V4L/DVB (9123): gspca: Add some lost controls to the s5k83a sensor.
authorErik Andren <erik.andren@gmail.com>
Tue, 7 Oct 2008 06:02:59 +0000 (03:02 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 12 Oct 2008 11:37:15 +0000 (09:37 -0200)
Signed-off-by: Erik Andren <erik.andren@gmail.com>
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/m5602/m5602_s5k83a.c
drivers/media/video/gspca/m5602/m5602_s5k83a.h

index c1ff967..b4b33c2 100644 (file)
@@ -321,7 +321,7 @@ int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val)
 
 int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
 {
-       int err = 0;
+       int err;
        u8 data[2];
        struct sd *sd = (struct sd *) gspca_dev;
 
@@ -331,3 +331,93 @@ int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val)
 
        return (err < 0) ? err : 0;
 }
+
+int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       int err;
+       u8 data[1];
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       data[0] = 0x05;
+       err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
+       if (err < 0)
+               return err;
+
+       err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
+       *val = (data[0] | 0x40) ? 1 : 0;
+
+       return (err < 0) ? err : 0;
+}
+
+int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val)
+{
+       int err;
+       u8 data[1];
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       data[0] = 0x05;
+       err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
+       if (err < 0)
+               return err;
+
+       err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
+       if (err < 0)
+               return err;
+
+       /* set or zero six bit, seven is hflip */
+       data[0] = (val) ? (data[0] & 0x80) | 0x40 | S5K83A_FLIP_MASK
+                       : (data[0] & 0x80) | S5K83A_FLIP_MASK;
+       err = s5k83a_write_sensor(sd, S5K83A_FLIP, data, 1);
+       if (err < 0)
+               return err;
+
+       data[0] = (val) ? 0x0b : 0x0a;
+       err = s5k83a_write_sensor(sd, S5K83A_VFLIP_TUNE, data, 1);
+
+       return (err < 0) ? err : 0;
+}
+
+int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val)
+{
+       int err;
+       u8 data[1];
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       data[0] = 0x05;
+       err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
+       if (err < 0)
+               return err;
+
+       err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
+       *val = (data[0] | 0x80) ? 1 : 0;
+
+       return (err < 0) ? err : 0;
+}
+
+int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val)
+{
+       int err;
+       u8 data[1];
+       struct sd *sd = (struct sd *) gspca_dev;
+
+       data[0] = 0x05;
+       err = s5k83a_write_sensor(sd, S5K83A_PAGE_MAP, data, 1);
+       if (err < 0)
+               return err;
+
+       err = s5k83a_read_sensor(sd, S5K83A_FLIP, data, 1);
+       if (err < 0)
+               return err;
+
+       /* set or zero seven bit, six is vflip */
+       data[0] = (val) ? (data[0] & 0x40) | 0x80 | S5K83A_FLIP_MASK
+                       : (data[0] & 0x40) | S5K83A_FLIP_MASK;
+       err = s5k83a_write_sensor(sd, S5K83A_FLIP, data, 1);
+       if (err < 0)
+               return err;
+
+       data[0] = (val) ? 0x0a : 0x0b;
+       err = s5k83a_write_sensor(sd, S5K83A_HFLIP_TUNE, data, 1);
+
+       return (err < 0) ? err : 0;
+}
index a57f623..833708e 100644 (file)
 
 #include "m5602_sensor.h"
 
-#define S5K83A_PAGE_MAP                        0xec
-#define S5K83A_GAIN                    0x18
+#define S5K83A_FLIP                            0x01
+#define S5K83A_HFLIP_TUNE              0x03
+#define S5K83A_VFLIP_TUNE              0x05
 #define S5K83A_WHITENESS               0x0a
-#define S5K83A_BRIGHTNESS              0x1b
+#define S5K83A_GAIN                            0x18
+#define S5K83A_BRIGHTNESS              0x1b
+#define S5K83A_PAGE_MAP                        0xec
 
 #define S5K83A_DEFAULT_BRIGHTNESS      0x71
 #define S5K83A_DEFAULT_WHITENESS       0x7e
