2 * Sonix sn9c102p sn9c105 sn9c120 (jpeg) library
3 * Copyright (C) 2005 Michel Xhaard mxhaard@magic.fr
5 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #define MODULE_NAME "sonixj"
25 #define QUANT_VAL 4 /* quantization table */
28 #define V4L2_CID_INFRARED (V4L2_CID_PRIVATE_BASE + 0)
30 MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
31 MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver");
32 MODULE_LICENSE("GPL");
34 /* specific webcam descriptor */
36 struct gspca_dev gspca_dev; /* !! must be the first item */
48 u8 vflip; /* ov7630 only */
49 u8 infrared; /* mt9v111 only */
52 #define AG_CNT_START 13
55 #define BRIDGE_SN9C102P 0
56 #define BRIDGE_SN9C105 1
57 #define BRIDGE_SN9C110 2
58 #define BRIDGE_SN9C120 3
59 #define BRIDGE_SN9C325 4
60 u8 sensor; /* Type of image sensor chip */
61 #define SENSOR_HV7131R 0
62 #define SENSOR_MI0360 1
63 #define SENSOR_MO4000 2
64 #define SENSOR_MT9V111 3
65 #define SENSOR_OM6802 4
66 #define SENSOR_OV7630 5
67 #define SENSOR_OV7648 6
68 #define SENSOR_OV7660 7
69 #define SENSOR_SP80708 8
73 /* V4L2 controls supported by the driver */
74 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
75 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
76 static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
77 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
78 static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val);
79 static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val);
80 static int sd_setblue_balance(struct gspca_dev *gspca_dev, __s32 val);
81 static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val);
82 static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val);
83 static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val);
84 static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val);
85 static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val);
86 static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val);
87 static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val);
88 static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val);
89 static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val);
90 static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val);
91 static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val);
93 static struct ctrl sd_ctrls[] = {
96 .id = V4L2_CID_BRIGHTNESS,
97 .type = V4L2_CTRL_TYPE_INTEGER,
100 #define BRIGHTNESS_MAX 0xffff
101 .maximum = BRIGHTNESS_MAX,
103 #define BRIGHTNESS_DEF 0x8000
104 .default_value = BRIGHTNESS_DEF,
106 .set = sd_setbrightness,
107 .get = sd_getbrightness,
111 .id = V4L2_CID_CONTRAST,
112 .type = V4L2_CTRL_TYPE_INTEGER,
115 #define CONTRAST_MAX 127
116 .maximum = CONTRAST_MAX,
118 #define CONTRAST_DEF 63
119 .default_value = CONTRAST_DEF,
121 .set = sd_setcontrast,
122 .get = sd_getcontrast,
126 .id = V4L2_CID_SATURATION,
127 .type = V4L2_CTRL_TYPE_INTEGER,
133 .default_value = COLOR_DEF,
140 .id = V4L2_CID_BLUE_BALANCE,
141 .type = V4L2_CTRL_TYPE_INTEGER,
142 .name = "Blue Balance",
146 #define BLUE_BALANCE_DEF 32
147 .default_value = BLUE_BALANCE_DEF,
149 .set = sd_setblue_balance,
150 .get = sd_getblue_balance,
154 .id = V4L2_CID_RED_BALANCE,
155 .type = V4L2_CTRL_TYPE_INTEGER,
156 .name = "Red Balance",
160 #define RED_BALANCE_DEF 32
161 .default_value = RED_BALANCE_DEF,
163 .set = sd_setred_balance,
164 .get = sd_getred_balance,
168 .id = V4L2_CID_GAMMA,
169 .type = V4L2_CTRL_TYPE_INTEGER,
175 .default_value = GAMMA_DEF,
180 #define AUTOGAIN_IDX 5
183 .id = V4L2_CID_AUTOGAIN,
184 .type = V4L2_CTRL_TYPE_BOOLEAN,
189 #define AUTOGAIN_DEF 1
190 .default_value = AUTOGAIN_DEF,
192 .set = sd_setautogain,
193 .get = sd_getautogain,
199 .id = V4L2_CID_VFLIP,
200 .type = V4L2_CTRL_TYPE_BOOLEAN,
206 .default_value = VFLIP_DEF,
212 #define INFRARED_IDX 7
215 .id = V4L2_CID_INFRARED,
216 .type = V4L2_CTRL_TYPE_BOOLEAN,
221 #define INFRARED_DEF 0
222 .default_value = INFRARED_DEF,
224 .set = sd_setinfrared,
225 .get = sd_getinfrared,
229 /* table of the disabled controls */
230 static __u32 ctrl_dis[] = {
231 (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
232 /* SENSOR_HV7131R 0 */
233 (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
234 /* SENSOR_MI0360 1 */
235 (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
236 /* SENSOR_MO4000 2 */
238 /* SENSOR_MT9V111 3 */
239 (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
240 /* SENSOR_OM6802 4 */
241 (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX),
242 /* SENSOR_OV7630 5 */
243 (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
244 /* SENSOR_OV7648 6 */
245 (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
246 /* SENSOR_OV7660 7 */
247 (1 << AUTOGAIN_IDX) | (1 << INFRARED_IDX) | (1 << VFLIP_IDX),
248 /* SENSOR_SP80708 8 */
251 static const struct v4l2_pix_format vga_mode[] = {
252 {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
254 .sizeimage = 160 * 120 * 4 / 8 + 590,
255 .colorspace = V4L2_COLORSPACE_JPEG,
257 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
259 .sizeimage = 320 * 240 * 3 / 8 + 590,
260 .colorspace = V4L2_COLORSPACE_JPEG,
262 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
264 .sizeimage = 640 * 480 * 3 / 8 + 590,
265 .colorspace = V4L2_COLORSPACE_JPEG,
269 /*Data from sn9c102p+hv7131r */
270 static const u8 sn_hv7131[0x1c] = {
271 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
272 0x00, 0x03, 0x64, 0x00, 0x1a, 0x20, 0x20, 0x20,
273 /* reg8 reg9 rega regb regc regd rege regf */
274 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10,
275 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
276 0x03, 0x00, 0x00, 0x01, 0x03, 0x28, 0x1e, 0x41,
277 /* reg18 reg19 reg1a reg1b */
278 0x0a, 0x00, 0x00, 0x00
281 static const u8 sn_mi0360[0x1c] = {
282 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
283 0x00, 0x61, 0x44, 0x00, 0x1a, 0x20, 0x20, 0x20,
284 /* reg8 reg9 rega regb regc regd rege regf */
285 0xb1, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10,
286 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
287 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x61,
288 /* reg18 reg19 reg1a reg1b */
289 0x06, 0x00, 0x00, 0x00
292 static const u8 sn_mo4000[0x1c] = {
293 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
294 0x00, 0x23, 0x60, 0x00, 0x1a, 0x00, 0x20, 0x18,
295 /* reg8 reg9 rega regb regc regd rege regf */
296 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
298 0x03, 0x00, 0x0b, 0x0f, 0x14, 0x28, 0x1e, 0x40,
299 /* reg18 reg19 reg1a reg1b */
300 0x08, 0x00, 0x00, 0x00
303 static const u8 sn_mt9v111[0x1c] = {
304 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
305 0x00, 0x61, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
306 /* reg8 reg9 rega regb regc regd rege regf */
307 0x81, 0x5c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
308 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
309 0x03, 0x00, 0x00, 0x02, 0x1c, 0x28, 0x1e, 0x40,
310 /* reg18 reg19 reg1a reg1b */
311 0x06, 0x00, 0x00, 0x00
314 static const u8 sn_om6802[0x1c] = {
315 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
316 0x00, 0x23, 0x72, 0x00, 0x1a, 0x34, 0x27, 0x20,
317 /* reg8 reg9 rega regb regc regd rege regf */
318 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
319 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
320 0x03, 0x00, 0x51, 0x01, 0x00, 0x28, 0x1e, 0x40,
321 /* reg18 reg19 reg1a reg1b */
322 0x05, 0x00, 0x00, 0x00
325 static const u8 sn_ov7630[0x1c] = {
326 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
327 0x00, 0x21, 0x40, 0x00, 0x1a, 0x20, 0x1f, 0x20,
328 /* reg8 reg9 rega regb regc regd rege regf */
329 0xa1, 0x21, 0x76, 0x21, 0x00, 0x00, 0x00, 0x10,
330 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
331 0x03, 0x00, 0x04, 0x01, 0x0a, 0x28, 0x1e, 0xc2,
332 /* reg18 reg19 reg1a reg1b */
333 0x0b, 0x00, 0x00, 0x00
336 static const u8 sn_ov7648[0x1c] = {
337 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
338 0x00, 0x63, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
339 /* reg8 reg9 rega regb regc regd rege regf */
340 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
341 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
342 0x03, 0x00, 0x00, 0x01, 0x00, 0x28, 0x1e, 0x00,
343 /* reg18 reg19 reg1a reg1b */
344 0x0b, 0x00, 0x00, 0x00
347 static const u8 sn_ov7660[0x1c] = {
348 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
349 0x00, 0x61, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
350 /* reg8 reg9 rega regb regc regd rege regf */
351 0x81, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10,
352 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
353 0x03, 0x00, 0x01, 0x01, 0x08, 0x28, 0x1e, 0x20,
354 /* reg18 reg19 reg1a reg1b */
355 0x07, 0x00, 0x00, 0x00
358 static const u8 sn_sp80708[0x1c] = {
359 /* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
360 0x00, 0x63, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20,
361 /* reg8 reg9 rega regb regc regd rege regf */
362 0x81, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
363 /* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
364 0x03, 0x00, 0x00, 0x03, 0x04, 0x28, 0x1e, 0x00,
365 /* reg18 reg19 reg1a reg1b */
366 0x07, 0x00, 0x00, 0x00
369 /* sequence specific to the sensors - !! index = SENSOR_xxx */
370 static const u8 *sn_tb[] = {
382 /* default gamma table */
383 static const u8 gamma_def[17] = {
384 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99,
385 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff
387 /* gamma for sensors HV7131R and MT9V111 */
388 static const u8 gamma_spec_1[17] = {
389 0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d,
390 0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5
392 /* gamma for sensor SP80708 */
393 static const u8 gamma_spec_2[17] = {
394 0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab,
395 0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6
398 /* color matrix and offsets */
399 static const u8 reg84[] = {
400 0x14, 0x00, 0x27, 0x00, 0x07, 0x00, /* YR YG YB gains */
401 0xe8, 0x0f, 0xda, 0x0f, 0x40, 0x00, /* UR UG UB */
402 0x3e, 0x00, 0xcd, 0x0f, 0xf7, 0x0f, /* VR VG VB */
403 0x00, 0x00, 0x00 /* YUV offsets */
405 static const u8 hv7131r_sensor_init[][8] = {
406 {0xc1, 0x11, 0x01, 0x08, 0x01, 0x00, 0x00, 0x10},
407 {0xb1, 0x11, 0x34, 0x17, 0x7f, 0x00, 0x00, 0x10},
408 {0xd1, 0x11, 0x40, 0xff, 0x7f, 0x7f, 0x7f, 0x10},
409 /* {0x91, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x10}, */
410 {0xd1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
411 {0xd1, 0x11, 0x14, 0x01, 0xe2, 0x02, 0x82, 0x10},
412 /* {0x91, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10}, */
414 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
415 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
416 {0xc1, 0x11, 0x25, 0x00, 0x61, 0xa8, 0x00, 0x10},
417 {0xa1, 0x11, 0x30, 0x22, 0x00, 0x00, 0x00, 0x10},
418 {0xc1, 0x11, 0x31, 0x20, 0x2e, 0x20, 0x00, 0x10},
419 {0xc1, 0x11, 0x25, 0x00, 0xc3, 0x50, 0x00, 0x10},
420 {0xa1, 0x11, 0x30, 0x07, 0x00, 0x00, 0x00, 0x10}, /* gain14 */
421 {0xc1, 0x11, 0x31, 0x10, 0x10, 0x10, 0x00, 0x10}, /* r g b 101a10 */
423 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
424 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
425 {0xa1, 0x11, 0x21, 0xD0, 0x00, 0x00, 0x00, 0x10},
426 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
427 {0xa1, 0x11, 0x23, 0x09, 0x00, 0x00, 0x00, 0x10},
429 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
430 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
431 {0xa1, 0x11, 0x21, 0xd0, 0x00, 0x00, 0x00, 0x10},
432 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
433 {0xa1, 0x11, 0x23, 0x10, 0x00, 0x00, 0x00, 0x10},
436 static const u8 mi0360_sensor_init[][8] = {
437 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
438 {0xb1, 0x5d, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10},
439 {0xb1, 0x5d, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10},
440 {0xd1, 0x5d, 0x01, 0x00, 0x08, 0x00, 0x16, 0x10},
441 {0xd1, 0x5d, 0x03, 0x01, 0xe2, 0x02, 0x82, 0x10},
442 {0xd1, 0x5d, 0x05, 0x00, 0x09, 0x00, 0x53, 0x10},
443 {0xb1, 0x5d, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x10},
444 {0xd1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
445 {0xd1, 0x5d, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10},
446 {0xd1, 0x5d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10},
447 {0xd1, 0x5d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
448 {0xd1, 0x5d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
449 {0xd1, 0x5d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10},
450 {0xd1, 0x5d, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10},
451 {0xd1, 0x5d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10},
452 {0xd1, 0x5d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x10},
453 {0xd1, 0x5d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10},
454 {0xb1, 0x5d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10},
455 {0xd1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10},
456 {0xd1, 0x5d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
457 {0xd1, 0x5d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10},
458 {0xd1, 0x5d, 0x26, 0x00, 0x00, 0x00, 0x24, 0x10},
459 {0xd1, 0x5d, 0x2f, 0xf7, 0xB0, 0x00, 0x04, 0x10},
460 {0xd1, 0x5d, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10},
461 {0xd1, 0x5d, 0x33, 0x00, 0x00, 0x01, 0x00, 0x10},
462 {0xb1, 0x5d, 0x3d, 0x06, 0x8f, 0x00, 0x00, 0x10},
463 {0xd1, 0x5d, 0x40, 0x01, 0xe0, 0x00, 0xd1, 0x10},
464 {0xb1, 0x5d, 0x44, 0x00, 0x82, 0x00, 0x00, 0x10},
465 {0xd1, 0x5d, 0x58, 0x00, 0x78, 0x00, 0x43, 0x10},
466 {0xd1, 0x5d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x10},
467 {0xd1, 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x10},
468 {0xd1, 0x5d, 0x5e, 0x00, 0x00, 0xa3, 0x1d, 0x10},
469 {0xb1, 0x5d, 0x62, 0x04, 0x11, 0x00, 0x00, 0x10},
471 {0xb1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10},
472 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10},
473 {0xb1, 0x5d, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10},
474 {0xd1, 0x5d, 0x2b, 0x00, 0xa0, 0x00, 0xb0, 0x10},
475 {0xd1, 0x5d, 0x2d, 0x00, 0xa0, 0x00, 0xa0, 0x10},
477 {0xb1, 0x5d, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x10}, /* sensor clck ?2 */
478 {0xb1, 0x5d, 0x06, 0x00, 0x30, 0x00, 0x00, 0x10},
479 {0xb1, 0x5d, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x10},
480 {0xb1, 0x5d, 0x09, 0x02, 0x35, 0x00, 0x00, 0x10}, /* exposure 2 */
482 {0xd1, 0x5d, 0x2b, 0x00, 0xb9, 0x00, 0xe3, 0x10},
483 {0xd1, 0x5d, 0x2d, 0x00, 0x5f, 0x00, 0xb9, 0x10}, /* 42 */
484 /* {0xb1, 0x5d, 0x35, 0x00, 0x67, 0x00, 0x00, 0x10}, * gain orig */
485 /* {0xb1, 0x5d, 0x35, 0x00, 0x20, 0x00, 0x00, 0x10}, * gain */
486 {0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10}, /* update */
487 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10}, /* sensor on */
490 static const u8 mo4000_sensor_init[][8] = {
491 {0xa1, 0x21, 0x01, 0x02, 0x00, 0x00, 0x00, 0x10},
492 {0xa1, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10},
493 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
494 {0xa1, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10},
495 {0xa1, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10},
496 {0xa1, 0x21, 0x05, 0x04, 0x00, 0x00, 0x00, 0x10},
497 {0xa1, 0x21, 0x06, 0x80, 0x00, 0x00, 0x00, 0x10},
498 {0xa1, 0x21, 0x06, 0x81, 0x00, 0x00, 0x00, 0x10},
499 {0xa1, 0x21, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10},
500 {0xa1, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10},
501 {0xa1, 0x21, 0x11, 0x20, 0x00, 0x00, 0x00, 0x10},
502 {0xa1, 0x21, 0x11, 0x30, 0x00, 0x00, 0x00, 0x10},
503 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
504 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
505 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
506 {0xa1, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
507 {0xa1, 0x21, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x10},
508 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10},
509 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
510 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
513 static const u8 mt9v111_sensor_init[][8] = {
514 {0xb1, 0x5c, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10}, /* reset? */
516 {0xb1, 0x5c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10},
517 {0xb1, 0x5c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x10}, /* IFP select */
518 {0xb1, 0x5c, 0x08, 0x04, 0x80, 0x00, 0x00, 0x10}, /* output fmt ctrl */
519 {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10}, /* op mode ctrl */
520 {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10},
521 {0xb1, 0x5c, 0x03, 0x01, 0xe1, 0x00, 0x00, 0x10},
522 {0xb1, 0x5c, 0x04, 0x02, 0x81, 0x00, 0x00, 0x10},
523 {0xb1, 0x5c, 0x05, 0x00, 0x04, 0x00, 0x00, 0x10},
524 {0xb1, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10}, /* sensor select */
525 {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10},
526 {0xb1, 0x5c, 0x03, 0x01, 0xe6, 0x00, 0x00, 0x10},
527 {0xb1, 0x5c, 0x04, 0x02, 0x86, 0x00, 0x00, 0x10},
528 {0xb1, 0x5c, 0x05, 0x00, 0x04, 0x00, 0x00, 0x10},
529 {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10},
530 {0xb1, 0x5c, 0x08, 0x00, 0x08, 0x00, 0x00, 0x10}, /* row start */
531 {0xb1, 0x5c, 0x0e, 0x00, 0x08, 0x00, 0x00, 0x10},
532 {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10}, /* col start */
533 {0xb1, 0x5c, 0x03, 0x01, 0xe7, 0x00, 0x00, 0x10}, /* window height */
534 {0xb1, 0x5c, 0x04, 0x02, 0x87, 0x00, 0x00, 0x10}, /* window width */
535 {0xb1, 0x5c, 0x07, 0x30, 0x02, 0x00, 0x00, 0x10}, /* output ctrl */
536 {0xb1, 0x5c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10}, /* shutter delay */
537 {0xb1, 0x5c, 0x12, 0x00, 0xb0, 0x00, 0x00, 0x10}, /* zoom col start */
538 {0xb1, 0x5c, 0x13, 0x00, 0x7c, 0x00, 0x00, 0x10}, /* zoom row start */
539 {0xb1, 0x5c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* digital zoom */
540 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, /* read mode */
541 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
543 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
544 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
545 {0xb1, 0x5c, 0x09, 0x01, 0x2c, 0x00, 0x00, 0x10},
546 {0xd1, 0x5c, 0x2b, 0x00, 0x33, 0x00, 0xa0, 0x10}, /* green1 gain */
547 {0xd1, 0x5c, 0x2d, 0x00, 0xa0, 0x00, 0x33, 0x10}, /* red gain */
549 {0xb1, 0x5c, 0x06, 0x00, 0x1e, 0x00, 0x00, 0x10}, /* vert blanking */
550 {0xb1, 0x5c, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x10}, /* horiz blanking */
551 {0xd1, 0x5c, 0x2c, 0x00, 0xad, 0x00, 0xad, 0x10}, /* blue gain */
552 {0xb1, 0x5c, 0x35, 0x01, 0xc0, 0x00, 0x00, 0x10}, /* global gain */
555 static const u8 om6802_sensor_init[][8] = {
556 {0xa0, 0x34, 0x90, 0x05, 0x00, 0x00, 0x00, 0x10},
557 {0xa0, 0x34, 0x49, 0x85, 0x00, 0x00, 0x00, 0x10},
558 {0xa0, 0x34, 0x5a, 0xc0, 0x00, 0x00, 0x00, 0x10},
559 {0xa0, 0x34, 0xdd, 0x18, 0x00, 0x00, 0x00, 0x10},
560 /* {0xa0, 0x34, 0xfb, 0x11, 0x00, 0x00, 0x00, 0x10}, */
561 {0xa0, 0x34, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x10},
562 /* white balance & auto-exposure */
563 /* {0xa0, 0x34, 0xf1, 0x02, 0x00, 0x00, 0x00, 0x10},
565 /* {0xa0, 0x34, 0xfe, 0x5b, 0x00, 0x00, 0x00, 0x10},
566 * max AGC value in AE */
567 /* {0xa0, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x10},
569 /* {0xa0, 0x34, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x10},
570 * preset brightness */
571 /* {0xa0, 0x34, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x10},
573 /* {0xa0, 0x34, 0xe8, 0x31, 0x00, 0x00, 0x00, 0x10},
575 {0xa0, 0x34, 0xe9, 0x0f, 0x00, 0x00, 0x00, 0x10},
576 /* luminance mode (0x4f = AE) */
577 {0xa0, 0x34, 0xe4, 0xff, 0x00, 0x00, 0x00, 0x10},
579 /* {0xa0, 0x34, 0xef, 0x00, 0x00, 0x00, 0x00, 0x10},
581 /* {0xa0, 0x34, 0xfb, 0xee, 0x00, 0x00, 0x00, 0x10}, */
583 /* {0xa0, 0x34, 0x71, 0x84, 0x00, 0x00, 0x00, 0x10}, */
584 /* {0xa0, 0x34, 0x72, 0x05, 0x00, 0x00, 0x00, 0x10}, */
585 /* {0xa0, 0x34, 0x68, 0x80, 0x00, 0x00, 0x00, 0x10}, */
586 /* {0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10}, */
589 static const u8 ov7630_sensor_init[][8] = {
590 {0xa1, 0x21, 0x76, 0x01, 0x00, 0x00, 0x00, 0x10},
591 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
592 /* win: delay 20ms */
593 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
594 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
595 /* win: delay 20ms */
596 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
597 /* win: i2c_r from 00 to 80 */
598 {0xd1, 0x21, 0x03, 0x80, 0x10, 0x20, 0x80, 0x10},
599 {0xb1, 0x21, 0x0c, 0x20, 0x20, 0x00, 0x00, 0x10},
600 {0xd1, 0x21, 0x11, 0x00, 0x48, 0xc0, 0x00, 0x10},
601 {0xb1, 0x21, 0x15, 0x80, 0x03, 0x00, 0x00, 0x10},
602 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
603 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
604 {0xd1, 0x21, 0x1f, 0x00, 0x80, 0x80, 0x80, 0x10},
605 {0xd1, 0x21, 0x23, 0xde, 0x10, 0x8a, 0xa0, 0x10},
606 {0xc1, 0x21, 0x27, 0xca, 0xa2, 0x74, 0x00, 0x10},
607 {0xd1, 0x21, 0x2a, 0x88, 0x00, 0x88, 0x01, 0x10},
608 {0xc1, 0x21, 0x2e, 0x80, 0x00, 0x18, 0x00, 0x10},
609 {0xa1, 0x21, 0x21, 0x08, 0x00, 0x00, 0x00, 0x10},
610 {0xa1, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
611 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10},
612 {0xb1, 0x21, 0x32, 0xc2, 0x08, 0x00, 0x00, 0x10},
613 {0xb1, 0x21, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x10},
614 {0xd1, 0x21, 0x60, 0x05, 0x40, 0x12, 0x57, 0x10},
615 {0xa1, 0x21, 0x64, 0x73, 0x00, 0x00, 0x00, 0x10},
616 {0xd1, 0x21, 0x65, 0x00, 0x55, 0x01, 0xac, 0x10},
617 {0xa1, 0x21, 0x69, 0x38, 0x00, 0x00, 0x00, 0x10},
618 {0xd1, 0x21, 0x6f, 0x1f, 0x01, 0x00, 0x10, 0x10},
619 {0xd1, 0x21, 0x73, 0x50, 0x20, 0x02, 0x01, 0x10},
620 {0xd1, 0x21, 0x77, 0xf3, 0x90, 0x98, 0x98, 0x10},
621 {0xc1, 0x21, 0x7b, 0x00, 0x4c, 0xf7, 0x00, 0x10},
622 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
623 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
625 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
626 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
627 /*fixme: + 0x12, 0x04*/
628 /* {0xa1, 0x21, 0x75, 0x82, 0x00, 0x00, 0x00, 0x10}, * COMN
630 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
631 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
632 {0xb1, 0x21, 0x01, 0x80, 0x80, 0x00, 0x00, 0x10},
634 {0xa1, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10},
635 {0xa1, 0x21, 0x2a, 0x88, 0x00, 0x00, 0x00, 0x10},
636 {0xa1, 0x21, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x10},
638 {0xa1, 0x21, 0x10, 0x83, 0x00, 0x00, 0x00, 0x10},
639 /* {0xb1, 0x21, 0x01, 0x88, 0x70, 0x00, 0x00, 0x10}, */
643 static const u8 ov7648_sensor_init[][8] = {
644 {0xa1, 0x21, 0x76, 0x00, 0x00, 0x00, 0x00, 0x10},
645 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset */
646 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
647 {0xd1, 0x21, 0x03, 0xa4, 0x30, 0x88, 0x00, 0x10},
648 {0xb1, 0x21, 0x11, 0x80, 0x08, 0x00, 0x00, 0x10},
649 {0xc1, 0x21, 0x13, 0xa0, 0x04, 0x84, 0x00, 0x10},
650 {0xd1, 0x21, 0x17, 0x1a, 0x02, 0xba, 0xf4, 0x10},
651 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
652 {0xd1, 0x21, 0x1f, 0x41, 0xc0, 0x80, 0x80, 0x10},
653 {0xd1, 0x21, 0x23, 0xde, 0xa0, 0x80, 0x32, 0x10},
654 {0xd1, 0x21, 0x27, 0xfe, 0xa0, 0x00, 0x91, 0x10},
655 {0xd1, 0x21, 0x2b, 0x00, 0x88, 0x85, 0x80, 0x10},
656 {0xc1, 0x21, 0x2f, 0x9c, 0x00, 0xc4, 0x00, 0x10},
657 {0xd1, 0x21, 0x60, 0xa6, 0x60, 0x88, 0x12, 0x10},
658 {0xd1, 0x21, 0x64, 0x88, 0x00, 0x00, 0x94, 0x10},
659 {0xd1, 0x21, 0x68, 0x7a, 0x0c, 0x00, 0x00, 0x10},
660 {0xd1, 0x21, 0x6c, 0x11, 0x33, 0x22, 0x00, 0x10},
661 {0xd1, 0x21, 0x70, 0x11, 0x00, 0x10, 0x50, 0x10},
662 {0xd1, 0x21, 0x74, 0x20, 0x06, 0x00, 0xb5, 0x10},
663 {0xd1, 0x21, 0x78, 0x8a, 0x00, 0x00, 0x00, 0x10},
664 {0xb1, 0x21, 0x7c, 0x00, 0x43, 0x00, 0x00, 0x10},
666 {0xd1, 0x21, 0x21, 0x86, 0x00, 0xde, 0xa0, 0x10},
667 /* {0xd1, 0x21, 0x25, 0x80, 0x32, 0xfe, 0xa0, 0x10}, jfm done */
668 /* {0xd1, 0x21, 0x29, 0x00, 0x91, 0x00, 0x88, 0x10}, jfm done */
669 {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10},
671 /* {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */
672 /* {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, jfm done */
673 {0xa1, 0x21, 0x19, 0x02, 0x00, 0x00, 0x00, 0x10},
674 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
675 /* {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
676 /* {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}, * GAIN - def */
677 /* {0xb1, 0x21, 0x01, 0x6c, 0x6c, 0x00, 0x00, 0x10}, * B R - def: 80 */
679 {0xa1, 0x21, 0x11, 0x81, 0x00, 0x00, 0x00, 0x10}, /* CLKRC */
680 /* {0xa1, 0x21, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
681 /* {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
682 /* {0xa1, 0x21, 0x2a, 0x91, 0x00, 0x00, 0x00, 0x10}, jfm done */
683 /* {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */
684 /* {0xb1, 0x21, 0x01, 0x64, 0x84, 0x00, 0x00, 0x10}, * B R - def: 80 */
689 static const u8 ov7660_sensor_init[][8] = {
690 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset SCCB */
692 {0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10},
693 /* Outformat = rawRGB */
694 {0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10}, /* init COM8 */
695 {0xd1, 0x21, 0x00, 0x01, 0x74, 0x74, 0x00, 0x10},
696 /* GAIN BLUE RED VREF */
697 {0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10},
698 /* COM 1 BAVE GEAVE AECHH */
699 {0xb1, 0x21, 0x08, 0x83, 0x01, 0x00, 0x00, 0x10}, /* RAVE COM2 */
700 {0xd1, 0x21, 0x0c, 0x00, 0x08, 0x04, 0x4f, 0x10}, /* COM 3 4 5 6 */
701 {0xd1, 0x21, 0x10, 0x7f, 0x40, 0x05, 0xff, 0x10},
702 /* AECH CLKRC COM7 COM8 */
703 {0xc1, 0x21, 0x14, 0x2c, 0x00, 0x02, 0x00, 0x10}, /* COM9 COM10 */
704 {0xd1, 0x21, 0x17, 0x10, 0x60, 0x02, 0x7b, 0x10},
705 /* HSTART HSTOP VSTRT VSTOP */
706 {0xa1, 0x21, 0x1b, 0x02, 0x00, 0x00, 0x00, 0x10}, /* PSHFT */
707 {0xb1, 0x21, 0x1e, 0x01, 0x0e, 0x00, 0x00, 0x10}, /* MVFP LAEC */
708 {0xd1, 0x21, 0x20, 0x07, 0x07, 0x07, 0x07, 0x10},
709 /* BOS GBOS GROS ROS (BGGR offset) */
710 /* {0xd1, 0x21, 0x24, 0x68, 0x58, 0xd4, 0x80, 0x10}, */
711 {0xd1, 0x21, 0x24, 0x78, 0x68, 0xd4, 0x80, 0x10},
712 /* AEW AEB VPT BBIAS */
713 {0xd1, 0x21, 0x28, 0x80, 0x30, 0x00, 0x00, 0x10},
714 /* GbBIAS RSVD EXHCH EXHCL */
715 {0xd1, 0x21, 0x2c, 0x80, 0x00, 0x00, 0x62, 0x10},
716 /* RBIAS ADVFL ASDVFH YAVE */
717 {0xc1, 0x21, 0x30, 0x08, 0x30, 0xb4, 0x00, 0x10},
718 /* HSYST HSYEN HREF */
719 {0xd1, 0x21, 0x33, 0x00, 0x07, 0x84, 0x00, 0x10}, /* reserved */
720 {0xd1, 0x21, 0x37, 0x0c, 0x02, 0x43, 0x00, 0x10},
721 /* ADC ACOM OFON TSLB */
722 {0xd1, 0x21, 0x3b, 0x02, 0x6c, 0x19, 0x0e, 0x10},
723 /* COM11 COM12 COM13 COM14 */
724 {0xd1, 0x21, 0x3f, 0x41, 0xc1, 0x22, 0x08, 0x10},
725 /* EDGE COM15 COM16 COM17 */
726 {0xd1, 0x21, 0x43, 0xf0, 0x10, 0x78, 0xa8, 0x10}, /* reserved */
727 {0xd1, 0x21, 0x47, 0x60, 0x80, 0x00, 0x00, 0x10}, /* reserved */
728 {0xd1, 0x21, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x10}, /* reserved */
729 {0xd1, 0x21, 0x4f, 0x46, 0x36, 0x0f, 0x17, 0x10}, /* MTX 1 2 3 4 */
730 {0xd1, 0x21, 0x53, 0x7f, 0x96, 0x40, 0x40, 0x10}, /* MTX 5 6 7 8 */
731 {0xb1, 0x21, 0x57, 0x40, 0x0f, 0x00, 0x00, 0x10}, /* MTX9 MTXS */
732 {0xd1, 0x21, 0x59, 0xba, 0x9a, 0x22, 0xb9, 0x10}, /* reserved */
733 {0xd1, 0x21, 0x5d, 0x9b, 0x10, 0xf0, 0x05, 0x10}, /* reserved */
734 {0xa1, 0x21, 0x61, 0x60, 0x00, 0x00, 0x00, 0x10}, /* reserved */
735 {0xd1, 0x21, 0x62, 0x00, 0x00, 0x50, 0x30, 0x10},
736 /* LCC1 LCC2 LCC3 LCC4 */
737 {0xa1, 0x21, 0x66, 0x00, 0x00, 0x00, 0x00, 0x10}, /* LCC5 */
738 {0xd1, 0x21, 0x67, 0x80, 0x7a, 0x90, 0x80, 0x10}, /* MANU */
739 {0xa1, 0x21, 0x6b, 0x0a, 0x00, 0x00, 0x00, 0x10},
740 /* band gap reference [0:3] DBLV */
741 {0xd1, 0x21, 0x6c, 0x30, 0x48, 0x80, 0x74, 0x10}, /* gamma curve */
742 {0xd1, 0x21, 0x70, 0x64, 0x60, 0x5c, 0x58, 0x10}, /* gamma curve */
743 {0xd1, 0x21, 0x74, 0x54, 0x4c, 0x40, 0x38, 0x10}, /* gamma curve */
744 {0xd1, 0x21, 0x78, 0x34, 0x30, 0x2f, 0x2b, 0x10}, /* gamma curve */
745 {0xd1, 0x21, 0x7c, 0x03, 0x07, 0x17, 0x34, 0x10}, /* gamma curve */
746 {0xd1, 0x21, 0x80, 0x41, 0x4d, 0x58, 0x63, 0x10}, /* gamma curve */
747 {0xd1, 0x21, 0x84, 0x6e, 0x77, 0x87, 0x95, 0x10}, /* gamma curve */
748 {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */
749 {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */
750 {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */
751 /****** (some exchanges in the win trace) ******/
752 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */
753 /* bits[3..0]reserved */
754 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10},
755 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
756 /* VREF vertical frame ctrl */
757 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
758 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10}, /* AECH 0x20 */
759 {0xa1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, /* ADVFL */
760 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* ADVFH */
761 {0xa1, 0x21, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10}, /* GAIN */
762 /* {0xb1, 0x21, 0x01, 0x78, 0x78, 0x00, 0x00, 0x10}, * BLUE */
763 /****** (some exchanges in the win trace) ******/
764 {0xa1, 0x21, 0x93, 0x00, 0x00, 0x00, 0x00, 0x10},/* dummy line hight */
765 {0xa1, 0x21, 0x92, 0x25, 0x00, 0x00, 0x00, 0x10}, /* dummy line low */
766 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCH */
767 {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCL */
768 /* {0xa1, 0x21, 0x02, 0x90, 0x00, 0x00, 0x00, 0x10}, * RED */
769 /****** (some exchanges in the win trace) ******/
770 /******!! startsensor KO if changed !!****/
771 {0xa1, 0x21, 0x93, 0x01, 0x00, 0x00, 0x00, 0x10},
772 {0xa1, 0x21, 0x92, 0xff, 0x00, 0x00, 0x00, 0x10},
773 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10},
774 {0xa1, 0x21, 0x2b, 0xc3, 0x00, 0x00, 0x00, 0x10},
778 static const u8 sp80708_sensor_init[][8] = {
779 {0xa1, 0x18, 0x06, 0xf9, 0x00, 0x00, 0x00, 0x10},
780 {0xa1, 0x18, 0x09, 0x1f, 0x00, 0x00, 0x00, 0x10},
781 {0xa1, 0x18, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
782 {0xa1, 0x18, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x10},
783 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
784 {0xa1, 0x18, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x10},
785 {0xa1, 0x18, 0x10, 0x40, 0x00, 0x00, 0x00, 0x10},
786 {0xa1, 0x18, 0x11, 0x4e, 0x00, 0x00, 0x00, 0x10},
787 {0xa1, 0x18, 0x12, 0x53, 0x00, 0x00, 0x00, 0x10},
788 {0xa1, 0x18, 0x15, 0x80, 0x00, 0x00, 0x00, 0x10},
789 {0xa1, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10},
790 {0xa1, 0x18, 0x19, 0x18, 0x00, 0x00, 0x00, 0x10},
791 {0xa1, 0x18, 0x1a, 0x10, 0x00, 0x00, 0x00, 0x10},
792 {0xa1, 0x18, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x10},
793 {0xa1, 0x18, 0x1c, 0x28, 0x00, 0x00, 0x00, 0x10},
794 {0xa1, 0x18, 0x1d, 0x02, 0x00, 0x00, 0x00, 0x10},
795 {0xa1, 0x18, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x10},
796 {0xa1, 0x18, 0x26, 0x04, 0x00, 0x00, 0x00, 0x10},
797 {0xa1, 0x18, 0x27, 0x1e, 0x00, 0x00, 0x00, 0x10},
798 {0xa1, 0x18, 0x28, 0x5a, 0x00, 0x00, 0x00, 0x10},
799 {0xa1, 0x18, 0x29, 0x28, 0x00, 0x00, 0x00, 0x10},
800 {0xa1, 0x18, 0x2a, 0x78, 0x00, 0x00, 0x00, 0x10},
801 {0xa1, 0x18, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x10},
802 {0xa1, 0x18, 0x2c, 0xf7, 0x00, 0x00, 0x00, 0x10},
803 {0xa1, 0x18, 0x2d, 0x2d, 0x00, 0x00, 0x00, 0x10},
804 {0xa1, 0x18, 0x2e, 0xd5, 0x00, 0x00, 0x00, 0x10},
805 {0xa1, 0x18, 0x39, 0x42, 0x00, 0x00, 0x00, 0x10},
806 {0xa1, 0x18, 0x3a, 0x67, 0x00, 0x00, 0x00, 0x10},
807 {0xa1, 0x18, 0x3b, 0x87, 0x00, 0x00, 0x00, 0x10},
808 {0xa1, 0x18, 0x3c, 0xa3, 0x00, 0x00, 0x00, 0x10},
809 {0xa1, 0x18, 0x3d, 0xb0, 0x00, 0x00, 0x00, 0x10},
810 {0xa1, 0x18, 0x3e, 0xbc, 0x00, 0x00, 0x00, 0x10},
811 {0xa1, 0x18, 0x3f, 0xc8, 0x00, 0x00, 0x00, 0x10},
812 {0xa1, 0x18, 0x40, 0xd4, 0x00, 0x00, 0x00, 0x10},
813 {0xa1, 0x18, 0x41, 0xdf, 0x00, 0x00, 0x00, 0x10},
814 {0xa1, 0x18, 0x42, 0xea, 0x00, 0x00, 0x00, 0x10},
815 {0xa1, 0x18, 0x43, 0xf5, 0x00, 0x00, 0x00, 0x10},
816 {0xa1, 0x18, 0x45, 0x80, 0x00, 0x00, 0x00, 0x10},
817 {0xa1, 0x18, 0x46, 0x60, 0x00, 0x00, 0x00, 0x10},
818 {0xa1, 0x18, 0x47, 0x50, 0x00, 0x00, 0x00, 0x10},
819 {0xa1, 0x18, 0x48, 0x30, 0x00, 0x00, 0x00, 0x10},
820 {0xa1, 0x18, 0x49, 0x01, 0x00, 0x00, 0x00, 0x10},
821 {0xa1, 0x18, 0x4d, 0xae, 0x00, 0x00, 0x00, 0x10},
822 {0xa1, 0x18, 0x4e, 0x03, 0x00, 0x00, 0x00, 0x10},
823 {0xa1, 0x18, 0x4f, 0x66, 0x00, 0x00, 0x00, 0x10},
824 {0xa1, 0x18, 0x50, 0x1c, 0x00, 0x00, 0x00, 0x10},
825 {0xa1, 0x18, 0x44, 0x10, 0x00, 0x00, 0x00, 0x10},
826 {0xa1, 0x18, 0x4a, 0x30, 0x00, 0x00, 0x00, 0x10},
827 {0xa1, 0x18, 0x51, 0x80, 0x00, 0x00, 0x00, 0x10},
828 {0xa1, 0x18, 0x52, 0x80, 0x00, 0x00, 0x00, 0x10},
829 {0xa1, 0x18, 0x53, 0x80, 0x00, 0x00, 0x00, 0x10},
830 {0xa1, 0x18, 0x54, 0x80, 0x00, 0x00, 0x00, 0x10},
831 {0xa1, 0x18, 0x55, 0x80, 0x00, 0x00, 0x00, 0x10},
832 {0xa1, 0x18, 0x56, 0x80, 0x00, 0x00, 0x00, 0x10},
833 {0xa1, 0x18, 0x57, 0xe0, 0x00, 0x00, 0x00, 0x10},
834 {0xa1, 0x18, 0x58, 0xc0, 0x00, 0x00, 0x00, 0x10},
835 {0xa1, 0x18, 0x59, 0xab, 0x00, 0x00, 0x00, 0x10},
836 {0xa1, 0x18, 0x5a, 0xa0, 0x00, 0x00, 0x00, 0x10},
837 {0xa1, 0x18, 0x5b, 0x99, 0x00, 0x00, 0x00, 0x10},
838 {0xa1, 0x18, 0x5c, 0x90, 0x00, 0x00, 0x00, 0x10},
839 {0xa1, 0x18, 0x5e, 0x24, 0x00, 0x00, 0x00, 0x10},
840 {0xa1, 0x18, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x10},
841 {0xa1, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x10},
842 {0xa1, 0x18, 0x61, 0x73, 0x00, 0x00, 0x00, 0x10},
843 {0xa1, 0x18, 0x63, 0x42, 0x00, 0x00, 0x00, 0x10},
844 {0xa1, 0x18, 0x64, 0x42, 0x00, 0x00, 0x00, 0x10},
845 {0xa1, 0x18, 0x65, 0x42, 0x00, 0x00, 0x00, 0x10},
846 {0xa1, 0x18, 0x66, 0x24, 0x00, 0x00, 0x00, 0x10},
847 {0xa1, 0x18, 0x67, 0x24, 0x00, 0x00, 0x00, 0x10},
848 {0xa1, 0x18, 0x68, 0x08, 0x00, 0x00, 0x00, 0x10},
849 {0xa1, 0x18, 0x2f, 0xc9, 0x00, 0x00, 0x00, 0x10},
851 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
852 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
853 {0xa1, 0x18, 0x03, 0x01, 0x00, 0x00, 0x00, 0x10},
854 {0xa1, 0x18, 0x04, 0xa4, 0x00, 0x00, 0x00, 0x10},
855 {0xa1, 0x18, 0x14, 0x3f, 0x00, 0x00, 0x00, 0x10},
856 {0xa1, 0x18, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x10},
857 {0xb1, 0x18, 0x11, 0x40, 0x40, 0x00, 0x00, 0x10},
861 static const u8 qtable4[] = {
862 0x06, 0x04, 0x04, 0x06, 0x04, 0x04, 0x06, 0x06,
863 0x06, 0x06, 0x08, 0x06, 0x06, 0x08, 0x0a, 0x11,
864 0x0a, 0x0a, 0x08, 0x08, 0x0a, 0x15, 0x0f, 0x0f,
865 0x0c, 0x11, 0x19, 0x15, 0x19, 0x19, 0x17, 0x15,
866 0x17, 0x17, 0x1b, 0x1d, 0x25, 0x21, 0x1b, 0x1d,
867 0x23, 0x1d, 0x17, 0x17, 0x21, 0x2e, 0x21, 0x23,
868 0x27, 0x29, 0x2c, 0x2c, 0x2c, 0x19, 0x1f, 0x30,
869 0x32, 0x2e, 0x29, 0x32, 0x25, 0x29, 0x2c, 0x29,
870 0x06, 0x08, 0x08, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
871 0x0a, 0x13, 0x29, 0x1b, 0x17, 0x1b, 0x29, 0x29,
872 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
873 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
874 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
875 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
876 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29,
877 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29
880 /* read <len> bytes to gspca_dev->usb_buf */
881 static void reg_r(struct gspca_dev *gspca_dev,
885 if (len > USB_BUF_SZ) {
886 err("reg_r: buffer overflow");
890 usb_control_msg(gspca_dev->dev,
891 usb_rcvctrlpipe(gspca_dev->dev, 0),
893 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
895 gspca_dev->usb_buf, len,
897 PDEBUG(D_USBI, "reg_r [%02x] -> %02x", value, gspca_dev->usb_buf[0]);
900 static void reg_w1(struct gspca_dev *gspca_dev,
904 PDEBUG(D_USBO, "reg_w1 [%04x] = %02x", value, data);
905 gspca_dev->usb_buf[0] = data;
906 usb_control_msg(gspca_dev->dev,
907 usb_sndctrlpipe(gspca_dev->dev, 0),
909 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
912 gspca_dev->usb_buf, 1,
915 static void reg_w(struct gspca_dev *gspca_dev,
920 PDEBUG(D_USBO, "reg_w [%04x] = %02x %02x ..",
921 value, buffer[0], buffer[1]);
923 if (len > USB_BUF_SZ) {
924 err("reg_w: buffer overflow");
928 memcpy(gspca_dev->usb_buf, buffer, len);
929 usb_control_msg(gspca_dev->dev,
930 usb_sndctrlpipe(gspca_dev->dev, 0),
932 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
934 gspca_dev->usb_buf, len,
938 /* I2C write 1 byte */
939 static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
941 struct sd *sd = (struct sd *) gspca_dev;
943 PDEBUG(D_USBO, "i2c_w2 [%02x] = %02x", reg, val);
944 gspca_dev->usb_buf[0] = 0x81 | (2 << 4); /* = a1 */
945 gspca_dev->usb_buf[1] = sd->i2c_base;
946 gspca_dev->usb_buf[2] = reg;
947 gspca_dev->usb_buf[3] = val;
948 gspca_dev->usb_buf[4] = 0;
949 gspca_dev->usb_buf[5] = 0;
950 gspca_dev->usb_buf[6] = 0;
951 gspca_dev->usb_buf[7] = 0x10;
952 usb_control_msg(gspca_dev->dev,
953 usb_sndctrlpipe(gspca_dev->dev, 0),
955 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
956 0x08, /* value = i2c */
958 gspca_dev->usb_buf, 8,
962 /* I2C write 8 bytes */
963 static void i2c_w8(struct gspca_dev *gspca_dev,
966 memcpy(gspca_dev->usb_buf, buffer, 8);
967 usb_control_msg(gspca_dev->dev,
968 usb_sndctrlpipe(gspca_dev->dev, 0),
970 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
971 0x08, 0, /* value, index */
972 gspca_dev->usb_buf, 8,
977 /* read 5 bytes in gspca_dev->usb_buf */
978 static void i2c_r5(struct gspca_dev *gspca_dev, u8 reg)
980 struct sd *sd = (struct sd *) gspca_dev;
983 mode[0] = 0x81 | 0x10;
984 mode[1] = sd->i2c_base;
991 i2c_w8(gspca_dev, mode);
993 mode[0] = 0x81 | (5 << 4) | 0x02;
995 i2c_w8(gspca_dev, mode);
997 reg_r(gspca_dev, 0x0a, 5);
1000 static int hv7131r_probe(struct gspca_dev *gspca_dev)
1002 i2c_w1(gspca_dev, 0x02, 0); /* sensor wakeup */
1004 reg_w1(gspca_dev, 0x02, 0x66); /* Gpio on */
1006 i2c_r5(gspca_dev, 0); /* read sensor id */
1007 if (gspca_dev->usb_buf[0] == 0x02
1008 && gspca_dev->usb_buf[1] == 0x09
1009 && gspca_dev->usb_buf[2] == 0x01
1010 && gspca_dev->usb_buf[3] == 0x00
1011 && gspca_dev->usb_buf[4] == 0x00) {
1012 PDEBUG(D_PROBE, "Find Sensor sn9c102P HV7131R");
1015 PDEBUG(D_PROBE, "Find Sensor 0x%02x 0x%02x 0x%02x",
1016 gspca_dev->usb_buf[0], gspca_dev->usb_buf[1],
1017 gspca_dev->usb_buf[2]);
1018 PDEBUG(D_PROBE, "Sensor sn9c102P Not found");
1022 static void mi0360_probe(struct gspca_dev *gspca_dev)
1024 struct sd *sd = (struct sd *) gspca_dev;
1027 static const u8 probe_tb[][4][8] = {
1029 {0xb0, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
1030 {0x90, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1031 {0xa2, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1032 {0xb0, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10}
1035 {0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10},
1036 {0x90, 0x5c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x10},
1037 {0xa2, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1042 for (i = 0; i < ARRAY_SIZE(probe_tb); i++) {
1043 reg_w1(gspca_dev, 0x17, 0x62);
1044 reg_w1(gspca_dev, 0x01, 0x08);
1045 for (j = 0; j < 3; j++)
1046 i2c_w8(gspca_dev, probe_tb[i][j]);
1048 reg_r(gspca_dev, 0x0a, 5);
1049 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1050 if (probe_tb[i][3][0] != 0)
1051 i2c_w8(gspca_dev, probe_tb[i][3]);
1052 reg_w1(gspca_dev, 0x01, 0x29);
1053 reg_w1(gspca_dev, 0x17, 0x42);
1059 PDEBUG(D_PROBE, "Sensor mt9v111");
1060 sd->sensor = SENSOR_MT9V111;
1061 sd->i2c_base = 0x5c;
1064 PDEBUG(D_PROBE, "Sensor mi0360");
1067 PDEBUG(D_PROBE, "Unknown sensor %04x - forced to mi0360", val);
1072 static int configure_gpio(struct gspca_dev *gspca_dev,
1075 struct sd *sd = (struct sd *) gspca_dev;
1077 static const u8 reg9a_def[] =
1078 {0x08, 0x40, 0x20, 0x10, 0x00, 0x04};
1079 static const u8 reg9a_sn9c325[] =
1080 {0x0a, 0x40, 0x38, 0x30, 0x00, 0x20};
1081 static const u8 regd4[] = {0x60, 0x00, 0x00};
1083 reg_w1(gspca_dev, 0xf1, 0x00);
1084 reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
1086 /* configure gpio */
1087 reg_w(gspca_dev, 0x01, &sn9c1xx[1], 2);
1088 reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
1089 reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5); /* jfm len was 3 */
1090 switch (sd->bridge) {
1091 case BRIDGE_SN9C325:
1092 reg9a = reg9a_sn9c325;
1098 reg_w(gspca_dev, 0x9a, reg9a, 6);
1100 reg_w(gspca_dev, 0xd4, regd4, sizeof regd4); /*fixme:jfm was 60 only*/
1102 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
1104 switch (sd->sensor) {
1105 case SENSOR_MT9V111:
1106 reg_w1(gspca_dev, 0x01, 0x61);
1107 reg_w1(gspca_dev, 0x17, 0x61);
1108 reg_w1(gspca_dev, 0x01, 0x60);
1109 reg_w1(gspca_dev, 0x01, 0x40);
1112 reg_w1(gspca_dev, 0x02, 0x71);
1113 reg_w1(gspca_dev, 0x01, 0x42);
1114 reg_w1(gspca_dev, 0x17, 0x64);
1115 reg_w1(gspca_dev, 0x01, 0x42);
1117 /*jfm: from win trace */
1119 reg_w1(gspca_dev, 0x01, 0x61);
1120 reg_w1(gspca_dev, 0x17, 0xe2);
1121 reg_w1(gspca_dev, 0x01, 0x60);
1122 reg_w1(gspca_dev, 0x01, 0x40);
1125 reg_w1(gspca_dev, 0x01, 0x63);
1126 reg_w1(gspca_dev, 0x17, 0x20);
1127 reg_w1(gspca_dev, 0x01, 0x42);
1129 /*jfm: from win trace */
1131 if (sd->bridge == BRIDGE_SN9C120) {
1132 reg_w1(gspca_dev, 0x01, 0x61);
1133 reg_w1(gspca_dev, 0x17, 0x20);
1134 reg_w1(gspca_dev, 0x01, 0x60);
1135 reg_w1(gspca_dev, 0x01, 0x40);
1139 case SENSOR_SP80708:
1140 reg_w1(gspca_dev, 0x01, 0x63);
1141 reg_w1(gspca_dev, 0x17, 0x20);
1142 reg_w1(gspca_dev, 0x01, 0x62);
1143 reg_w1(gspca_dev, 0x01, 0x42);
1145 reg_w1(gspca_dev, 0x02, 0x62);
1148 reg_w1(gspca_dev, 0x01, 0x43);
1149 reg_w1(gspca_dev, 0x17, 0x61);
1150 reg_w1(gspca_dev, 0x01, 0x42);
1151 if (sd->sensor == SENSOR_HV7131R) {
1152 if (hv7131r_probe(gspca_dev) < 0)
1160 static void hv7131R_InitSensor(struct gspca_dev *gspca_dev)
1163 static const u8 SetSensorClk[] = /* 0x08 Mclk */
1164 { 0xa1, 0x11, 0x01, 0x18, 0x00, 0x00, 0x00, 0x10 };
1166 while (hv7131r_sensor_init[i][0]) {
1167 i2c_w8(gspca_dev, hv7131r_sensor_init[i]);
1170 i2c_w8(gspca_dev, SetSensorClk);
1173 static void mi0360_InitSensor(struct gspca_dev *gspca_dev)
1177 while (mi0360_sensor_init[i][0]) {
1178 i2c_w8(gspca_dev, mi0360_sensor_init[i]);
1183 static void mo4000_InitSensor(struct gspca_dev *gspca_dev)
1187 while (mo4000_sensor_init[i][0]) {
1188 i2c_w8(gspca_dev, mo4000_sensor_init[i]);
1193 static void mt9v111_InitSensor(struct gspca_dev *gspca_dev)
1197 i2c_w8(gspca_dev, mt9v111_sensor_init[i]);
1200 while (mt9v111_sensor_init[i][0]) {
1201 i2c_w8(gspca_dev, mt9v111_sensor_init[i]);
1206 static void om6802_InitSensor(struct gspca_dev *gspca_dev)
1210 while (om6802_sensor_init[i][0]) {
1211 i2c_w8(gspca_dev, om6802_sensor_init[i]);
1216 static void ov7630_InitSensor(struct gspca_dev *gspca_dev)
1220 i2c_w8(gspca_dev, ov7630_sensor_init[i]); /* 76 01 */
1222 i2c_w8(gspca_dev, ov7630_sensor_init[i]); /* 12 c8 (RGB+SRST) */
1225 i2c_w8(gspca_dev, ov7630_sensor_init[i]); /* 12 48 */
1227 i2c_w8(gspca_dev, ov7630_sensor_init[i]); /* 12 c8 */
1230 i2c_w8(gspca_dev, ov7630_sensor_init[i]); /* 12 48 */
1232 /*jfm:win i2c_r from 00 to 80*/
1234 while (ov7630_sensor_init[i][0]) {
1235 i2c_w8(gspca_dev, ov7630_sensor_init[i]);
1240 static void ov7648_InitSensor(struct gspca_dev *gspca_dev)
1244 i2c_w8(gspca_dev, ov7648_sensor_init[i]);
1246 /* win: dble reset */
1247 i2c_w8(gspca_dev, ov7648_sensor_init[i]); /* reset */
1250 /* win: i2c reg read 00..7f */
1251 while (ov7648_sensor_init[i][0]) {
1252 i2c_w8(gspca_dev, ov7648_sensor_init[i]);
1257 static void ov7660_InitSensor(struct gspca_dev *gspca_dev)
1261 i2c_w8(gspca_dev, ov7660_sensor_init[i]); /* reset SCCB */
1264 while (ov7660_sensor_init[i][0]) {
1265 i2c_w8(gspca_dev, ov7660_sensor_init[i]);
1270 static void sp80708_InitSensor(struct gspca_dev *gspca_dev)
1274 i2c_w8(gspca_dev, sp80708_sensor_init[i]); /* reset SCCB */
1277 while (sp80708_sensor_init[i][0]) {
1278 i2c_w8(gspca_dev, sp80708_sensor_init[i]);
1283 /* this function is called at probe time */
1284 static int sd_config(struct gspca_dev *gspca_dev,
1285 const struct usb_device_id *id)
1287 struct sd *sd = (struct sd *) gspca_dev;
1290 cam = &gspca_dev->cam;
1291 cam->cam_mode = vga_mode;
1292 cam->nmodes = ARRAY_SIZE(vga_mode);
1294 sd->bridge = id->driver_info >> 16;
1295 sd->sensor = id->driver_info >> 8;
1296 sd->i2c_base = id->driver_info;
1298 sd->brightness = BRIGHTNESS_DEF;
1299 sd->contrast = CONTRAST_DEF;
1300 sd->colors = COLOR_DEF;
1301 sd->blue = BLUE_BALANCE_DEF;
1302 sd->red = RED_BALANCE_DEF;
1303 sd->gamma = GAMMA_DEF;
1304 sd->autogain = AUTOGAIN_DEF;
1306 sd->vflip = VFLIP_DEF;
1307 sd->infrared = INFRARED_DEF;
1309 gspca_dev->ctrl_dis = ctrl_dis[sd->sensor];
1313 /* this function is called at probe and resume time */
1314 static int sd_init(struct gspca_dev *gspca_dev)
1316 struct sd *sd = (struct sd *) gspca_dev;
1317 u8 regGpio[] = { 0x29, 0x74 };
1320 /* setup a selector by bridge */
1321 reg_w1(gspca_dev, 0xf1, 0x01);
1322 reg_r(gspca_dev, 0x00, 1);
1323 reg_w1(gspca_dev, 0xf1, gspca_dev->usb_buf[0]);
1324 reg_r(gspca_dev, 0x00, 1); /* get sonix chip id */
1325 regF1 = gspca_dev->usb_buf[0];
1326 PDEBUG(D_PROBE, "Sonix chip id: %02x", regF1);
1327 switch (sd->bridge) {
1328 case BRIDGE_SN9C102P:
1331 reg_w1(gspca_dev, 0x02, regGpio[1]);
1333 case BRIDGE_SN9C105:
1336 if (sd->sensor == SENSOR_MI0360)
1337 mi0360_probe(gspca_dev);
1338 reg_w(gspca_dev, 0x01, regGpio, 2);
1340 case BRIDGE_SN9C120:
1343 if (sd->sensor == SENSOR_MI0360)
1344 mi0360_probe(gspca_dev);
1346 reg_w(gspca_dev, 0x01, regGpio, 2);
1349 /* case BRIDGE_SN9C110: */
1350 /* case BRIDGE_SN9C325: */
1353 reg_w1(gspca_dev, 0x02, 0x62);
1357 reg_w1(gspca_dev, 0xf1, 0x01);
1362 static u32 setexposure(struct gspca_dev *gspca_dev,
1365 struct sd *sd = (struct sd *) gspca_dev;
1367 switch (sd->sensor) {
1368 case SENSOR_HV7131R: {
1370 { 0xc1, 0x11, 0x25, 0x07, 0x27, 0xc0, 0x00, 0x16 };
1372 Expodoit[3] = expo >> 16;
1373 Expodoit[4] = expo >> 8;
1375 i2c_w8(gspca_dev, Expodoit);
1378 case SENSOR_MI0360: {
1379 u8 expoMi[] = /* exposure 0x0635 -> 4 fp/s 0x10 */
1380 { 0xb1, 0x5d, 0x09, 0x06, 0x35, 0x00, 0x00, 0x16 };
1381 static const u8 doit[] = /* update sensor */
1382 { 0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10 };
1383 static const u8 sensorgo[] = /* sensor on */
1384 { 0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10 };
1388 else if (expo < 0x0001)
1390 expoMi[3] = expo >> 8;
1392 i2c_w8(gspca_dev, expoMi);
1393 i2c_w8(gspca_dev, doit);
1394 i2c_w8(gspca_dev, sensorgo);
1397 case SENSOR_MO4000: {
1399 { 0xa1, 0x21, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x10 };
1401 { 0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10 };
1402 static const u8 gainMo[] =
1403 { 0xa1, 0x21, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1d };
1407 else if (expo < 0x0001)
1409 expoMof[3] = (expo & 0x03fc) >> 2;
1410 i2c_w8(gspca_dev, expoMof);
1411 expoMo10[3] = ((expo & 0x1c00) >> 10)
1412 | ((expo & 0x0003) << 4);
1413 i2c_w8(gspca_dev, expoMo10);
1414 i2c_w8(gspca_dev, gainMo);
1415 PDEBUG(D_FRAM, "set exposure %d",
1416 ((expoMo10[3] & 0x07) << 10)
1418 | ((expoMo10[3] & 0x30) >> 4));
1421 case SENSOR_MT9V111: {
1423 { 0xb1, 0x5c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x10 };
1427 else if (expo < 0x0040)
1429 expo_c1[3] = expo >> 8;
1431 i2c_w8(gspca_dev, expo_c1);
1434 case SENSOR_OM6802: {
1436 { 0xa0, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x10 };
1442 gainOm[3] = expo >> 2;
1443 i2c_w8(gspca_dev, gainOm);
1444 reg_w1(gspca_dev, 0x96, (expo >> 5) & 0x1f);
1445 PDEBUG(D_FRAM, "set exposure %d", gainOm[3]);
1452 static void setbrightness(struct gspca_dev *gspca_dev)
1454 struct sd *sd = (struct sd *) gspca_dev;
1458 k2 = ((int) sd->brightness - 0x8000) >> 10;
1459 switch (sd->sensor) {
1460 case SENSOR_HV7131R:
1461 expo = sd->brightness << 4;
1462 if (expo > 0x002dc6c0)
1464 else if (expo < 0x02a0)
1466 sd->exposure = setexposure(gspca_dev, expo);
1470 expo = sd->brightness >> 4;
1471 sd->exposure = setexposure(gspca_dev, expo);
1473 case SENSOR_MT9V111:
1474 expo = sd->brightness >> 8;
1475 sd->exposure = setexposure(gspca_dev, expo);
1478 expo = sd->brightness >> 6;
1479 sd->exposure = setexposure(gspca_dev, expo);
1480 k2 = sd->brightness >> 11;
1484 if (sd->sensor != SENSOR_MT9V111)
1485 reg_w1(gspca_dev, 0x96, k2); /* color matrix Y offset */
1488 static void setcontrast(struct gspca_dev *gspca_dev)
1490 struct sd *sd = (struct sd *) gspca_dev;
1494 k2 = sd->contrast * 0x30 / (CONTRAST_MAX + 1) + 0x10; /* 10..40 */
1495 contrast[0] = (k2 + 1) / 2; /* red */
1497 contrast[2] = k2; /* green */
1499 contrast[4] = (k2 + 1) / 5; /* blue */
1501 reg_w(gspca_dev, 0x84, contrast, sizeof contrast);
1504 static void setcolors(struct gspca_dev *gspca_dev)
1506 struct sd *sd = (struct sd *) gspca_dev;
1508 u8 reg8a[12]; /* U & V gains */
1509 static s16 uv[6] = { /* same as reg84 in signed decimal */
1510 -24, -38, 64, /* UR UG UB */
1511 62, -51, -9 /* VR VG VB */
1513 for (i = 0; i < 6; i++) {
1514 v = uv[i] * sd->colors / COLOR_DEF;
1516 reg8a[i * 2 + 1] = (v >> 8) & 0x0f;
1518 reg_w(gspca_dev, 0x8a, reg8a, sizeof reg8a);
1521 static void setredblue(struct gspca_dev *gspca_dev)
1523 struct sd *sd = (struct sd *) gspca_dev;
1525 reg_w1(gspca_dev, 0x05, sd->red);
1526 /* reg_w1(gspca_dev, 0x07, 32); */
1527 reg_w1(gspca_dev, 0x06, sd->blue);
1530 static void setgamma(struct gspca_dev *gspca_dev)
1532 struct sd *sd = (struct sd *) gspca_dev;
1535 const u8 *gamma_base;
1536 static const u8 delta[17] = {
1537 0x00, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1a,
1538 0x18, 0x13, 0x10, 0x0e, 0x08, 0x07, 0x04, 0x02, 0x00
1541 switch (sd->sensor) {
1542 case SENSOR_HV7131R:
1543 case SENSOR_MT9V111:
1544 gamma_base = gamma_spec_1;
1546 case SENSOR_SP80708:
1547 gamma_base = gamma_spec_2;
1550 gamma_base = gamma_def;
1554 for (i = 0; i < sizeof gamma; i++)
1555 gamma[i] = gamma_base[i]
1556 + delta[i] * (sd->gamma - GAMMA_DEF) / 32;
1557 reg_w(gspca_dev, 0x20, gamma, sizeof gamma);
1560 static void setautogain(struct gspca_dev *gspca_dev)
1562 struct sd *sd = (struct sd *) gspca_dev;
1564 if (gspca_dev->ctrl_dis & (1 << AUTOGAIN_IDX))
1567 sd->ag_cnt = AG_CNT_START;
1572 static void setvflip(struct sd *sd)
1574 i2c_w1(&sd->gspca_dev, 0x75, /* COMN */
1575 sd->vflip ? 0x82 : 0x02);
1578 static void setinfrared(struct sd *sd)
1580 /*fixme: different sequence for StarCam Clip and StarCam 370i */
1582 i2c_w1(&sd->gspca_dev, 0x02, /* gpio */
1583 sd->infrared ? 0x66 : 0x64);
1586 /* -- start the camera -- */
1587 static int sd_start(struct gspca_dev *gspca_dev)
1589 struct sd *sd = (struct sd *) gspca_dev;
1591 u8 reg1, reg17, reg18;
1594 static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
1595 static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
1596 static const u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */
1597 static const u8 CE_ov76xx[] =
1598 { 0x32, 0xdd, 0x32, 0xdd };
1600 sn9c1xx = sn_tb[(int) sd->sensor];
1601 configure_gpio(gspca_dev, sn9c1xx);
1603 reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]);
1604 reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]);
1605 reg_w1(gspca_dev, 0x12, sn9c1xx[0x12]);
1606 reg_w1(gspca_dev, 0x13, sn9c1xx[0x13]);
1607 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
1608 reg_w1(gspca_dev, 0xd2, 0x6a); /* DC29 */
1609 reg_w1(gspca_dev, 0xd3, 0x50);
1610 reg_w1(gspca_dev, 0xc6, 0x00);
1611 reg_w1(gspca_dev, 0xc7, 0x00);
1612 reg_w1(gspca_dev, 0xc8, 0x50);
1613 reg_w1(gspca_dev, 0xc9, 0x3c);
1614 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
1615 switch (sd->sensor) {
1616 case SENSOR_MT9V111:
1625 /*jfm: from win trace */
1627 if (sd->bridge == BRIDGE_SN9C120) {
1636 reg_w1(gspca_dev, 0x17, reg17);
1637 /* set reg1 was here */
1638 reg_w1(gspca_dev, 0x05, sn9c1xx[5]); /* red */
1639 reg_w1(gspca_dev, 0x07, sn9c1xx[7]); /* green */
1640 reg_w1(gspca_dev, 0x06, sn9c1xx[6]); /* blue */
1641 reg_w1(gspca_dev, 0x14, sn9c1xx[0x14]);
1643 setgamma(gspca_dev);
1645 for (i = 0; i < 8; i++)
1646 reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
1647 switch (sd->sensor) {
1648 case SENSOR_MT9V111:
1649 reg_w1(gspca_dev, 0x9a, 0x07);
1650 reg_w1(gspca_dev, 0x99, 0x59);
1653 reg_w1(gspca_dev, 0x9a, 0x0a);
1654 reg_w1(gspca_dev, 0x99, 0x60);
1656 case SENSOR_SP80708:
1657 reg_w1(gspca_dev, 0x9a, 0x05);
1658 reg_w1(gspca_dev, 0x99, 0x59);
1661 if (sd->bridge == BRIDGE_SN9C120) {
1662 reg_w1(gspca_dev, 0x9a, 0x05);
1667 reg_w1(gspca_dev, 0x9a, 0x08);
1668 reg_w1(gspca_dev, 0x99, 0x59);
1672 mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
1674 reg1 = 0x46; /* 320x240: clk 48Mhz, video trf enable */
1676 reg1 = 0x06; /* 640x480: clk 24Mhz, video trf enable */
1677 reg17 = 0x61; /* 0x:20: enable sensor clock */
1678 switch (sd->sensor) {
1679 case SENSOR_HV7131R:
1680 hv7131R_InitSensor(gspca_dev);
1683 mi0360_InitSensor(gspca_dev);
1686 mo4000_InitSensor(gspca_dev);
1688 /* reg1 = 0x46; * 320 clk 48Mhz 60fp/s */
1689 reg1 = 0x06; /* clk 24Mz */
1691 reg17 = 0x22; /* 640 MCKSIZE */
1692 /* reg1 = 0x06; * 640 clk 24Mz (done) */
1695 case SENSOR_MT9V111:
1696 mt9v111_InitSensor(gspca_dev);
1698 reg1 = 0x04; /* 320 clk 48Mhz */
1700 /* reg1 = 0x06; * 640 clk 24Mz (done) */
1705 om6802_InitSensor(gspca_dev);
1706 reg17 = 0x64; /* 640 MCKSIZE */
1709 ov7630_InitSensor(gspca_dev);
1715 ov7648_InitSensor(gspca_dev);
1717 /* reg1 = 0x42; * 42 - 46? */
1720 ov7660_InitSensor(gspca_dev);
1721 if (sd->bridge == BRIDGE_SN9C120) {
1722 if (mode) { /* 320x240 - 160x120 */
1724 reg1 = 0x44; /* 48 Mhz, video trf eneble */
1728 reg1 = 0x06; /* 24 Mhz, video trf eneble
1729 * inverse power down */
1733 /* case SENSOR_SP80708: */
1734 sp80708_InitSensor(gspca_dev);
1736 /*?? reg1 = 0x04; * 320 clk 48Mhz */
1738 reg1 = 0x46; /* 640 clk 48Mz */
1743 reg_w(gspca_dev, 0xc0, C0, 6);
1744 reg_w(gspca_dev, 0xca, CA, 4);
1745 switch (sd->sensor) {
1749 reg_w(gspca_dev, 0xce, CE_ov76xx, 4);
1752 reg_w(gspca_dev, 0xce, CE, 4);
1753 /* ?? {0x1e, 0xdd, 0x2d, 0xe7} */
1757 /* here change size mode 0 -> VGA; 1 -> CIF */
1758 reg18 = sn9c1xx[0x18] | (mode << 4);
1759 reg_w1(gspca_dev, 0x18, reg18 | 0x40);
1761 reg_w(gspca_dev, 0x0100, qtable4, 0x40);
1762 reg_w(gspca_dev, 0x0140, qtable4 + 0x40, 0x40);
1764 reg_w1(gspca_dev, 0x18, reg18);
1766 reg_w1(gspca_dev, 0x17, reg17);
1767 reg_w1(gspca_dev, 0x01, reg1);
1768 switch (sd->sensor) {
1773 setbrightness(gspca_dev);
1774 setcontrast(gspca_dev);
1775 setautogain(gspca_dev);
1779 static void sd_stopN(struct gspca_dev *gspca_dev)
1781 struct sd *sd = (struct sd *) gspca_dev;
1782 static const u8 stophv7131[] =
1783 { 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10 };
1784 static const u8 stopmi0360[] =
1785 { 0xb1, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10 };
1786 static const u8 stopov7648[] =
1787 { 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 };
1792 switch (sd->sensor) {
1793 case SENSOR_HV7131R:
1794 i2c_w8(gspca_dev, stophv7131);
1798 i2c_w8(gspca_dev, stopmi0360);
1802 i2c_w8(gspca_dev, stopov7648);
1804 case SENSOR_MT9V111:
1809 /* case SENSOR_MO4000: */
1810 /* case SENSOR_OV7660: */
1813 sn9c1xx = sn_tb[(int) sd->sensor];
1814 reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
1815 reg_w1(gspca_dev, 0x17, sn9c1xx[0x17]);
1816 reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
1817 reg_w1(gspca_dev, 0x01, data);
1818 reg_w1(gspca_dev, 0xf1, 0x00);
1821 static void do_autogain(struct gspca_dev *gspca_dev)
1823 struct sd *sd = (struct sd *) gspca_dev;
1829 /* Thanks S., without your advice, autobright should not work :) */
1832 if (--sd->ag_cnt >= 0)
1834 sd->ag_cnt = AG_CNT_START;
1836 delta = atomic_read(&sd->avg_lum);
1837 PDEBUG(D_FRAM, "mean lum %d", delta);
1838 if (delta < luma_mean - luma_delta ||
1839 delta > luma_mean + luma_delta) {
1840 switch (sd->sensor) {
1841 case SENSOR_HV7131R:
1842 expotimes = sd->exposure >> 8;
1843 expotimes += (luma_mean - delta) >> 4;
1846 sd->exposure = setexposure(gspca_dev,
1847 (unsigned int) (expotimes << 8));
1850 /* case SENSOR_MO4000: */
1851 /* case SENSOR_MI0360: */
1852 /* case SENSOR_MT9V111: */
1853 /* case SENSOR_OM6802: */
1854 expotimes = sd->exposure;
1855 expotimes += (luma_mean - delta) >> 6;
1858 sd->exposure = setexposure(gspca_dev,
1859 (unsigned int) expotimes);
1860 setredblue(gspca_dev);
1866 /* scan the URB packets */
1867 /* This function is run at interrupt level. */
1868 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1869 struct gspca_frame *frame, /* target */
1870 u8 *data, /* isoc packet */
1871 int len) /* iso packet length */
1873 struct sd *sd = (struct sd *) gspca_dev;
1877 if (sof >= 0 && data[sof] == 0xff && data[sof + 1] == 0xd9) {
1880 gspca_frame_add(gspca_dev, LAST_PACKET,
1881 frame, data, sof + 2);
1888 avg_lum = ((data[sof + 29] << 8) | data[sof + 30]) >> 6;
1890 avg_lum += ((data[sof + 33] << 8) | data[sof + 34]) >> 6;
1892 avg_lum += ((data[sof + 25] << 8) | data[sof + 26]) >> 6;
1894 avg_lum += ((data[sof + 37] << 8) | data[sof + 38]) >> 6;
1896 avg_lum += ((data[sof + 31] << 8) | data[sof + 32]) >> 4;
1898 atomic_set(&sd->avg_lum, avg_lum);
1901 if (gspca_dev->last_packet_type == LAST_PACKET) {
1903 /* put the JPEG 422 header */
1904 jpeg_put_header(gspca_dev, frame, 0x21);
1906 gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
1909 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
1911 struct sd *sd = (struct sd *) gspca_dev;
1913 sd->brightness = val;
1914 if (gspca_dev->streaming)
1915 setbrightness(gspca_dev);
1919 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
1921 struct sd *sd = (struct sd *) gspca_dev;
1923 *val = sd->brightness;
1927 static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
1929 struct sd *sd = (struct sd *) gspca_dev;
1932 if (gspca_dev->streaming)
1933 setcontrast(gspca_dev);
1937 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
1939 struct sd *sd = (struct sd *) gspca_dev;
1941 *val = sd->contrast;
1945 static int sd_setcolors(struct gspca_dev *gspca_dev, __s32 val)
1947 struct sd *sd = (struct sd *) gspca_dev;
1950 if (gspca_dev->streaming)
1951 setcolors(gspca_dev);
1955 static int sd_getcolors(struct gspca_dev *gspca_dev, __s32 *val)
1957 struct sd *sd = (struct sd *) gspca_dev;
1963 static int sd_setblue_balance(struct gspca_dev *gspca_dev, __s32 val)
1965 struct sd *sd = (struct sd *) gspca_dev;
1968 if (gspca_dev->streaming)
1969 setredblue(gspca_dev);
1973 static int sd_getblue_balance(struct gspca_dev *gspca_dev, __s32 *val)
1975 struct sd *sd = (struct sd *) gspca_dev;
1981 static int sd_setred_balance(struct gspca_dev *gspca_dev, __s32 val)
1983 struct sd *sd = (struct sd *) gspca_dev;
1986 if (gspca_dev->streaming)
1987 setredblue(gspca_dev);
1991 static int sd_getred_balance(struct gspca_dev *gspca_dev, __s32 *val)
1993 struct sd *sd = (struct sd *) gspca_dev;
1999 static int sd_setgamma(struct gspca_dev *gspca_dev, __s32 val)
2001 struct sd *sd = (struct sd *) gspca_dev;
2004 if (gspca_dev->streaming)
2005 setgamma(gspca_dev);
2009 static int sd_getgamma(struct gspca_dev *gspca_dev, __s32 *val)
2011 struct sd *sd = (struct sd *) gspca_dev;
2017 static int sd_setautogain(struct gspca_dev *gspca_dev, __s32 val)
2019 struct sd *sd = (struct sd *) gspca_dev;
2022 if (gspca_dev->streaming)
2023 setautogain(gspca_dev);
2027 static int sd_getautogain(struct gspca_dev *gspca_dev, __s32 *val)
2029 struct sd *sd = (struct sd *) gspca_dev;
2031 *val = sd->autogain;
2035 static int sd_setvflip(struct gspca_dev *gspca_dev, __s32 val)
2037 struct sd *sd = (struct sd *) gspca_dev;
2040 if (gspca_dev->streaming)
2045 static int sd_getvflip(struct gspca_dev *gspca_dev, __s32 *val)
2047 struct sd *sd = (struct sd *) gspca_dev;
2053 static int sd_setinfrared(struct gspca_dev *gspca_dev, __s32 val)
2055 struct sd *sd = (struct sd *) gspca_dev;
2058 if (gspca_dev->streaming)
2063 static int sd_getinfrared(struct gspca_dev *gspca_dev, __s32 *val)
2065 struct sd *sd = (struct sd *) gspca_dev;
2067 *val = sd->infrared;
2071 /* sub-driver description */
2072 static const struct sd_desc sd_desc = {
2073 .name = MODULE_NAME,
2075 .nctrls = ARRAY_SIZE(sd_ctrls),
2076 .config = sd_config,
2080 .pkt_scan = sd_pkt_scan,
2081 .dq_callback = do_autogain,
2084 /* -- module initialisation -- */
2085 #define BSI(bridge, sensor, i2c_addr) \
2086 .driver_info = (BRIDGE_ ## bridge << 16) \
2087 | (SENSOR_ ## sensor << 8) \
2089 static const __devinitdata struct usb_device_id device_table[] = {
2090 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
2091 {USB_DEVICE(0x0458, 0x7025), BSI(SN9C120, MI0360, 0x5d)},
2092 {USB_DEVICE(0x0458, 0x702e), BSI(SN9C120, OV7660, 0x21)},
2094 {USB_DEVICE(0x045e, 0x00f5), BSI(SN9C105, OV7660, 0x21)},
2095 {USB_DEVICE(0x045e, 0x00f7), BSI(SN9C105, OV7660, 0x21)},
2096 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
2097 {USB_DEVICE(0x0471, 0x0327), BSI(SN9C105, MI0360, 0x5d)},
2099 {USB_DEVICE(0x0471, 0x0328), BSI(SN9C105, MI0360, 0x5d)},
2100 {USB_DEVICE(0x0471, 0x0330), BSI(SN9C105, MI0360, 0x5d)},
2101 {USB_DEVICE(0x06f8, 0x3004), BSI(SN9C105, OV7660, 0x21)},
2102 {USB_DEVICE(0x0c45, 0x6040), BSI(SN9C102P, HV7131R, 0x11)},
2104 {USB_DEVICE(0x0c45, 0x6040), BSI(SN9C102P, MI0360, 0x5d)}, */
2105 /* {USB_DEVICE(0x0c45, 0x603a), BSI(SN9C102P, OV7648, 0x??)}, */
2106 /* {USB_DEVICE(0x0c45, 0x607a), BSI(SN9C102P, OV7648, 0x??)}, */
2107 {USB_DEVICE(0x0c45, 0x607c), BSI(SN9C102P, HV7131R, 0x11)},
2108 /* {USB_DEVICE(0x0c45, 0x607e), BSI(SN9C102P, OV7630, 0x??)}, */
2109 {USB_DEVICE(0x0c45, 0x60c0), BSI(SN9C105, MI0360, 0x5d)},
2110 /* {USB_DEVICE(0x0c45, 0x60c8), BSI(SN9C105, OM6801, 0x??)}, */
2111 /* {USB_DEVICE(0x0c45, 0x60cc), BSI(SN9C105, HV7131GP, 0x??)}, */
2112 {USB_DEVICE(0x0c45, 0x60ec), BSI(SN9C105, MO4000, 0x21)},
2113 /* {USB_DEVICE(0x0c45, 0x60ef), BSI(SN9C105, ICM105C, 0x??)}, */
2114 /* {USB_DEVICE(0x0c45, 0x60fa), BSI(SN9C105, OV7648, 0x??)}, */
2115 {USB_DEVICE(0x0c45, 0x60fb), BSI(SN9C105, OV7660, 0x21)},
2116 {USB_DEVICE(0x0c45, 0x60fc), BSI(SN9C105, HV7131R, 0x11)},
2117 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
2118 {USB_DEVICE(0x0c45, 0x60fe), BSI(SN9C105, OV7630, 0x21)},
2120 /* {USB_DEVICE(0x0c45, 0x6108), BSI(SN9C120, OM6801, 0x??)}, */
2121 /* {USB_DEVICE(0x0c45, 0x6122), BSI(SN9C110, ICM105C, 0x??)}, */
2122 /* {USB_DEVICE(0x0c45, 0x6123), BSI(SN9C110, SanyoCCD, 0x??)}, */
2123 {USB_DEVICE(0x0c45, 0x6128), BSI(SN9C110, OM6802, 0x21)}, /*sn9c325?*/
2125 {USB_DEVICE(0x0c45, 0x612a), BSI(SN9C120, OV7648, 0x21)}, /*sn9c110?*/
2126 {USB_DEVICE(0x0c45, 0x612c), BSI(SN9C110, MO4000, 0x21)},
2127 {USB_DEVICE(0x0c45, 0x612e), BSI(SN9C110, OV7630, 0x21)},
2128 /* {USB_DEVICE(0x0c45, 0x612f), BSI(SN9C110, ICM105C, 0x??)}, */
2129 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
2130 {USB_DEVICE(0x0c45, 0x6130), BSI(SN9C120, MI0360, 0x5d)},
2132 {USB_DEVICE(0x0c45, 0x6138), BSI(SN9C120, MO4000, 0x21)},
2133 {USB_DEVICE(0x0c45, 0x613a), BSI(SN9C120, OV7648, 0x21)},
2134 #if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
2135 {USB_DEVICE(0x0c45, 0x613b), BSI(SN9C120, OV7660, 0x21)},
2136 {USB_DEVICE(0x0c45, 0x613c), BSI(SN9C120, HV7131R, 0x11)},
2137 /* {USB_DEVICE(0x0c45, 0x613e), BSI(SN9C120, OV7630, 0x??)}, */
2139 {USB_DEVICE(0x0c45, 0x6143), BSI(SN9C120, SP80708, 0x18)},
2142 MODULE_DEVICE_TABLE(usb, device_table);
2144 /* -- device connect -- */
2145 static int sd_probe(struct usb_interface *intf,
2146 const struct usb_device_id *id)
2148 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
2152 static struct usb_driver sd_driver = {
2153 .name = MODULE_NAME,
2154 .id_table = device_table,
2156 .disconnect = gspca_disconnect,
2158 .suspend = gspca_suspend,
2159 .resume = gspca_resume,
2163 /* -- module insert / remove -- */
2164 static int __init sd_mod_init(void)
2167 ret = usb_register(&sd_driver);
2173 static void __exit sd_mod_exit(void)
2175 usb_deregister(&sd_driver);
2176 info("deregistered");
2179 module_init(sd_mod_init);
2180 module_exit(sd_mod_exit);