aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/sonixj.c
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2008-10-17 06:48:24 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2008-12-29 14:53:28 -0500
commit0cae89647e3f601029474b99c21b38a7ca781f07 (patch)
treeaa1aae349d9a1e6f8e9187ab25df84ba78dd2e81 /drivers/media/video/gspca/sonixj.c
parent4cc0edff341294d14f3a6acb3ddb97abdf29b8c0 (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.c58
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
27MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); 29MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
28MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); 30MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver");
29MODULE_LICENSE("GPL"); 31MODULE_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);
73static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val); 76static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);
74static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val); 77static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val);
75static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val); 78static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);
79static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val);
80static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val);
76 81
77static struct ctrl sd_ctrls[] = { 82static 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
155static struct v4l2_pix_format vga_mode[] = { 176static 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
1196static void setvflip(struct sd *sd) 1220static 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
1226static 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 -- */
1205static int sd_start(struct gspca_dev *gspca_dev) 1235static 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
1633static 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
1643static 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 */
1602static const struct sd_desc sd_desc = { 1652static const struct sd_desc sd_desc = {
1603 .name = MODULE_NAME, 1653 .name = MODULE_NAME,