diff options
author | Max Thrun <bear24rw@gmail.com> | 2010-02-27 15:20:21 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-05-17 23:46:55 -0400 |
commit | f2938822523739e99a39fd634943865a432e9c00 (patch) | |
tree | 996d2abb4d3a5db0193b76e465075feb84ff2214 /drivers/media/video/gspca/ov534.c | |
parent | 8b7fbda484176b46a7760fd474d605ca5152c86d (diff) |
V4L/DVB: gspca - ov534: Add Auto Exposure
This also makes manual exposure actually work: it never worked before
because AEC was always enabled.
Signed-off-by: Max Thrun <bear24rw@gmail.com>
Signed-off-by: Antonio Ospite <ospite@studenti.unina.it>
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/ov534.c')
-rw-r--r-- | drivers/media/video/gspca/ov534.c | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c index 4058e224d6a4..2d8965003077 100644 --- a/drivers/media/video/gspca/ov534.c +++ b/drivers/media/video/gspca/ov534.c | |||
@@ -62,6 +62,7 @@ struct sd { | |||
62 | u8 exposure; | 62 | u8 exposure; |
63 | u8 agc; | 63 | u8 agc; |
64 | u8 awb; | 64 | u8 awb; |
65 | u8 aec; | ||
65 | s8 sharpness; | 66 | s8 sharpness; |
66 | u8 hflip; | 67 | u8 hflip; |
67 | u8 vflip; | 68 | u8 vflip; |
@@ -83,6 +84,8 @@ static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); | |||
83 | static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); | 84 | static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); |
84 | static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val); | 85 | static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val); |
85 | static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val); | 86 | static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val); |
87 | static int sd_setaec(struct gspca_dev *gspca_dev, __s32 val); | ||
88 | static int sd_getaec(struct gspca_dev *gspca_dev, __s32 *val); | ||
86 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); | 89 | static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); |
87 | static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); | 90 | static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); |
88 | static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); | 91 | static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); |
@@ -176,6 +179,20 @@ static const struct ctrl sd_ctrls[] = { | |||
176 | }, | 179 | }, |
177 | { /* 6 */ | 180 | { /* 6 */ |
178 | { | 181 | { |
182 | .id = V4L2_CID_EXPOSURE_AUTO, | ||
183 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
184 | .name = "Auto Exposure", | ||
185 | .minimum = 0, | ||
186 | .maximum = 1, | ||
187 | .step = 1, | ||
188 | #define AEC_DEF 1 | ||
189 | .default_value = AEC_DEF, | ||
190 | }, | ||
191 | .set = sd_setaec, | ||
192 | .get = sd_getaec, | ||
193 | }, | ||
194 | { /* 7 */ | ||
195 | { | ||
179 | .id = V4L2_CID_SHARPNESS, | 196 | .id = V4L2_CID_SHARPNESS, |
180 | .type = V4L2_CTRL_TYPE_INTEGER, | 197 | .type = V4L2_CTRL_TYPE_INTEGER, |
181 | .name = "Sharpness", | 198 | .name = "Sharpness", |
@@ -188,7 +205,7 @@ static const struct ctrl sd_ctrls[] = { | |||
188 | .set = sd_setsharpness, | 205 | .set = sd_setsharpness, |
189 | .get = sd_getsharpness, | 206 | .get = sd_getsharpness, |
190 | }, | 207 | }, |
191 | { /* 7 */ | 208 | { /* 8 */ |
192 | { | 209 | { |
193 | .id = V4L2_CID_HFLIP, | 210 | .id = V4L2_CID_HFLIP, |
194 | .type = V4L2_CTRL_TYPE_BOOLEAN, | 211 | .type = V4L2_CTRL_TYPE_BOOLEAN, |
@@ -202,7 +219,7 @@ static const struct ctrl sd_ctrls[] = { | |||
202 | .set = sd_sethflip, | 219 | .set = sd_sethflip, |
203 | .get = sd_gethflip, | 220 | .get = sd_gethflip, |
204 | }, | 221 | }, |
205 | { /* 8 */ | 222 | { /* 9 */ |
206 | { | 223 | { |
207 | .id = V4L2_CID_VFLIP, | 224 | .id = V4L2_CID_VFLIP, |
208 | .type = V4L2_CTRL_TYPE_BOOLEAN, | 225 | .type = V4L2_CTRL_TYPE_BOOLEAN, |
@@ -703,6 +720,20 @@ static void setawb(struct gspca_dev *gspca_dev) | |||
703 | sccb_reg_write(gspca_dev, 0x63, 0xaa); /* AWB off */ | 720 | sccb_reg_write(gspca_dev, 0x63, 0xaa); /* AWB off */ |
704 | } | 721 | } |
705 | 722 | ||
723 | static void setaec(struct gspca_dev *gspca_dev) | ||
724 | { | ||
725 | struct sd *sd = (struct sd *) gspca_dev; | ||
726 | |||
727 | if (sd->aec) | ||
728 | sccb_reg_write(gspca_dev, 0x13, | ||
729 | sccb_reg_read(gspca_dev, 0x13) | 0x01); | ||
730 | else { | ||
731 | sccb_reg_write(gspca_dev, 0x13, | ||
732 | sccb_reg_read(gspca_dev, 0x13) & ~0x01); | ||
733 | setexposure(gspca_dev); | ||
734 | } | ||
735 | } | ||
736 | |||
706 | static void setsharpness(struct gspca_dev *gspca_dev) | 737 | static void setsharpness(struct gspca_dev *gspca_dev) |
707 | { | 738 | { |
708 | struct sd *sd = (struct sd *) gspca_dev; | 739 | struct sd *sd = (struct sd *) gspca_dev; |
@@ -768,6 +799,7 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
768 | #if AWB_DEF != 0 | 799 | #if AWB_DEF != 0 |
769 | sd->awb = AWB_DEF | 800 | sd->awb = AWB_DEF |
770 | #endif | 801 | #endif |
802 | sd->aec = AEC_DEF; | ||
771 | #if SHARPNESS_DEF != 0 | 803 | #if SHARPNESS_DEF != 0 |
772 | sd->sharpness = SHARPNESS_DEF; | 804 | sd->sharpness = SHARPNESS_DEF; |
773 | #endif | 805 | #endif |
@@ -838,6 +870,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
838 | 870 | ||
839 | setagc(gspca_dev); | 871 | setagc(gspca_dev); |
840 | setawb(gspca_dev); | 872 | setawb(gspca_dev); |
873 | setaec(gspca_dev); | ||
841 | setgain(gspca_dev); | 874 | setgain(gspca_dev); |
842 | setexposure(gspca_dev); | 875 | setexposure(gspca_dev); |
843 | setbrightness(gspca_dev); | 876 | setbrightness(gspca_dev); |
@@ -1066,6 +1099,24 @@ static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val) | |||
1066 | return 0; | 1099 | return 0; |
1067 | } | 1100 | } |
1068 | 1101 | ||
1102 | static int sd_setaec(struct gspca_dev *gspca_dev, __s32 val) | ||
1103 | { | ||
1104 | struct sd *sd = (struct sd *) gspca_dev; | ||
1105 | |||
1106 | sd->aec = val; | ||
1107 | if (gspca_dev->streaming) | ||
1108 | setaec(gspca_dev); | ||
1109 | return 0; | ||
1110 | } | ||
1111 | |||
1112 | static int sd_getaec(struct gspca_dev *gspca_dev, __s32 *val) | ||
1113 | { | ||
1114 | struct sd *sd = (struct sd *) gspca_dev; | ||
1115 | |||
1116 | *val = sd->aec; | ||
1117 | return 0; | ||
1118 | } | ||
1119 | |||
1069 | static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val) | 1120 | static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val) |
1070 | { | 1121 | { |
1071 | struct sd *sd = (struct sd *) gspca_dev; | 1122 | struct sd *sd = (struct sd *) gspca_dev; |