@@ -224,30 +224,39 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out
224224 ESP_LOGD (TAG , "Searching for camera address" );
225225 vTaskDelay (10 / portTICK_PERIOD_MS );
226226
227- uint8_t slv_addr = SCCB_Probe ();
228-
229- if (slv_addr == 0 ) {
230- ret = ESP_ERR_NOT_FOUND ;
231- goto err ;
232- }
233-
234- ESP_LOGI (TAG , "Detected camera at address=0x%02x" , slv_addr );
235- s_state -> sensor .slv_addr = slv_addr ;
236- s_state -> sensor .xclk_freq_hz = config -> xclk_freq_hz ;
227+ int camera_model_id ;
228+ uint8_t slv_addr = 0x0 ;
237229
238230 /**
239- * Read sensor ID and then initialize sensor
240- * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process
231+ * This loop probes each known sensor until a supported camera is detected
241232 */
242- sensor_id_t * id = & s_state -> sensor .id ;
243- for (size_t i = 0 ; i < sizeof (g_sensors ) / sizeof (sensor_func_t ); i ++ ) {
244- if (g_sensors [i ].detect (slv_addr , id )) {
245- camera_sensor_info_t * info = esp_camera_sensor_get_info (id );
246- if (NULL != info ) {
247- * out_camera_model = info -> model ;
248- ESP_LOGI (TAG , "Detected %s camera" , info -> name );
249- g_sensors [i ].init (& s_state -> sensor );
250- break ;
233+ for (camera_model_id = 0 ; * out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX ; camera_model_id ++ ) {
234+ slv_addr = camera_sensor [camera_model_id ].sccb_addr ;
235+
236+ if (ESP_OK != SCCB_Probe (slv_addr )) {
237+ continue ;
238+ }
239+
240+ s_state -> sensor .slv_addr = slv_addr ;
241+ s_state -> sensor .xclk_freq_hz = config -> xclk_freq_hz ;
242+
243+ /**
244+ * Read sensor ID and then initialize sensor
245+ * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process
246+ */
247+ sensor_id_t * id = & s_state -> sensor .id ;
248+
249+ for (size_t i = 0 ; i < sizeof (g_sensors ) / sizeof (sensor_func_t ); i ++ ) {
250+ if (g_sensors [i ].detect (slv_addr , id )) {
251+ ESP_LOGI (TAG , "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x" ,
252+ id -> PID , id -> VER , id -> MIDH , id -> MIDL );
253+ camera_sensor_info_t * info = esp_camera_sensor_get_info (id );
254+ if (NULL != info ) {
255+ * out_camera_model = info -> model ;
256+ ESP_LOGI (TAG , "Detected %s camera" , info -> name );
257+ g_sensors [i ].init (& s_state -> sensor );
258+ break ;
259+ }
251260 }
252261 }
253262 }
@@ -258,8 +267,7 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out
258267 goto err ;
259268 }
260269
261- ESP_LOGI (TAG , "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x" ,
262- id -> PID , id -> VER , id -> MIDH , id -> MIDL );
270+ ESP_LOGI (TAG , "Detected camera at address=0x%02x" , slv_addr );
263271
264272 ESP_LOGD (TAG , "Doing SW reset of sensor" );
265273 vTaskDelay (10 / portTICK_PERIOD_MS );
0 commit comments