From 2960a803cb617cc1fd9e92c4bd4dad2805865dd4 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Sat, 12 Mar 2022 00:03:25 +0200 Subject: [PATCH] sensors/cambus: Support returning multiple devices from scan. --- src/omv/common/cambus.h | 2 +- src/omv/common/sensor_utils.c | 8 ++++---- src/omv/modules/py_fir.c | 2 +- src/omv/ports/nrf/cambus.c | 13 ++++++++++--- src/omv/ports/rp2/cambus.c | 15 +++++++++++---- src/omv/ports/stm32/cambus.c | 21 +++++++++++++++------ 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/omv/common/cambus.h b/src/omv/common/cambus.h index 763245f2e..44a50f297 100644 --- a/src/omv/common/cambus.h +++ b/src/omv/common/cambus.h @@ -46,7 +46,7 @@ typedef struct _cambus { int cambus_init(cambus_t *bus, uint32_t bus_id, uint32_t speed); int cambus_deinit(cambus_t *bus); -int cambus_scan(cambus_t *bus); +int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size); int cambus_enable(cambus_t *bus, bool enable); int cambus_gencall(cambus_t *bus, uint8_t cmd); int cambus_pulse_scl(cambus_t *bus); diff --git a/src/omv/common/sensor_utils.c b/src/omv/common/sensor_utils.c index 87983e549..719df3bce 100644 --- a/src/omv/common/sensor_utils.c +++ b/src/omv/common/sensor_utils.c @@ -201,7 +201,7 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed) mp_hal_delay_ms(10); // Probe the sensor - sensor.slv_addr = cambus_scan(&sensor.bus); + sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); if (sensor.slv_addr == 0) { /* Sensor has been held in reset, so the reset line is active low */ @@ -212,21 +212,21 @@ int sensor_probe_init(uint32_t bus_id, uint32_t bus_speed) mp_hal_delay_ms(10); // Probe again to set the slave addr. - sensor.slv_addr = cambus_scan(&sensor.bus); + sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); if (sensor.slv_addr == 0) { sensor.pwdn_pol = ACTIVE_LOW; DCMI_PWDN_HIGH(); mp_hal_delay_ms(10); - sensor.slv_addr = cambus_scan(&sensor.bus); + sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); if (sensor.slv_addr == 0) { sensor.reset_pol = ACTIVE_HIGH; DCMI_RESET_LOW(); mp_hal_delay_ms(10); - sensor.slv_addr = cambus_scan(&sensor.bus); + sensor.slv_addr = cambus_scan(&sensor.bus, NULL, 0); #ifndef OMV_ENABLE_NONI2CIS if (sensor.slv_addr == 0) { return SENSOR_ERROR_ISC_UNDETECTED; diff --git a/src/omv/modules/py_fir.c b/src/omv/modules/py_fir.c index ac11f0750..f14b9e172 100644 --- a/src/omv/modules/py_fir.c +++ b/src/omv/modules/py_fir.c @@ -317,7 +317,7 @@ mp_obj_t py_fir_init(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) if (type == -1) { FIR_SCAN_RETRY: cambus_init(&fir_bus, FIR_I2C_ID, CAMBUS_SPEED_STANDARD); - switch (cambus_scan(&fir_bus)) { + switch (cambus_scan(&fir_bus, NULL, 0)) { #if (OMV_ENABLE_FIR_MLX90621 == 1) case (MLX90621_ADDR << 1): { type = FIR_MLX90621; diff --git a/src/omv/ports/nrf/cambus.c b/src/omv/ports/nrf/cambus.c index 4b3ff4052..4c8ae81e5 100644 --- a/src/omv/ports/nrf/cambus.c +++ b/src/omv/ports/nrf/cambus.c @@ -84,17 +84,24 @@ int cambus_deinit(cambus_t *bus) return 0; } -int cambus_scan(cambus_t *bus) +int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size) { + int idx = 0; uint8_t data; uint32_t xfer_flags = 0; for (uint8_t addr=0x09; addr<=0x77; addr++) { nrfx_twi_xfer_desc_t desc = NRFX_TWI_XFER_DESC_RX(addr, &data, 1); if (nrfx_twi_xfer(&bus->i2c, &desc, xfer_flags) == NRFX_SUCCESS) { - return (addr << 1); + if (list == NULL || size == 0) { + return (addr << 1); + } else if (idx < size) { + list[idx++] = (addr << 1); + } else { + break; + } } } - return 0; + return idx; } int cambus_enable(cambus_t *bus, bool enable) diff --git a/src/omv/ports/rp2/cambus.c b/src/omv/ports/rp2/cambus.c index f2419eb37..1f829151d 100644 --- a/src/omv/ports/rp2/cambus.c +++ b/src/omv/ports/rp2/cambus.c @@ -64,14 +64,21 @@ int cambus_deinit(cambus_t *bus) return 0; } -int cambus_scan(cambus_t *bus) +int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size) { - for (uint8_t addr=0x20, rxdata; addr<=0x48; addr++) { + int idx = 0; + for (uint8_t addr=0x20, rxdata; addr<=0x77; addr++) { if (i2c_read_timeout_us(bus->i2c, addr, &rxdata, 1, false, I2C_SCAN_TIMEOUT) >= 0) { - return (addr << 1); + if (list == NULL || size == 0) { + return (addr << 1); + } else if (idx < size) { + list[idx++] = (addr << 1); + } else { + break; + } } } - return 0; + return idx; } int cambus_enable(cambus_t *bus, bool enable) diff --git a/src/omv/ports/stm32/cambus.c b/src/omv/ports/stm32/cambus.c index 28b2d6e8e..e114b40b1 100644 --- a/src/omv/ports/stm32/cambus.c +++ b/src/omv/ports/stm32/cambus.c @@ -261,21 +261,30 @@ int cambus_deinit(cambus_t *bus) return 0; } -int cambus_scan(cambus_t *bus) +int cambus_scan(cambus_t *bus, uint8_t *list, uint8_t size) { + int idx = 0; for (uint8_t addr=0x09; addr<=0x77; addr++) { if (HAL_I2C_IsDeviceReady(bus->i2c, addr << 1, 10, I2C_SCAN_TIMEOUT) == HAL_OK) { - return (addr << 1); + if (list == NULL || size == 0) { + return (addr << 1); + } else if (idx < size) { + list[idx++] = (addr << 1); + } else { + break; + } } } #if defined(STM32H7) // After a failed scan the bus can get stuck. Re-initializing the bus fixes // it, but it seems disabling and re-enabling the bus is all that's needed. - __HAL_I2C_DISABLE(bus->i2c); - mp_hal_delay_ms(10); - __HAL_I2C_ENABLE(bus->i2c); + if (idx == 0) { + __HAL_I2C_DISABLE(bus->i2c); + mp_hal_delay_ms(10); + __HAL_I2C_ENABLE(bus->i2c); + } #endif - return 0; + return idx; } int cambus_enable(cambus_t *bus, bool enable)