The patch number 9293 was added via Jean-Francois Moine <[EMAIL PROTECTED]>
to http://linuxtv.org/hg/v4l-dvb master development tree.

Kernel patches in this development tree may be modified to be backward
compatible with older kernels. Compatibility modifications will be
removed before inclusion into the mainstream Kernel

If anyone has any objections, please let us know by sending a message to:
        [EMAIL PROTECTED]

------

From: Leandro Costantino  <[EMAIL PROTECTED]>
gspca: Separate and fix the sensor dependant sequences in t613.


Priority: normal

Signed-off-by: Leandro Costantino <[EMAIL PROTECTED]>
Signed-off-by: Jean-Francois Moine <[EMAIL PROTECTED]>


---

 linux/drivers/media/video/gspca/t613.c |  147 ++++++++++++++++++-------
 1 file changed, 110 insertions(+), 37 deletions(-)

diff -r 513bd6831cc3 -r 03b648e48eff linux/drivers/media/video/gspca/t613.c
--- a/linux/drivers/media/video/gspca/t613.c    Fri Oct 17 10:19:46 2008 +0200
+++ b/linux/drivers/media/video/gspca/t613.c    Fri Oct 17 10:27:04 2008 +0200
@@ -261,6 +261,59 @@ static struct v4l2_pix_format vga_mode_t
                .priv = 0},
 };
 
+/* sensor specific data */
+struct additional_sensor_data {
+       const __u8 data1[20];
+       const __u8 data2[18];
+       const __u8 data3[18];
+       const __u8 data4[4];
+       const __u8 data5[6];
+       const __u8 stream[4];
+};
+
+const static struct additional_sensor_data sensor_data[] = {
+    {                          /* TAS5130A */
+       .data1 =
+               {0xd0, 0xbb, 0xd1, 0x28, 0xd2, 0x10, 0xd3, 0x10,
+                0xd4, 0xbb, 0xd5, 0x28, 0xd6, 0x1e, 0xd7, 0x27,
+                0xd8, 0xc8, 0xd9, 0xfc},
+       .data2 =
+               {0xe0, 0x60, 0xe1, 0xa8, 0xe2, 0xe0, 0xe3, 0x60,
+                0xe4, 0xa8, 0xe5, 0xe0, 0xe6, 0x60, 0xe7, 0xa8,
+                0xe8, 0xe0},
+       .data3 =
+               {0xc7, 0x60, 0xc8, 0xa8, 0xc9, 0xe0, 0xca, 0x60,
+                0xcb, 0xa8, 0xcc, 0xe0, 0xcd, 0x60, 0xce, 0xa8,
+                0xcf, 0xe0},
+       .data4 =        /* Freq (50/60Hz). Splitted for test purpose */
+               {0x66, 0x00, 0xa8, 0xe8},
+       .data5 =
+               {0x0c, 0x03, 0xab, 0x10, 0x81, 0x20},
+       .stream =
+               {0x0b, 0x04, 0x0a, 0x40},
+    },
+    {                          /* OM6802 */
+       .data1 =
+               {0xd0, 0xc2, 0xd1, 0x28, 0xd2, 0x0f, 0xd3, 0x22,
+                0xd4, 0xcd, 0xd5, 0x27, 0xd6, 0x2c, 0xd7, 0x06,
+                0xd8, 0xb3, 0xd9, 0xfc},
+       .data2 =
+               {0xe0, 0x80, 0xe1, 0xff, 0xe2, 0xff, 0xe3, 0x80,
+                0xe4, 0xff, 0xe5, 0xff, 0xe6, 0x80, 0xe7, 0xff,
+                0xe8, 0xff},
+       .data3 =
+               {0xc7, 0x80, 0xc8, 0xff, 0xc9, 0xff, 0xca, 0x80,
+                0xcb, 0xff, 0xcc, 0xff, 0xcd, 0x80, 0xce, 0xff,
+                0xcf, 0xff},
+       .data4 =        /*Freq (50/60Hz). Splitted for test purpose */
+               {0x66, 0xca, 0xa8, 0xf0 },
+       .data5 =        /* this could be removed later */
+               {0x0c, 0x03, 0xab, 0x13, 0x81, 0x23},
+       .stream =
+               {0x0b, 0x04, 0x0a, 0x78},
+    }
+};
+
 #define MAX_EFFECTS 7
 /* easily done by soft, this table could be removed,
  * i keep it here just in case */
