[media] gspca_sonixb: Add support for 0c45:602a
authorHans de Goede <hdegoede@redhat.com>
Sun, 12 Dec 2010 18:55:03 +0000 (15:55 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 29 Dec 2010 10:17:01 +0000 (08:17 -0200)
Add support for cameras with the HV7131D sensor, such as the 0c45:602a

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/sonixb.c
drivers/media/video/sn9c102/sn9c102_devtable.h

index f47a82902fa382aa1ee2ea513921b8fd3257d9df..73504a3f87b75ffdbc21e958b00ef0001a7e71a0 100644 (file)
@@ -73,14 +73,15 @@ struct sd {
 #define BRIDGE_103 1
 
        __u8 sensor;                    /* Type of image sensor chip */
-#define SENSOR_HV7131R 0
-#define SENSOR_OV6650 1
-#define SENSOR_OV7630 2
-#define SENSOR_PAS106 3
-#define SENSOR_PAS202 4
-#define SENSOR_TAS5110C 5
-#define SENSOR_TAS5110D 6
-#define SENSOR_TAS5130CXX 7
+#define SENSOR_HV7131D 0
+#define SENSOR_HV7131R 1
+#define SENSOR_OV6650 2
+#define SENSOR_OV7630 3
+#define SENSOR_PAS106 4
+#define SENSOR_PAS202 5
+#define SENSOR_TAS5110C 6
+#define SENSOR_TAS5110D 7
+#define SENSOR_TAS5130CXX 8
        __u8 reg11;
 };
 
@@ -305,14 +306,29 @@ static const struct v4l2_pix_format sif_mode[] = {
                .priv = 0},
 };
 
