From 33db84ebdccb05c1d42543ab483a5d5453711af3 Mon Sep 17 00:00:00 2001 From: "Kwabena W. Agyeman" Date: Sun, 10 Sep 2023 14:24:45 -0700 Subject: [PATCH] sensors/ov7725: Add controls for blc. --- src/omv/sensors/ov7725.c | 29 +++++++++++++++++++++++++++++ src/omv/sensors/ov7725_regs.h | 1 + 2 files changed, 30 insertions(+) diff --git a/src/omv/sensors/ov7725.c b/src/omv/sensors/ov7725.c index 6a335d920..ed312d7e4 100644 --- a/src/omv/sensors/ov7725.c +++ b/src/omv/sensors/ov7725.c @@ -545,6 +545,32 @@ static int get_rgb_gain_db(sensor_t *sensor, float *r_gain_db, float *g_gain_db, return ret; } +static int set_auto_blc(sensor_t *sensor, int enable, int *regs) { + uint8_t reg; + int ret = omv_i2c_readb(&sensor->i2c_bus, sensor->slv_addr, COM13, ®); + ret |= omv_i2c_writeb(&sensor->i2c_bus, sensor->slv_addr, COM13, COM13_SET_BLC(reg, (enable != 0))); + + if ((enable == 0) && (regs != NULL)) { + for (uint32_t i = 0; i < sensor->hw_flags.blc_size; i++) { + ret |= omv_i2c_writeb(&sensor->i2c_bus, sensor->slv_addr, ADOFF_B + i, regs[i]); + } + } + + return ret; +} + +static int get_blc_regs(sensor_t *sensor, int *regs) { + int ret = 0; + + for (uint32_t i = 0; i < sensor->hw_flags.blc_size; i++) { + uint8_t reg; + ret |= omv_i2c_readb(&sensor->i2c_bus, sensor->slv_addr, ADOFF_B + i, ®); + regs[i] = reg; + } + + return ret; +} + static int set_hmirror(sensor_t *sensor, int enable) { uint8_t reg; int ret = omv_i2c_readb(&sensor->i2c_bus, sensor->slv_addr, COM3, ®); @@ -611,6 +637,8 @@ int ov7725_init(sensor_t *sensor) { sensor->get_exposure_us = get_exposure_us; sensor->set_auto_whitebal = set_auto_whitebal; sensor->get_rgb_gain_db = get_rgb_gain_db; + sensor->set_auto_blc = set_auto_blc; + sensor->get_blc_regs = get_blc_regs; sensor->set_hmirror = set_hmirror; sensor->set_vflip = set_vflip; sensor->set_special_effect = set_special_effect; @@ -625,6 +653,7 @@ int ov7725_init(sensor_t *sensor) { sensor->hw_flags.gs_bpp = 2; sensor->hw_flags.rgb_swap = 1; sensor->hw_flags.yuv_order = SENSOR_HW_FLAGS_YVU422; + sensor->hw_flags.blc_size = 8; return 0; } diff --git a/src/omv/sensors/ov7725_regs.h b/src/omv/sensors/ov7725_regs.h index 550127d54..b85aed7c7 100644 --- a/src/omv/sensors/ov7725_regs.h +++ b/src/omv/sensors/ov7725_regs.h @@ -184,6 +184,7 @@ #define COM13_ADC_EN 0x40 /* ADC channel BLC ON/OFF control */ #define COM13_ANALOG_BLC 0x20 /* Analog processing channel BLC ON/OFF control */ #define COM13_ABLC_GAIN_EN 0x04 /* ABLC gain trigger enable */ +#define COM13_SET_BLC(r, x) ((r & 0x7F) | ((x & 0x1) << 7)) #define COM14 0x3F /* Common Control 14 */ #define COM15 0x40 /* Common Control 15 */