Skip to content

Commit ed74d59

Browse files
authored
Merge pull request #756 from rjoly-getraline/fix_camera_probe
Fix camera probe detecting non-camera peripheral
2 parents 3e25105 + 8b60205 commit ed74d59

File tree

4 files changed

+47
-63
lines changed

4 files changed

+47
-63
lines changed

driver/esp_camera.c

Lines changed: 31 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

driver/private_include/sccb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
int SCCB_Init(int pin_sda, int pin_scl);
1313
int SCCB_Use_Port(int sccb_i2c_port);
1414
int SCCB_Deinit(void);
15-
uint8_t SCCB_Probe(void);
15+
int SCCB_Probe(uint8_t slv_addr);
1616
uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg);
1717
int SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data);
1818
uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg);

driver/sccb-ng.c

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,8 @@ int SCCB_Deinit(void)
198198
return ESP_OK;
199199
}
200200

201-
uint8_t SCCB_Probe(void)
201+
int SCCB_Probe(uint8_t slv_addr)
202202
{
203-
uint8_t slave_addr = 0x0;
204203
esp_err_t ret;
205204
i2c_master_bus_handle_t bus_handle;
206205

@@ -211,26 +210,14 @@ uint8_t SCCB_Probe(void)
211210
return ret;
212211
}
213212

214-
for (size_t i = 0; i < CAMERA_MODEL_MAX; i++)
215-
{
216-
if (slave_addr == camera_sensor[i].sccb_addr)
217-
{
218-
continue;
219-
}
220-
slave_addr = camera_sensor[i].sccb_addr;
213+
ret = i2c_master_probe(bus_handle, slv_addr, TIMEOUT_MS);
221214

222-
ret = i2c_master_probe(bus_handle, slave_addr, TIMEOUT_MS);
223-
224-
if (ret == ESP_OK)
225-
{
226-
if (SCCB_Install_Device(slave_addr) != 0)
227-
{
228-
return 0;
229-
}
230-
return slave_addr;
231-
}
215+
if (ret == ESP_OK)
216+
{
217+
return SCCB_Install_Device(slv_addr);
232218
}
233-
return 0;
219+
220+
return ret;
234221
}
235222

236223
uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg)

driver/sccb.c

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,26 +93,15 @@ int SCCB_Deinit(void)
9393
return i2c_driver_delete(sccb_i2c_port);
9494
}
9595

96-
uint8_t SCCB_Probe(void)
96+
int SCCB_Probe(uint8_t slv_addr)
9797
{
98-
uint8_t slave_addr = 0x0;
99-
100-
for (size_t i = 0; i < CAMERA_MODEL_MAX; i++) {
101-
if (slave_addr == camera_sensor[i].sccb_addr) {
102-
continue;
103-
}
104-
slave_addr = camera_sensor[i].sccb_addr;
105-
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
106-
i2c_master_start(cmd);
107-
i2c_master_write_byte(cmd, ( slave_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
108-
i2c_master_stop(cmd);
109-
esp_err_t ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
110-
i2c_cmd_link_delete(cmd);
111-
if( ret == ESP_OK) {
112-
return slave_addr;
113-
}
114-
}
115-
return 0;
98+
i2c_cmd_handle_t cmd = i2c_cmd_link_create();
99+
i2c_master_start(cmd);
100+
i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN);
101+
i2c_master_stop(cmd);
102+
esp_err_t ret = i2c_master_cmd_begin(sccb_i2c_port, cmd, 1000 / portTICK_RATE_MS);
103+
i2c_cmd_link_delete(cmd);
104+
return ret;
116105
}
117106

118107
uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg)

0 commit comments

Comments
 (0)