Add set_gain/exposure/whitebalance functions.

* Add functions to disable auto functions control and set manual values.
This commit is contained in:
iabdalkader 2016-12-29 03:39:06 +02:00
parent c6ba893d3d
commit 1b22a29612
7 changed files with 134 additions and 96 deletions

View File

@ -607,28 +607,7 @@ static int set_colorbar(sensor_t *sensor, int enable)
return ret; return ret;
} }
static int set_whitebal(sensor_t *sensor, int enable) static int set_auto_gain(sensor_t *sensor, int enable, int gain)
{
int ret=0;
uint8_t reg;
/* Switch to SENSOR register bank */
ret |= SCCB_Write(sensor->slv_addr, BANK_SEL, BANK_SEL_DSP);
/* Update CTRL1 */
reg = SCCB_Read(sensor->slv_addr, CTRL1);
if (enable) {
reg |= CTRL1_AWB;
} else {
reg &= ~CTRL1_AWB;
}
ret |= SCCB_Write(sensor->slv_addr, CTRL1, reg);
return ret;
}
static int set_gain_ctrl(sensor_t *sensor, int enable)
{ {
int ret=0; int ret=0;
uint8_t reg; uint8_t reg;
@ -649,7 +628,7 @@ static int set_gain_ctrl(sensor_t *sensor, int enable)
return ret; return ret;
} }
static int set_exposure_ctrl(sensor_t *sensor, int enable) static int set_auto_exposure(sensor_t *sensor, int enable, int exposure)
{ {
int ret=0; int ret=0;
uint8_t reg; uint8_t reg;
@ -670,6 +649,28 @@ static int set_exposure_ctrl(sensor_t *sensor, int enable)
return ret; return ret;
} }
static int set_auto_whitebal(sensor_t *sensor, int enable, int r_gain, int g_gain, int b_gain)
{
int ret=0;
uint8_t reg;
/* Switch to SENSOR register bank */
ret |= SCCB_Write(sensor->slv_addr, BANK_SEL, BANK_SEL_DSP);
/* Update CTRL1 */
reg = SCCB_Read(sensor->slv_addr, CTRL1);
if (enable) {
reg |= CTRL1_AWB;
} else {
reg &= ~CTRL1_AWB;
}
ret |= SCCB_Write(sensor->slv_addr, CTRL1, reg);
return ret;
}
static int set_hmirror(sensor_t *sensor, int enable) static int set_hmirror(sensor_t *sensor, int enable)
{ {
int ret=0; int ret=0;
@ -725,9 +726,9 @@ int ov2640_init(sensor_t *sensor)
sensor->set_gainceiling = set_gainceiling; sensor->set_gainceiling = set_gainceiling;
sensor->set_quality = set_quality; sensor->set_quality = set_quality;
sensor->set_colorbar = set_colorbar; sensor->set_colorbar = set_colorbar;
sensor->set_gain_ctrl = set_gain_ctrl; sensor->set_auto_gain = set_auto_gain;
sensor->set_exposure_ctrl = set_exposure_ctrl; sensor->set_auto_exposure = set_auto_exposure;
sensor->set_whitebal = set_whitebal; sensor->set_auto_whitebal = set_auto_whitebal;
sensor->set_hmirror = set_hmirror; sensor->set_hmirror = set_hmirror;
sensor->set_vflip = set_vflip; sensor->set_vflip = set_vflip;

View File

@ -311,40 +311,69 @@ static int set_colorbar(sensor_t *sensor, int enable)
return ret; return ret;
} }
static int set_whitebal(sensor_t *sensor, int enable) static int set_auto_gain(sensor_t *sensor, int enable, int gain)
{ {
int ret=0;
// Read register COM8 // Read register COM8
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
// Set white bal on/off // Set AGC on/off
reg = COM8_SET_AWB(reg, enable);
// Write back register COM8
return SCCB_Write(sensor->slv_addr, COM8, reg);
}
static int set_gain_ctrl(sensor_t *sensor, int enable)
{
// Read register COM8
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
// Set white bal on/off
reg = COM8_SET_AGC(reg, enable); reg = COM8_SET_AGC(reg, enable);
// Write back register COM8 // Write back register COM8
return SCCB_Write(sensor->slv_addr, COM8, reg); ret |= SCCB_Write(sensor->slv_addr, COM8, reg);
if (enable == 0 && gain >= 0) {
// Set value manually.
ret |= SCCB_Write(sensor->slv_addr, GAIN, gain);
}
return ret;
} }
static int set_exposure_ctrl(sensor_t *sensor, int enable) static int set_auto_exposure(sensor_t *sensor, int enable, int exposure)
{ {
int ret=0;
// Read register COM8 // Read register COM8
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8); uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
// Set white bal on/off // Set AEC on/off
reg = COM8_SET_AEC(reg, enable); reg = COM8_SET_AEC(reg, enable);
// Write back register COM8 // Write back register COM8
return SCCB_Write(sensor->slv_addr, COM8, reg); ret |= SCCB_Write(sensor->slv_addr, COM8, reg);
if (enable == 0 && exposure >= 0) {
// Set value manually.
ret |= SCCB_Write(sensor->slv_addr, AEC, (exposure&0xFF));
ret |= SCCB_Write(sensor->slv_addr, AECH, ((exposure>>8)&0xFF));
}
return ret;
}
static int set_auto_whitebal(sensor_t *sensor, int enable, int r_gain, int g_gain, int b_gain)
{
int ret=0;
// Read register COM8
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
// Set AWB on/off
reg = COM8_SET_AWB(reg, enable);
// Write back register COM8
ret |= SCCB_Write(sensor->slv_addr, COM8, reg);
if (enable == 0 && r_gain >= 0 && g_gain >=0 && b_gain >=0) {
// Set value manually.
ret |= SCCB_Write(sensor->slv_addr, RED, r_gain);
ret |= SCCB_Write(sensor->slv_addr, GREEN, g_gain);
ret |= SCCB_Write(sensor->slv_addr, BLUE, b_gain);
}
return ret;
} }
static int set_hmirror(sensor_t *sensor, int enable) static int set_hmirror(sensor_t *sensor, int enable)
@ -414,9 +443,9 @@ int ov7725_init(sensor_t *sensor)
sensor->set_saturation= set_saturation; sensor->set_saturation= set_saturation;
sensor->set_gainceiling = set_gainceiling; sensor->set_gainceiling = set_gainceiling;
sensor->set_colorbar = set_colorbar; sensor->set_colorbar = set_colorbar;
sensor->set_whitebal = set_whitebal; sensor->set_auto_gain = set_auto_gain;
sensor->set_gain_ctrl = set_gain_ctrl; sensor->set_auto_exposure = set_auto_exposure;
sensor->set_exposure_ctrl = set_exposure_ctrl; sensor->set_auto_whitebal = set_auto_whitebal;
sensor->set_hmirror = set_hmirror; sensor->set_hmirror = set_hmirror;
sensor->set_vflip = set_vflip; sensor->set_vflip = set_vflip;
sensor->set_special_effect = set_special_effect; sensor->set_special_effect = set_special_effect;

