mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Add set_gain/exposure/whitebalance functions.
* Add functions to disable auto functions control and set manual values.
This commit is contained in:
parent
c6ba893d3d
commit
1b22a29612
@ -607,28 +607,7 @@ static int set_colorbar(sensor_t *sensor, int enable)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int set_whitebal(sensor_t *sensor, int enable)
|
||||
{
|
||||
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)
|
||||
static int set_auto_gain(sensor_t *sensor, int enable, int gain)
|
||||
{
|
||||
int ret=0;
|
||||
uint8_t reg;
|
||||
@ -649,7 +628,7 @@ static int set_gain_ctrl(sensor_t *sensor, int enable)
|
||||
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;
|
||||
uint8_t reg;
|
||||
@ -670,6 +649,28 @@ static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||
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)
|
||||
{
|
||||
int ret=0;
|
||||
@ -725,9 +726,9 @@ int ov2640_init(sensor_t *sensor)
|
||||
sensor->set_gainceiling = set_gainceiling;
|
||||
sensor->set_quality = set_quality;
|
||||
sensor->set_colorbar = set_colorbar;
|
||||
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||
sensor->set_whitebal = set_whitebal;
|
||||
sensor->set_auto_gain = set_auto_gain;
|
||||
sensor->set_auto_exposure = set_auto_exposure;
|
||||
sensor->set_auto_whitebal = set_auto_whitebal;
|
||||
sensor->set_hmirror = set_hmirror;
|
||||
sensor->set_vflip = set_vflip;
|
||||
|
||||
|
||||
@ -311,40 +311,69 @@ static int set_colorbar(sensor_t *sensor, int enable)
|
||||
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
|
||||
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||
|
||||
// Set white bal 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
|
||||
// Set AGC on/off
|
||||
reg = COM8_SET_AGC(reg, enable);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int set_auto_exposure(sensor_t *sensor, int enable, int exposure)
|
||||
{
|
||||
int ret=0;
|
||||
// Read register 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);
|
||||
|
||||
// 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)
|
||||
@ -414,9 +443,9 @@ int ov7725_init(sensor_t *sensor)
|
||||
sensor->set_saturation= set_saturation;
|
||||
sensor->set_gainceiling = set_gainceiling;
|
||||
sensor->set_colorbar = set_colorbar;
|
||||
sensor->set_whitebal = set_whitebal;
|
||||
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||
sensor->set_auto_gain = set_auto_gain;
|
||||
sensor->set_auto_exposure = set_auto_exposure;
|
||||
sensor->set_auto_whitebal = set_auto_whitebal;
|
||||
sensor->set_hmirror = set_hmirror;
|
||||
sensor->set_vflip = set_vflip;
|
||||
sensor->set_special_effect = set_special_effect;
|
||||
|
||||
@ -343,18 +343,7 @@ static int set_gainceiling(sensor_t *sensor, gainceiling_t gainceiling)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int set_whitebal(sensor_t *sensor, int enable)
|
||||
{
|
||||
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)
|
||||
static int set_auto_gain(sensor_t *sensor, int enable, int gain)
|
||||
{
|
||||
uint8_t val;
|
||||
val = SCCB_Read(sensor->slv_addr, REG_COM8);
|
||||
@ -365,7 +354,7 @@ static int set_gain_ctrl(sensor_t *sensor, int enable)
|
||||
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;
|
||||
val = SCCB_Read(sensor->slv_addr, REG_COM8);
|
||||
@ -376,6 +365,17 @@ static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||
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)
|
||||
{
|
||||
uint8_t val;
|
||||
@ -407,9 +407,9 @@ int ov9650_init(sensor_t *sensor)
|
||||
sensor->set_framerate = set_framerate;
|
||||
sensor->set_brightness= set_brightness;
|
||||
sensor->set_gainceiling = set_gainceiling;
|
||||
sensor->set_whitebal = set_whitebal;
|
||||
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||
sensor->set_auto_gain = set_auto_gain;
|
||||
sensor->set_auto_exposure = set_auto_exposure;
|
||||
sensor->set_auto_whitebal = set_auto_whitebal;
|
||||
sensor->set_hmirror = set_hmirror;
|
||||
sensor->set_vflip = set_vflip;
|
||||
|
||||
|
||||
@ -237,22 +237,29 @@ static mp_obj_t py_sensor_set_colorbar(mp_obj_t enable) {
|
||||
return mp_const_true;
|
||||
}
|
||||
|
||||
static mp_obj_t py_sensor_set_whitebal(mp_obj_t enable) {
|
||||
if (sensor_set_whitebal(mp_obj_is_true(enable)) != 0) {
|
||||
static mp_obj_t py_sensor_set_auto_gain(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
|
||||
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_true;
|
||||
}
|
||||
|
||||
static mp_obj_t py_sensor_set_gain_ctrl(mp_obj_t enable) {
|
||||
if (sensor_set_gain_ctrl(mp_obj_is_true(enable)) != 0) {
|
||||
static mp_obj_t py_sensor_set_auto_exposure(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
|
||||
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_true;
|
||||
}
|
||||
|
||||
static mp_obj_t py_sensor_set_exposure_ctrl(mp_obj_t enable) {
|
||||
if (sensor_set_exposure_ctrl(mp_obj_is_true(enable)) != 0) {
|
||||
static mp_obj_t py_sensor_set_auto_whitebal(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) {
|
||||
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_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_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_whitebal_obj, py_sensor_set_whitebal);
|
||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_gain_ctrl_obj, py_sensor_set_gain_ctrl);
|
||||
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_gain_obj, 1,py_sensor_set_auto_gain);
|
||||
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_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_vflip_obj, py_sensor_set_vflip);
|
||||
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_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_whitebal), (mp_obj_t)&py_sensor_set_whitebal_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_exposure_ctrl), (mp_obj_t)&py_sensor_set_exposure_ctrl_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_auto_exposure), (mp_obj_t)&py_sensor_set_auto_exposure_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_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 },
|
||||
|
||||
@ -172,6 +172,7 @@ Q(OV9650)
|
||||
Q(OV2640)
|
||||
Q(OV7725)
|
||||
Q(line_filter)
|
||||
Q(value)
|
||||
|
||||
//SDE
|
||||
Q(NORMAL)
|
||||
@ -193,9 +194,9 @@ Q(set_brightness)
|
||||
Q(set_saturation)
|
||||
Q(set_quality)
|
||||
Q(set_colorbar)
|
||||
Q(set_whitebal)
|
||||
Q(set_gain_ctrl)
|
||||
Q(set_exposure_ctrl)
|
||||
Q(set_auto_gain)
|
||||
Q(set_auto_exposure)
|
||||
Q(set_auto_whitebal)
|
||||
Q(set_hmirror)
|
||||
Q(set_vflip)
|
||||
Q(set_special_effect)
|
||||
|
||||
@ -490,33 +490,33 @@ int sensor_set_colorbar(int enable)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sensor_set_whitebal(int enable)
|
||||
int sensor_set_auto_gain(int enable, int gain)
|
||||
{
|
||||
/* call the sensor specific function */
|
||||
if (sensor.set_whitebal == NULL
|
||||
|| sensor.set_whitebal(&sensor, enable) != 0) {
|
||||
if (sensor.set_auto_gain == NULL
|
||||
|| sensor.set_auto_gain(&sensor, enable, gain) != 0) {
|
||||
/* operation not supported */
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sensor_set_gain_ctrl(int enable)
|
||||
int sensor_set_auto_exposure(int enable, int exposure)
|
||||
{
|
||||
/* call the sensor specific function */
|
||||
if (sensor.set_gain_ctrl == NULL
|
||||
|| sensor.set_gain_ctrl(&sensor, enable) != 0) {
|
||||
if (sensor.set_auto_exposure == NULL
|
||||
|| sensor.set_auto_exposure(&sensor, enable, exposure) != 0) {
|
||||
/* operation not supported */
|
||||
return -1;
|
||||
}
|
||||
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 */
|
||||
if (sensor.set_exposure_ctrl == NULL
|
||||
|| sensor.set_exposure_ctrl(&sensor, enable) != 0) {
|
||||
if (sensor.set_auto_whitebal == NULL
|
||||
|| sensor.set_auto_whitebal(&sensor, enable, r_gain, g_gain, b_gain) != 0) {
|
||||
/* operation not supported */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -122,9 +122,9 @@ typedef struct _sensor {
|
||||
int (*set_gainceiling) (sensor_t *sensor, gainceiling_t gainceiling);
|
||||
int (*set_quality) (sensor_t *sensor, int quality);
|
||||
int (*set_colorbar) (sensor_t *sensor, int enable);
|
||||
int (*set_whitebal) (sensor_t *sensor, int enable);
|
||||
int (*set_gain_ctrl) (sensor_t *sensor, int enable);
|
||||
int (*set_exposure_ctrl) (sensor_t *sensor, int enable);
|
||||
int (*set_auto_gain) (sensor_t *sensor, int enable, int gain);
|
||||
int (*set_auto_exposure) (sensor_t *sensor, int enable, int exposure);
|
||||
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_vflip) (sensor_t *sensor, int enable);
|
||||
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.
|
||||
int sensor_set_colorbar(int enable);
|
||||
|
||||
// Enable/disable the whitebal mode.
|
||||
int sensor_set_whitebal(int enable);
|
||||
// Enable auto gain or set value manually.
|
||||
int sensor_set_auto_gain(int enable, int gain);
|
||||
|
||||
// Enable/disable the agc mode.
|
||||
int sensor_set_gain_ctrl(int enable);
|
||||
// Enable auto exposure or set value manually.
|
||||
int sensor_set_auto_exposure(int enable, int exposure);
|
||||
|
||||
// Enable/disable the aec mode.
|
||||
int sensor_set_exposure_ctrl(int enable);
|
||||
// Enable auto white balance or set value manually.
|
||||
int sensor_set_auto_whitebal(int enable, int r_gain, int g_gain, int b_gain);
|
||||
|
||||
// Enable/disable the hmirror mode.
|
||||
int sensor_set_hmirror(int enable);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user