diff options
author | Erik Andr?n <erik.andren@gmail.com> | 2009-01-13 11:43:46 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-06-16 17:20:31 -0400 |
commit | dd9ce84a773f9c9919a3c59291e82ec0e8803ecc (patch) | |
tree | 5aef0741964f10547c6b38cc72be5b1ddf2ab47a | |
parent | 9ae165779720209d4c566c8102dce415a3c7f055 (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.c | 58 |
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); |
35 | static int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev, | 35 | static int po1030_get_auto_white_balance(struct gspca_dev *gspca_dev, |
36 | __s32 *val); | 36 | __s32 *val); |
37 | static int po1030_set_auto_exposure(struct gspca_dev *gspca_dev, | ||
38 | __s32 val); | ||
39 | static int po1030_get_auto_exposure(struct gspca_dev *gspca_dev, | ||
40 | __s32 *val); | ||
37 | 41 | ||
38 | static struct v4l2_pix_format po1030_modes[] = { | 42 | static 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 | ||
156 | static void po1030_dump_registers(struct sd *sd); | 175 | static 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 | ||
534 | static 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 | |||
545 | static 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 | |||
509 | void po1030_disconnect(struct sd *sd) | 563 | void po1030_disconnect(struct sd *sd) |
510 | { | 564 | { |
511 | sd->sensor = NULL; | 565 | sd->sensor = NULL; |