View File

@ -343,18 +343,7 @@ static int set_gainceiling(sensor_t *sensor, gainceiling_t gainceiling)
return 0; return 0;
} }
static int set_whitebal(sensor_t *sensor, int enable) static int set_auto_gain(sensor_t *sensor, int enable, int gain)
{
uint8_t val;
val = SCCB_Read(sensor->slv_addr, REG_COM8);
SCCB_Write(sensor->slv_addr, REG_COM8,
enable ? (val | REG_COM8_AWB) : (val & ~REG_COM8_AWB));
return 0;
}
static int set_gain_ctrl(sensor_t *sensor, int enable)
{ {
uint8_t val; uint8_t val;
val = SCCB_Read(sensor->slv_addr, REG_COM8); val = SCCB_Read(sensor->slv_addr, REG_COM8);
@ -365,7 +354,7 @@ static int set_gain_ctrl(sensor_t *sensor, int enable)
return 0; return 0;
} }
static int set_exposure_ctrl(sensor_t *sensor, int enable) static int set_auto_exposure(sensor_t *sensor, int enable, int exposure)
{ {
uint8_t val; uint8_t val;
val = SCCB_Read(sensor->slv_addr, REG_COM8); val = SCCB_Read(sensor->slv_addr, REG_COM8);
@ -376,6 +365,17 @@ static int set_exposure_ctrl(sensor_t *sensor, int enable)
return 0; return 0;
} }
static int set_auto_whitebal(sensor_t *sensor, int enable, int r_gain, int g_gain, int b_gain)
{
uint8_t val;
val = SCCB_Read(sensor->slv_addr, REG_COM8);
SCCB_Write(sensor->slv_addr, REG_COM8,
enable ? (val | REG_COM8_AWB) : (val & ~REG_COM8_AWB));
return 0;
}
static int set_hmirror(sensor_t *sensor, int enable) static int set_hmirror(sensor_t *sensor, int enable)
{ {
uint8_t val; uint8_t val;
@ -407,9 +407,9 @@ int ov9650_init(sensor_t *sensor)
sensor->set_framerate = set_framerate; sensor->set_framerate = set_framerate;
sensor->set_brightness= set_brightness; sensor->set_brightness= set_brightness;
sensor->set_gainceiling = set_gainceiling; sensor->set_gainceiling = set_gainceiling;
sensor->set_whitebal = set_whitebal; sensor->set_auto_gain = set_auto_gain;
sensor->set_gain_ctrl = set_gain_ctrl; sensor->set_auto_exposure = set_auto_exposure;
sensor->set_exposure_ctrl = set_exposure_ctrl; sensor->set_auto_whitebal = set_auto_whitebal;
sensor->set_hmirror = set_hmirror; sensor->set_hmirror = set_hmirror;
sensor->set_vflip = set_vflip; sensor->set_vflip = set_vflip;

View File

@ -237,22 +237,29 @@ static mp_obj_t py_sensor_set_colorbar(mp_obj_t enable) {
return mp_const_true; return mp_const_true;
} }
static mp_obj_t py_sensor_set_whitebal(mp_obj_t enable) { static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
if (sensor_set_whitebal(mp_obj_is_true(enable)) != 0) { int enable = mp_obj_get_int(args[0]);
int value = py_helper_lookup_int(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_value), -1);
if (sensor_set_auto_gain(enable, value) != 0) {
return mp_const_false; return mp_const_false;
} }
return mp_const_true; return mp_const_true;
} }
static mp_obj_t py_sensor_set_gain_ctrl(mp_obj_t enable) { static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
if (sensor_set_gain_ctrl(mp_obj_is_true(enable)) != 0) { int enable = mp_obj_get_int(args[0]);
int value = py_helper_lookup_int(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_value), -1);
if (sensor_set_auto_exposure(enable, value) != 0) {
return mp_const_false; return mp_const_false;
} }
return mp_const_true; return mp_const_true;
} }
static mp_obj_t py_sensor_set_exposure_ctrl(mp_obj_t enable) { static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
if (sensor_set_exposure_ctrl(mp_obj_is_true(enable)) != 0) { int enable = mp_obj_get_int(args[0]);
int value[3] = {-1, -1, -1};
py_helper_lookup_int_array(kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_value), value, 3);
if (sensor_set_auto_whitebal(enable, value[0], value[1], value[2]) != 0) {
return mp_const_false; return mp_const_false;
} }
return mp_const_true; return mp_const_true;
@ -315,9 +322,9 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_brightness_obj, py_sensor_se
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_saturation_obj, py_sensor_set_saturation); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_saturation_obj, py_sensor_set_saturation);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_quality_obj, py_sensor_set_quality); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_quality_obj, py_sensor_set_quality);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_colorbar_obj, py_sensor_set_colorbar); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_colorbar_obj, py_sensor_set_colorbar);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_whitebal_obj, py_sensor_set_whitebal); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_gain_obj, 1,py_sensor_set_auto_gain);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_gain_ctrl_obj, py_sensor_set_gain_ctrl); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_exposure_obj,1,py_sensor_set_auto_exposure);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_exposure_ctrl_obj, py_sensor_set_exposure_ctrl); STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_sensor_set_auto_whitebal_obj,1,py_sensor_set_auto_whitebal);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_hmirror_obj, py_sensor_set_hmirror); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_hmirror_obj, py_sensor_set_hmirror);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vflip_obj, py_sensor_set_vflip); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_vflip_obj, py_sensor_set_vflip);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_special_effect_obj, py_sensor_set_special_effect); STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_special_effect_obj, py_sensor_set_special_effect);
@ -372,9 +379,9 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_saturation), (mp_obj_t)&py_sensor_set_saturation_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_saturation), (mp_obj_t)&py_sensor_set_saturation_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_quality), (mp_obj_t)&py_sensor_set_quality_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_quality), (mp_obj_t)&py_sensor_set_quality_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_colorbar), (mp_obj_t)&py_sensor_set_colorbar_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_colorbar), (mp_obj_t)&py_sensor_set_colorbar_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_whitebal), (mp_obj_t)&py_sensor_set_whitebal_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_gain), (mp_obj_t)&py_sensor_set_auto_gain_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_gain_ctrl), (mp_obj_t)&py_sensor_set_gain_ctrl_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_exposure), (mp_obj_t)&py_sensor_set_auto_exposure_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_exposure_ctrl), (mp_obj_t)&py_sensor_set_exposure_ctrl_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_auto_whitebal), (mp_obj_t)&py_sensor_set_auto_whitebal_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_hmirror), (mp_obj_t)&py_sensor_set_hmirror_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_hmirror), (mp_obj_t)&py_sensor_set_hmirror_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_vflip), (mp_obj_t)&py_sensor_set_vflip_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_vflip), (mp_obj_t)&py_sensor_set_vflip_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_special_effect), (mp_obj_t)&py_sensor_set_special_effect_obj }, { MP_OBJ_NEW_QSTR(MP_QSTR_set_special_effect), (mp_obj_t)&py_sensor_set_special_effect_obj },

