diff options
author | Erik Andr?n <erik.andren@gmail.com> | 2009-01-13 07:57:57 +0100 |
---|---|---|
committer | Erik Andr?n <erik.andren@gmail.com> | 2009-01-13 07:57:57 +0100 |
commit | fee49c6d61fd792a28607edfc4b1a59136b7425c (patch) | |
tree | 424b9d45a899137eb0b18bac4e8e48fc544b5e9d /linux/drivers | |
parent | 28801b0a659f3572bb85b14275bd6f42cc7cca24 (diff) | |
download | mediapointer-dvb-s2-fee49c6d61fd792a28607edfc4b1a59136b7425c.tar.gz mediapointer-dvb-s2-fee49c6d61fd792a28607edfc4b1a59136b7425c.tar.bz2 |
gspca - m5602-ov9650: Add auto exposure ctrl
From: Erik Andr?n <erik.andren@gmail.com>
Priority: normal
Signed-off-by: Erik Andr?n <erik.andren@gmail.com>
Diffstat (limited to 'linux/drivers')
-rw-r--r-- | linux/drivers/media/video/gspca/m5602/m5602_ov9650.c | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/linux/drivers/media/video/gspca/m5602/m5602_ov9650.c b/linux/drivers/media/video/gspca/m5602/m5602_ov9650.c index be59fe7af..d6a666b86 100644 --- a/linux/drivers/media/video/gspca/m5602/m5602_ov9650.c +++ b/linux/drivers/media/video/gspca/m5602/m5602_ov9650.c @@ -36,6 +36,8 @@ static int ov9650_set_auto_white_balance(struct gspca_dev *gspca_dev, __s32 val); static int ov9650_get_auto_gain(struct gspca_dev *gspca_dev, __s32 *val); static int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val); +static int ov9650_get_auto_exposure(struct gspca_dev *gspca_dev, __s32 *val); +static int ov9650_set_auto_exposure(struct gspca_dev *gspca_dev, __s32 val); /* Vertically and horizontally flips the image if matched, needed for machines where the sensor is mounted upside down */ @@ -203,7 +205,22 @@ const static struct ctrl ov9650_ctrls[] = { }, .set = ov9650_set_auto_gain, .get = ov9650_get_auto_gain + }, +#define AUTO_EXPOSURE_IDX 8 + { + { + .id = V4L2_CID_EXPOSURE_AUTO, + .type = V4L2_CTRL_TYPE_BOOLEAN, + .name = "auto exposure", + .minimum = 0, + .maximum = 1, + .step = 1, + .default_value = 1 + }, + .set = ov9650_set_auto_exposure, + .get = ov9650_get_auto_exposure } + }; static struct v4l2_pix_format ov9650_modes[] = { @@ -358,13 +375,18 @@ int ov9650_init(struct sd *sd) if (err < 0) return err; + err = ov9650_set_auto_exposure(&sd->gspca_dev, + sensor_settings[AUTO_EXPOSURE_IDX]); + if (err < 0) + return err; + err = ov9650_set_auto_white_balance(&sd->gspca_dev, sensor_settings[AUTO_WHITE_BALANCE_IDX]); if (err < 0) return err; err = ov9650_set_auto_gain(&sd->gspca_dev, - sensor_settings[AUTO_GAIN_CTRL_IDX]); + sensor_settings[AUTO_GAIN_CTRL_IDX]); return err; } @@ -701,6 +723,36 @@ static int ov9650_set_vflip(struct gspca_dev *gspca_dev, __s32 val) return err; } +static int ov9650_get_auto_exposure(struct gspca_dev *gspca_dev, __s32 *val) +{ + struct sd *sd = (struct sd *) gspca_dev; + s32 *sensor_settings = sd->sensor_priv; + + *val = sensor_settings[AUTO_EXPOSURE_IDX]; + PDEBUG(D_V4L2, "Read auto exposure control %d", *val); + return 0; +} + +static int ov9650_set_auto_exposure(struct gspca_dev *gspca_dev, + __s32 val) +{ + int err; + u8 i2c_data; + struct sd *sd = (struct sd *) gspca_dev; + s32 *sensor_settings = sd->sensor_priv; + + PDEBUG(D_V4L2, "Set auto exposure control to %d", val); + + sensor_settings[AUTO_EXPOSURE_IDX] = val; + err = m5602_read_sensor(sd, OV9650_COM8, &i2c_data, 1); + if (err < 0) + return err; + + i2c_data = ((i2c_data & 0xfe) | ((val & 0x01) << 0)); + + return m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1); +} + static int ov9650_get_auto_white_balance(struct gspca_dev *gspca_dev, __s32 *val) { @@ -757,9 +809,8 @@ static int ov9650_set_auto_gain(struct gspca_dev *gspca_dev, __s32 val) return err; i2c_data = ((i2c_data & 0xfb) | ((val & 0x01) << 2)); - err = m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1); - return err; + return m5602_write_sensor(sd, OV9650_COM8, &i2c_data, 1); } static void ov9650_dump_registers(struct sd *sd) |