45
45
#if CONFIG_OV3660_SUPPORT
46
46
#include "ov3660.h"
47
47
#endif
48
+ #if CONFIG_OV5640_SUPPORT
49
+ #include "ov5640.h"
50
+ #endif
48
51
49
52
typedef enum {
50
53
CAMERA_NONE = 0 ,
51
54
CAMERA_UNKNOWN = 1 ,
52
55
CAMERA_OV7725 = 7725 ,
53
56
CAMERA_OV2640 = 2640 ,
54
57
CAMERA_OV3660 = 3660 ,
58
+ CAMERA_OV5640 = 5640 ,
55
59
} camera_model_t ;
56
60
57
61
#define REG_PID 0x0A
@@ -80,6 +84,7 @@ typedef struct camera_fb_s {
80
84
size_t width ;
81
85
size_t height ;
82
86
pixformat_t format ;
87
+ struct timeval timestamp ;
83
88
size_t size ;
84
89
uint8_t ref ;
85
90
uint8_t bad ;
@@ -546,6 +551,7 @@ static void IRAM_ATTR signal_dma_buf_received(bool* need_yield)
546
551
}
547
552
//ESP_EARLY_LOGW(TAG, "qsf:%d", s_state->dma_received_count);
548
553
//ets_printf("qsf:%d\n", s_state->dma_received_count);
554
+ //ets_printf("qovf\n");
549
555
}
550
556
* need_yield = (ret == pdTRUE && higher_priority_task_woken == pdTRUE );
551
557
}
@@ -577,6 +583,7 @@ static void IRAM_ATTR vsync_isr(void* arg)
577
583
if (s_state -> dma_filtered_count > 1 || s_state -> fb -> bad || s_state -> config .fb_count > 1 ) {
578
584
i2s_stop (& need_yield );
579
585
}
586
+ //ets_printf("vs\n");
580
587
}
581
588
if (s_state -> config .fb_count > 1 || s_state -> dma_filtered_count < 2 ) {
582
589
I2S0 .conf .rx_start = 0 ;
@@ -669,6 +676,7 @@ static void IRAM_ATTR dma_finish_frame()
669
676
if (s_state -> config .fb_count == 1 ) {
670
677
i2s_start_bus ();
671
678
}
679
+ //ets_printf("bad\n");
672
680
} else {
673
681
s_state -> fb -> len = s_state -> dma_filtered_count * buf_len ;
674
682
if (s_state -> fb -> len ) {
@@ -695,6 +703,8 @@ static void IRAM_ATTR dma_finish_frame()
695
703
} else if (s_state -> config .fb_count == 1 ){
696
704
//frame was empty?
697
705
i2s_start_bus ();
706
+ } else {
707
+ //ets_printf("empty\n");
698
708
}
699
709
}
700
710
} else if (s_state -> fb -> len ) {
@@ -728,15 +738,19 @@ static void IRAM_ATTR dma_filter_buffer(size_t buf_idx)
728
738
if (s_state -> sensor .pixformat == PIXFORMAT_JPEG ) {
729
739
uint32_t sig = * ((uint32_t * )s_state -> fb -> buf ) & 0xFFFFFF ;
730
740
if (sig != 0xffd8ff ) {
731
- // ets_printf("bad header \n");
741
+ ets_printf ("bh 0x%08x \n" , sig );
732
742
s_state -> fb -> bad = 1 ;
733
743
return ;
734
744
}
735
745
}
736
746
//set the frame properties
737
- s_state -> fb -> width = resolution [s_state -> sensor .status .framesize ][ 0 ] ;
738
- s_state -> fb -> height = resolution [s_state -> sensor .status .framesize ][ 1 ] ;
747
+ s_state -> fb -> width = resolution [s_state -> sensor .status .framesize ]. width ;
748
+ s_state -> fb -> height = resolution [s_state -> sensor .status .framesize ]. height ;
739
749
s_state -> fb -> format = s_state -> sensor .pixformat ;
750
+
751
+ uint64_t us = (uint64_t )esp_timer_get_time ();
752
+ s_state -> fb -> timestamp .tv_sec = us / 1000000UL ;
753
+ s_state -> fb -> timestamp .tv_usec = us % 1000000UL ;
740
754
}
741
755
s_state -> dma_filtered_count ++ ;
742
756
}
@@ -972,13 +986,6 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera
972
986
vTaskDelay (10 / portTICK_PERIOD_MS );
973
987
gpio_set_level (config -> pin_reset , 1 );
974
988
vTaskDelay (10 / portTICK_PERIOD_MS );
975
- #if (CONFIG_OV2640_SUPPORT && !CONFIG_OV3660_SUPPORT )
976
- } else {
977
- //reset OV2640
978
- SCCB_Write (0x30 , 0xFF , 0x01 );//bank sensor
979
- SCCB_Write (0x30 , 0x12 , 0x80 );//reset
980
- vTaskDelay (10 / portTICK_PERIOD_MS );
981
- #endif
982
989
}
983
990
984
991
ESP_LOGD (TAG , "Searching for camera address" );
@@ -989,15 +996,13 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera
989
996
camera_disable_out_clock ();
990
997
return ESP_ERR_CAMERA_NOT_DETECTED ;
991
998
}
992
- s_state -> sensor .slv_addr = slv_addr ;
993
- s_state -> sensor .xclk_freq_hz = config -> xclk_freq_hz ;
994
-
995
- //s_state->sensor.slv_addr = 0x30;
996
- ESP_LOGD (TAG , "Detected camera at address=0x%02x" , s_state -> sensor .slv_addr );
999
+
1000
+ //slv_addr = 0x30;
1001
+ ESP_LOGD (TAG , "Detected camera at address=0x%02x" , slv_addr );
997
1002
sensor_id_t * id = & s_state -> sensor .id ;
998
1003
999
- #if ( CONFIG_OV2640_SUPPORT )
1000
- if (s_state -> sensor . slv_addr == 0x30 ) {
1004
+ #if CONFIG_OV2640_SUPPORT
1005
+ if (slv_addr == 0x30 ) {
1001
1006
ESP_LOGD (TAG , "Resetting OV2640" );
1002
1007
//camera might be OV2640. try to reset it
1003
1008
SCCB_Write (0x30 , 0xFF , 0x01 );//bank sensor
@@ -1007,7 +1012,10 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera
1007
1012
}
1008
1013
#endif
1009
1014
1010
- #if CONFIG_OV3660_SUPPORT
1015
+ s_state -> sensor .slv_addr = slv_addr ;
1016
+ s_state -> sensor .xclk_freq_hz = config -> xclk_freq_hz ;
1017
+
1018
+ #if (CONFIG_OV3660_SUPPORT || CONFIG_OV5640_SUPPORT )
1011
1019
if (s_state -> sensor .slv_addr == 0x3c ){
1012
1020
id -> PID = SCCB_Read16 (s_state -> sensor .slv_addr , REG16_CHIDH );
1013
1021
id -> VER = SCCB_Read16 (s_state -> sensor .slv_addr , REG16_CHIDL );
@@ -1022,7 +1030,8 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera
1022
1030
vTaskDelay (10 / portTICK_PERIOD_MS );
1023
1031
ESP_LOGD (TAG , "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x" ,
1024
1032
id -> PID , id -> VER , id -> MIDH , id -> MIDL );
1025
- #if CONFIG_OV3660_SUPPORT
1033
+
1034
+ #if (CONFIG_OV3660_SUPPORT || CONFIG_OV5640_SUPPORT )
1026
1035
}
1027
1036
#endif
1028
1037
@@ -1045,6 +1054,12 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera
1045
1054
* out_camera_model = CAMERA_OV3660 ;
1046
1055
ov3660_init (& s_state -> sensor );
1047
1056
break ;
1057
+ #endif
1058
+ #if CONFIG_OV5640_SUPPORT
1059
+ case OV5640_PID :
1060
+ * out_camera_model = CAMERA_OV5640 ;
1061
+ ov5640_init (& s_state -> sensor );
1062
+ break ;
1048
1063
#endif
1049
1064
default :
1050
1065
id -> PID = 0 ;
@@ -1072,12 +1087,46 @@ esp_err_t camera_init(const camera_config_t* config)
1072
1087
esp_err_t err = ESP_OK ;
1073
1088
framesize_t frame_size = (framesize_t ) config -> frame_size ;
1074
1089
pixformat_t pix_format = (pixformat_t ) config -> pixel_format ;
1075
- s_state -> width = resolution [frame_size ][0 ];
1076
- s_state -> height = resolution [frame_size ][1 ];
1090
+
1091
+ switch (s_state -> sensor .id .PID ) {
1092
+ #if CONFIG_OV2640_SUPPORT
1093
+ case OV2640_PID :
1094
+ if (frame_size > FRAMESIZE_UXGA ) {
1095
+ frame_size = FRAMESIZE_UXGA ;
1096
+ }
1097
+ break ;
1098
+ #endif
1099
+ #if CONFIG_OV7725_SUPPORT
1100
+ case OV7725_PID :
1101
+ if (frame_size > FRAMESIZE_VGA ) {
1102
+ frame_size = FRAMESIZE_VGA ;
1103
+ }
1104
+ break ;
1105
+ #endif
1106
+ #if CONFIG_OV3660_SUPPORT
1107
+ case OV3660_PID :
1108
+ if (frame_size > FRAMESIZE_QXGA ) {
1109
+ frame_size = FRAMESIZE_QXGA ;
1110
+ }
1111
+ break ;
1112
+ #endif
1113
+ #if CONFIG_OV5640_SUPPORT
1114
+ case OV5640_PID :
1115
+ if (frame_size > FRAMESIZE_QSXGA ) {
1116
+ frame_size = FRAMESIZE_QSXGA ;
1117
+ }
1118
+ break ;
1119
+ #endif
1120
+ default :
1121
+ return ESP_ERR_CAMERA_NOT_SUPPORTED ;
1122
+ }
1123
+
1124
+ s_state -> width = resolution [frame_size ].width ;
1125
+ s_state -> height = resolution [frame_size ].height ;
1077
1126
1078
1127
if (pix_format == PIXFORMAT_GRAYSCALE ) {
1079
1128
s_state -> fb_size = s_state -> width * s_state -> height ;
1080
- if (s_state -> sensor .id .PID == OV3660_PID ) {
1129
+ if (s_state -> sensor .id .PID == OV3660_PID || s_state -> sensor . id . PID == OV5640_PID ) {
1081
1130
if (is_hs_mode ()) {
1082
1131
s_state -> sampling_mode = SM_0A00_0B00 ;
1083
1132
s_state -> dma_filter = & dma_filter_yuyv_highspeed ;
@@ -1120,8 +1169,8 @@ esp_err_t camera_init(const camera_config_t* config)
1120
1169
s_state -> in_bytes_per_pixel = 2 ; // camera sends RGB565
1121
1170
s_state -> fb_bytes_per_pixel = 3 ; // frame buffer stores RGB888
1122
1171
} else if (pix_format == PIXFORMAT_JPEG ) {
1123
- if (s_state -> sensor .id .PID != OV2640_PID && s_state -> sensor .id .PID != OV3660_PID ) {
1124
- ESP_LOGE (TAG , "JPEG format is only supported for ov2640 and ov3660 " );
1172
+ if (s_state -> sensor .id .PID != OV2640_PID && s_state -> sensor .id .PID != OV3660_PID && s_state -> sensor . id . PID != OV5640_PID ) {
1173
+ ESP_LOGE (TAG , "JPEG format is only supported for ov2640, ov3660 and ov5640 " );
1125
1174
err = ESP_ERR_NOT_SUPPORTED ;
1126
1175
goto fail ;
1127
1176
}
@@ -1268,6 +1317,8 @@ esp_err_t esp_camera_init(const camera_config_t* config)
1268
1317
ESP_LOGD (TAG , "Detected OV2640 camera" );
1269
1318
} else if (camera_model == CAMERA_OV3660 ) {
1270
1319
ESP_LOGD (TAG , "Detected OV3660 camera" );
1320
+ } else if (camera_model == CAMERA_OV5640 ) {
1321
+ ESP_LOGD (TAG , "Detected OV5640 camera" );
1271
1322
} else {
1272
1323
ESP_LOGE (TAG , "Camera not supported" );
1273
1324
err = ESP_ERR_CAMERA_NOT_SUPPORTED ;
0 commit comments