diff options
author | Jean-Francois Moine <moinejf@free.fr> | 2008-12-17 12:34:53 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2008-12-30 06:39:40 -0500 |
commit | 35dc1b4cfa75dc0fa5ed44991b41db814e0f7741 (patch) | |
tree | 404482447eb48027dabadb04656a94a657a72072 /drivers/media/video/gspca/spca561.c | |
parent | ca8959bb07f27514f811200b4f71669b1783dc54 (diff) |
V4L/DVB (9985): gspca - spca561: Cleanup source.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/spca561.c')
-rw-r--r-- | drivers/media/video/gspca/spca561.c | 246 |
1 files changed, 117 insertions, 129 deletions
diff --git a/drivers/media/video/gspca/spca561.c b/drivers/media/video/gspca/spca561.c index c3de4e44123d..3a27faf60242 100644 --- a/drivers/media/video/gspca/spca561.c +++ b/drivers/media/video/gspca/spca561.c | |||
@@ -146,98 +146,7 @@ static struct v4l2_pix_format sif_072a_mode[] = { | |||
146 | #define SPCA561_SNAPBIT 0x20 | 146 | #define SPCA561_SNAPBIT 0x20 |
147 | #define SPCA561_SNAPCTRL 0x40 | 147 | #define SPCA561_SNAPCTRL 0x40 |
148 | 148 | ||
149 | static void reg_w_val(struct usb_device *dev, __u16 index, __u8 value) | 149 | static const __u16 rev72a_init_data[][2] = { |
150 | { | ||
151 | int ret; | ||
152 | |||
153 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
154 | 0, /* request */ | ||
155 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
156 | value, index, NULL, 0, 500); | ||
157 | PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value); | ||
158 | if (ret < 0) | ||
159 | PDEBUG(D_ERR, "reg write: error %d", ret); | ||
160 | } | ||
161 | |||
162 | static void write_vector(struct gspca_dev *gspca_dev, | ||
163 | const __u16 data[][2]) | ||
164 | { | ||
165 | struct usb_device *dev = gspca_dev->dev; | ||
166 | int i; | ||
167 | |||
168 | i = 0; | ||
169 | while (data[i][1] != 0) { | ||
170 | reg_w_val(dev, data[i][1], data[i][0]); | ||
171 | i++; | ||
172 | } | ||
173 | } | ||
174 | |||
175 | /* read 'len' bytes to gspca_dev->usb_buf */ | ||
176 | static void reg_r(struct gspca_dev *gspca_dev, | ||
177 | __u16 index, __u16 length) | ||
178 | { | ||
179 | usb_control_msg(gspca_dev->dev, | ||
180 | usb_rcvctrlpipe(gspca_dev->dev, 0), | ||
181 | 0, /* request */ | ||
182 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
183 | 0, /* value */ | ||
184 | index, gspca_dev->usb_buf, length, 500); | ||
185 | } | ||
186 | |||
187 | static void reg_w_buf(struct gspca_dev *gspca_dev, | ||
188 | __u16 index, const __u8 *buffer, __u16 len) | ||
189 | { | ||
190 | memcpy(gspca_dev->usb_buf, buffer, len); | ||
191 | usb_control_msg(gspca_dev->dev, | ||
192 | usb_sndctrlpipe(gspca_dev->dev, 0), | ||
193 | 0, /* request */ | ||
194 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
195 | 0, /* value */ | ||
196 | index, gspca_dev->usb_buf, len, 500); | ||
197 | } | ||
198 | |||
199 | static void i2c_write(struct gspca_dev *gspca_dev, __u16 valeur, __u16 reg) | ||
200 | { | ||
201 | int retry = 60; | ||
202 | __u8 DataLow; | ||
203 | __u8 DataHight; | ||
204 | |||
205 | DataLow = valeur; | ||
206 | DataHight = valeur >> 8; | ||
207 | reg_w_val(gspca_dev->dev, 0x8801, reg); | ||
208 | reg_w_val(gspca_dev->dev, 0x8805, DataLow); | ||
209 | reg_w_val(gspca_dev->dev, 0x8800, DataHight); | ||
210 | while (retry--) { | ||
211 | reg_r(gspca_dev, 0x8803, 1); | ||
212 | if (!gspca_dev->usb_buf[0]) | ||
213 | break; | ||
214 | } | ||
215 | } | ||
216 | |||
217 | static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode) | ||
218 | { | ||
219 | int retry = 60; | ||
220 | __u8 value; | ||
221 | __u8 vallsb; | ||
222 | |||
223 | reg_w_val(gspca_dev->dev, 0x8804, 0x92); | ||
224 | reg_w_val(gspca_dev->dev, 0x8801, reg); | ||
225 | reg_w_val(gspca_dev->dev, 0x8802, (mode | 0x01)); | ||
226 | do { | ||
227 | reg_r(gspca_dev, 0x8803, 1); | ||
228 | if (!gspca_dev->usb_buf[0]) | ||
229 | break; | ||
230 | } while (--retry); | ||
231 | if (retry == 0) | ||
232 | return -1; | ||
233 | reg_r(gspca_dev, 0x8800, 1); | ||
234 | value = gspca_dev->usb_buf[0]; | ||
235 | reg_r(gspca_dev, 0x8805, 1); | ||
236 | vallsb = gspca_dev->usb_buf[0]; | ||
237 | return ((int) value << 8) | vallsb; | ||
238 | } | ||
239 | |||
240 | static const __u16 spca561_init_data[][2] = { | ||
241 | {0x0000, 0x8114}, /* Software GPIO output data */ | 150 | {0x0000, 0x8114}, /* Software GPIO output data */ |
242 | {0x0001, 0x8114}, /* Software GPIO output data */ | 151 | {0x0001, 0x8114}, /* Software GPIO output data */ |
243 | {0x0000, 0x8112}, /* Some kind of reset */ | 152 | {0x0000, 0x8112}, /* Some kind of reset */ |
@@ -324,7 +233,7 @@ static const __u16 spca561_init_data[][2] = { | |||
324 | 233 | ||
325 | {0x0002, 0x865b}, /* Horizontal offset for valid pixels */ | 234 | {0x0002, 0x865b}, /* Horizontal offset for valid pixels */ |
326 | {0x0003, 0x865c}, /* Vertical offset for valid lines */ | 235 | {0x0003, 0x865c}, /* Vertical offset for valid lines */ |
327 | /***************//* sensor active */ | 236 | /***************/ /* sensor active */ |
328 | {0x0003, 0x8801}, /* 0x03 <- 0x01 0x21 //289 */ | 237 | {0x0003, 0x8801}, /* 0x03 <- 0x01 0x21 //289 */ |
329 | {0x0021, 0x8805}, | 238 | {0x0021, 0x8805}, |
330 | {0x0001, 0x8800}, | 239 | {0x0001, 0x8800}, |
@@ -434,7 +343,6 @@ static const __u16 spca561_init_data[][2] = { | |||
434 | {} | 343 | {} |
435 | }; | 344 | }; |
436 | 345 | ||
437 | |||
438 | /******************** QC Express etch2 stuff ********************/ | 346 | /******************** QC Express etch2 stuff ********************/ |
439 | static const __u16 Pb100_1map8300[][2] = { | 347 | static const __u16 Pb100_1map8300[][2] = { |
440 | /* reg, value */ | 348 | /* reg, value */ |
@@ -515,22 +423,103 @@ static const __u16 spca561_161rev12A_data2[][2] = { | |||
515 | {} | 423 | {} |
516 | }; | 424 | }; |
517 | 425 | ||
518 | static void sensor_mapwrite(struct gspca_dev *gspca_dev, | 426 | static void reg_w_val(struct usb_device *dev, __u16 index, __u8 value) |
519 | const __u16 sensormap[][2]) | 427 | { |
428 | int ret; | ||
429 | |||
430 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), | ||
431 | 0, /* request */ | ||
432 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
433 | value, index, NULL, 0, 500); | ||
434 | PDEBUG(D_USBO, "reg write: 0x%02x:0x%02x", index, value); | ||
435 | if (ret < 0) | ||
436 | PDEBUG(D_ERR, "reg write: error %d", ret); | ||
437 | } | ||
438 | |||
439 | static void write_vector(struct gspca_dev *gspca_dev, | ||
440 | const __u16 data[][2]) | ||
520 | { | 441 | { |
521 | int i = 0; | 442 | struct usb_device *dev = gspca_dev->dev; |
522 | __u8 usbval[2]; | 443 | int i; |
523 | 444 | ||
524 | while (sensormap[i][0]) { | 445 | i = 0; |
525 | usbval[0] = sensormap[i][1]; | 446 | while (data[i][1] != 0) { |
526 | usbval[1] = sensormap[i][1] >> 8; | 447 | reg_w_val(dev, data[i][1], data[i][0]); |
527 | reg_w_buf(gspca_dev, sensormap[i][0], usbval, 2); | ||
528 | i++; | 448 | i++; |
529 | } | 449 | } |
530 | } | 450 | } |
451 | |||
452 | /* read 'len' bytes to gspca_dev->usb_buf */ | ||
453 | static void reg_r(struct gspca_dev *gspca_dev, | ||
454 | __u16 index, __u16 length) | ||
455 | { | ||
456 | usb_control_msg(gspca_dev->dev, | ||
457 | usb_rcvctrlpipe(gspca_dev->dev, 0), | ||
458 | 0, /* request */ | ||
459 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
460 | 0, /* value */ | ||
461 | index, gspca_dev->usb_buf, length, 500); | ||
462 | } | ||
463 | |||
464 | /* write 'len' bytes from gspca_dev->usb_buf */ | ||
465 | static void reg_w_buf(struct gspca_dev *gspca_dev, | ||
466 | __u16 index, __u16 len) | ||
467 | { | ||
468 | usb_control_msg(gspca_dev->dev, | ||
469 | usb_sndctrlpipe(gspca_dev->dev, 0), | ||
470 | 0, /* request */ | ||
471 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
472 | 0, /* value */ | ||
473 | index, gspca_dev->usb_buf, len, 500); | ||
474 | } | ||
475 | |||
476 | static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg) | ||
477 | { | ||
478 | int retry = 60; | ||
479 | |||
480 | reg_w_val(gspca_dev->dev, 0x8801, reg); | ||
481 | reg_w_val(gspca_dev->dev, 0x8805, value); | ||
482 | reg_w_val(gspca_dev->dev, 0x8800, value >> 8); | ||
483 | do { | ||
484 | reg_r(gspca_dev, 0x8803, 1); | ||
485 | if (!gspca_dev->usb_buf[0]) | ||
486 | return; | ||
487 | } while (--retry); | ||
488 | } | ||
489 | |||
490 | static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode) | ||
491 | { | ||
492 | int retry = 60; | ||
493 | __u8 value; | ||
494 | |||
495 | reg_w_val(gspca_dev->dev, 0x8804, 0x92); | ||
496 | reg_w_val(gspca_dev->dev, 0x8801, reg); | ||
497 | reg_w_val(gspca_dev->dev, 0x8802, mode | 0x01); | ||
498 | do { | ||
499 | reg_r(gspca_dev, 0x8803, 1); | ||
500 | if (!gspca_dev->usb_buf[0]) { | ||
501 | reg_r(gspca_dev, 0x8800, 1); | ||
502 | value = gspca_dev->usb_buf[0]; | ||
503 | reg_r(gspca_dev, 0x8805, 1); | ||
504 | return ((int) value << 8) | gspca_dev->usb_buf[0]; | ||
505 | } | ||
506 | } while (--retry); | ||
507 | return -1; | ||
508 | } | ||
509 | |||
510 | static void sensor_mapwrite(struct gspca_dev *gspca_dev, | ||
511 | const __u16 (*sensormap)[2]) | ||
512 | { | ||
513 | while ((*sensormap)[0]) { | ||
514 | gspca_dev->usb_buf[0] = (*sensormap)[1]; | ||
515 | gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8; | ||
516 | reg_w_buf(gspca_dev, (*sensormap)[0], 2); | ||
517 | sensormap++; | ||
518 | } | ||
519 | } | ||
520 | |||
531 | static void init_161rev12A(struct gspca_dev *gspca_dev) | 521 | static void init_161rev12A(struct gspca_dev *gspca_dev) |
532 | { | 522 | { |
533 | /* sensor_reset(gspca_dev); (not in win) */ | ||
534 | write_vector(gspca_dev, spca561_161rev12A_data1); | 523 | write_vector(gspca_dev, spca561_161rev12A_data1); |
535 | sensor_mapwrite(gspca_dev, Pb100_1map8300); | 524 | sensor_mapwrite(gspca_dev, Pb100_1map8300); |
536 | /*fixme: should be in sd_start*/ | 525 | /*fixme: should be in sd_start*/ |
@@ -598,7 +587,7 @@ static int sd_init_12a(struct gspca_dev *gspca_dev) | |||
598 | static int sd_init_72a(struct gspca_dev *gspca_dev) | 587 | static int sd_init_72a(struct gspca_dev *gspca_dev) |
599 | { | 588 | { |
600 | PDEBUG(D_STREAM, "Chip revision: 072a"); | 589 | PDEBUG(D_STREAM, "Chip revision: 072a"); |
601 | write_vector(gspca_dev, spca561_init_data); | 590 | write_vector(gspca_dev, rev72a_init_data); |
602 | return 0; | 591 | return 0; |
603 | } | 592 | } |
604 | 593 | ||
@@ -621,8 +610,9 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
621 | static const __u8 Reg8391[] = | 610 | static const __u8 Reg8391[] = |
622 | { 0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00 }; | 611 | { 0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00 }; |
623 | 612 | ||
624 | reg_w_buf(gspca_dev, 0x8391, Reg8391, 8); | 613 | memcpy(gspca_dev->usb_buf, Reg8391, 8); |
625 | reg_w_buf(gspca_dev, 0x8390, Reg8391, 8); | 614 | reg_w_buf(gspca_dev, 0x8391, 8); |
615 | reg_w_buf(gspca_dev, 0x8390, 8); | ||
626 | break; | 616 | break; |
627 | } | 617 | } |
628 | } | 618 | } |
@@ -649,7 +639,6 @@ static void setexposure(struct gspca_dev *gspca_dev) | |||
649 | struct sd *sd = (struct sd *) gspca_dev; | 639 | struct sd *sd = (struct sd *) gspca_dev; |
650 | int expo; | 640 | int expo; |
651 | int clock_divider; | 641 | int clock_divider; |
652 | __u8 data[2]; | ||
653 | 642 | ||
654 | /* Register 0x8309 controls exposure for the spca561, | 643 | /* Register 0x8309 controls exposure for the spca561, |
655 | the basic exposure setting goes from 1-2047, where 1 is completely | 644 | the basic exposure setting goes from 1-2047, where 1 is completely |
@@ -673,20 +662,19 @@ static void setexposure(struct gspca_dev *gspca_dev) | |||
673 | clock_divider = 3; | 662 | clock_divider = 3; |
674 | } | 663 | } |
675 | expo |= clock_divider << 11; | 664 | expo |= clock_divider << 11; |
676 | data[0] = expo; | 665 | gspca_dev->usb_buf[0] = expo; |
677 | data[1] = expo >> 8; | 666 | gspca_dev->usb_buf[1] = expo >> 8; |
678 | reg_w_buf(gspca_dev, 0x8309, data, 2); | 667 | reg_w_buf(gspca_dev, 0x8309, 2); |
679 | } | 668 | } |
680 | 669 | ||
681 | /* rev 12a only */ | 670 | /* rev 12a only */ |
682 | static void setgain(struct gspca_dev *gspca_dev) | 671 | static void setgain(struct gspca_dev *gspca_dev) |
683 | { | 672 | { |
684 | struct sd *sd = (struct sd *) gspca_dev; | 673 | struct sd *sd = (struct sd *) gspca_dev; |
685 | __u8 data[2]; | ||
686 | 674 | ||
687 | data[0] = sd->gain; | 675 | gspca_dev->usb_buf[0] = sd->gain; |
688 | data[1] = 0; | 676 | gspca_dev->usb_buf[1] = 0; |
689 | reg_w_buf(gspca_dev, 0x8335, data, 2); | 677 | reg_w_buf(gspca_dev, 0x8335, 2); |
690 | } | 678 | } |
691 | 679 | ||
692 | static void setautogain(struct gspca_dev *gspca_dev) | 680 | static void setautogain(struct gspca_dev *gspca_dev) |
@@ -716,7 +704,9 @@ static int sd_start_12a(struct gspca_dev *gspca_dev) | |||
716 | * is sufficient to push raw frames at ~20fps */ | 704 | * is sufficient to push raw frames at ~20fps */ |
717 | reg_w_val(dev, 0x8500, mode); | 705 | reg_w_val(dev, 0x8500, mode); |
718 | } /* -- qq@kuku.eu.org */ | 706 | } /* -- qq@kuku.eu.org */ |
719 | reg_w_buf(gspca_dev, 0x8307, Reg8307, 2); | 707 | |
708 | memcpy(gspca_dev->usb_buf, Reg8307, sizeof Reg8307); | ||
709 | reg_w_buf(gspca_dev, 0x8307, sizeof Reg8307); | ||
720 | reg_w_val(gspca_dev->dev, 0x8700, Clck); | 710 | reg_w_val(gspca_dev->dev, 0x8700, Clck); |
721 | /* 0x8f 0x85 0x27 clock */ | 711 | /* 0x8f 0x85 0x27 clock */ |
722 | reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20); | 712 | reg_w_val(gspca_dev->dev, 0x8112, 0x1e | 0x20); |
@@ -791,7 +781,6 @@ static void do_autogain(struct gspca_dev *gspca_dev) | |||
791 | __u8 luma_mean = 110; | 781 | __u8 luma_mean = 110; |
792 | __u8 luma_delta = 20; | 782 | __u8 luma_delta = 20; |
793 | __u8 spring = 4; | 783 | __u8 spring = 4; |
794 | __u8 reg8339[2]; | ||
795 | 784 | ||
796 | if (sd->ag_cnt < 0) | 785 | if (sd->ag_cnt < 0) |
797 | return; | 786 | return; |
@@ -834,13 +823,13 @@ static void do_autogain(struct gspca_dev *gspca_dev) | |||
834 | 823 | ||
835 | if (gainG > 0x3f) | 824 | if (gainG > 0x3f) |
836 | gainG = 0x3f; | 825 | gainG = 0x3f; |
837 | else if (gainG < 4) | 826 | else if (gainG < 3) |
838 | gainG = 3; | 827 | gainG = 3; |
839 | i2c_write(gspca_dev, gainG, 0x35); | 828 | i2c_write(gspca_dev, gainG, 0x35); |
840 | 829 | ||
841 | if (expotimes >= 0x0256) | 830 | if (expotimes > 0x0256) |
842 | expotimes = 0x0256; | 831 | expotimes = 0x0256; |
843 | else if (expotimes < 4) | 832 | else if (expotimes < 3) |
844 | expotimes = 3; | 833 | expotimes = 3; |
845 | i2c_write(gspca_dev, expotimes | pixelclk, 0x09); | 834 | i2c_write(gspca_dev, expotimes | pixelclk, 0x09); |
846 | } | 835 | } |
@@ -848,13 +837,13 @@ static void do_autogain(struct gspca_dev *gspca_dev) | |||
848 | case Rev012A: | 837 | case Rev012A: |
849 | reg_r(gspca_dev, 0x8330, 2); | 838 | reg_r(gspca_dev, 0x8330, 2); |
850 | if (gspca_dev->usb_buf[1] > 0x08) { | 839 | if (gspca_dev->usb_buf[1] > 0x08) { |
851 | reg8339[0] = ++sd->expo12a; | 840 | gspca_dev->usb_buf[0] = ++sd->expo12a; |
852 | reg8339[1] = 0; | 841 | gspca_dev->usb_buf[1] = 0; |
853 | reg_w_buf(gspca_dev, 0x8339, reg8339, 2); | 842 | reg_w_buf(gspca_dev, 0x8339, 2); |
854 | } else if (gspca_dev->usb_buf[1] < 0x02) { | 843 | } else if (gspca_dev->usb_buf[1] < 0x02) { |
855 | reg8339[0] = --sd->expo12a; | 844 | gspca_dev->usb_buf[0] = --sd->expo12a; |
856 | reg8339[1] = 0; | 845 | gspca_dev->usb_buf[1] = 0; |
857 | reg_w_buf(gspca_dev, 0x8339, reg8339, 2); | 846 | reg_w_buf(gspca_dev, 0x8339, 2); |
858 | } | 847 | } |
859 | break; | 848 | break; |
860 | } | 849 | } |
@@ -867,8 +856,8 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
867 | { | 856 | { |
868 | struct sd *sd = (struct sd *) gspca_dev; | 857 | struct sd *sd = (struct sd *) gspca_dev; |
869 | 858 | ||
870 | switch (data[0]) { | 859 | switch (data[0]) { /* sequence number */ |
871 | case 0: /* start of frame */ | 860 | case 0: /* start of frame */ |
872 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, | 861 | frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame, |
873 | data, 0); | 862 | data, 0); |
874 | data += SPCA561_OFFSET_DATA; | 863 | data += SPCA561_OFFSET_DATA; |
@@ -890,8 +879,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
890 | frame, data, len); | 879 | frame, data, len); |
891 | } | 880 | } |
892 | return; | 881 | return; |
893 | case 0xff: /* drop */ | 882 | case 0xff: /* drop (empty mpackets) */ |
894 | /* gspca_dev->last_packet_type = DISCARD_PACKET; */ | ||
895 | return; | 883 | return; |
896 | } | 884 | } |
897 | data++; | 885 | data++; |