[media] gspca - sn9c20x: Change the exposure setting of Omnivision sensors
authorJean-François Moine <moinejf@free.fr>
Sat, 24 Mar 2012 12:33:42 +0000 (09:33 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 3 May 2012 18:29:56 +0000 (15:29 -0300)
The exposure of Omnivision sensors is defined by the registers 07, 10 and 04.
This patch updates the registers 10 and 04 before using the registers 2d
and 2e (dummy lines).

Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/gspca/sn9c20x.c

index da2904a891aa78ed07faaab4da60bd0cbea59e5c..5285a519c1f34c8c4d6ce69fba0f9e4bd2dfcd29 100644 (file)
@@ -874,8 +874,8 @@ static const struct i2c_reg_u8 ov7660_init[] = {
           0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */
        {0x17, 0x10}, {0x18, 0x61},
        {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43},
-       {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0xf6},
-       {0x2e, 0x0b}, {0x01, 0x78}, {0x02, 0x50},
+       {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00},
+       {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50},
 };
 
 static const struct i2c_reg_u8 ov7670_init[] = {
@@ -1645,7 +1645,7 @@ static void set_exposure(struct gspca_dev *gspca_dev)
        struct sd *sd = (struct sd *) gspca_dev;
        u8 exp[8] = {sd->i2c_intf, sd->i2c_addr,
                                0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
-       int expo;
+       int expo, expo2;
 
        if (gspca_dev->streaming)
                exp[7] = 0x1e;
@@ -1656,8 +1656,23 @@ static void set_exposure(struct gspca_dev *gspca_dev)
        case SENSOR_OV7670:
        case SENSOR_OV9655:
        case SENSOR_OV9650:
+               if (expo > 547)
+                       expo2 = 547;
+               else
+                       expo2 = expo;
+               exp[0] |= (2 << 4);
+               exp[2] = 0x10;                  /* AECH */
+               exp[3] = expo2 >> 2;
+               exp[7] = 0x10;
+               i2c_w(gspca_dev, exp);
+               exp[2] = 0x04;                  /* COM1 */
+               exp[3] = expo2 & 0x0003;
+               exp[7] = 0x10;
+               i2c_w(gspca_dev, exp);
+               expo -= expo2;
+               exp[7] = 0x1e;
                exp[0] |= (3 << 4);
-               exp[2] = 0x2d;
+               exp[2] = 0x2d;                  /* ADVFL & ADVFH */
                exp[3] = expo;
                exp[4] = expo >> 8;
                break;