diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2008-10-17 06:48:24 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-12-29 14:53:28 -0500 |
commit | 0cae89647e3f601029474b99c21b38a7ca781f07 (patch) | |
tree | aa1aae349d9a1e6f8e9187ab25df84ba78dd2e81 /drivers/media/video/gspca/sonixj.c | |
parent | 4cc0edff341294d14f3a6acb3ddb97abdf29b8c0 (diff) |
V4L/DVB (9541): gspca: Add infrared control for sonixj - mi0360.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/sonixj.c')
-rw-r--r-- | drivers/media/video/gspca/sonixj.c | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index 53cb82d9e7c6..193f0f77964f 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include "gspca.h" | 24 | #include "gspca.h" |
25 | #include "jpeg.h" | 25 | #include "jpeg.h" |
26 | 26 | ||
27 | #define V4L2_CID_INFRARED (V4L2_CID_PRIVATE_BASE + 0) | ||
28 | |||
27 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); | 29 | MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); |
28 | MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); | 30 | MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); |
29 | MODULE_LICENSE("GPL"); | 31 | MODULE_LICENSE("GPL"); |
@@ -40,6 +42,7 @@ struct sd { | |||
40 | unsigned char colors; | 42 | unsigned char colors; |
41 | unsigned char autogain; | 43 | unsigned char autogain; |
42 | __u8 vflip; /* ov7630 only */ | 44 | __u8 vflip; /* ov7630 only */ |
45 | __u8 infrared; /* mi0360 only */ | ||
43 | 46 | ||
44 | signed char ag_cnt; | 47 | signed char ag_cnt; |
45 | #define AG_CNT_START 13 | 48 | #define AG_CNT_START 13 |
@@ -73,6 +76,8 @@ static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val); | |||
73 | static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); | 76 | static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); |
74 | static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); | 77 | static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); |
75 | static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); | 78 | static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); |
79 | static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val); | ||
80 | static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val); | ||
76 | 81 | ||
77 | static struct ctrl sd_ctrls[] = { | 82 | static struct ctrl sd_ctrls[] = { |
78 | { | 83 | { |
@@ -150,6 +155,22 @@ static struct ctrl sd_ctrls[] = { | |||
150 | .set = sd_setvflip, | 155 | .set = sd_setvflip, |
151 | .get = sd_getvflip, | 156 | .get = sd_getvflip, |
152 | }, | 157 | }, |
158 | /* mi0360 only */ | ||
159 | #define INFRARED_IDX 5 | ||
160 | { | ||
161 | { | ||
162 | .id = V4L2_CID_INFRARED, | ||
163 | .type = V4L2_CTRL_TYPE_BOOLEAN, | ||
164 | .name = "Infrared", | ||
165 | .minimum = 0, | ||
166 | .maximum = 1, | ||
167 | .step = 1, | ||
168 | #define INFRARED_DEF 0 | ||
169 | .default_value = INFRARED_DEF, | ||
170 | }, | ||
171 | .set = sd_setinfrared, | ||
172 | .get = sd_getinfrared, | ||
173 | }, | ||
153 | }; | 174 | }; |
154 | 175 | ||
155 | static struct v4l2_pix_format vga_mode[] = { | 176 | static struct v4l2_pix_format vga_mode[] = { |
@@ -963,6 +984,8 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
963 | sd->colors = COLOR_DEF; | 984 | sd->colors = COLOR_DEF; |
964 | sd->autogain = AUTOGAIN_DEF; | 985 | sd->autogain = AUTOGAIN_DEF; |
965 | sd->ag_cnt = -1; | 986 | sd->ag_cnt = -1; |
987 | sd->vflip = VFLIP_DEF; | ||
988 | sd->infrared = INFRARED_DEF; | ||
966 | 989 | ||
967 | switch (sd->sensor) { | 990 | switch (sd->sensor) { |
968 | case SENSOR_OV7630: | 991 | case SENSOR_OV7630: |
@@ -973,7 +996,8 @@ static int sd_config(struct gspca_dev *gspca_dev, | |||
973 | } | 996 | } |
974 | if (sd->sensor != SENSOR_OV7630) | 997 | if (sd->sensor != SENSOR_OV7630) |
975 | gspca_dev->ctrl_dis |= (1 << VFLIP_IDX); | 998 | gspca_dev->ctrl_dis |= (1 << VFLIP_IDX); |
976 | 999 | if (sd->sensor != SENSOR_MI0360) | |
1000 | gspca_dev->ctrl_dis |= (1 << INFRARED_IDX); | ||
977 | return 0; | 1001 | return 0; |
978 | } | 1002 | } |
979 | 1003 | ||
@@ -1195,12 +1219,18 @@ static void setautogain(struct gspca_dev *gspca_dev) | |||
1195 | 1219 | ||
1196 | static void setvflip(struct sd *sd) | 1220 | static void setvflip(struct sd *sd) |
1197 | { | 1221 | { |
1198 | if (sd->sensor != SENSOR_OV7630) | ||
1199 | return; | ||
1200 | i2c_w1(&sd->gspca_dev, 0x75, /* COMN */ | 1222 | i2c_w1(&sd->gspca_dev, 0x75, /* COMN */ |
1201 | sd->vflip ? 0x82 : 0x02); | 1223 | sd->vflip ? 0x82 : 0x02); |
1202 | } | 1224 | } |
1203 | 1225 | ||
1226 | static void setinfrared(struct sd *sd) | ||
1227 | { | ||
1228 | /*fixme: different sequence for StarCam Clip and StarCam 370i */ | ||
1229 | /* Clip */ | ||
1230 | i2c_w1(&sd->gspca_dev, 0x02, /* gpio */ | ||
1231 | sd->infrared ? 0x66 : 0x64); | ||
1232 | } | ||
1233 | |||
1204 | /* -- start the camera -- */ | 1234 | /* -- start the camera -- */ |
1205 | static int sd_start(struct gspca_dev *gspca_dev) | 1235 | static int sd_start(struct gspca_dev *gspca_dev) |
1206 | { | 1236 | { |
@@ -1343,8 +1373,10 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
1343 | 1373 | ||
1344 | reg_w1(gspca_dev, 0x17, reg17); | 1374 | reg_w1(gspca_dev, 0x17, reg17); |
1345 | switch (sd->sensor) { | 1375 | switch (sd->sensor) { |
1346 | case SENSOR_HV7131R: | ||
1347 | case SENSOR_MI0360: | 1376 | case SENSOR_MI0360: |
1377 | setinfrared(sd); | ||
1378 | /* fall thru */ | ||
1379 | case SENSOR_HV7131R: | ||
1348 | case SENSOR_MO4000: | 1380 | case SENSOR_MO4000: |
1349 | case SENSOR_OM6802: | 1381 | case SENSOR_OM6802: |
1350 | setbrightness(gspca_dev); | 1382 | setbrightness(gspca_dev); |
@@ -1598,6 +1630,24 @@ static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val) | |||
1598 | return 0; | 1630 | return 0; |
1599 | } | 1631 | } |
1600 | 1632 | ||
1633 | static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val) | ||
1634 | { | ||
1635 | struct sd *sd = (struct sd *) gspca_dev; | ||
1636 | |||
1637 | sd->infrared = val; | ||
1638 | if (gspca_dev->streaming) | ||
1639 | setinfrared(sd); | ||
1640 | return 0; | ||
1641 | } | ||
1642 | |||
1643 | static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val) | ||
1644 | { | ||
1645 | struct sd *sd = (struct sd *) gspca_dev; | ||
1646 | |||
1647 | *val = sd->infrared; | ||
1648 | return 0; | ||
1649 | } | ||
1650 | |||
1601 | /* sub-driver description */ | 1651 | /* sub-driver description */ |
1602 | static const struct sd_desc sd_desc = { | 1652 | static const struct sd_desc sd_desc = { |
1603 | .name = MODULE_NAME, | 1653 | .name = MODULE_NAME, |