@@ -603,32 +656,10 @@ static int sd_init(struct gspca_dev *gsp
                 0x65, 0x0a, 0xbb, 0x86, 0xaf, 0x58, 0xb0, 0x68,
                 0x87, 0x40, 0x89, 0x2b, 0x8d, 0xff, 0x83, 0x40,
                 0xac, 0x84, 0xad, 0x86, 0xaf, 0x46};
-       static const __u8 nset4[] = {
-               0xe0, 0x60, 0xe1, 0xa8, 0xe2, 0xe0, 0xe3, 0x60, 0xe4, 0xa8,
-               0xe5, 0xe0, 0xe6, 0x60, 0xe7, 0xa8,
-               0xe8, 0xe0
-       };
-       /* ojo puede ser 0xe6 en vez de 0xe9 */
-       static const __u8 nset2[] = {
-               0xd0, 0xbb, 0xd1, 0x28, 0xd2, 0x10, 0xd3, 0x10, 0xd4, 0xbb,
-               0xd5, 0x28, 0xd6, 0x1e, 0xd7, 0x27,
-               0xd8, 0xc8, 0xd9, 0xfc
-       };
-       static const __u8 nset3[] = {
-               0xc7, 0x60, 0xc8, 0xa8, 0xc9, 0xe0, 0xca, 0x60, 0xcb, 0xa8,
-               0xcc, 0xe0, 0xcd, 0x60, 0xce, 0xa8,
-               0xcf, 0xe0
-       };
-       static const __u8 nset5[] =
-                       { 0x8f, 0x24, 0xc3, 0x00 };     /* bright */
-       static const __u8 nset7[4] =
-                       { 0x66, 0xca, 0xa8, 0xf8 };     /* 50/60 Hz */
        static const __u8 nset9[4] =
                        { 0x0b, 0x04, 0x0a, 0x78 };
        static const __u8 nset8[6] =
                        { 0xa8, 0xf0, 0xc6, 0x88, 0xc0, 0x00 };
-       static const __u8 nset10[6] =
-                       { 0x0c, 0x03, 0xab, 0x10, 0x81, 0x20 };
 
        byte = reg_r(gspca_dev, 0x06);
        test_byte = reg_r(gspca_dev, 0x07);
@@ -672,13 +703,18 @@ static int sd_init(struct gspca_dev *gsp
        reg_w_buf(gspca_dev, n4, sizeof n4);
        reg_r(gspca_dev, 0x0080);
        reg_w(gspca_dev, 0x2c80);
-       reg_w_buf(gspca_dev, nset2, sizeof nset2);
-       reg_w_buf(gspca_dev, nset3, sizeof nset3);
-       reg_w_buf(gspca_dev, nset4, sizeof nset4);
+
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data1,
+                       sizeof sensor_data[sd->sensor].data1);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data3,
+                       sizeof sensor_data[sd->sensor].data3);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data2,
+                       sizeof sensor_data[sd->sensor].data2);
+
        reg_w(gspca_dev, 0x3880);
        reg_w(gspca_dev, 0x3880);
        reg_w(gspca_dev, 0x338e);
-nset5 - missing
+
        setbrightness(gspca_dev);
        setcontrast(gspca_dev);
        setgamma(gspca_dev);
@@ -690,15 +726,21 @@ nset5 - missing
        reg_w(gspca_dev, 0x2088);
        reg_w(gspca_dev, 0x2089);
 
-       reg_w_buf(gspca_dev, nset7, sizeof nset7);
-       reg_w_buf(gspca_dev, nset10, sizeof nset10);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data4,
+                       sizeof sensor_data[sd->sensor].data4);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data5,
+                       sizeof sensor_data[sd->sensor].data5);
        reg_w_buf(gspca_dev, nset8, sizeof nset8);
        reg_w_buf(gspca_dev, nset9, sizeof nset9);
 
        reg_w(gspca_dev, 0x2880);
-       reg_w_buf(gspca_dev, nset2, sizeof nset2);
-       reg_w_buf(gspca_dev, nset3, sizeof nset3);
-       reg_w_buf(gspca_dev, nset4, sizeof nset4);
+
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data1,
+                       sizeof sensor_data[sd->sensor].data1);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data3,
+                       sizeof sensor_data[sd->sensor].data3);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data2,
+                       sizeof sensor_data[sd->sensor].data2);
 
        return 0;
 }
@@ -744,16 +786,43 @@ static void setlightfreq(struct gspca_de
        reg_w_buf(gspca_dev, freq, sizeof freq);
 }
 
+/* Is this really needed?
+ * i added some module parameters for test with some users */
+static void poll_sensor(struct gspca_dev *gspca_dev)
+{
+       struct sd *sd = (struct sd *) gspca_dev;
+       static const __u8 poll1[] =
+               {0x67, 0x05, 0x68, 0x81, 0x69, 0x80, 0x6a, 0x82,
+                0x6b, 0x68, 0x6c, 0x69, 0x72, 0xd9, 0x73, 0x34,
+                0x74, 0x32, 0x75, 0x92, 0x76, 0x00, 0x09, 0x01,
+                0x60, 0x14};
+       static const __u8 poll2[] =
+               {0x67, 0x02, 0x68, 0x71, 0x69, 0x72, 0x72, 0xa9,
+                0x73, 0x02, 0x73, 0x02, 0x60, 0x14};
+       static const __u8 poll3[] =
+               {0x87, 0x3f, 0x88, 0x20, 0x89, 0x2d};
+       static const __u8 poll4[] =
+               {0xa6, 0x0a, 0xea, 0xcf, 0xbe, 0x26, 0xb1, 0x5f,
+                0xa1, 0xb1, 0xda, 0x6b, 0xdb, 0x98, 0xdf, 0x0c,
+                0xc2, 0x80, 0xc3, 0x10};
+
+       if (sd->sensor != SENSOR_TAS5130A) {
+               PDEBUG(D_STREAM, "[Sensor requires polling]");
+               reg_w_buf(gspca_dev, poll1, sizeof poll1);
+               reg_w_buf(gspca_dev, poll2, sizeof poll2);
+               reg_w_buf(gspca_dev, poll3, sizeof poll3);
+               reg_w_buf(gspca_dev, poll4, sizeof poll4);
+       }
+}
+
 static int sd_start(struct gspca_dev *gspca_dev)
 {
        struct sd *sd = (struct sd *) gspca_dev;
        int i, mode;
-       static const __u8 t1[] = { 0x66, 0x00, 0xa8, 0xe8 };
        __u8 t2[] = { 0x07, 0x00, 0x0d, 0x60, 0x0e, 0x80 };
        static const __u8 t3[] =
                { 0xb3, 0x07, 0xb4, 0x00, 0xb5, 0x88, 0xb6, 0x02, 0xb7, 0x06,
                  0xb8, 0x00, 0xb9, 0xe7, 0xba, 0x01 };
-       static const __u8 t4[] = { 0x0b, 0x04, 0x0a, 0x40 };
 
        mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode]. priv;
        switch (mode) {
@@ -788,13 +857,17 @@ static int sd_start(struct gspca_dev *gs
        } else {
                om6802_sensor_init(gspca_dev);
        }
-       /* just in case and to keep sync with logs  (for mine) */
-       reg_w_buf(gspca_dev, t1, sizeof t1);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].data4,
+                       sizeof sensor_data[sd->sensor].data4);
+       reg_r(gspca_dev, 0x0012);
        reg_w_buf(gspca_dev, t2, sizeof t2);
-       reg_r(gspca_dev, 0x0012);
        reg_w_buf(gspca_dev, t3, sizeof t3);
        reg_w(gspca_dev, 0x0013);
-       reg_w_buf(gspca_dev, t4, sizeof t4);
+       msleep(15);
+       reg_w_buf(gspca_dev, sensor_data[sd->sensor].stream,
+                       sizeof sensor_data[sd->sensor].stream);
+       poll_sensor(gspca_dev);
+
        /* restart on each start, just in case, sometimes regs goes wrong
         * when using controls from app */
        setbrightness(gspca_dev);


---

Patch is available at: 
http://linuxtv.org/hg/v4l-dvb/rev/03b648e48efff788f85d1afd3017d8da57ae251c

_______________________________________________
linuxtv-commits mailing list
linuxtv-commits@linuxtv.org
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits

Reply via email to