2222#include <drv_log.h>
2323
2424#define DEV_ADDRESS 0x30 /* OV2640 address */
25- #define I2C_NAME "i2c1 "
25+ #define I2C_NAME "i2c2 "
2626
2727volatile rt_uint32_t jpeg_data_len = 0 ;
2828volatile rt_uint8_t jpeg_data_ok = 0 ;
2929struct rt_i2c_bus_device * i2c_bus = RT_NULL ;
3030
3131#define JPEG_BUF_SIZE 32 * 1024
32- #define JPEG_LINE_SIZE 2 * 1024
32+ #define JPEG_LINE_SIZE 1 * 1024
33+
34+ #define RESET_PIN GET_PIN(A, 3)
3335
3436static rt_uint32_t * jpeg_data_buf = RT_NULL ;
3537static rt_uint32_t JPEG_LINE0_BUF [JPEG_LINE_SIZE * 2 ];
@@ -446,8 +448,8 @@ rt_uint8_t ov2640_set_image_window_size(rt_uint16_t offx, rt_uint16_t offy, rt_u
446448 temp |=(offy >>4 )& 0X70 ;
447449 temp |=(hsize >>5 )& 0X08 ;
448450 temp |=(offx >>8 )& 0X07 ;
449- write_reg (i2c_bus , 0X55 ,temp ); //设置H_SIZE/V_SIZE/OFFX,OFFY的高位
450- write_reg (i2c_bus , 0X57 ,(hsize >>2 )& 0X80 ); //设置H_SIZE/V_SIZE/OFFX,OFFY的高位
451+ write_reg (i2c_bus , 0X55 ,temp );
452+ write_reg (i2c_bus , 0X57 ,(hsize >>2 )& 0X80 );
451453 write_reg (i2c_bus , 0XE0 ,0X00 );
452454 return 0 ;
453455}
@@ -491,6 +493,7 @@ void camera_dma_data_process(void)
491493 }
492494 jpeg_data_len += JPEG_LINE_SIZE ;
493495 }
496+ SCB_CleanInvalidateDCache ();
494497}
495498
496499/* After a frame of picture data has been collected. */
@@ -524,25 +527,56 @@ void camera_frame_data_process(void)
524527 jpeg_data_len += rlen ;
525528 jpeg_data_ok = 1 ;
526529 }
530+ if (jpeg_data_ok == 2 )
531+ {
532+ DMA2_Stream1 -> NDTR = JPEG_LINE_SIZE ;
533+ DMA2_Stream1 -> CR |= 1 <<0 ;
534+ jpeg_data_ok = 0 ;
535+ jpeg_data_len = 0 ;
536+ }
527537}
528538
529539int rt_ov2640_init (void )
530540{
531541 rt_uint16_t i = 0 ;
542+ rt_err_t result = RT_EOK ;
532543 rt_device_t dcmi_dev = RT_NULL ;
533544
545+ /* ov2640 reset */
546+ rt_pin_mode (RESET_PIN , PIN_MODE_OUTPUT );
547+ rt_pin_write (RESET_PIN , PIN_LOW );
548+ rt_thread_delay (20 );
549+ rt_pin_write (RESET_PIN , PIN_HIGH );
550+ rt_thread_delay (20 );
551+
534552 i2c_bus = rt_i2c_bus_device_find (I2C_NAME );
535553 if (i2c_bus == RT_NULL )
536554 {
537- LOG_E ("can't find %c deivce" , I2C_NAME );
555+ LOG_E ("can't find %s deivce" , I2C_NAME );
556+ return RT_ERROR ;
557+ }
558+ /* Prepare the camera to be configured */
559+ result = write_reg (i2c_bus , OV2640_DSP_RA_DLMT , 0x01 );
560+ if (result != RT_EOK )
561+ {
562+ LOG_E ("ov2640 write reg error!" );
538563 return RT_ERROR ;
539564 }
540-
541- write_reg (i2c_bus , OV2640_DSP_RA_DLMT , 0x01 );
542565 rt_thread_delay (10 );
543- write_reg (i2c_bus , OV2640_SENSOR_COM7 , 0x80 );
566+ result = write_reg (i2c_bus , OV2640_SENSOR_COM7 , 0x80 );
567+ if (result != RT_EOK )
568+ {
569+ LOG_E ("ov2640 soft reset error!" );
570+ return RT_ERROR ;
571+ }
572+ rt_thread_delay (200 );
544573
545- ov2640_read_id (i2c_bus );
574+ result = ov2640_read_id (i2c_bus );
575+ if (result != RT_EOK )
576+ {
577+ LOG_E ("ov2640 read id error!" );
578+ return RT_ERROR ;
579+ }
546580
547581 for (i = 0 ; i < sizeof (ov2640_svga_init_reg_tbl ) / 2 ; i ++ )
548582 {
@@ -577,17 +611,16 @@ int rt_ov2640_init(void)
577611 rt_hw_dcmi_dma_config ((rt_uint32_t )JPEG_LINE0_BUF , (rt_uint32_t )JPEG_LINE1_BUF , JPEG_LINE_SIZE );
578612
579613 rt_kprintf ("camera init success!\n" );
614+
580615 return RT_EOK ;
581616}
582617INIT_APP_EXPORT (rt_ov2640_init );
583618
584619int camera_sample (int argc , char * * argv )
585620{
586-
587621 rt_err_t result = RT_EOK ;
588622 int fd = -1 ;
589623 rt_uint32_t i , jpg_start , jpg_len ;
590- rt_uint32_t tickstart = 0 ;
591624 rt_uint8_t jpg_head = 0 ;
592625 rt_uint8_t * p = RT_NULL ;
593626
@@ -598,71 +631,61 @@ int camera_sample(int argc, char **argv)
598631 return -1 ;
599632 }
600633
601- jpeg_data_len = 0 ;
602- jpeg_data_ok = 0 ;
603-
604634 DCMI_Start ();
605635
606- tickstart = rt_tick_get ();
607636 while (1 )
608637 {
609- if (rt_tick_get () - tickstart > 10000 )
638+ while (jpeg_data_ok != 1 );
639+ jpeg_data_ok = 2 ;
640+ while (jpeg_data_ok != 1 );
641+ DCMI_Stop ();
642+
643+ p = (rt_uint8_t * )jpeg_data_buf ;
644+ jpg_len = 0 ;
645+ jpg_head = 0 ;
646+ for (i = 0 ; i < jpeg_data_len * 4 ; i ++ )
610647 {
611- DCMI_Stop ();
612- LOG_E ("picture capture overtime!" );
613- break ;
614- }
615-
616- if (jpeg_data_ok == 1 )
617- {
618- DCMI_Stop ();
619- p = (rt_uint8_t * )jpeg_data_buf ;
620- jpg_len = 0 ;
621- jpg_head = 0 ;
622- for (i = 0 ; i < jpeg_data_len * 4 ; i ++ )
648+ /* jpg head */
649+ if ((p [i ] == 0xFF ) && (p [i + 1 ] == 0xD8 ))
623650 {
624- /* jpg head */
625- if ((p [i ] == 0xFF ) && (p [i + 1 ] == 0xD8 ))
626- {
627- jpg_start = i ;
628- jpg_head = 1 ;
629- }
630- /* jpg end */
631- if ((p [i ] == 0xFF ) && (p [i + 1 ] == 0xD9 ) && jpg_head )
632- {
633- jpg_len = i - jpg_start + 2 ; /* a picture len */
634- break ;
635- }
651+ jpg_start = i ;
652+ jpg_head = 1 ;
636653 }
637- if (jpg_len )
654+ /* jpg end */
655+ if ((p [i ] == 0xFF ) && (p [i + 1 ] == 0xD9 ) && jpg_head )
638656 {
639- p += jpg_start ;
640- fd = open (argv [1 ], O_WRONLY | O_CREAT );
641- if (fd < 0 )
642- {
643- rt_kprintf ("open file for recording failed!\n" );
644- result = - RT_ERROR ;
645- goto _exit ;
646- }
647- else
648- {
649- write (fd , p , jpg_len );
650- close (fd );
651- rt_kprintf ("picture capture complate!\n" );
652- break ;
653- }
657+ jpg_len = i - jpg_start + 2 ; /* a picture len */
658+ break ;
654659 }
655- else
660+ }
661+ if (jpg_len )
662+ {
663+ p += jpg_start ;
664+ fd = open (argv [1 ], O_WRONLY | O_CREAT );
665+ if (fd < 0 )
656666 {
657- rt_kprintf ("jpg_len error !\n" );
667+ rt_kprintf ("open file for recording failed !\n" );
658668 result = - RT_ERROR ;
659669 goto _exit ;
660670 }
671+ else
672+ {
673+ write (fd , p , jpg_len );
674+ close (fd );
675+ rt_kprintf ("%s picture capture complate!\n" , argv [1 ]);
676+ break ;
677+ }
678+ }
679+ else
680+ {
681+ rt_kprintf ("jpg_len error!\n" );
682+ result = - RT_ERROR ;
683+ goto _exit ;
661684 }
662685 }
663686
664687_exit :
665- return result ;;
688+ return result ;
666689}
667690MSH_CMD_EXPORT (camera_sample , record picture to a jpg file );
668691
0 commit comments