diff options
| author | Jean-Francois Moine <moinejf@free.fr> | 2008-07-29 13:14:04 -0400 |
|---|---|---|
| committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-08-06 05:57:13 -0400 |
| commit | 8f47a3cefbb275893ce26ade7094599e4b129bb3 (patch) | |
| tree | 4f88729afc9e4e9602805c4f926483fa874aa105 | |
| parent | 0cd6759da646aae9d117df278ce3d5f3cab31904 (diff) | |
V4L/DVB (8569): gspca: Set back the old values of Sonix sn9c120 and cleanup source.
The values from win traces do not seem to work while the webcams
did work with gspca v1.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
| -rw-r--r-- | drivers/media/video/gspca/sonixj.c | 184 |
1 files changed, 59 insertions, 125 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c index 65452f3b1945..b60ff600a757 100644 --- a/drivers/media/video/gspca/sonixj.c +++ b/drivers/media/video/gspca/sonixj.c | |||
| @@ -148,55 +148,58 @@ static struct v4l2_pix_format vga_mode[] = { | |||
| 148 | 148 | ||
| 149 | /*Data from sn9c102p+hv71331r */ | 149 | /*Data from sn9c102p+hv71331r */ |
| 150 | static const __u8 sn_hv7131[] = { | 150 | static const __u8 sn_hv7131[] = { |
| 151 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 reg9 */ | 151 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 152 | 0x00, 0x03, 0x64, 0x00, 0x1A, 0x20, 0x20, 0x20, 0xA1, 0x11, | 152 | 0x00, 0x03, 0x64, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| 153 | /* rega regb regc regd rege regf reg10 reg11 */ | 153 | /* reg8 reg9 rega regb regc regd rege regf */ |
| 154 | 0x02, 0x09, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, /* 00 */ | 154 | 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10, |
| 155 | /* reg12 reg13 reg14 reg15 reg16 reg17 reg18 reg19 reg1a reg1b */ | 155 | /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| 156 | 0x00, 0x01, 0x03, 0x28, 0x1e, 0x41, 0x0a, 0x00, 0x00, 0x00, | 156 | 0x03, 0x00, 0x00, 0x01, 0x03, 0x28, 0x1e, 0x41, |
| 157 | /* reg1c reg1d reg1e reg1f reg20 reg21 reg22 reg23 */ | 157 | /* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */ |
| 158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 158 | 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| 159 | }; | 159 | }; |
| 160 | 160 | ||
| 161 | static const __u8 sn_mi0360[] = { | 161 | static const __u8 sn_mi0360[] = { |
| 162 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 reg9 */ | 162 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 163 | 0x00, 0x61, 0x44, 0x00, 0x1a, 0x20, 0x20, 0x20, 0xb1, 0x5d, | 163 | 0x00, 0x61, 0x44, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| 164 | /* rega regb regc regd rege regf reg10 reg11 */ | 164 | /* reg8 reg9 rega regb regc regd rege regf */ |
| 165 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, | 165 | 0xb1, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, |
| 166 | /* reg12 reg13 reg14 reg15 reg16 reg17 reg18 reg19 reg1a reg1b */ | 166 | /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| 167 | 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x61, 0x06, 0x00, 0x00, 0x00, | 167 | 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x61, |
| 168 | /* reg1c reg1d reg1e reg1f reg20 reg21 reg22 reg23 */ | 168 | /* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */ |
| 169 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 169 | 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | static const __u8 sn_mo4000[] = { | 172 | static const __u8 sn_mo4000[] = { |
| 173 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 */ | 173 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 174 | 0x12, 0x23, 0x60, 0x00, 0x1A, 0x00, 0x20, 0x18, 0x81, | 174 | 0x12, 0x23, 0x60, 0x00, 0x1a, 0x00, 0x20, 0x18, |
| 175 | /* reg9 rega regb regc regd rege regf reg10 reg11*/ | 175 | /* reg8 reg9 rega regb regc regd rege regf */ |
| 176 | 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, | 176 | 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 177 | /* reg12 reg13 reg14 reg15 reg16 reg17 reg18 reg19 reg1a*/ | 177 | /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| 178 | 0x0b, 0x0f, 0x14, 0x28, 0x1e, 0x40, 0x08, 0x00, 0x00, | 178 | 0x03, 0x00, 0x0b, 0x0f, 0x14, 0x28, 0x1e, 0x40, |
| 179 | /* reg1b reg1c reg1d reg1e reg1f reg20 reg21 reg22 reg23*/ | 179 | /* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */ |
| 180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x25, 0x39, 0x4b, | 180 | 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
| 181 | 0x5c, 0x6b, 0x79, 0x87, 0x95, 0xa2, 0xaf, 0xbb, 0xc7, | ||
| 182 | 0xd3, 0xdf, 0xea, 0xf5 | ||
| 183 | }; | 181 | }; |
| 184 | 182 | ||
| 185 | static const __u8 sn_ov7648[] = { | 183 | static const __u8 sn_ov7648[] = { |
| 186 | 0x00, 0x21, 0x62, 0x00, 0x1a, 0x20, 0x20, 0x20, 0xA1, 0x6E, 0x18, 0x65, | 184 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 187 | 0x00, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x06, 0x06, 0x28, 0x1E, 0x82, | 185 | 0x00, 0x21, 0x62, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| 188 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00 | 186 | /* reg8 reg9 rega regb regc regd rege regf */ |
| 187 | 0xa1, 0x6e, 0x18, 0x65, 0x00, 0x00, 0x00, 0x10, | ||
| 188 | /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ | ||
| 189 | 0x03, 0x00, 0x00, 0x06, 0x06, 0x28, 0x1e, 0x82, | ||
| 190 | /* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */ | ||
| 191 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00 | ||
| 189 | }; | 192 | }; |
| 190 | 193 | ||
| 191 | static const __u8 sn_ov7660[] = { | 194 | static const __u8 sn_ov7660[] = { |
| 192 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 */ | 195 | /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ |
| 193 | 0x00, 0x61, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x81, | 196 | 0x00, 0x61, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20, |
| 194 | /* reg9 rega regb regc regd rege regf reg10 reg11*/ | 197 | /* reg8 reg9 rega regb regc regd rege regf */ |
| 195 | 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, | 198 | 0x81, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10, |
| 196 | /* reg12 reg13 reg14 reg15 reg16 reg17 reg18 reg19 reg1a*/ | 199 | /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ |
| 197 | 0x01, 0x01, 0x14, 0x28, 0x1e, 0x00, 0x07, 0x00, 0x00, | 200 | 0x03, 0x00, 0x01, 0x01, 0x08, 0x28, 0x1e, 0x20, |
| 198 | /* reg1b reg1c reg1d reg1e reg1f reg20 reg21 reg22 reg23*/ | 201 | /* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */ |
| 199 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 202 | 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| 200 | }; | 203 | }; |
| 201 | 204 | ||
| 202 | /* sequence specific to the sensors - !! index = SENSOR_xxx */ | 205 | /* sequence specific to the sensors - !! index = SENSOR_xxx */ |
| @@ -212,10 +215,6 @@ static const __u8 regsn20[] = { | |||
| 212 | 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99, | 215 | 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99, |
| 213 | 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff | 216 | 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff |
| 214 | }; | 217 | }; |
| 215 | static const __u8 regsn20_sn9c120[] = { | ||
| 216 | 0x00, 0x25, 0x3c, 0x50, 0x62, 0x72, 0x81, 0x90, | ||
| 217 | 0x9e, 0xab, 0xb8, 0xc5, 0xd1, 0xdd, 0xe9, 0xf4, 0xff | ||
| 218 | }; | ||
| 219 | static const __u8 regsn20_sn9c325[] = { | 218 | static const __u8 regsn20_sn9c325[] = { |
| 220 | 0x0a, 0x3a, 0x56, 0x6c, 0x7e, 0x8d, 0x9a, 0xa4, | 219 | 0x0a, 0x3a, 0x56, 0x6c, 0x7e, 0x8d, 0x9a, 0xa4, |
| 221 | 0xaf, 0xbb, 0xc5, 0xcd, 0xd5, 0xde, 0xe8, 0xed, 0xf5 | 220 | 0xaf, 0xbb, 0xc5, 0xcd, 0xd5, 0xde, 0xe8, 0xed, 0xf5 |
| @@ -227,21 +226,6 @@ static const __u8 reg84[] = { | |||
| 227 | /* 0x00, 0x00, 0x00, 0x00, 0x00 */ | 226 | /* 0x00, 0x00, 0x00, 0x00, 0x00 */ |
| 228 | 0xf7, 0x0f, 0x0a, 0x00, 0x00 | 227 | 0xf7, 0x0f, 0x0a, 0x00, 0x00 |
| 229 | }; | 228 | }; |
| 230 | static const __u8 reg84_sn9c120_1[] = { | ||
| 231 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 232 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 233 | 0x00, 0x00, 0x0c, 0x00, 0x00 | ||
| 234 | }; | ||
| 235 | static const __u8 reg84_sn9c120_2[] = { | ||
| 236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
| 238 | 0x00, 0x00, 0x0c, 0x02, 0x3b | ||
| 239 | }; | ||
| 240 | static const __u8 reg84_sn9c120_3[] = { | ||
| 241 | 0x14, 0x00, 0x27, 0x00, 0x08, 0x00, 0xeb, 0x0f, | ||
| 242 | 0xd5, 0x0f, 0x42, 0x00, 0x41, 0x00, 0xca, 0x0f, | ||
| 243 | 0xf5, 0x0f, 0x0c, 0x02, 0x3b | ||
| 244 | }; | ||
| 245 | static const __u8 reg84_sn9c325[] = { | 229 | static const __u8 reg84_sn9c325[] = { |
| 246 | 0x14, 0x00, 0x27, 0x00, 0x07, 0x00, 0xe4, 0x0f, | 230 | 0x14, 0x00, 0x27, 0x00, 0x07, 0x00, 0xe4, 0x0f, |
| 247 | 0xd3, 0x0f, 0x4b, 0x00, 0x48, 0x00, 0xc0, 0x0f, | 231 | 0xd3, 0x0f, 0x4b, 0x00, 0x48, 0x00, 0xc0, 0x0f, |
| @@ -676,13 +660,12 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
| 676 | const __u8 *reg9a; | 660 | const __u8 *reg9a; |
| 677 | static const __u8 reg9a_def[] = | 661 | static const __u8 reg9a_def[] = |
| 678 | {0x08, 0x40, 0x20, 0x10, 0x00, 0x04}; | 662 | {0x08, 0x40, 0x20, 0x10, 0x00, 0x04}; |
| 679 | static const __u8 reg9a_sn9c120[] = /* from win trace */ | ||
| 680 | {0x00, 0x40, 0x38, 0x30, 0x00, 0x20}; | ||
| 681 | static const __u8 reg9a_sn9c325[] = | 663 | static const __u8 reg9a_sn9c325[] = |
| 682 | {0x0a, 0x40, 0x38, 0x30, 0x00, 0x20}; | 664 | {0x0a, 0x40, 0x38, 0x30, 0x00, 0x20}; |
| 665 | static const __u8 regd4[] = {0x60, 0x00, 0x00}; | ||
| 683 | 666 | ||
| 684 | reg_w1(gspca_dev, 0xf1, 0x00); | 667 | reg_w1(gspca_dev, 0xf1, 0x00); |
| 685 | reg_w1(gspca_dev, 0x01, sn9c1xx[0]); /*fixme:jfm was [1] en v1*/ | 668 | reg_w1(gspca_dev, 0x01, 0x00); /*jfm was sn9c1xx[1] in v1*/ |
| 686 | 669 | ||
| 687 | /* configure gpio */ | 670 | /* configure gpio */ |
| 688 | reg_w(gspca_dev, 0x01, &sn9c1xx[1], 2); | 671 | reg_w(gspca_dev, 0x01, &sn9c1xx[1], 2); |
| @@ -692,25 +675,17 @@ static int configure_gpio(struct gspca_dev *gspca_dev, | |||
| 692 | case BRIDGE_SN9C325: | 675 | case BRIDGE_SN9C325: |
| 693 | reg9a = reg9a_sn9c325; | 676 | reg9a = reg9a_sn9c325; |
| 694 | break; | 677 | break; |
| 695 | case BRIDGE_SN9C120: | ||
| 696 | reg9a = reg9a_sn9c120; | ||
| 697 | break; | ||
| 698 | default: | 678 | default: |
| 699 | reg9a = reg9a_def; | 679 | reg9a = reg9a_def; |
| 700 | break; | 680 | break; |
| 701 | } | 681 | } |
| 702 | reg_w(gspca_dev, 0x9a, reg9a, 6); | 682 | reg_w(gspca_dev, 0x9a, reg9a, 6); |
| 703 | 683 | ||
| 704 | reg_w1(gspca_dev, 0xd4, 0x60); /*fixme:jfm 60 00 00 (3) ? */ | 684 | reg_w(gspca_dev, 0xd4, regd4, sizeof regd4); /*fixme:jfm was 60 only*/ |
| 705 | 685 | ||
| 706 | reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f); | 686 | reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f); |
| 707 | 687 | ||
| 708 | switch (sd->bridge) { | 688 | switch (sd->bridge) { |
| 709 | case BRIDGE_SN9C120: /* from win trace */ | ||
| 710 | reg_w1(gspca_dev, 0x01, 0x61); | ||
| 711 | reg_w1(gspca_dev, 0x17, 0x20); | ||
| 712 | reg_w1(gspca_dev, 0x01, 0x60); | ||
| 713 | break; | ||
| 714 | case BRIDGE_SN9C325: | 689 | case BRIDGE_SN9C325: |
| 715 | reg_w1(gspca_dev, 0x01, 0x43); | 690 | reg_w1(gspca_dev, 0x01, 0x43); |
| 716 | reg_w1(gspca_dev, 0x17, 0xae); | 691 | reg_w1(gspca_dev, 0x17, 0xae); |
| @@ -819,10 +794,11 @@ static int sd_open(struct gspca_dev *gspca_dev) | |||
| 819 | 794 | ||
| 820 | /* setup a selector by bridge */ | 795 | /* setup a selector by bridge */ |
| 821 | reg_w1(gspca_dev, 0xf1, 0x01); | 796 | reg_w1(gspca_dev, 0xf1, 0x01); |
| 822 | reg_r(gspca_dev, 0x00, 1); /* -> regF1 = 0x00 */ | ||
| 823 | reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]); | ||
| 824 | reg_r(gspca_dev, 0x00, 1); | 797 | reg_r(gspca_dev, 0x00, 1); |
| 798 | reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]); | ||
| 799 | reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */ | ||
| 825 | regF1 = gspca_dev->usb_buf[0]; | 800 | regF1 = gspca_dev->usb_buf[0]; |
| 801 | PDEBUG(D_PROBE, "Sonix chip id: %02x", regF1); | ||
| 826 | switch (sd->bridge) { | 802 | switch (sd->bridge) { |
| 827 | case BRIDGE_SN9C102P: | 803 | case BRIDGE_SN9C102P: |
| 828 | if (regF1 != 0x11) | 804 | if (regF1 != 0x11) |
| @@ -933,15 +909,10 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
| 933 | sd->exposure = setexposure(gspca_dev, expo); | 909 | sd->exposure = setexposure(gspca_dev, expo); |
| 934 | break; | 910 | break; |
| 935 | case SENSOR_MI0360: | 911 | case SENSOR_MI0360: |
| 936 | expo = sd->brightness >> 4; | ||
| 937 | sd->exposure = setexposure(gspca_dev, expo); | ||
| 938 | break; | ||
| 939 | case SENSOR_MO4000: | 912 | case SENSOR_MO4000: |
| 940 | expo = sd->brightness >> 4; | 913 | expo = sd->brightness >> 4; |
| 941 | sd->exposure = setexposure(gspca_dev, expo); | 914 | sd->exposure = setexposure(gspca_dev, expo); |
| 942 | break; | 915 | break; |
| 943 | case SENSOR_OV7660: | ||
| 944 | return; /*jfm??*/ | ||
| 945 | } | 916 | } |
| 946 | 917 | ||
| 947 | k2 = sd->brightness >> 10; | 918 | k2 = sd->brightness >> 10; |
| @@ -954,8 +925,6 @@ static void setcontrast(struct gspca_dev *gspca_dev) | |||
| 954 | __u8 k2; | 925 | __u8 k2; |
| 955 | __u8 contrast[] = { 0x00, 0x00, 0x28, 0x00, 0x07, 0x00 }; | 926 | __u8 contrast[] = { 0x00, 0x00, 0x28, 0x00, 0x07, 0x00 }; |
| 956 | 927 | ||
| 957 | if (sd->sensor == SENSOR_OV7660) | ||
| 958 | return; /*jfm??*/ | ||
| 959 | k2 = sd->contrast; | 928 | k2 = sd->contrast; |
| 960 | contrast[2] = k2; | 929 | contrast[2] = k2; |
| 961 | contrast[0] = (k2 + 1) >> 1; | 930 | contrast[0] = (k2 + 1) >> 1; |
| @@ -982,15 +951,11 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 982 | { | 951 | { |
| 983 | struct sd *sd = (struct sd *) gspca_dev; | 952 | struct sd *sd = (struct sd *) gspca_dev; |
| 984 | int i; | 953 | int i; |
| 985 | __u8 data; | 954 | __u8 reg1, reg17, reg18; |
| 986 | __u8 reg1; | ||
| 987 | __u8 reg17; | ||
| 988 | const __u8 *sn9c1xx; | 955 | const __u8 *sn9c1xx; |
| 989 | int mode; | 956 | int mode; |
| 990 | static const __u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; | 957 | static const __u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; |
| 991 | static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; | 958 | static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; |
| 992 | static const __u8 CA_sn9c120[] = | ||
| 993 | { 0x14, 0xec, 0x0a, 0xf6 }; /* SN9C120 */ | ||
| 994 | static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */ | 959 | static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */ |
| 995 | static const __u8 CE_sn9c325[] = | 960 | static const __u8 CE_sn9c325[] = |
| 996 | { 0x32, 0xdd, 0x32, 0xdd }; /* OV7648 - SN9C325 */ | 961 | { 0x32, 0xdd, 0x32, 0xdd }; /* OV7648 - SN9C325 */ |
| @@ -998,9 +963,7 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 998 | sn9c1xx = sn_tb[(int) sd->sensor]; | 963 | sn9c1xx = sn_tb[(int) sd->sensor]; |
| 999 | configure_gpio(gspca_dev, sn9c1xx); | 964 | configure_gpio(gspca_dev, sn9c1xx); |
| 1000 | 965 | ||
| 1001 | /*fixme:jfm this sequence should appear at end of sd_start */ | 966 | /* reg_w1(gspca_dev, 0x01, 0x44); jfm from win trace*/ |
| 1002 | /* with | ||
| 1003 | reg_w1(gspca_dev, 0x01, 0x44); */ | ||
| 1004 | reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]); | 967 | reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]); |
| 1005 | reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]); | 968 | reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]); |
| 1006 | reg_w1(gspca_dev, 0x12, sn9c1xx[0x12]); | 969 | reg_w1(gspca_dev, 0x12, sn9c1xx[0x12]); |
| @@ -1012,20 +975,16 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 1012 | reg_w1(gspca_dev, 0xc7, 0x00); | 975 | reg_w1(gspca_dev, 0xc7, 0x00); |
| 1013 | reg_w1(gspca_dev, 0xc8, 0x50); | 976 | reg_w1(gspca_dev, 0xc8, 0x50); |
| 1014 | reg_w1(gspca_dev, 0xc9, 0x3c); | 977 | reg_w1(gspca_dev, 0xc9, 0x3c); |
| 1015 | /*fixme:jfm end of ending sequence */ | ||
| 1016 | reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]); | 978 | reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]); |
| 1017 | switch (sd->bridge) { | 979 | switch (sd->bridge) { |
| 1018 | case BRIDGE_SN9C325: | 980 | case BRIDGE_SN9C325: |
| 1019 | data = 0xae; | 981 | reg17 = 0xae; |
| 1020 | break; | ||
| 1021 | case BRIDGE_SN9C120: | ||
| 1022 | data = 0xa0; | ||
| 1023 | break; | 982 | break; |
| 1024 | default: | 983 | default: |
| 1025 | data = 0x60; | 984 | reg17 = 0x60; |
| 1026 | break; | 985 | break; |
| 1027 | } | 986 | } |
| 1028 | reg_w1(gspca_dev, 0x17, data); | 987 | reg_w1(gspca_dev, 0x17, reg17); |
| 1029 | reg_w1(gspca_dev, 0x05, sn9c1xx[5]); | 988 | reg_w1(gspca_dev, 0x05, sn9c1xx[5]); |
| 1030 | reg_w1(gspca_dev, 0x07, sn9c1xx[7]); | 989 | reg_w1(gspca_dev, 0x07, sn9c1xx[7]); |
| 1031 | reg_w1(gspca_dev, 0x06, sn9c1xx[6]); | 990 | reg_w1(gspca_dev, 0x06, sn9c1xx[6]); |
| @@ -1040,20 +999,6 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 1040 | reg_w1(gspca_dev, 0x9a, 0x0a); | 999 | reg_w1(gspca_dev, 0x9a, 0x0a); |
| 1041 | reg_w1(gspca_dev, 0x99, 0x60); | 1000 | reg_w1(gspca_dev, 0x99, 0x60); |
| 1042 | break; | 1001 | break; |
| 1043 | case BRIDGE_SN9C120: | ||
| 1044 | reg_w(gspca_dev, 0x20, regsn20_sn9c120, | ||
| 1045 | sizeof regsn20_sn9c120); | ||
| 1046 | for (i = 0; i < 2; i++) | ||
| 1047 | reg_w(gspca_dev, 0x84, reg84_sn9c120_1, | ||
| 1048 | sizeof reg84_sn9c120_1); | ||
| 1049 | for (i = 0; i < 6; i++) | ||
| 1050 | reg_w(gspca_dev, 0x84, reg84_sn9c120_2, | ||
| 1051 | sizeof reg84_sn9c120_2); | ||
| 1052 | reg_w(gspca_dev, 0x84, reg84_sn9c120_3, | ||
| 1053 | sizeof reg84_sn9c120_3); | ||
| 1054 | reg_w1(gspca_dev, 0x9a, 0x05); | ||
| 1055 | reg_w1(gspca_dev, 0x99, 0x5b); | ||
| 1056 | break; | ||
| 1057 | default: | 1002 | default: |
| 1058 | reg_w(gspca_dev, 0x20, regsn20, sizeof regsn20); | 1003 | reg_w(gspca_dev, 0x20, regsn20, sizeof regsn20); |
| 1059 | for (i = 0; i < 8; i++) | 1004 | for (i = 0; i < 8; i++) |
| @@ -1103,22 +1048,14 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 1103 | /* reg1 = 0x44; */ | 1048 | /* reg1 = 0x44; */ |
| 1104 | /* reg1 = 0x46; (done) */ | 1049 | /* reg1 = 0x46; (done) */ |
| 1105 | } else { | 1050 | } else { |
| 1106 | reg17 = 0xa2; /* 640 */ | 1051 | reg17 = 0x22; /* 640 MCKSIZE */ |
| 1107 | reg1 = 0x40; | 1052 | reg1 = 0x06; |
| 1108 | } | 1053 | } |
| 1109 | break; | 1054 | break; |
| 1110 | } | 1055 | } |
| 1111 | reg_w(gspca_dev, 0xc0, C0, 6); | 1056 | reg_w(gspca_dev, 0xc0, C0, 6); |
| 1057 | reg_w(gspca_dev, 0xca, CA, 4); | ||
| 1112 | switch (sd->bridge) { | 1058 | switch (sd->bridge) { |
| 1113 | case BRIDGE_SN9C120: /*jfm ?? */ | ||
| 1114 | reg_w(gspca_dev, 0xca, CA_sn9c120, 4); | ||
| 1115 | break; | ||
| 1116 | default: | ||
| 1117 | reg_w(gspca_dev, 0xca, CA, 4); | ||
| 1118 | break; | ||
| 1119 | } | ||
| 1120 | switch (sd->bridge) { | ||
| 1121 | case BRIDGE_SN9C120: /*jfm ?? */ | ||
| 1122 | case BRIDGE_SN9C325: | 1059 | case BRIDGE_SN9C325: |
| 1123 | reg_w(gspca_dev, 0xce, CE_sn9c325, 4); | 1060 | reg_w(gspca_dev, 0xce, CE_sn9c325, 4); |
| 1124 | break; | 1061 | break; |
| @@ -1129,14 +1066,13 @@ static void sd_start(struct gspca_dev *gspca_dev) | |||
| 1129 | } | 1066 | } |
| 1130 | 1067 | ||
| 1131 | /* here change size mode 0 -> VGA; 1 -> CIF */ | 1068 | /* here change size mode 0 -> VGA; 1 -> CIF */ |
| 1132 | data = 0x40 | sn9c1xx[0x18] | (mode << 4); | 1069 | reg18 = sn9c1xx[0x18] | (mode << 4); |
| 1133 | reg_w1(gspca_dev, 0x18, data); | 1070 | reg_w1(gspca_dev, 0x18, reg18 | 0x40); |
| 1134 | 1071 | ||
| 1135 | reg_w(gspca_dev, 0x100, qtable4, 0x40); | 1072 | reg_w(gspca_dev, 0x100, qtable4, 0x40); |
| 1136 | reg_w(gspca_dev, 0x140, qtable4 + 0x40, 0x40); | 1073 | reg_w(gspca_dev, 0x140, qtable4 + 0x40, 0x40); |
| 1137 | 1074 | ||
| 1138 | data = sn9c1xx[0x18] | (mode << 4); | 1075 | reg_w1(gspca_dev, 0x18, reg18); |
| 1139 | reg_w1(gspca_dev, 0x18, data); | ||
| 1140 | 1076 | ||
| 1141 | reg_w1(gspca_dev, 0x17, reg17); | 1077 | reg_w1(gspca_dev, 0x17, reg17); |
| 1142 | reg_w1(gspca_dev, 0x01, reg1); | 1078 | reg_w1(gspca_dev, 0x01, reg1); |
| @@ -1164,12 +1100,11 @@ static void sd_stopN(struct gspca_dev *gspca_dev) | |||
| 1164 | i2c_w8(gspca_dev, stopmi0360); | 1100 | i2c_w8(gspca_dev, stopmi0360); |
| 1165 | data = 0x29; | 1101 | data = 0x29; |
| 1166 | break; | 1102 | break; |
| 1167 | case SENSOR_MO4000: | ||
| 1168 | break; | ||
| 1169 | case SENSOR_OV7648: | 1103 | case SENSOR_OV7648: |
| 1170 | data = 0x29; | 1104 | data = 0x29; |
| 1171 | break; | 1105 | break; |
| 1172 | default: | 1106 | default: |
| 1107 | /* case SENSOR_MO4000: */ | ||
| 1173 | /* case SENSOR_OV7660: */ | 1108 | /* case SENSOR_OV7660: */ |
| 1174 | break; | 1109 | break; |
| 1175 | } | 1110 | } |
| @@ -1296,6 +1231,7 @@ static unsigned int getexposure(struct gspca_dev *gspca_dev) | |||
| 1296 | (hexpo << 10) | (mexpo << 2) | lexpo); | 1231 | (hexpo << 10) | (mexpo << 2) | lexpo); |
| 1297 | return (hexpo << 10) | (mexpo << 2) | lexpo; | 1232 | return (hexpo << 10) | (mexpo << 2) | lexpo; |
| 1298 | default: | 1233 | default: |
| 1234 | /* case SENSOR_OV7648: * jfm: is it ok for 7648? */ | ||
| 1299 | /* case SENSOR_OV7660: */ | 1235 | /* case SENSOR_OV7660: */ |
| 1300 | /* read sensor exposure */ | 1236 | /* read sensor exposure */ |
| 1301 | i2c_r5(gspca_dev, 0x04); | 1237 | i2c_r5(gspca_dev, 0x04); |
| @@ -1314,14 +1250,12 @@ static void getbrightness(struct gspca_dev *gspca_dev) | |||
| 1314 | /* hardcoded registers seem not readable */ | 1250 | /* hardcoded registers seem not readable */ |
| 1315 | switch (sd->sensor) { | 1251 | switch (sd->sensor) { |
| 1316 | case SENSOR_HV7131R: | 1252 | case SENSOR_HV7131R: |
| 1317 | /* sd->brightness = 0x7fff; */ | ||
| 1318 | sd->brightness = getexposure(gspca_dev) >> 4; | 1253 | sd->brightness = getexposure(gspca_dev) >> 4; |
| 1319 | break; | 1254 | break; |
| 1320 | case SENSOR_MI0360: | 1255 | case SENSOR_MI0360: |
| 1321 | sd->brightness = getexposure(gspca_dev) << 4; | 1256 | sd->brightness = getexposure(gspca_dev) << 4; |
| 1322 | break; | 1257 | break; |
| 1323 | case SENSOR_MO4000: | 1258 | case SENSOR_MO4000: |
| 1324 | /* sd->brightness = 0x1fff; */ | ||
| 1325 | sd->brightness = getexposure(gspca_dev) << 4; | 1259 | sd->brightness = getexposure(gspca_dev) << 4; |
| 1326 | break; | 1260 | break; |
| 1327 | } | 1261 | } |
