aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Andr?n <erik.andren@gmail.com>2009-01-13 11:43:46 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-06-16 17:20:31 -0400
commitdd9ce84a773f9c9919a3c59291e82ec0e8803ecc (patch)
tree5aef0741964f10547c6b38cc72be5b1ddf2ab47a
parent9ae165779720209d4c566c8102dce415a3c7f055 (diff)
V4L/DVB (11522): gspca - m5602-po1030: Add auto exposure control
Signed-off-by: Erik Andr?n <erik.andren@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/gspca/m5602/m5602_po1030.c58
1 files changed, 56 insertions, 2 deletions
diff --git a/drivers/media/video/gspca/m5602/m5602_po1030.c b/drivers/media/video/gspca/m5602/m5602_po1030.c
index 26ac619781c..e32d03a2cf9 100644
--- a/drivers/media/video/gspca/m5602/m5602_po1030.c
+++ b/drivers/media/video/gspca/m5602/m5602_po1030.c
@@ -34,6 +34,10 @@ static int po1030_set_auto_white_balance(struct gspca_dev *gspca_dev,
34 __s32 val); 34 __s32 val);
35static int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev, 35static int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev,
36 __s32 *val); 36 __s32 *val);
37static int po1030_set_auto_exposure(struct gspca_dev *gspca_dev,
38 __s32 val);
39static int po1030_get_auto_exposure(struct gspca_dev *gspca_dev,
40 __s32 *val);
37 41
38static struct v4l2_pix_format po1030_modes[] = { 42static struct v4l2_pix_format po1030_modes[] = {
39 { 43 {
@@ -150,7 +154,22 @@ const static struct ctrl po1030_ctrls[] = {
150 }, 154 },
151 .set = po1030_set_auto_white_balance, 155 .set = po1030_set_auto_white_balance,
152 .get = po1030_get_auto_white_balance 156 .get = po1030_get_auto_white_balance
153 } 157 },
158#define AUTO_EXPOSURE_IDX 7
159 {
160 {
161 .id = V4L2_CID_EXPOSURE_AUTO,
162 .type = V4L2_CTRL_TYPE_BOOLEAN,
163 .name = "auto exposure",
164 .minimum = 0,
165 .maximum = 1,
166 .step = 1,
167 .default_value = 0,
168 },
169 .set = po1030_set_auto_exposure,
170 .get = po1030_get_auto_exposure
171 },
172
154}; 173};
155 174
156static void po1030_dump_registers(struct sd *sd); 175static void po1030_dump_registers(struct sd *sd);
@@ -270,7 +289,12 @@ int po1030_init(struct sd *sd)
270 return err; 289 return err;
271 290
272 err = po1030_set_auto_white_balance(&sd->gspca_dev, 291 err = po1030_set_auto_white_balance(&sd->gspca_dev,
273 sensor_settings[AUTO_WHITE_BALANCE_IDX]); 292 sensor_settings[AUTO_WHITE_BALANCE_IDX]);
293 if (err < 0)
294 return err;
295
296 err = po1030_set_auto_exposure(&sd->gspca_dev,
297 sensor_settings[AUTO_EXPOSURE_IDX]);
274 return err; 298 return err;
275} 299}
276 300
@@ -501,11 +525,41 @@ static int po1030_set_auto_white_balance(struct gspca_dev *gspca_dev,
501 if (err < 0) 525 if (err < 0)
502 return err; 526 return err;
503 527
528 PDEBUG(D_V4L2, "Set auto white balance to %d", val);
504 i2c_data = (i2c_data & 0xfe) | (val & 0x01); 529 i2c_data = (i2c_data & 0xfe) | (val & 0x01);
505 err = m5602_write_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1); 530 err = m5602_write_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1);
506 return err; 531 return err;
507} 532}
508 533
534static int po1030_get_auto_exposure(struct gspca_dev *gspca_dev,
535 __s32 *val)
536{
537 struct sd *sd = (struct sd *) gspca_dev;
538 s32 *sensor_settings = sd->sensor_priv;
539
540 *val = sensor_settings[AUTO_EXPOSURE_IDX];
541 PDEBUG(D_V4L2, "Auto exposure is %d", *val);
542 return 0;
543}
544
545static int po1030_set_auto_exposure(struct gspca_dev *gspca_dev,
546 __s32 val)
547{
548 struct sd *sd = (struct sd *) gspca_dev;
549 s32 *sensor_settings = sd->sensor_priv;
550 u8 i2c_data;
551 int err;
552
553 sensor_settings[AUTO_EXPOSURE_IDX] = val;
554 err = m5602_read_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1);
555 if (err < 0)
556 return err;
557
558 PDEBUG(D_V4L2, "Set auto exposure to %d", val);
559 i2c_data = (i2c_data & 0xfd) | ((val & 0x01) << 1);
560 return m5602_write_sensor(sd, PO1030_AUTOCTRL1, &i2c_data, 1);
561}
562
509void po1030_disconnect(struct sd *sd) 563void po1030_disconnect(struct sd *sd)
510{ 564{
511 sd->sensor = NULL; 565 sd->sensor = NULL;