Skip to content

Commit ad62fb0

Browse files
lcostantinoMauro Carvalho Chehab
authored andcommitted
V4L/DVB (9293): gspca: Separate and fix the sensor dependant sequences in t613.
Signed-off-by: Leandro Costantino <[email protected]> Signed-off-by: Jean-Francois Moine <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent 35480b6 commit ad62fb0

File tree

1 file changed

+110
-37
lines changed
  • drivers/media/video/gspca

1 file changed

+110
-37
lines changed

drivers/media/video/gspca/t613.c

Lines changed: 110 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,59 @@ static struct v4l2_pix_format vga_mode_t16[] = {
261261
.priv = 0},
262262
};
263263

264+
/* sensor specific data */
265+
struct additional_sensor_data {
266+
const __u8 data1[20];
267+
const __u8 data2[18];
268+
const __u8 data3[18];
269+
const __u8 data4[4];
270+
const __u8 data5[6];
271+
const __u8 stream[4];
272+
};
273+
274+
const static struct additional_sensor_data sensor_data[] = {
275+
{ /* TAS5130A */
276+
.data1 =
277+
{0xd0, 0xbb, 0xd1, 0x28, 0xd2, 0x10, 0xd3, 0x10,
278+
0xd4, 0xbb, 0xd5, 0x28, 0xd6, 0x1e, 0xd7, 0x27,
279+
0xd8, 0xc8, 0xd9, 0xfc},
280+
.data2 =
281+
{0xe0, 0x60, 0xe1, 0xa8, 0xe2, 0xe0, 0xe3, 0x60,
282+
0xe4, 0xa8, 0xe5, 0xe0, 0xe6, 0x60, 0xe7, 0xa8,
283+
0xe8, 0xe0},
284+
.data3 =
285+
{0xc7, 0x60, 0xc8, 0xa8, 0xc9, 0xe0, 0xca, 0x60,
286+
0xcb, 0xa8, 0xcc, 0xe0, 0xcd, 0x60, 0xce, 0xa8,
287+
0xcf, 0xe0},
288+
.data4 = /* Freq (50/60Hz). Splitted for test purpose */
289+
{0x66, 0x00, 0xa8, 0xe8},
290+
.data5 =
291+
{0x0c, 0x03, 0xab, 0x10, 0x81, 0x20},
292+
.stream =
293+
{0x0b, 0x04, 0x0a, 0x40},
294+
},
295+
{ /* OM6802 */
296+
.data1 =
297+
{0xd0, 0xc2, 0xd1, 0x28, 0xd2, 0x0f, 0xd3, 0x22,
298+
0xd4, 0xcd, 0xd5, 0x27, 0xd6, 0x2c, 0xd7, 0x06,
299+
0xd8, 0xb3, 0xd9, 0xfc},
300+
.data2 =
301+
{0xe0, 0x80, 0xe1, 0xff, 0xe2, 0xff, 0xe3, 0x80,
302+
0xe4, 0xff, 0xe5, 0xff, 0xe6, 0x80, 0xe7, 0xff,
303+
0xe8, 0xff},
304+
.data3 =
305+
{0xc7, 0x80, 0xc8, 0xff, 0xc9, 0xff, 0xca, 0x80,
306+
0xcb, 0xff, 0xcc, 0xff, 0xcd, 0x80, 0xce, 0xff,
307+
0xcf, 0xff},
308+
.data4 = /*Freq (50/60Hz). Splitted for test purpose */
309+
{0x66, 0xca, 0xa8, 0xf0 },
310+
.data5 = /* this could be removed later */
311+
{0x0c, 0x03, 0xab, 0x13, 0x81, 0x23},
312+
.stream =
313+
{0x0b, 0x04, 0x0a, 0x78},
314+
}
315+
};
316+
264317
#define MAX_EFFECTS 7
265318
/* easily done by soft, this table could be removed,
266319
* i keep it here just in case */
@@ -603,32 +656,10 @@ static int sd_init(struct gspca_dev *gspca_dev)
603656
0x65, 0x0a, 0xbb, 0x86, 0xaf, 0x58, 0xb0, 0x68,
604657
0x87, 0x40, 0x89, 0x2b, 0x8d, 0xff, 0x83, 0x40,
605658
0xac, 0x84, 0xad, 0x86, 0xaf, 0x46};
606-
static const __u8 nset4[] = {
607-
0xe0, 0x60, 0xe1, 0xa8, 0xe2, 0xe0, 0xe3, 0x60, 0xe4, 0xa8,
608-
0xe5, 0xe0, 0xe6, 0x60, 0xe7, 0xa8,
609-
0xe8, 0xe0
610-
};
611-
/* ojo puede ser 0xe6 en vez de 0xe9 */
612-
static const __u8 nset2[] = {
613-
0xd0, 0xbb, 0xd1, 0x28, 0xd2, 0x10, 0xd3, 0x10, 0xd4, 0xbb,
614-
0xd5, 0x28, 0xd6, 0x1e, 0xd7, 0x27,
615-
0xd8, 0xc8, 0xd9, 0xfc
616-
};
617-
static const __u8 nset3[] = {
618-
0xc7, 0x60, 0xc8, 0xa8, 0xc9, 0xe0, 0xca, 0x60, 0xcb, 0xa8,
619-
0xcc, 0xe0, 0xcd, 0x60, 0xce, 0xa8,
620-
0xcf, 0xe0
621-
};
622-
static const __u8 nset5[] =
623-
{ 0x8f, 0x24, 0xc3, 0x00 }; /* bright */
624-
static const __u8 nset7[4] =
625-
{ 0x66, 0xca, 0xa8, 0xf8 }; /* 50/60 Hz */
626659
static const __u8 nset9[4] =
627660
{ 0x0b, 0x04, 0x0a, 0x78 };
628661
static const __u8 nset8[6] =
629662
{ 0xa8, 0xf0, 0xc6, 0x88, 0xc0, 0x00 };
630-
static const __u8 nset10[6] =
631-
{ 0x0c, 0x03, 0xab, 0x10, 0x81, 0x20 };
632663

633664
byte = reg_r(gspca_dev, 0x06);
634665
test_byte = reg_r(gspca_dev, 0x07);
@@ -672,13 +703,18 @@ static int sd_init(struct gspca_dev *gspca_dev)
672703
reg_w_buf(gspca_dev, n4, sizeof n4);
673704
reg_r(gspca_dev, 0x0080);
674705
reg_w(gspca_dev, 0x2c80);
675-
reg_w_buf(gspca_dev, nset2, sizeof nset2);
676-
reg_w_buf(gspca_dev, nset3, sizeof nset3);
677-
reg_w_buf(gspca_dev, nset4, sizeof nset4);
706+
707+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data1,
708+
sizeof sensor_data[sd->sensor].data1);
709+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data3,
710+
sizeof sensor_data[sd->sensor].data3);
711+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data2,
712+
sizeof sensor_data[sd->sensor].data2);
713+
678714
reg_w(gspca_dev, 0x3880);
679715
reg_w(gspca_dev, 0x3880);
680716
reg_w(gspca_dev, 0x338e);
681-
nset5 - missing
717+
682718
setbrightness(gspca_dev);
683719
setcontrast(gspca_dev);
684720
setgamma(gspca_dev);
@@ -690,15 +726,21 @@ nset5 - missing
690726
reg_w(gspca_dev, 0x2088);
691727
reg_w(gspca_dev, 0x2089);
692728

693-
reg_w_buf(gspca_dev, nset7, sizeof nset7);
694-
reg_w_buf(gspca_dev, nset10, sizeof nset10);
729+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data4,
730+
sizeof sensor_data[sd->sensor].data4);
731+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data5,
732+
sizeof sensor_data[sd->sensor].data5);
695733
reg_w_buf(gspca_dev, nset8, sizeof nset8);
696734
reg_w_buf(gspca_dev, nset9, sizeof nset9);
697735

698736
reg_w(gspca_dev, 0x2880);
699-
reg_w_buf(gspca_dev, nset2, sizeof nset2);
700-
reg_w_buf(gspca_dev, nset3, sizeof nset3);
701-
reg_w_buf(gspca_dev, nset4, sizeof nset4);
737+
738+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data1,
739+
sizeof sensor_data[sd->sensor].data1);
740+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data3,
741+
sizeof sensor_data[sd->sensor].data3);
742+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data2,
743+
sizeof sensor_data[sd->sensor].data2);
702744

703745
return 0;
704746
}
@@ -744,16 +786,43 @@ static void setlightfreq(struct gspca_dev *gspca_dev)
744786
reg_w_buf(gspca_dev, freq, sizeof freq);
745787
}
746788

789+
/* Is this really needed?
790+
* i added some module parameters for test with some users */
791+
static void poll_sensor(struct gspca_dev *gspca_dev)
792+
{
793+
struct sd *sd = (struct sd *) gspca_dev;
794+
static const __u8 poll1[] =
795+
{0x67, 0x05, 0x68, 0x81, 0x69, 0x80, 0x6a, 0x82,
796+
0x6b, 0x68, 0x6c, 0x69, 0x72, 0xd9, 0x73, 0x34,
797+
0x74, 0x32, 0x75, 0x92, 0x76, 0x00, 0x09, 0x01,
798+
0x60, 0x14};
799+
static const __u8 poll2[] =
800+
{0x67, 0x02, 0x68, 0x71, 0x69, 0x72, 0x72, 0xa9,
801+
0x73, 0x02, 0x73, 0x02, 0x60, 0x14};
802+
static const __u8 poll3[] =
803+
{0x87, 0x3f, 0x88, 0x20, 0x89, 0x2d};
804+
static const __u8 poll4[] =
805+
{0xa6, 0x0a, 0xea, 0xcf, 0xbe, 0x26, 0xb1, 0x5f,
806+
0xa1, 0xb1, 0xda, 0x6b, 0xdb, 0x98, 0xdf, 0x0c,
807+
0xc2, 0x80, 0xc3, 0x10};
808+
809+
if (sd->sensor != SENSOR_TAS5130A) {
810+
PDEBUG(D_STREAM, "[Sensor requires polling]");
811+
reg_w_buf(gspca_dev, poll1, sizeof poll1);
812+
reg_w_buf(gspca_dev, poll2, sizeof poll2);
813+
reg_w_buf(gspca_dev, poll3, sizeof poll3);
814+
reg_w_buf(gspca_dev, poll4, sizeof poll4);
815+
}
816+
}
817+
747818
static int sd_start(struct gspca_dev *gspca_dev)
748819
{
749820
struct sd *sd = (struct sd *) gspca_dev;
750821
int i, mode;
751-
static const __u8 t1[] = { 0x66, 0x00, 0xa8, 0xe8 };
752822
__u8 t2[] = { 0x07, 0x00, 0x0d, 0x60, 0x0e, 0x80 };
753823
static const __u8 t3[] =
754824
{ 0xb3, 0x07, 0xb4, 0x00, 0xb5, 0x88, 0xb6, 0x02, 0xb7, 0x06,
755825
0xb8, 0x00, 0xb9, 0xe7, 0xba, 0x01 };
756-
static const __u8 t4[] = { 0x0b, 0x04, 0x0a, 0x40 };
757826

758827
mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode]. priv;
759828
switch (mode) {
@@ -788,13 +857,17 @@ static int sd_start(struct gspca_dev *gspca_dev)
788857
} else {
789858
om6802_sensor_init(gspca_dev);
790859
}
791-
/* just in case and to keep sync with logs (for mine) */
792-
reg_w_buf(gspca_dev, t1, sizeof t1);
793-
reg_w_buf(gspca_dev, t2, sizeof t2);
860+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].data4,
861+
sizeof sensor_data[sd->sensor].data4);
794862
reg_r(gspca_dev, 0x0012);
863+
reg_w_buf(gspca_dev, t2, sizeof t2);
795864
reg_w_buf(gspca_dev, t3, sizeof t3);
796865
reg_w(gspca_dev, 0x0013);
797-
reg_w_buf(gspca_dev, t4, sizeof t4);
866+
msleep(15);
867+
reg_w_buf(gspca_dev, sensor_data[sd->sensor].stream,
868+
sizeof sensor_data[sd->sensor].stream);
869+
poll_sensor(gspca_dev);
870+
798871
/* restart on each start, just in case, sometimes regs goes wrong
799872
* when using controls from app */
800873
setbrightness(gspca_dev);

0 commit comments

Comments
 (0)