drivers/video/isx019: Fix white balance control and capability
This commit is contained in:
parent
d57324473e
commit
5e4e8f6809
@ -282,6 +282,7 @@ static int isx019_get_value(uint32_t id, uint32_t size,
|
|||||||
static int isx019_set_value(uint32_t id, uint32_t size,
|
static int isx019_set_value(uint32_t id, uint32_t size,
|
||||||
imgsensor_value_t value);
|
imgsensor_value_t value);
|
||||||
static int initialize_jpg_quality(void);
|
static int initialize_jpg_quality(void);
|
||||||
|
static void initialize_wbmode(void);
|
||||||
static int send_read_cmd(FAR struct i2c_config_s *config,
|
static int send_read_cmd(FAR struct i2c_config_s *config,
|
||||||
uint8_t cat,
|
uint8_t cat,
|
||||||
uint16_t addr,
|
uint16_t addr,
|
||||||
@ -770,7 +771,7 @@ int32_t g_isx019_wbmode[] =
|
|||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int fpga_i2c_write(uint8_t addr, FAR uint8_t *data, uint8_t size)
|
static int fpga_i2c_write(uint8_t addr, FAR uint8_t *data, uint8_t size)
|
||||||
{
|
{
|
||||||
struct i2c_config_s config;
|
struct i2c_config_s config;
|
||||||
static uint8_t buf[FPGA_I2C_REGSIZE_MAX + FPGA_I2C_REGADDR_LEN];
|
static uint8_t buf[FPGA_I2C_REGSIZE_MAX + FPGA_I2C_REGADDR_LEN];
|
||||||
@ -1211,6 +1212,7 @@ static int isx019_init(void)
|
|||||||
power_on();
|
power_on();
|
||||||
set_drive_mode();
|
set_drive_mode();
|
||||||
fpga_init();
|
fpga_init();
|
||||||
|
initialize_wbmode();
|
||||||
initialize_jpg_quality();
|
initialize_jpg_quality();
|
||||||
store_default_value();
|
store_default_value();
|
||||||
clk = board_isx019_get_master_clock();
|
clk = board_isx019_get_master_clock();
|
||||||
@ -1423,7 +1425,7 @@ static int activate_clip(imgsensor_stream_type_t type,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* 640 */
|
case 640:
|
||||||
if (clip->width == 640)
|
if (clip->width == 640)
|
||||||
{
|
{
|
||||||
/* In this case, clip->height == 360 */
|
/* In this case, clip->height == 360 */
|
||||||
@ -1451,6 +1453,13 @@ static int activate_clip(imgsensor_stream_type_t type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default: /* Otherwise, clear clip setting. */
|
||||||
|
size = FPGA_CLIP_NON;
|
||||||
|
top = 0;
|
||||||
|
left = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fpga_i2c_write(FPGA_CLIP_SIZE, &size, 1);
|
fpga_i2c_write(FPGA_CLIP_SIZE, &size, 1);
|
||||||
@ -1512,30 +1521,27 @@ static int isx019_start_capture(imgsensor_stream_type_t type,
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (fmt[IMGSENSOR_FMT_MAIN].width)
|
switch (fmt[IMGSENSOR_FMT_MAIN].width)
|
||||||
{
|
{
|
||||||
case 1280:
|
case 1280:
|
||||||
regval |= FPGA_SCALE_1280_960;
|
regval |= FPGA_SCALE_1280_960;
|
||||||
activate_clip(type,
|
break;
|
||||||
fmt[IMGSENSOR_FMT_MAIN].width,
|
|
||||||
fmt[IMGSENSOR_FMT_MAIN].height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 640:
|
case 640:
|
||||||
regval |= FPGA_SCALE_640_480;
|
regval |= FPGA_SCALE_640_480;
|
||||||
activate_clip(type,
|
break;
|
||||||
fmt[IMGSENSOR_FMT_MAIN].width,
|
|
||||||
fmt[IMGSENSOR_FMT_MAIN].height);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 320:
|
case 320:
|
||||||
regval |= FPGA_SCALE_320_240;
|
regval |= FPGA_SCALE_320_240;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: /* 160 */
|
default: /* 160 */
|
||||||
|
regval |= FPGA_SCALE_160_120;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
regval |= FPGA_SCALE_160_120;
|
activate_clip(type,
|
||||||
break;
|
fmt[IMGSENSOR_FMT_MAIN].width,
|
||||||
}
|
fmt[IMGSENSOR_FMT_MAIN].height);
|
||||||
|
|
||||||
fpga_i2c_write(FPGA_FORMAT_AND_SCALE, ®val, 1);
|
fpga_i2c_write(FPGA_FORMAT_AND_SCALE, ®val, 1);
|
||||||
|
|
||||||
@ -1894,16 +1900,6 @@ static int32_t convert_hue_reg2is(int32_t val)
|
|||||||
return (val * 128) / 90;
|
return (val * 128) / 90;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t convert_awb_is2reg(int32_t val)
|
|
||||||
{
|
|
||||||
return (val == 1) ? 0 : 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t convert_awb_reg2is(int32_t val)
|
|
||||||
{
|
|
||||||
return (val == 0) ? 1 : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t convert_hdr_is2reg(int32_t val)
|
static int32_t convert_hdr_is2reg(int32_t val)
|
||||||
{
|
{
|
||||||
int32_t ret = AEWDMODE_AUTO;
|
int32_t ret = AEWDMODE_AUTO;
|
||||||
@ -1985,11 +1981,6 @@ static convert_t get_reginfo(uint32_t id, bool is_set,
|
|||||||
cvrt = is_set ? convert_hue_is2reg : convert_hue_reg2is;
|
cvrt = is_set ? convert_hue_is2reg : convert_hue_reg2is;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IMGSENSOR_ID_AUTO_WHITE_BALANCE:
|
|
||||||
SET_REGINFO(reg, CAT_CATAWB, AWBMODE, 1);
|
|
||||||
cvrt = is_set ? convert_awb_is2reg : convert_awb_reg2is;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case IMGSENSOR_ID_EXPOSURE:
|
case IMGSENSOR_ID_EXPOSURE:
|
||||||
SET_REGINFO(reg, CAT_AEDGRM, EVSEL, 1);
|
SET_REGINFO(reg, CAT_AEDGRM, EVSEL, 1);
|
||||||
cvrt = not_convert;
|
cvrt = not_convert;
|
||||||
@ -2147,7 +2138,18 @@ static int set_exptime(imgsensor_value_t val)
|
|||||||
return isx019_i2c_write(CAT_CATAE, SHT_PRIMODE, (FAR uint8_t *)®val, 4);
|
return isx019_i2c_write(CAT_CATAE, SHT_PRIMODE, (FAR uint8_t *)®val, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int set_wbmode(imgsensor_value_t val)
|
static int set_awb_hold(void)
|
||||||
|
{
|
||||||
|
uint8_t mode = AWBMODE_HOLD;
|
||||||
|
return isx019_i2c_write(CAT_CATAWB, AWBMODE, &mode, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void initialize_wbmode(void)
|
||||||
|
{
|
||||||
|
g_isx019_private.wb_mode = IMGSENSOR_WHITE_BALANCE_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int update_wbmode_reg(int32_t val)
|
||||||
{
|
{
|
||||||
/* AWBMODE mode0 : auto, mode4 : user defined white balance
|
/* AWBMODE mode0 : auto, mode4 : user defined white balance
|
||||||
* AWBUSER_NO definition number for AWBMODE = mode4
|
* AWBUSER_NO definition number for AWBMODE = mode4
|
||||||
@ -2175,7 +2177,7 @@ static int set_wbmode(imgsensor_value_t val)
|
|||||||
toggle = true;
|
toggle = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (val.value32)
|
switch (val)
|
||||||
{
|
{
|
||||||
case IMGSENSOR_WHITE_BALANCE_AUTO:
|
case IMGSENSOR_WHITE_BALANCE_AUTO:
|
||||||
mode = AWBMODE_AUTO;
|
mode = AWBMODE_AUTO;
|
||||||
@ -2217,7 +2219,53 @@ static int set_wbmode(imgsensor_value_t val)
|
|||||||
isx019_i2c_write(CAT_CATAWB, AWBUSER_NO, (FAR uint8_t *)&toggle, 1);
|
isx019_i2c_write(CAT_CATAWB, AWBUSER_NO, (FAR uint8_t *)&toggle, 1);
|
||||||
isx019_i2c_write(CAT_CATAWB, AWBMODE, &mode, 1);
|
isx019_i2c_write(CAT_CATAWB, AWBMODE, &mode, 1);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool is_awb_enable(void)
|
||||||
|
{
|
||||||
|
uint8_t mode = AWBMODE_AUTO;
|
||||||
|
|
||||||
|
isx019_i2c_read(CAT_CATAWB, AWBMODE, &mode, 1);
|
||||||
|
|
||||||
|
return mode != AWBMODE_HOLD;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_wbmode(imgsensor_value_t val)
|
||||||
|
{
|
||||||
|
/* Update register only if IMGSENSOR_ID_AUTO_WHITE_BALANCE = 1. */
|
||||||
|
|
||||||
|
if (is_awb_enable())
|
||||||
|
{
|
||||||
|
update_wbmode_reg(val.value32);
|
||||||
|
}
|
||||||
|
|
||||||
g_isx019_private.wb_mode = val.value32;
|
g_isx019_private.wb_mode = val.value32;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_awb(imgsensor_value_t val)
|
||||||
|
{
|
||||||
|
/* true -> false : Update regster to HOLD
|
||||||
|
* false -> true : Update register
|
||||||
|
* with IMGSENSOR_ID_AUTO_N_PRESET_WB setting
|
||||||
|
* otherwise : Nothing to do
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (is_awb_enable())
|
||||||
|
{
|
||||||
|
if (val.value32 == 0)
|
||||||
|
{
|
||||||
|
set_awb_hold();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (val.value32 == 1)
|
||||||
|
{
|
||||||
|
update_wbmode_reg(g_isx019_private.wb_mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@ -2644,6 +2692,10 @@ static setvalue_t set_value_func(uint32_t id)
|
|||||||
func = set_exptime;
|
func = set_exptime;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMGSENSOR_ID_AUTO_WHITE_BALANCE:
|
||||||
|
func = set_awb;
|
||||||
|
break;
|
||||||
|
|
||||||
case IMGSENSOR_ID_AUTO_N_PRESET_WB:
|
case IMGSENSOR_ID_AUTO_N_PRESET_WB:
|
||||||
func = set_wbmode;
|
func = set_wbmode;
|
||||||
break;
|
break;
|
||||||
@ -2687,7 +2739,7 @@ static setvalue_t set_value_func(uint32_t id)
|
|||||||
return func;
|
return func;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t get_flip(uint8_t *flip, uint8_t direction)
|
static int32_t get_flip(FAR uint8_t *flip, uint8_t direction)
|
||||||
{
|
{
|
||||||
DEBUGASSERT(flip);
|
DEBUGASSERT(flip);
|
||||||
|
|
||||||
@ -2782,6 +2834,18 @@ static int get_exptime(FAR imgsensor_value_t *val)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int get_awb(FAR imgsensor_value_t *val)
|
||||||
|
{
|
||||||
|
if (val == NULL)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
val->value32 = is_awb_enable();
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
static int get_wbmode(FAR imgsensor_value_t *val)
|
static int get_wbmode(FAR imgsensor_value_t *val)
|
||||||
{
|
{
|
||||||
if (val == NULL)
|
if (val == NULL)
|
||||||
@ -3032,6 +3096,10 @@ static getvalue_t get_value_func(uint32_t id)
|
|||||||
func = get_exptime;
|
func = get_exptime;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IMGSENSOR_ID_AUTO_WHITE_BALANCE:
|
||||||
|
func = get_awb;
|
||||||
|
break;
|
||||||
|
|
||||||
case IMGSENSOR_ID_AUTO_N_PRESET_WB:
|
case IMGSENSOR_ID_AUTO_N_PRESET_WB:
|
||||||
func = get_wbmode;
|
func = get_wbmode;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user