View File

@ -172,6 +172,7 @@ Q(OV9650)
Q(OV2640) Q(OV2640)
Q(OV7725) Q(OV7725)
Q(line_filter) Q(line_filter)
Q(value)
//SDE //SDE
Q(NORMAL) Q(NORMAL)
@ -193,9 +194,9 @@ Q(set_brightness)
Q(set_saturation) Q(set_saturation)
Q(set_quality) Q(set_quality)
Q(set_colorbar) Q(set_colorbar)
Q(set_whitebal) Q(set_auto_gain)
Q(set_gain_ctrl) Q(set_auto_exposure)
Q(set_exposure_ctrl) Q(set_auto_whitebal)
Q(set_hmirror) Q(set_hmirror)
Q(set_vflip) Q(set_vflip)
Q(set_special_effect) Q(set_special_effect)

View File

@ -490,33 +490,33 @@ int sensor_set_colorbar(int enable)
return 0; return 0;
} }
int sensor_set_whitebal(int enable) int sensor_set_auto_gain(int enable, int gain)
{ {
/* call the sensor specific function */ /* call the sensor specific function */
if (sensor.set_whitebal == NULL if (sensor.set_auto_gain == NULL
|| sensor.set_whitebal(&sensor, enable) != 0) { || sensor.set_auto_gain(&sensor, enable, gain) != 0) {
/* operation not supported */ /* operation not supported */
return -1; return -1;
} }
return 0; return 0;
} }
int sensor_set_gain_ctrl(int enable) int sensor_set_auto_exposure(int enable, int exposure)
{ {
/* call the sensor specific function */ /* call the sensor specific function */
if (sensor.set_gain_ctrl == NULL if (sensor.set_auto_exposure == NULL
|| sensor.set_gain_ctrl(&sensor, enable) != 0) { || sensor.set_auto_exposure(&sensor, enable, exposure) != 0) {
/* operation not supported */ /* operation not supported */
return -1; return -1;
} }
return 0; return 0;
} }
int sensor_set_exposure_ctrl(int enable) int sensor_set_auto_whitebal(int enable, int r_gain, int g_gain, int b_gain)
{ {
/* call the sensor specific function */ /* call the sensor specific function */
if (sensor.set_exposure_ctrl == NULL if (sensor.set_auto_whitebal == NULL
|| sensor.set_exposure_ctrl(&sensor, enable) != 0) { || sensor.set_auto_whitebal(&sensor, enable, r_gain, g_gain, b_gain) != 0) {
/* operation not supported */ /* operation not supported */
return -1; return -1;
} }

View File

@ -122,9 +122,9 @@ typedef struct _sensor {
int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling); int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling);
int (*set_quality) (sensor_t *sensor, int quality); int (*set_quality) (sensor_t *sensor, int quality);
int (*set_colorbar) (sensor_t *sensor, int enable); int (*set_colorbar) (sensor_t *sensor, int enable);
int (*set_whitebal) (sensor_t *sensor, int enable); int (*set_auto_gain) (sensor_t *sensor, int enable, int gain);
int (*set_gain_ctrl) (sensor_t *sensor, int enable); int (*set_auto_exposure) (sensor_t *sensor, int enable, int exposure);
int (*set_exposure_ctrl) (sensor_t *sensor, int enable); int (*set_auto_whitebal) (sensor_t *sensor, int enable, int r_gain, int g_gain, int b_gain);
int (*set_hmirror) (sensor_t *sensor, int enable); int (*set_hmirror) (sensor_t *sensor, int enable);
int (*set_vflip) (sensor_t *sensor, int enable); int (*set_vflip) (sensor_t *sensor, int enable);
int (*set_special_effect) (sensor_t *sensor, sde_t sde); int (*set_special_effect) (sensor_t *sensor, sde_t sde);
@ -183,14 +183,14 @@ int sensor_set_quality(int qs);
// Enable/disable the colorbar mode. // Enable/disable the colorbar mode.
int sensor_set_colorbar(int enable); int sensor_set_colorbar(int enable);
// Enable/disable the whitebal mode. // Enable auto gain or set value manually.
int sensor_set_whitebal(int enable); int sensor_set_auto_gain(int enable, int gain);
// Enable/disable the agc mode. // Enable auto exposure or set value manually.
int sensor_set_gain_ctrl(int enable); int sensor_set_auto_exposure(int enable, int exposure);
// Enable/disable the aec mode. // Enable auto white balance or set value manually.
int sensor_set_exposure_ctrl(int enable); int sensor_set_auto_whitebal(int enable, int r_gain, int g_gain, int b_gain);
// Enable/disable the hmirror mode. // Enable/disable the hmirror mode.
int sensor_set_hmirror(int enable); int sensor_set_hmirror(int enable);