-#define S5K83A_DEFAULT_GAIN            0x00
-#define S5K83A_MAXIMUM_GAIN            0x3c
+#define S5K83A_DEFAULT_GAIN                    0x00
+#define S5K83A_MAXIMUM_GAIN                    0x3c
+#define S5K83A_FLIP_MASK                       0x10
+
 
 /*****************************************************************************/
 
@@ -56,6 +61,11 @@ int s5k83a_set_whiteness(struct gspca_dev *gspca_dev, __s32 val);
 int s5k83a_get_whiteness(struct gspca_dev *gspca_dev, __s32 *val);
 int s5k83a_set_gain(struct gspca_dev *gspca_dev, __s32 val);
 int s5k83a_get_gain(struct gspca_dev *gspca_dev, __s32 *val);
+int s5k83a_get_vflip(struct gspca_dev *gspca_dev, __s32 *val);
+int s5k83a_set_vflip(struct gspca_dev *gspca_dev, __s32 val);
+int s5k83a_get_hflip(struct gspca_dev *gspca_dev, __s32 *val);
+int s5k83a_set_hflip(struct gspca_dev *gspca_dev, __s32 val);
+
 
 static struct m5602_sensor s5k83a = {
        .name = "S5K83A",
@@ -65,7 +75,7 @@ static struct m5602_sensor s5k83a = {
        .read_sensor = s5k83a_read_sensor,
        .write_sensor = s5k83a_write_sensor,
        .i2c_slave_id = 0x5a,
-       .nctrls = 3,
+       .nctrls = 5,
        .ctrls = {
        {
                {
@@ -107,7 +117,31 @@ static struct m5602_sensor s5k83a = {
                },
                        .set = s5k83a_set_gain,
                        .get = s5k83a_get_gain
-       }
+       }, {
+               {
+                       .id         = V4L2_CID_HFLIP,
+                       .type       = V4L2_CTRL_TYPE_BOOLEAN,
+                       .name       = "horizontal flip",
+                       .minimum    = 0,
+                       .maximum    = 1,
+                       .step       = 1,
+                       .default_value  = 0
+               },
+                       .set = s5k83a_set_hflip,
+                       .get = s5k83a_get_hflip
+       }, {
+               {
+                .id         = V4L2_CID_VFLIP,
+               .type       = V4L2_CTRL_TYPE_BOOLEAN,
+               .name       = "vertical flip",
+               .minimum    = 0,
+               .maximum    = 1,
+               .step       = 1,
+               .default_value  = 0
+               },
+               .set = s5k83a_set_vflip,
+               .get = s5k83a_get_vflip
+               }
        },
        .nmodes = 1,
        .modes = {
@@ -121,7 +155,6 @@ static struct m5602_sensor s5k83a = {
                .bytesperline = M5602_DEFAULT_FRAME_WIDTH,
                .colorspace = V4L2_COLORSPACE_SRGB,
                .priv = 1
-
        }
        }
 };
@@ -438,7 +471,14 @@ static const unsigned char init_s5k83a[][4] =
        {SENSOR, S5K83A_WHITENESS, S5K83A_DEFAULT_WHITENESS, 0x00},
 
        /* set default gain */
-       {SENSOR_LONG, 0x18, 0x00, S5K83A_DEFAULT_GAIN}
+       {SENSOR_LONG, 0x18, 0x00, S5K83A_DEFAULT_GAIN},
+
+       /* set default flip */
+       {SENSOR, S5K83A_PAGE_MAP, 0x05, 0x00},
+       {SENSOR, S5K83A_FLIP, 0x00 | S5K83A_FLIP_MASK, 0x00},
+       {SENSOR, S5K83A_HFLIP_TUNE, 0x0b, 0x00},
+       {SENSOR, S5K83A_VFLIP_TUNE, 0x0a, 0x00}
+
 };
 
 #endif