-static const __u8 initHv7131[] = {
+static const __u8 initHv7131d[] = {
+       0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
+       0x00, 0x00,
+       0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
+       0x28, 0x1e, 0x60, 0x8e, 0x42,
+       0x1d, 0x10, 0x02, 0x03, 0x0f, 0x0c
+};
+static const __u8 hv7131d_sensor_init[][8] = {
+       {0xa0, 0x11, 0x01, 0x04, 0x00, 0x00, 0x00, 0x17},
+       {0xa0, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x17},
+       {0xa0, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17},
+       {0xa0, 0x11, 0x30, 0x30, 0x00, 0x00, 0x00, 0x17}, /* reset level */
+       {0xa0, 0x11, 0x34, 0x02, 0x00, 0x00, 0x00, 0x17}, /* pixel bias volt */
+};
+
+static const __u8 initHv7131r[] = {
        0x46, 0x77, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
        0x00, 0x00,
        0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
        0x28, 0x1e, 0x60, 0x8a, 0x20,
        0x1d, 0x10, 0x02, 0x03, 0x0f, 0x0c
 };
-static const __u8 hv7131_sensor_init[][8] = {
+static const __u8 hv7131r_sensor_init[][8] = {
        {0xc0, 0x11, 0x31, 0x38, 0x2a, 0x2e, 0x00, 0x10},
        {0xa0, 0x11, 0x01, 0x08, 0x2a, 0x2e, 0x00, 0x10},
        {0xb0, 0x11, 0x20, 0x00, 0xd0, 0x2e, 0x00, 0x10},
@@ -553,7 +569,8 @@ static const __u8 tas5130_sensor_init[][8] = {
 };
 
 static struct sensor_data sensor_data[] = {
-SENS(initHv7131, NULL, hv7131_sensor_init, NULL, NULL, 0, NO_EXPO|NO_FREQ, 0),
+SENS(initHv7131d, NULL, hv7131d_sensor_init, NULL, NULL, F_GAIN, NO_BRIGHTNESS|NO_FREQ, 0),
+SENS(initHv7131r, NULL, hv7131r_sensor_init, NULL, NULL, 0, NO_BRIGHTNESS|NO_EXPO|NO_FREQ, 0),
 SENS(initOv6650, NULL, ov6650_sensor_init, NULL, NULL, F_GAIN|F_SIF, 0, 0x60),
 SENS(initOv7630, initOv7630_3, ov7630_sensor_init, NULL, ov7630_sensor_init_3,
        F_GAIN, 0, 0x21),
@@ -703,7 +720,18 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
        unsigned char gain = sd->gain;
 
        switch (sd->sensor) {
+       case SENSOR_HV7131D: {
+               __u8 i2c[] =
+                       {0xc0, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0x17};
+
+               i2c[3] = 0x3f - (sd->gain / 4);
+               i2c[4] = 0x3f - (sd->gain / 4);
+               i2c[5] = 0x3f - (sd->gain / 4);
 
+               if (i2c_w(gspca_dev, i2c) < 0)
+                       goto err;
+               break;
+           }
        case SENSOR_TAS5110C:
        case SENSOR_TAS5110D: {
                __u8 i2c[] =
@@ -790,6 +818,23 @@ static void setexposure(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
 
        switch (sd->sensor) {
+       case SENSOR_HV7131D: {
+               /* Note the datasheet wrongly says line mode exposure uses reg
+                  0x26 and 0x27, testing has shown 0x25 + 0x26 */
+               __u8 i2c[] = {0xc0, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x17};
+               /* The HV7131D's exposure goes from 0 - 65535, we scale our
+                  exposure of 0-1023 to 0-6138. There are 2 reasons for this:
+                  1) This puts our exposure knee of 200 at approx the point
+                     where the framerate starts dropping
+                  2) At 6138 the framerate has already dropped to 2 fps,
+                     going any lower makes little sense */
+               __u16 reg = sd->exposure * 6;
+               i2c[3] = reg >> 8;
+               i2c[4] = reg & 0xff;
+               if (i2c_w(gspca_dev, i2c) != 0)
+                       goto err;
+               break;
+           }
        case SENSOR_TAS5110C:
        case SENSOR_TAS5110D: {
                /* register 19's high nibble contains the sn9c10x clock divider
@@ -1494,9 +1539,12 @@ static const struct usb_device_id device_table[] __devinitconst = {
 #endif
        {USB_DEVICE(0x0c45, 0x6028), SB(PAS202, 102)},
        {USB_DEVICE(0x0c45, 0x6029), SB(PAS106, 102)},
+       {USB_DEVICE(0x0c45, 0x602a), SB(HV7131D, 102)},
+       /* {USB_DEVICE(0x0c45, 0x602b), SB(MI0343, 102)}, */
        {USB_DEVICE(0x0c45, 0x602c), SB(OV7630, 102)},
        {USB_DEVICE(0x0c45, 0x602d), SB(HV7131R, 102)},
        {USB_DEVICE(0x0c45, 0x602e), SB(OV7630, 102)},
+       /* {USB_DEVICE(0x0c45, 0x602b), SB(MI03XX, 102)}, */ /* MI0343 MI0360 MI0330 */
        {USB_DEVICE(0x0c45, 0x608f), SB(OV7630, 103)},
 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
        {USB_DEVICE(0x0c45, 0x60af), SB(PAS202, 103)},
index aba6d686c1f4e665998da027b87ff8ab0a2a8a8c..41064c7b5ef8d896e2deb133fb89b10e72d09df3 100644 (file)
@@ -54,8 +54,8 @@ static const struct usb_device_id sn9c102_id_table[] = {
 #if !defined CONFIG_USB_GSPCA_SONIXB && !defined CONFIG_USB_GSPCA_SONIXB_MODULE
        { SN9C102_USB_DEVICE(0x0c45, 0x6028, BRIDGE_SN9C102), },
        { SN9C102_USB_DEVICE(0x0c45, 0x6029, BRIDGE_SN9C102), },
-#endif
        { SN9C102_USB_DEVICE(0x0c45, 0x602a, BRIDGE_SN9C102), },
+#endif
        { SN9C102_USB_DEVICE(0x0c45, 0x602b, BRIDGE_SN9C102), },
 #if !defined CONFIG_USB_GSPCA_SONIXB && !defined CONFIG_USB_GSPCA_SONIXB_MODULE
        { SN9C102_USB_DEVICE(0x0c45, 0x602c, BRIDGE_SN9C102), },