Skip to content

Commit e8be2af

Browse files
author
thread-liu
committed
[update] ov2640 driver.
1 parent 041814e commit e8be2af

File tree

1 file changed

+82
-59
lines changed

1 file changed

+82
-59
lines changed

libraries/drivers/drv_ov2640.c

Lines changed: 82 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,16 @@
2222
#include <drv_log.h>
2323

2424
#define DEV_ADDRESS 0x30 /* OV2640 address */
25-
#define I2C_NAME "i2c1"
25+
#define I2C_NAME "i2c2"
2626

2727
volatile rt_uint32_t jpeg_data_len = 0;
2828
volatile rt_uint8_t jpeg_data_ok = 0;
2929
struct 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

3436
static rt_uint32_t *jpeg_data_buf = RT_NULL;
3537
static 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

529539
int 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
}
582617
INIT_APP_EXPORT(rt_ov2640_init);
583618

584619
int 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
}
667690
MSH_CMD_EXPORT(camera_sample, record picture to a jpg file);
668691

0 commit comments

Comments
 (0)