From 724c14d46afed87243a40d27888488fe397122ce Mon Sep 17 00:00:00 2001 From: rjoly Date: Mon, 30 Jun 2025 10:19:48 +0200 Subject: [PATCH 1/3] Fix camera probe detecting non-camera module --- driver/esp_camera.c | 49 +++++++++++++++++++---------------- driver/private_include/sccb.h | 2 +- driver/sccb-ng.c | 27 +++++-------------- driver/sccb.c | 27 ++++++------------- 4 files changed, 43 insertions(+), 62 deletions(-) diff --git a/driver/esp_camera.c b/driver/esp_camera.c index 7c693a6957..0187aaba83 100644 --- a/driver/esp_camera.c +++ b/driver/esp_camera.c @@ -212,34 +212,39 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out ESP_LOGD(TAG, "Searching for camera address"); vTaskDelay(10 / portTICK_PERIOD_MS); - uint8_t slv_addr = SCCB_Probe(); + int camera_model_id = 0; + uint8_t slave_addr = 0x0; - if (slv_addr == 0) { - ret = ESP_ERR_NOT_FOUND; - goto err; - } + for(camera_model_id ; *out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX ; camera_model_id++) { + slave_addr = camera_sensor[camera_model_id].sccb_addr; - ESP_LOGI(TAG, "Detected camera at address=0x%02x", slv_addr); - s_state->sensor.slv_addr = slv_addr; - s_state->sensor.xclk_freq_hz = config->xclk_freq_hz; - - /** - * Read sensor ID and then initialize sensor - * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process - */ - sensor_id_t *id = &s_state->sensor.id; - for (size_t i = 0; i < sizeof(g_sensors) / sizeof(sensor_func_t); i++) { - if (g_sensors[i].detect(slv_addr, id)) { - camera_sensor_info_t *info = esp_camera_sensor_get_info(id); - if (NULL != info) { - *out_camera_model = info->model; - ESP_LOGI(TAG, "Detected %s camera", info->name); - g_sensors[i].init(&s_state->sensor); - break; + if (ESP_OK != SCCB_PROBE(slave_addr)) { + continue; + } + + s_state->sensor.slv_addr = slv_addr; + s_state->sensor.xclk_freq_hz = config->xclk_freq_hz; + + /** + * Read sensor ID and then initialize sensor + * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process + */ + sensor_id_t *id = &s_state->sensor.id; + for (size_t i = 0; i < sizeof(g_sensors) / sizeof(sensor_func_t); i++) { + if (g_sensors[i].detect(slv_addr, id)) { + camera_sensor_info_t *info = esp_camera_sensor_get_info(id); + if (NULL != info) { + *out_camera_model = info->model; + ESP_LOGI(TAG, "Detected %s camera", info->name); + g_sensors[i].init(&s_state->sensor); + break; + } } } } + ESP_LOGI(TAG, "Detected camera at address=0x%02x", slv_addr); + if (CAMERA_NONE == *out_camera_model) { //If no supported sensors are detected ESP_LOGE(TAG, "Detected camera not supported."); ret = ESP_ERR_NOT_SUPPORTED; diff --git a/driver/private_include/sccb.h b/driver/private_include/sccb.h index f000fba112..04dd95a6bb 100755 --- a/driver/private_include/sccb.h +++ b/driver/private_include/sccb.h @@ -12,7 +12,7 @@ int SCCB_Init(int pin_sda, int pin_scl); int SCCB_Use_Port(int sccb_i2c_port); int SCCB_Deinit(void); -uint8_t SCCB_Probe(void); +int SCCB_Probe(uint8_t slave_addr); uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg); int SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data); uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg); diff --git a/driver/sccb-ng.c b/driver/sccb-ng.c index 9272c37c1b..0559db5b66 100755 --- a/driver/sccb-ng.c +++ b/driver/sccb-ng.c @@ -198,9 +198,8 @@ int SCCB_Deinit(void) return ESP_OK; } -uint8_t SCCB_Probe(void) +int SCCB_Probe(uint8_t slave_addr) { - uint8_t slave_addr = 0x0; esp_err_t ret; i2c_master_bus_handle_t bus_handle; @@ -211,26 +210,14 @@ uint8_t SCCB_Probe(void) return ret; } - for (size_t i = 0; i < CAMERA_MODEL_MAX; i++) - { - if (slave_addr == camera_sensor[i].sccb_addr) - { - continue; - } - slave_addr = camera_sensor[i].sccb_addr; + ret = i2c_master_probe(bus_handle, slave_addr, TIMEOUT_MS); - ret = i2c_master_probe(bus_handle, slave_addr, TIMEOUT_MS); - - if (ret == ESP_OK) - { - if (SCCB_Install_Device(slave_addr) != 0) - { - return 0; - } - return slave_addr; - } + if (ret == ESP_OK) + { + return SCCB_Install_Device(slave_addr); } - return 0; + + return ret; } uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg) diff --git a/driver/sccb.c b/driver/sccb.c index 7007883c15..2fb253c910 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -93,26 +93,15 @@ int SCCB_Deinit(void) return i2c_driver_delete(sccb_i2c_port); } -uint8_t SCCB_Probe(void) +int SCCB_Probe(uint8_t slave_addr) { - uint8_t slave_addr = 0x0; - - for (size_t i = 0; i < CAMERA_MODEL_MAX; i++) { - if (slave_addr == camera_sensor[i].sccb_addr) { - continue; - } - slave_addr = camera_sensor[i].sccb_addr; - i2c_cmd_handle_t cmd = i2c_cmd_link_create(); - i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( slave_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); - i2c_master_stop(cmd); - esp_err_t ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS); - i2c_cmd_link_delete(cmd); - if( ret == ESP_OK) { - return slave_addr; - } - } - return 0; + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, ( slave_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS); + i2c_cmd_link_delete(cmd); + return ret; } uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg) From e7d2ff69c79408d8e0a97ead33897c0deb1d7b70 Mon Sep 17 00:00:00 2001 From: rjoly Date: Mon, 30 Jun 2025 11:25:48 +0200 Subject: [PATCH 2/3] Fix naming --- driver/esp_camera.c | 18 +++++++++--------- driver/sccb-ng.c | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/driver/esp_camera.c b/driver/esp_camera.c index 0187aaba83..21f3772623 100644 --- a/driver/esp_camera.c +++ b/driver/esp_camera.c @@ -212,13 +212,13 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out ESP_LOGD(TAG, "Searching for camera address"); vTaskDelay(10 / portTICK_PERIOD_MS); - int camera_model_id = 0; - uint8_t slave_addr = 0x0; + int camera_model_id; + uint8_t slv_addr = 0x0; - for(camera_model_id ; *out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX ; camera_model_id++) { - slave_addr = camera_sensor[camera_model_id].sccb_addr; + for(camera_model_id = 0; (*out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX) ; camera_model_id++) { + slv_addr = camera_sensor[camera_model_id].sccb_addr; - if (ESP_OK != SCCB_PROBE(slave_addr)) { + if (ESP_OK != SCCB_Probe(slv_addr)) { continue; } @@ -230,6 +230,9 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process */ sensor_id_t *id = &s_state->sensor.id; + ESP_LOGI(TAG, "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x", + id->PID, id->VER, id->MIDH, id->MIDL); + for (size_t i = 0; i < sizeof(g_sensors) / sizeof(sensor_func_t); i++) { if (g_sensors[i].detect(slv_addr, id)) { camera_sensor_info_t *info = esp_camera_sensor_get_info(id); @@ -243,16 +246,13 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out } } - ESP_LOGI(TAG, "Detected camera at address=0x%02x", slv_addr); - if (CAMERA_NONE == *out_camera_model) { //If no supported sensors are detected ESP_LOGE(TAG, "Detected camera not supported."); ret = ESP_ERR_NOT_SUPPORTED; goto err; } - ESP_LOGI(TAG, "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x", - id->PID, id->VER, id->MIDH, id->MIDL); + ESP_LOGI(TAG, "Detected camera at address=0x%02x", slv_addr); ESP_LOGD(TAG, "Doing SW reset of sensor"); vTaskDelay(10 / portTICK_PERIOD_MS); diff --git a/driver/sccb-ng.c b/driver/sccb-ng.c index 0559db5b66..e8701ca088 100755 --- a/driver/sccb-ng.c +++ b/driver/sccb-ng.c @@ -198,7 +198,7 @@ int SCCB_Deinit(void) return ESP_OK; } -int SCCB_Probe(uint8_t slave_addr) +int SCCB_Probe(uint8_t slv_addr) { esp_err_t ret; i2c_master_bus_handle_t bus_handle; @@ -210,11 +210,11 @@ int SCCB_Probe(uint8_t slave_addr) return ret; } - ret = i2c_master_probe(bus_handle, slave_addr, TIMEOUT_MS); + ret = i2c_master_probe(bus_handle, slv_addr, TIMEOUT_MS); if (ret == ESP_OK) { - return SCCB_Install_Device(slave_addr); + return SCCB_Install_Device(slv_addr); } return ret; From aa9e228040045d2a946360a9e511f6603311f807 Mon Sep 17 00:00:00 2001 From: rjoly Date: Tue, 1 Jul 2025 10:33:44 +0200 Subject: [PATCH 3/3] Implemented github copilot suggestion --- driver/esp_camera.c | 9 ++++++--- driver/private_include/sccb.h | 2 +- driver/sccb.c | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/driver/esp_camera.c b/driver/esp_camera.c index 782ff0f708..a807d11376 100644 --- a/driver/esp_camera.c +++ b/driver/esp_camera.c @@ -215,7 +215,10 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out int camera_model_id; uint8_t slv_addr = 0x0; - for(camera_model_id = 0; (*out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX) ; camera_model_id++) { + /** + * This loop probes each known sensor until a supported camera is detected + */ + for(camera_model_id = 0; *out_camera_model == CAMERA_NONE && camera_model_id < CAMERA_MODEL_MAX ; camera_model_id++) { slv_addr = camera_sensor[camera_model_id].sccb_addr; if (ESP_OK != SCCB_Probe(slv_addr)) { @@ -230,11 +233,11 @@ static esp_err_t camera_probe(const camera_config_t *config, camera_model_t *out * Attention: Some sensors have the same SCCB address. Therefore, several attempts may be made in the detection process */ sensor_id_t *id = &s_state->sensor.id; - ESP_LOGI(TAG, "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x", - id->PID, id->VER, id->MIDH, id->MIDL); for (size_t i = 0; i < sizeof(g_sensors) / sizeof(sensor_func_t); i++) { if (g_sensors[i].detect(slv_addr, id)) { + ESP_LOGI(TAG, "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x", + id->PID, id->VER, id->MIDH, id->MIDL); camera_sensor_info_t *info = esp_camera_sensor_get_info(id); if (NULL != info) { *out_camera_model = info->model; diff --git a/driver/private_include/sccb.h b/driver/private_include/sccb.h index 04dd95a6bb..c8613da124 100755 --- a/driver/private_include/sccb.h +++ b/driver/private_include/sccb.h @@ -12,7 +12,7 @@ int SCCB_Init(int pin_sda, int pin_scl); int SCCB_Use_Port(int sccb_i2c_port); int SCCB_Deinit(void); -int SCCB_Probe(uint8_t slave_addr); +int SCCB_Probe(uint8_t slv_addr); uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg); int SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data); uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg); diff --git a/driver/sccb.c b/driver/sccb.c index 2fb253c910..63bddac957 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -93,11 +93,11 @@ int SCCB_Deinit(void) return i2c_driver_delete(sccb_i2c_port); } -int SCCB_Probe(uint8_t slave_addr) +int SCCB_Probe(uint8_t slv_addr) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( slave_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd);