Update sensor drivers

* Add set_contrast
* Fix set_brightness
This commit is contained in:
iabdalkader 2014-06-19 23:19:11 +02:00
parent 06ed1c0a53
commit 64b883ceaf
5 changed files with 80 additions and 17 deletions

View File

@ -272,6 +272,16 @@ static const uint8_t br_regs[NUM_BR_LEVELS + 1][5] = {
{ 0x00, 0x04, 0x09, 0x40, 0x00 }, /* +2 */
};
#define NUM_CONT_LEVELS (5)
static const uint8_t cont_regs[NUM_BR_LEVELS + 1][7] = {
{ BPADDR, BPDATA, BPADDR, BPDATA, BPDATA, BPDATA, BPDATA },
{ 0x00, 0x04, 0x07, 0x20, 0x28, 0x0c, 0x06 }, /* -2 */
{ 0x00, 0x04, 0x07, 0x20, 0x24, 0x16, 0x06 }, /* -1 */
{ 0x00, 0x04, 0x07, 0x20, 0x20, 0x20, 0x06 }, /* 0 */
{ 0x00, 0x04, 0x07, 0x20, 0x1c, 0x2a, 0x06 }, /* +1 */
{ 0x00, 0x04, 0x07, 0x20, 0x18, 0x34, 0x06 }, /* +2 */
};
static int reset()
{
int i=0;
@ -350,9 +360,9 @@ static int set_framerate(enum sensor_framerate framerate)
return 0;
}
static int set_brightness(uint8_t level)
static int set_brightness(int level)
{
int i, ret=0;
int ret=0;
level += (NUM_BR_LEVELS / 2 + 1);
if (level < 0 || level > NUM_BR_LEVELS) {
@ -363,7 +373,7 @@ static int set_brightness(uint8_t level)
ret |= SCCB_Write(R_BYPASS, R_BYPASS_DSP_BYPAS);
/* Write brightness registers */
for (i=0; i<sizeof(br_regs[0])/sizeof(br_regs[0][0]); i++) {
for (int i=0; i<sizeof(br_regs[0])/sizeof(br_regs[0][0]); i++) {
ret |= SCCB_Write(br_regs[0][i], br_regs[level][i]);
}
@ -373,7 +383,30 @@ static int set_brightness(uint8_t level)
return ret;
}
static int set_exposure(uint16_t exposure)
static int set_contrast(int level)
{
int ret=0;
level += (NUM_CONT_LEVELS / 2 + 1);
if (level < 0 || level > NUM_CONT_LEVELS) {
return -1;
}
/* Disable DSP */
ret |= SCCB_Write(BANK_SEL, BANK_SEL_DSP);
ret |= SCCB_Write(R_BYPASS, R_BYPASS_DSP_BYPAS);
/* Write contrast registers */
for (int i=0; i<sizeof(cont_regs[0])/sizeof(cont_regs[0][0]); i++) {
ret |= SCCB_Write(cont_regs[0][i], cont_regs[level][i]);
}
/* Enable DSP */
ret |= SCCB_Write(BANK_SEL, BANK_SEL_DSP);
ret |= SCCB_Write(R_BYPASS, R_BYPASS_USE_DSP);
return ret;
}
static int set_exposure(int exposure)
{
return 0;
}
@ -409,6 +442,7 @@ int ov2640_init(struct sensor_dev *sensor)
sensor->set_pixformat = set_pixformat;
sensor->set_framesize = set_framesize;
sensor->set_framerate = set_framerate;
sensor->set_contrast = set_contrast;
sensor->set_brightness= set_brightness;
sensor->set_exposure = set_exposure;
sensor->set_gainceiling = set_gainceiling;

View File

@ -284,10 +284,9 @@ static int set_framerate(enum sensor_framerate framerate)
return 0;
}
static int set_brightness(uint8_t level)
static int set_brightness(int level)
{
int i;
// int8_t lvl = (int8_t) level;
static uint8_t regs[NUM_BR_LEVELS + 1][3] = {
{ REG_AEW, REG_AEB, REG_VPT },
@ -312,7 +311,7 @@ static int set_brightness(uint8_t level)
return 0;
}
static int set_exposure(uint16_t exposure)
static int set_exposure(int exposure)
{
uint8_t val;
val = SCCB_Read(REG_COM1);

View File

@ -10,7 +10,8 @@ static mp_obj_t py_sensor_reset() {
sensor_set_framesize(FRAMESIZE_QQVGA);
sensor_set_framerate(FRAMERATE_30FPS);
sensor_set_gainceiling(GAINCEILING_8X);
sensor_set_brightness(-2);
sensor_set_contrast(0);
sensor_set_brightness(0);
return mp_const_none;
}
@ -105,6 +106,13 @@ static mp_obj_t py_sensor_set_brightness(mp_obj_t brightness) {
return mp_const_true;
}
static mp_obj_t py_sensor_set_contrast(mp_obj_t contrast) {
if (sensor_set_contrast(mp_obj_get_int(contrast)) != 0) {
return mp_const_false;
}
return mp_const_true;
}
static mp_obj_t py_sensor_write_reg(mp_obj_t addr, mp_obj_t val) {
SCCB_Write(mp_obj_get_int(addr), mp_obj_get_int(val));
return mp_const_none;
@ -128,6 +136,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_pixformat_obj, py_sensor_set_pi
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framerate_obj, py_sensor_set_framerate);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_framesize_obj, py_sensor_set_framesize);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_gainceiling_obj, py_sensor_set_gainceiling);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_contrast_obj, py_sensor_set_contrast);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_set_brightness_obj, py_sensor_set_brightness);
STATIC MP_DEFINE_CONST_FUN_OBJ_2(py_sensor_write_reg_obj, py_sensor_write_reg);
STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_sensor_read_reg_obj, py_sensor_read_reg);
@ -155,6 +164,7 @@ STATIC const mp_map_elem_t globals_dict_table[] = {
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_framerate), (mp_obj_t)&py_sensor_set_framerate_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_framesize), (mp_obj_t)&py_sensor_set_framesize_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_gainceiling), (mp_obj_t)&py_sensor_set_gainceiling_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_contrast), (mp_obj_t)&py_sensor_set_contrast_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR_set_brightness), (mp_obj_t)&py_sensor_set_brightness_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___write_reg), (mp_obj_t)&py_sensor_write_reg_obj },
{ MP_OBJ_NEW_QSTR(MP_QSTR___read_reg), (mp_obj_t)&py_sensor_read_reg_obj },
@ -183,7 +193,8 @@ const mp_obj_module_t *py_sensor_init()
sensor_set_framesize(FRAMESIZE_QQVGA);
sensor_set_framerate(FRAMERATE_30FPS);
sensor_set_gainceiling(GAINCEILING_8X);
sensor_set_brightness(-2);
sensor_set_contrast(0);
sensor_set_brightness(0);
return &py_sensor_module;
}

