aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/ov534.c
diff options
context:
space:
mode:
authorMax Thrun <bear24rw@gmail.com>2010-02-27 15:20:21 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-17 23:46:55 -0400
commitf2938822523739e99a39fd634943865a432e9c00 (patch)
tree996d2abb4d3a5db0193b76e465075feb84ff2214 /drivers/media/video/gspca/ov534.c
parent8b7fbda484176b46a7760fd474d605ca5152c86d (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.c55
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);
83static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); 84static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);
84static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val); 85static int sd_setawb(struct gspca_dev *gspca_dev, __s32 val);
85static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val); 86static int sd_getawb(struct gspca_dev *gspca_dev, __s32 *val);
87static int sd_setaec(struct gspca_dev *gspca_dev, __s32 val);
88static int sd_getaec(struct gspca_dev *gspca_dev, __s32 *val);
86static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val); 89static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
87static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val); 90static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
88static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val); 91static 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
723static 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
706static void setsharpness(struct gspca_dev *gspca_dev) 737static 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
1102static 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
1112static 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
1069static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val) 1120static 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;