View File

@ -489,13 +489,23 @@ int sensor_set_framerate(enum sensor_framerate framerate)
return 0;
}
int sensor_set_brightness(uint8_t level)
int sensor_set_brightness(int level)
{
sensor.set_brightness(level);
return 0;
if (sensor.set_brightness != NULL) {
return sensor.set_brightness(level);
}
return -1;
}
int sensor_set_exposure(uint16_t exposure)
int sensor_set_contrast(int level)
{
if (sensor.set_contrast != NULL) {
return sensor.set_contrast(level);
}
return -1;
}
int sensor_set_exposure(int exposure)
{
return 0;
}

View File

@ -87,8 +87,9 @@ struct sensor_dev {
int (*set_pixformat) (enum sensor_pixformat pixformat);
int (*set_framesize) (enum sensor_framesize framesize);
int (*set_framerate) (enum sensor_framerate framerate);
int (*set_brightness) (uint8_t level);
int (*set_exposure) (uint16_t exposure);
int (*set_brightness) (int level);
int (*set_contrast) (int level);
int (*set_exposure) (int exposure);
int (*set_gainceiling) (enum sensor_gainceiling gainceiling);
};
@ -166,7 +167,15 @@ int sensor_set_framerate(enum sensor_framerate framerate);
* @param level The new brightness level allowed values from -3 to +3.
* @return On success, 0 is returned. If the operation not supported by the sensor, -1 is returned.
*/
int sensor_set_brightness(uint8_t level);
int sensor_set_brightness(int level);
/**
* Set the sensor contrast level.
*
* @param sensor A pointer to the sensor device handle.
* @param level The new contrast level allowed values from -3 to +3.
* @return On success, 0 is returned. If the operation not supported by the sensor, -1 is returned.
*/
int sensor_set_contrast(int level);
/**
* Set the sensor exposure level. This function has no
* effect when AEC (Automatic Exposure Control) is enabled.
@ -175,7 +184,7 @@ int sensor_set_brightness(uint8_t level);
* @param exposure The new exposure level.
* @return On success, 0 is returned. If the operation not supported by the sensor, -1 is returned.
*/
int sensor_set_exposure(uint16_t exposure);
int sensor_set_exposure(int exposure);
/**
* Set the sensor AGC gain ceiling.
*