1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23
24#define MODULE_NAME "sonixj"
25
26#include <linux/input.h>
27#include "gspca.h"
28#include "jpeg.h"
29
30MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");
31MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver");
32MODULE_LICENSE("GPL");
33
34
35struct sd {
36 struct gspca_dev gspca_dev;
37
38 atomic_t avg_lum;
39 struct v4l2_ctrl *brightness;
40 struct v4l2_ctrl *contrast;
41 struct v4l2_ctrl *saturation;
42 struct {
43 struct v4l2_ctrl *red_bal;
44 struct v4l2_ctrl *blue_bal;
45 };
46 struct {
47 struct v4l2_ctrl *vflip;
48 struct v4l2_ctrl *hflip;
49 };
50 struct v4l2_ctrl *gamma;
51 struct v4l2_ctrl *illum;
52 struct v4l2_ctrl *sharpness;
53 struct v4l2_ctrl *freq;
54 u32 exposure;
55
56 struct work_struct work;
57
58 u32 pktsz;
59 u16 npkt;
60 s8 nchg;
61 s8 short_mark;
62
63 u8 quality;
64#define QUALITY_MIN 25
65#define QUALITY_MAX 90
66#define QUALITY_DEF 70
67
68 u8 reg01;
69 u8 reg17;
70 u8 reg18;
71 u8 flags;
72
73 s8 ag_cnt;
74#define AG_CNT_START 13
75
76 u8 bridge;
77#define BRIDGE_SN9C102P 0
78#define BRIDGE_SN9C105 1
79#define BRIDGE_SN9C110 2
80#define BRIDGE_SN9C120 3
81 u8 sensor;
82 u8 i2c_addr;
83
84 u8 jpeg_hdr[JPEG_HDR_SZ];
85};
86enum sensors {
87 SENSOR_ADCM1700,
88 SENSOR_GC0307,
89 SENSOR_HV7131R,
90 SENSOR_MI0360,
91 SENSOR_MI0360B,
92 SENSOR_MO4000,
93 SENSOR_MT9V111,
94 SENSOR_OM6802,
95 SENSOR_OV7630,
96 SENSOR_OV7648,
97 SENSOR_OV7660,
98 SENSOR_PO1030,
99 SENSOR_PO2030N,
100 SENSOR_SOI768,
101 SENSOR_SP80708,
102};
103
104static void qual_upd(struct work_struct *work);
105
106
107#define F_PDN_INV 0x01
108#define F_ILLUM 0x02
109
110
111
112#define S_PWR_DN 0x01
113#define S_PDN_INV 0x02
114#define V_TX_EN 0x04
115#define LED 0x08
116#define SCL_SEL_OD 0x20
117#define SYS_SEL_48M 0x40
118
119#define MCK_SIZE_MASK 0x1f
120#define SEN_CLK_EN 0x20
121#define DEF_EN 0x80
122
123static const struct v4l2_pix_format cif_mode[] = {
124 {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
125 .bytesperline = 352,
126 .sizeimage = 352 * 288 * 4 / 8 + 590,
127 .colorspace = V4L2_COLORSPACE_JPEG,
128 .priv = 0},
129};
130static const struct v4l2_pix_format vga_mode[] = {
131 {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
132 .bytesperline = 160,
133 .sizeimage = 160 * 120 * 4 / 8 + 590,
134 .colorspace = V4L2_COLORSPACE_JPEG,
135 .priv = 2},
136 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
137 .bytesperline = 320,
138 .sizeimage = 320 * 240 * 3 / 8 + 590,
139 .colorspace = V4L2_COLORSPACE_JPEG,
140 .priv = 1},
141 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,
142 .bytesperline = 640,
143
144 .sizeimage = 640 * 480 * 3 / 4 + 590,
145 .colorspace = V4L2_COLORSPACE_JPEG,
146 .priv = 0},
147};
148
149static const u8 sn_adcm1700[0x1c] = {
150
151 0x00, 0x43, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x00,
152
153 0x80, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154
155 0x03, 0x00, 0x05, 0x01, 0x05, 0x16, 0x12, 0x42,
156
157 0x06, 0x00, 0x00, 0x00
158};
159
160static const u8 sn_gc0307[0x1c] = {
161
162 0x00, 0x61, 0x62, 0x00, 0x1a, 0x00, 0x00, 0x00,
163
164 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
165
166 0x03, 0x00, 0x03, 0x01, 0x08, 0x28, 0x1e, 0x02,
167
168 0x06, 0x00, 0x00, 0x00
169};
170
171static const u8 sn_hv7131[0x1c] = {
172
173 0x00, 0x03, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20,
174
175 0x81, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176
177 0x03, 0x00, 0x00, 0x01, 0x03, 0x28, 0x1e, 0x41,
178
179 0x0a, 0x00, 0x00, 0x00
180};
181
182static const u8 sn_mi0360[0x1c] = {
183
184 0x00, 0x63, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
185
186 0x81, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
187
188 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x61,
189
190 0x06, 0x00, 0x00, 0x00
191};
192
193static const u8 sn_mi0360b[0x1c] = {
194
195 0x00, 0x61, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00,
196
197 0x81, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198
199 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x40,
200
201 0x06, 0x00, 0x00, 0x00
202};
203
204static const u8 sn_mo4000[0x1c] = {
205
206 0x00, 0x23, 0x60, 0x00, 0x1a, 0x00, 0x20, 0x18,
207
208 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
209
210 0x03, 0x00, 0x0b, 0x0f, 0x14, 0x28, 0x1e, 0x40,
211
212 0x08, 0x00, 0x00, 0x00
213};
214
215static const u8 sn_mt9v111[0x1c] = {
216
217 0x00, 0x61, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
218
219 0x81, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
220
221 0x03, 0x00, 0x00, 0x02, 0x1c, 0x28, 0x1e, 0x40,
222
223 0x06, 0x00, 0x00, 0x00
224};
225
226static const u8 sn_om6802[0x1c] = {
227
228 0x00, 0x23, 0x72, 0x00, 0x1a, 0x20, 0x20, 0x19,
229
230 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231
232 0x03, 0x00, 0x51, 0x01, 0x00, 0x28, 0x1e, 0x40,
233
234 0x05, 0x00, 0x00, 0x00
235};
236
237static const u8 sn_ov7630[0x1c] = {
238
239 0x00, 0x21, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00,
240
241 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242
243 0x03, 0x00, 0x04, 0x01, 0x0a, 0x28, 0x1e, 0xc2,
244
245 0x0b, 0x00, 0x00, 0x00
246};
247
248static const u8 sn_ov7648[0x1c] = {
249
250 0x00, 0x63, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20,
251
252 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253
254 0x03, 0x00, 0x00, 0x01, 0x00, 0x28, 0x1e, 0x00,
255
256 0x0b, 0x00, 0x00, 0x00
257};
258
259static const u8 sn_ov7660[0x1c] = {
260
261 0x00, 0x61, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00,
262
263 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
264
265 0x03, 0x00, 0x01, 0x01, 0x08, 0x28, 0x1e, 0x20,
266
267 0x07, 0x00, 0x00, 0x00
268};
269
270static const u8 sn_po1030[0x1c] = {
271
272 0x00, 0x21, 0x62, 0x00, 0x1a, 0x20, 0x20, 0x20,
273
274 0x81, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
275
276 0x03, 0x00, 0x00, 0x06, 0x06, 0x28, 0x1e, 0x00,
277
278 0x07, 0x00, 0x00, 0x00
279};
280
281static const u8 sn_po2030n[0x1c] = {
282
283 0x00, 0x63, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00,
284
285 0x81, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
286
287 0x03, 0x00, 0x00, 0x01, 0x14, 0x28, 0x1e, 0x00,
288
289 0x07, 0x00, 0x00, 0x00
290};
291
292static const u8 sn_soi768[0x1c] = {
293
294 0x00, 0x21, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00,
295
296 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
297
298 0x03, 0x00, 0x00, 0x01, 0x08, 0x28, 0x1e, 0x00,
299
300 0x07, 0x00, 0x00, 0x00
301};
302
303static const u8 sn_sp80708[0x1c] = {
304
305 0x00, 0x63, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20,
306
307 0x81, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308
309 0x03, 0x00, 0x00, 0x03, 0x04, 0x28, 0x1e, 0x00,
310
311 0x07, 0x00, 0x00, 0x00
312};
313
314
315static const u8 *sn_tb[] = {
316[SENSOR_ADCM1700] = sn_adcm1700,
317[SENSOR_GC0307] = sn_gc0307,
318[SENSOR_HV7131R] = sn_hv7131,
319[SENSOR_MI0360] = sn_mi0360,
320[SENSOR_MI0360B] = sn_mi0360b,
321[SENSOR_MO4000] = sn_mo4000,
322[SENSOR_MT9V111] = sn_mt9v111,
323[SENSOR_OM6802] = sn_om6802,
324[SENSOR_OV7630] = sn_ov7630,
325[SENSOR_OV7648] = sn_ov7648,
326[SENSOR_OV7660] = sn_ov7660,
327[SENSOR_PO1030] = sn_po1030,
328[SENSOR_PO2030N] = sn_po2030n,
329[SENSOR_SOI768] = sn_soi768,
330[SENSOR_SP80708] = sn_sp80708,
331};
332
333
334static const u8 gamma_def[17] = {
335 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99,
336 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff
337};
338
339static const u8 gamma_spec_0[17] = {
340 0x0f, 0x39, 0x5a, 0x74, 0x86, 0x95, 0xa6, 0xb4,
341 0xbd, 0xc4, 0xcc, 0xd4, 0xd5, 0xde, 0xe4, 0xed, 0xf5
342};
343
344static const u8 gamma_spec_1[17] = {
345 0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d,
346 0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5
347};
348
349static const u8 gamma_spec_2[17] = {
350 0x14, 0x37, 0x50, 0x6a, 0x7c, 0x8d, 0x9d, 0xab,
351 0xb5, 0xbf, 0xc2, 0xcb, 0xd1, 0xd6, 0xdb, 0xe1, 0xeb
352};
353
354static const u8 gamma_spec_3[17] = {
355 0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab,
356 0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6
357};
358
359
360static const u8 reg84[] = {
361 0x14, 0x00, 0x27, 0x00, 0x07, 0x00,
362 0xe8, 0x0f, 0xda, 0x0f, 0x40, 0x00,
363 0x3e, 0x00, 0xcd, 0x0f, 0xf7, 0x0f,
364 0x00, 0x00, 0x00
365};
366
367#define DELAY 0xdd
368
369static const u8 adcm1700_sensor_init[][8] = {
370 {0xa0, 0x51, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x10},
371 {0xb0, 0x51, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10},
372 {DELAY, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
373 {0xb0, 0x51, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10},
374 {DELAY, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
375 {0xb0, 0x51, 0x0c, 0xe0, 0x2e, 0x00, 0x00, 0x10},
376 {0xb0, 0x51, 0x10, 0x02, 0x02, 0x00, 0x00, 0x10},
377 {0xb0, 0x51, 0x14, 0x0e, 0x0e, 0x00, 0x00, 0x10},
378 {0xb0, 0x51, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x10},
379 {0xb0, 0x51, 0x20, 0x01, 0x00, 0x00, 0x00, 0x10},
380 {DELAY, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
381 {0xb0, 0x51, 0x04, 0x04, 0x00, 0x00, 0x00, 0x10},
382 {DELAY, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
383 {0xb0, 0x51, 0x04, 0x01, 0x00, 0x00, 0x00, 0x10},
384 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10},
385 {0xb0, 0x51, 0x14, 0x01, 0x00, 0x00, 0x00, 0x10},
386 {0xb0, 0x51, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10},
387 {}
388};
389static const u8 adcm1700_sensor_param1[][8] = {
390 {0xb0, 0x51, 0x26, 0xf9, 0x01, 0x00, 0x00, 0x10},
391 {0xd0, 0x51, 0x1e, 0x8e, 0x8e, 0x8e, 0x8e, 0x10},
392
393 {0xa0, 0x51, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x10},
394 {0xb0, 0x51, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10},
395 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10},
396 {0xb0, 0x51, 0x32, 0x00, 0x72, 0x00, 0x00, 0x10},
397 {0xd0, 0x51, 0x1e, 0xbe, 0xd7, 0xe8, 0xbe, 0x10},
398
399 {0xa0, 0x51, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x10},
400 {0xb0, 0x51, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10},
401 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10},
402 {0xb0, 0x51, 0x32, 0x00, 0xa2, 0x00, 0x00, 0x10},
403 {}
404};
405static const u8 gc0307_sensor_init[][8] = {
406 {0xa0, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, 0x10},
407 {0xa0, 0x21, 0x44, 0xa2, 0x00, 0x00, 0x00, 0x10},
408 {0xa0, 0x21, 0x01, 0x6a, 0x00, 0x00, 0x00, 0x10},
409 {0xa0, 0x21, 0x02, 0x70, 0x00, 0x00, 0x00, 0x10},
410 {0xa0, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
411 {0xa0, 0x21, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10},
412 {0xa0, 0x21, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10},
413 {0xa0, 0x21, 0x11, 0x05, 0x00, 0x00, 0x00, 0x10},
414 {0xa0, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10},
415 {0xa0, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10},
416 {0xa0, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10},
417 {0xa0, 0x21, 0x08, 0x02, 0x00, 0x00, 0x00, 0x10},
418 {0xa0, 0x21, 0x09, 0x01, 0x00, 0x00, 0x00, 0x10},
419 {0xa0, 0x21, 0x0a, 0xe8, 0x00, 0x00, 0x00, 0x10},
420 {0xa0, 0x21, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x10},
421 {0xa0, 0x21, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x10},
422 {0xa0, 0x21, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x10},
423 {0xa0, 0x21, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x10},
424 {0xa0, 0x21, 0x0f, 0xb2, 0x00, 0x00, 0x00, 0x10},
425 {0xa0, 0x21, 0x12, 0x70, 0x00, 0x00, 0x00, 0x10},
426 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
427 {0xa0, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 0x10},
428 {0xa0, 0x21, 0x15, 0xb8, 0x00, 0x00, 0x00, 0x10},
429 {0xa0, 0x21, 0x16, 0x13, 0x00, 0x00, 0x00, 0x10},
430 {0xa0, 0x21, 0x17, 0x52, 0x00, 0x00, 0x00, 0x10},
431 {0xa0, 0x21, 0x18, 0x50, 0x00, 0x00, 0x00, 0x10},
432 {0xa0, 0x21, 0x1e, 0x0d, 0x00, 0x00, 0x00, 0x10},
433 {0xa0, 0x21, 0x1f, 0x32, 0x00, 0x00, 0x00, 0x10},
434 {0xa0, 0x21, 0x61, 0x90, 0x00, 0x00, 0x00, 0x10},
435 {0xa0, 0x21, 0x63, 0x70, 0x00, 0x00, 0x00, 0x10},
436 {0xa0, 0x21, 0x65, 0x98, 0x00, 0x00, 0x00, 0x10},
437 {0xa0, 0x21, 0x67, 0x90, 0x00, 0x00, 0x00, 0x10},
438 {0xa0, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
439 {0xa0, 0x21, 0x04, 0x96, 0x00, 0x00, 0x00, 0x10},
440 {0xa0, 0x21, 0x45, 0x27, 0x00, 0x00, 0x00, 0x10},
441 {0xa0, 0x21, 0x47, 0x2c, 0x00, 0x00, 0x00, 0x10},
442 {0xa0, 0x21, 0x43, 0x47, 0x00, 0x00, 0x00, 0x10},
443 {0xa0, 0x21, 0x44, 0xd8, 0x00, 0x00, 0x00, 0x10},
444 {}
445};
446static const u8 gc0307_sensor_param1[][8] = {
447 {0xa0, 0x21, 0x68, 0x13, 0x00, 0x00, 0x00, 0x10},
448 {0xd0, 0x21, 0x61, 0x80, 0x00, 0x80, 0x00, 0x10},
449 {0xc0, 0x21, 0x65, 0x80, 0x00, 0x80, 0x00, 0x10},
450 {0xc0, 0x21, 0x63, 0xa0, 0x00, 0xa6, 0x00, 0x10},
451
452 {0xa0, 0x21, 0x01, 0x6e, 0x00, 0x00, 0x00, 0x10},
453 {0xa0, 0x21, 0x02, 0x88, 0x00, 0x00, 0x00, 0x10},
454 {}
455};
456
457static const u8 hv7131r_sensor_init[][8] = {
458 {0xc1, 0x11, 0x01, 0x08, 0x01, 0x00, 0x00, 0x10},
459 {0xb1, 0x11, 0x34, 0x17, 0x7f, 0x00, 0x00, 0x10},
460 {0xd1, 0x11, 0x40, 0xff, 0x7f, 0x7f, 0x7f, 0x10},
461
462 {0xd1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
463 {0xd1, 0x11, 0x14, 0x01, 0xe2, 0x02, 0x82, 0x10},
464
465
466 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
467 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
468 {0xc1, 0x11, 0x25, 0x00, 0x61, 0xa8, 0x00, 0x10},
469 {0xa1, 0x11, 0x30, 0x22, 0x00, 0x00, 0x00, 0x10},
470 {0xc1, 0x11, 0x31, 0x20, 0x2e, 0x20, 0x00, 0x10},
471 {0xc1, 0x11, 0x25, 0x00, 0xc3, 0x50, 0x00, 0x10},
472 {0xa1, 0x11, 0x30, 0x07, 0x00, 0x00, 0x00, 0x10},
473 {0xc1, 0x11, 0x31, 0x10, 0x10, 0x10, 0x00, 0x10},
474
475 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
476 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
477 {0xa1, 0x11, 0x21, 0xd0, 0x00, 0x00, 0x00, 0x10},
478 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
479 {0xa1, 0x11, 0x23, 0x09, 0x00, 0x00, 0x00, 0x10},
480
481 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10},
482 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
483 {0xa1, 0x11, 0x21, 0xd0, 0x00, 0x00, 0x00, 0x10},
484 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
485 {0xa1, 0x11, 0x23, 0x10, 0x00, 0x00, 0x00, 0x10},
486 {0xa1, 0x11, 0x01, 0x18, 0x00, 0x00, 0x00, 0x10},
487
488 {}
489};
490static const u8 mi0360_sensor_init[][8] = {
491 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
492 {0xb1, 0x5d, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10},
493 {0xb1, 0x5d, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10},
494 {0xd1, 0x5d, 0x01, 0x00, 0x08, 0x00, 0x16, 0x10},
495 {0xd1, 0x5d, 0x03, 0x01, 0xe2, 0x02, 0x82, 0x10},
496 {0xd1, 0x5d, 0x05, 0x00, 0x09, 0x00, 0x53, 0x10},
497 {0xb1, 0x5d, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x10},
498 {0xd1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
499 {0xd1, 0x5d, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10},
500 {0xd1, 0x5d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10},
501 {0xd1, 0x5d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
502 {0xd1, 0x5d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
503 {0xd1, 0x5d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10},
504 {0xd1, 0x5d, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10},
505 {0xd1, 0x5d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10},
506 {0xd1, 0x5d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x10},
507 {0xd1, 0x5d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10},
508 {0xb1, 0x5d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10},
509 {0xd1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10},
510 {0xd1, 0x5d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
511 {0xd1, 0x5d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10},
512 {0xd1, 0x5d, 0x26, 0x00, 0x00, 0x00, 0x24, 0x10},
513 {0xd1, 0x5d, 0x2f, 0xf7, 0xb0, 0x00, 0x04, 0x10},
514 {0xd1, 0x5d, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10},
515 {0xd1, 0x5d, 0x33, 0x00, 0x00, 0x01, 0x00, 0x10},
516 {0xb1, 0x5d, 0x3d, 0x06, 0x8f, 0x00, 0x00, 0x10},
517 {0xd1, 0x5d, 0x40, 0x01, 0xe0, 0x00, 0xd1, 0x10},
518 {0xb1, 0x5d, 0x44, 0x00, 0x82, 0x00, 0x00, 0x10},
519 {0xd1, 0x5d, 0x58, 0x00, 0x78, 0x00, 0x43, 0x10},
520 {0xd1, 0x5d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x10},
521 {0xd1, 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x10},
522 {0xd1, 0x5d, 0x5e, 0x00, 0x00, 0xa3, 0x1d, 0x10},
523 {0xb1, 0x5d, 0x62, 0x04, 0x11, 0x00, 0x00, 0x10},
524
525 {0xb1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10},
526 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10},
527 {0xb1, 0x5d, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10},
528 {0xd1, 0x5d, 0x2b, 0x00, 0xa0, 0x00, 0xb0, 0x10},
529 {0xd1, 0x5d, 0x2d, 0x00, 0xa0, 0x00, 0xa0, 0x10},
530
531 {0xb1, 0x5d, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x10},
532 {0xb1, 0x5d, 0x06, 0x00, 0x30, 0x00, 0x00, 0x10},
533 {0xb1, 0x5d, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x10},
534 {0xb1, 0x5d, 0x09, 0x02, 0x35, 0x00, 0x00, 0x10},
535
536 {0xd1, 0x5d, 0x2b, 0x00, 0xb9, 0x00, 0xe3, 0x10},
537 {0xd1, 0x5d, 0x2d, 0x00, 0x5f, 0x00, 0xb9, 0x10},
538
539
540 {0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10},
541 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
542 {}
543};
544static const u8 mi0360b_sensor_init[][8] = {
545 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
546 {0xb1, 0x5d, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10},
547 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
548 {0xb1, 0x5d, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10},
549 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
550 {0xd1, 0x5d, 0x01, 0x00, 0x08, 0x00, 0x16, 0x10},
551 {0xd1, 0x5d, 0x03, 0x01, 0xe2, 0x02, 0x82, 0x10},
552 {0xd1, 0x5d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10},
553 {0xb1, 0x5d, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x10},
554 {0xd1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
555 {0xd1, 0x5d, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10},
556 {0xd1, 0x5d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10},
557 {0xd1, 0x5d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
558 {0xd1, 0x5d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
559 {0xd1, 0x5d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10},
560 {0xd1, 0x5d, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10},
561 {0xd1, 0x5d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10},
562 {0xd1, 0x5d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x10},
563 {0xd1, 0x5d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10},
564 {0xb1, 0x5d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10},
565 {0xd1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10},
566 {0xd1, 0x5d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
567 {0xd1, 0x5d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10},
568 {0xd1, 0x5d, 0x26, 0x00, 0x00, 0x00, 0x24, 0x10},
569 {0xd1, 0x5d, 0x2f, 0xf7, 0xb0, 0x00, 0x04, 0x10},
570 {0xd1, 0x5d, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10},
571 {0xd1, 0x5d, 0x33, 0x00, 0x00, 0x01, 0x00, 0x10},
572 {0xb1, 0x5d, 0x3d, 0x06, 0x8f, 0x00, 0x00, 0x10},
573 {0xd1, 0x5d, 0x40, 0x01, 0xe0, 0x00, 0xd1, 0x10},
574 {0xb1, 0x5d, 0x44, 0x00, 0x82, 0x00, 0x00, 0x10},
575 {0xd1, 0x5d, 0x58, 0x00, 0x78, 0x00, 0x43, 0x10},
576 {0xd1, 0x5d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x10},
577 {0xd1, 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x10},
578 {0xd1, 0x5d, 0x5e, 0x00, 0x00, 0xa3, 0x1d, 0x10},
579 {0xb1, 0x5d, 0x62, 0x04, 0x11, 0x00, 0x00, 0x10},
580
581 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10},
582 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10},
583 {0xb1, 0x5d, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10},
584 {0xd1, 0x5d, 0x2b, 0x00, 0x33, 0x00, 0xa0, 0x10},
585 {0xd1, 0x5d, 0x2d, 0x00, 0xa0, 0x00, 0x33, 0x10},
586 {}
587};
588static const u8 mi0360b_sensor_param1[][8] = {
589 {0xb1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
590 {0xb1, 0x5d, 0x06, 0x00, 0x53, 0x00, 0x00, 0x10},
591 {0xb1, 0x5d, 0x05, 0x00, 0x09, 0x00, 0x00, 0x10},
592 {0xb1, 0x5d, 0x09, 0x02, 0x35, 0x00, 0x00, 0x10},
593
594 {0xd1, 0x5d, 0x2b, 0x00, 0xd1, 0x01, 0xc9, 0x10},
595 {0xd1, 0x5d, 0x2d, 0x00, 0xed, 0x00, 0xd1, 0x10},
596 {0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10},
597 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
598 {}
599};
600static const u8 mo4000_sensor_init[][8] = {
601 {0xa1, 0x21, 0x01, 0x02, 0x00, 0x00, 0x00, 0x10},
602 {0xa1, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10},
603 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
604 {0xa1, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10},
605 {0xa1, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10},
606 {0xa1, 0x21, 0x05, 0x04, 0x00, 0x00, 0x00, 0x10},
607 {0xa1, 0x21, 0x06, 0x80, 0x00, 0x00, 0x00, 0x10},
608 {0xa1, 0x21, 0x06, 0x81, 0x00, 0x00, 0x00, 0x10},
609 {0xa1, 0x21, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10},
610 {0xa1, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10},
611 {0xa1, 0x21, 0x11, 0x20, 0x00, 0x00, 0x00, 0x10},
612 {0xa1, 0x21, 0x11, 0x30, 0x00, 0x00, 0x00, 0x10},
613 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
614 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
615 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
616 {0xa1, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10},
617 {0xa1, 0x21, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x10},
618 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10},
619 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
620 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10},
621 {}
622};
623static const u8 mt9v111_sensor_init[][8] = {
624 {0xb1, 0x5c, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10},
625 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
626 {0xb1, 0x5c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10},
627 {0xb1, 0x5c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x10},
628 {0xb1, 0x5c, 0x08, 0x04, 0x80, 0x00, 0x00, 0x10},
629 {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10},
630 {0xb1, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10},
631 {0xb1, 0x5c, 0x08, 0x00, 0x08, 0x00, 0x00, 0x10},
632 {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10},
633 {0xb1, 0x5c, 0x03, 0x01, 0xe7, 0x00, 0x00, 0x10},
634 {0xb1, 0x5c, 0x04, 0x02, 0x87, 0x00, 0x00, 0x10},
635 {0xb1, 0x5c, 0x07, 0x30, 0x02, 0x00, 0x00, 0x10},
636 {0xb1, 0x5c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10},
637 {0xb1, 0x5c, 0x12, 0x00, 0xb0, 0x00, 0x00, 0x10},
638 {0xb1, 0x5c, 0x13, 0x00, 0x7c, 0x00, 0x00, 0x10},
639 {0xb1, 0x5c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10},
640 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
641 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
642 {}
643};
644static const u8 mt9v111_sensor_param1[][8] = {
645 {0xd1, 0x5c, 0x2b, 0x00, 0x33, 0x00, 0xad, 0x10},
646 {0xd1, 0x5c, 0x2d, 0x00, 0xad, 0x00, 0x33, 0x10},
647 {0xb1, 0x5c, 0x06, 0x00, 0x40, 0x00, 0x00, 0x10},
648 {0xb1, 0x5c, 0x05, 0x00, 0x09, 0x00, 0x00, 0x10},
649 {0xb1, 0x5c, 0x35, 0x01, 0xc0, 0x00, 0x00, 0x10},
650 {}
651};
652static const u8 om6802_init0[2][8] = {
653
654 {0xa0, 0x34, 0x29, 0x0e, 0x00, 0x00, 0x00, 0x10},
655 {0xa0, 0x34, 0x23, 0xb0, 0x00, 0x00, 0x00, 0x10},
656};
657static const u8 om6802_sensor_init[][8] = {
658 {0xa0, 0x34, 0xdf, 0x6d, 0x00, 0x00, 0x00, 0x10},
659
660 {0xa0, 0x34, 0xdd, 0x18, 0x00, 0x00, 0x00, 0x10},
661
662 {0xa0, 0x34, 0x5a, 0xc0, 0x00, 0x00, 0x00, 0x10},
663
664 {0xa0, 0x34, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x10},
665
666
667
668
669
670
671
672
673
674
675
676
677
678 {0xa0, 0x34, 0xe9, 0x0f, 0x00, 0x00, 0x00, 0x10},
679
680 {0xa0, 0x34, 0xe4, 0xff, 0x00, 0x00, 0x00, 0x10},
681
682
683
684
685 {0xa0, 0x34, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x10},
686 {}
687};
688static const u8 om6802_sensor_param1[][8] = {
689 {0xa0, 0x34, 0x71, 0x84, 0x00, 0x00, 0x00, 0x10},
690 {0xa0, 0x34, 0x72, 0x05, 0x00, 0x00, 0x00, 0x10},
691 {0xa0, 0x34, 0x68, 0x80, 0x00, 0x00, 0x00, 0x10},
692 {0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10},
693 {}
694};
695static const u8 ov7630_sensor_init[][8] = {
696 {0xa1, 0x21, 0x76, 0x01, 0x00, 0x00, 0x00, 0x10},
697 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
698 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
699 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
700 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
701 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
702 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
703
704 {0xd1, 0x21, 0x03, 0x80, 0x10, 0x20, 0x80, 0x10},
705 {0xb1, 0x21, 0x0c, 0x20, 0x20, 0x00, 0x00, 0x10},
706
707
708 {0xd1, 0x21, 0x11, 0x01, 0x48, 0xc3, 0x00, 0x10},
709 {0xb1, 0x21, 0x15, 0x80, 0x03, 0x00, 0x00, 0x10},
710 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
711 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
712 {0xd1, 0x21, 0x1f, 0x00, 0x80, 0x80, 0x80, 0x10},
713 {0xd1, 0x21, 0x23, 0xde, 0x10, 0x8a, 0xa0, 0x10},
714 {0xc1, 0x21, 0x27, 0xca, 0xa2, 0x74, 0x00, 0x10},
715 {0xd1, 0x21, 0x2a, 0x88, 0x00, 0x88, 0x01, 0x10},
716 {0xc1, 0x21, 0x2e, 0x80, 0x00, 0x18, 0x00, 0x10},
717 {0xa1, 0x21, 0x21, 0x08, 0x00, 0x00, 0x00, 0x10},
718 {0xa1, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
719 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10},
720 {0xb1, 0x21, 0x32, 0xc2, 0x08, 0x00, 0x00, 0x10},
721 {0xb1, 0x21, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x10},
722 {0xd1, 0x21, 0x60, 0x05, 0x40, 0x12, 0x57, 0x10},
723 {0xa1, 0x21, 0x64, 0x73, 0x00, 0x00, 0x00, 0x10},
724 {0xd1, 0x21, 0x65, 0x00, 0x55, 0x01, 0xac, 0x10},
725 {0xa1, 0x21, 0x69, 0x38, 0x00, 0x00, 0x00, 0x10},
726 {0xd1, 0x21, 0x6f, 0x1f, 0x01, 0x00, 0x10, 0x10},
727 {0xd1, 0x21, 0x73, 0x50, 0x20, 0x02, 0x01, 0x10},
728 {0xd1, 0x21, 0x77, 0xf3, 0x90, 0x98, 0x98, 0x10},
729 {0xc1, 0x21, 0x7b, 0x00, 0x4c, 0xf7, 0x00, 0x10},
730 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
731 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
732 {}
733};
734static const u8 ov7630_sensor_param1[][8] = {
735 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
736 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
737
738
739
740 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
741 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
742 {0xb1, 0x21, 0x01, 0x80, 0x80, 0x00, 0x00, 0x10},
743
744
745
746
747 {0xa1, 0x21, 0x10, 0x83, 0x00, 0x00, 0x00, 0x10},
748
749 {}
750};
751
752static const u8 ov7648_sensor_init[][8] = {
753 {0xa1, 0x21, 0x76, 0x00, 0x00, 0x00, 0x00, 0x10},
754 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
755 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
756 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
757 {0xd1, 0x21, 0x03, 0xa4, 0x30, 0x88, 0x00, 0x10},
758 {0xb1, 0x21, 0x11, 0x80, 0x08, 0x00, 0x00, 0x10},
759 {0xc1, 0x21, 0x13, 0xa0, 0x04, 0x84, 0x00, 0x10},
760 {0xd1, 0x21, 0x17, 0x1a, 0x02, 0xba, 0xf4, 0x10},
761 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
762 {0xd1, 0x21, 0x1f, 0x41, 0xc0, 0x80, 0x80, 0x10},
763 {0xd1, 0x21, 0x23, 0xde, 0xa0, 0x80, 0x32, 0x10},
764 {0xd1, 0x21, 0x27, 0xfe, 0xa0, 0x00, 0x91, 0x10},
765 {0xd1, 0x21, 0x2b, 0x00, 0x88, 0x85, 0x80, 0x10},
766 {0xc1, 0x21, 0x2f, 0x9c, 0x00, 0xc4, 0x00, 0x10},
767 {0xd1, 0x21, 0x60, 0xa6, 0x60, 0x88, 0x12, 0x10},
768 {0xd1, 0x21, 0x64, 0x88, 0x00, 0x00, 0x94, 0x10},
769 {0xd1, 0x21, 0x68, 0x7a, 0x0c, 0x00, 0x00, 0x10},
770 {0xd1, 0x21, 0x6c, 0x11, 0x33, 0x22, 0x00, 0x10},
771 {0xd1, 0x21, 0x70, 0x11, 0x00, 0x10, 0x50, 0x10},
772 {0xd1, 0x21, 0x74, 0x20, 0x06, 0x00, 0xb5, 0x10},
773 {0xd1, 0x21, 0x78, 0x8a, 0x00, 0x00, 0x00, 0x10},
774 {0xb1, 0x21, 0x7c, 0x00, 0x43, 0x00, 0x00, 0x10},
775
776 {0xd1, 0x21, 0x21, 0x86, 0x00, 0xde, 0xa0, 0x10},
777
778
779
780 {}
781};
782static const u8 ov7648_sensor_param1[][8] = {
783
784
785
786 {0xa1, 0x21, 0x19, 0x02, 0x00, 0x00, 0x00, 0x10},
787 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
788
789
790
791
792 {0xa1, 0x21, 0x11, 0x81, 0x00, 0x00, 0x00, 0x10},
793
794
795
796
797
798
799 {}
800};
801
802static const u8 ov7660_sensor_init[][8] = {
803 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
804 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
805 {0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10},
806
807 {0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10},
808 {0xd1, 0x21, 0x00, 0x01, 0x74, 0x92, 0x00, 0x10},
809
810 {0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10},
811
812 {0xb1, 0x21, 0x08, 0x83, 0x01, 0x00, 0x00, 0x10},
813 {0xd1, 0x21, 0x0c, 0x00, 0x08, 0x04, 0x4f, 0x10},
814 {0xd1, 0x21, 0x10, 0x7f, 0x40, 0x05, 0xff, 0x10},
815
816 {0xc1, 0x21, 0x14, 0x2c, 0x00, 0x02, 0x00, 0x10},
817 {0xd1, 0x21, 0x17, 0x10, 0x60, 0x02, 0x7b, 0x10},
818
819 {0xa1, 0x21, 0x1b, 0x02, 0x00, 0x00, 0x00, 0x10},
820 {0xb1, 0x21, 0x1e, 0x01, 0x0e, 0x00, 0x00, 0x10},
821 {0xd1, 0x21, 0x20, 0x07, 0x07, 0x07, 0x07, 0x10},
822
823
824 {0xd1, 0x21, 0x24, 0x78, 0x68, 0xd4, 0x80, 0x10},
825
826 {0xd1, 0x21, 0x28, 0x80, 0x30, 0x00, 0x00, 0x10},
827
828 {0xd1, 0x21, 0x2c, 0x80, 0x00, 0x00, 0x62, 0x10},
829
830 {0xc1, 0x21, 0x30, 0x08, 0x30, 0xb4, 0x00, 0x10},
831
832 {0xd1, 0x21, 0x33, 0x00, 0x07, 0x84, 0x00, 0x10},
833 {0xd1, 0x21, 0x37, 0x0c, 0x02, 0x43, 0x00, 0x10},
834
835 {0xd1, 0x21, 0x3b, 0x02, 0x6c, 0x19, 0x0e, 0x10},
836
837 {0xd1, 0x21, 0x3f, 0x41, 0xc1, 0x22, 0x08, 0x10},
838
839 {0xd1, 0x21, 0x43, 0xf0, 0x10, 0x78, 0xa8, 0x10},
840 {0xd1, 0x21, 0x47, 0x60, 0x80, 0x00, 0x00, 0x10},
841 {0xd1, 0x21, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x10},
842 {0xd1, 0x21, 0x4f, 0x46, 0x36, 0x0f, 0x17, 0x10},
843 {0xd1, 0x21, 0x53, 0x7f, 0x96, 0x40, 0x40, 0x10},
844 {0xb1, 0x21, 0x57, 0x40, 0x0f, 0x00, 0x00, 0x10},
845 {0xd1, 0x21, 0x59, 0xba, 0x9a, 0x22, 0xb9, 0x10},
846 {0xd1, 0x21, 0x5d, 0x9b, 0x10, 0xf0, 0x05, 0x10},
847 {0xa1, 0x21, 0x61, 0x60, 0x00, 0x00, 0x00, 0x10},
848 {0xd1, 0x21, 0x62, 0x00, 0x00, 0x50, 0x30, 0x10},
849
850 {0xa1, 0x21, 0x66, 0x00, 0x00, 0x00, 0x00, 0x10},
851 {0xd1, 0x21, 0x67, 0x80, 0x7a, 0x90, 0x80, 0x10},
852 {0xa1, 0x21, 0x6b, 0x0a, 0x00, 0x00, 0x00, 0x10},
853
854 {0xd1, 0x21, 0x6c, 0x30, 0x48, 0x80, 0x74, 0x10},
855 {0xd1, 0x21, 0x70, 0x64, 0x60, 0x5c, 0x58, 0x10},
856 {0xd1, 0x21, 0x74, 0x54, 0x4c, 0x40, 0x38, 0x10},
857 {0xd1, 0x21, 0x78, 0x34, 0x30, 0x2f, 0x2b, 0x10},
858 {0xd1, 0x21, 0x7c, 0x03, 0x07, 0x17, 0x34, 0x10},
859 {0xd1, 0x21, 0x80, 0x41, 0x4d, 0x58, 0x63, 0x10},
860 {0xd1, 0x21, 0x84, 0x6e, 0x77, 0x87, 0x95, 0x10},
861 {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10},
862 {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10},
863 {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10},
864
865 {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10},
866 {}
867};
868static const u8 ov7660_sensor_param1[][8] = {
869 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10},
870
871 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10},
872 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
873
874 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10},
875 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10},
876 {0xa1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10},
877 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10},
878 {0xa1, 0x21, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10},
879
880
881
882 {0xa1, 0x21, 0x93, 0x00, 0x00, 0x00, 0x00, 0x10},
883 {0xa1, 0x21, 0x92, 0x25, 0x00, 0x00, 0x00, 0x10},
884 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10},
885 {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10},
886
887
888
889
890 {0xa1, 0x21, 0x93, 0x01, 0x00, 0x00, 0x00, 0x10},
891 {0xa1, 0x21, 0x92, 0xff, 0x00, 0x00, 0x00, 0x10},
892 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10},
893 {0xa1, 0x21, 0x2b, 0xc3, 0x00, 0x00, 0x00, 0x10},
894 {}
895};
896
897static const u8 po1030_sensor_init[][8] = {
898
899 {0xa1, 0x6e, 0x3f, 0x20, 0x00, 0x00, 0x00, 0x10},
900 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
901 {0xa1, 0x6e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10},
902 {0xa1, 0x6e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x10},
903 {0xd1, 0x6e, 0x04, 0x02, 0xb1, 0x02, 0x39, 0x10},
904 {0xd1, 0x6e, 0x08, 0x00, 0x01, 0x00, 0x00, 0x10},
905 {0xd1, 0x6e, 0x0c, 0x02, 0x7f, 0x01, 0xe0, 0x10},
906 {0xd1, 0x6e, 0x12, 0x03, 0x02, 0x00, 0x03, 0x10},
907 {0xd1, 0x6e, 0x16, 0x85, 0x40, 0x4a, 0x40, 0x10},
908 {0xc1, 0x6e, 0x1a, 0x00, 0x80, 0x00, 0x00, 0x10},
909 {0xd1, 0x6e, 0x1d, 0x08, 0x03, 0x00, 0x00, 0x10},
910 {0xd1, 0x6e, 0x23, 0x00, 0xb0, 0x00, 0x94, 0x10},
911 {0xd1, 0x6e, 0x27, 0x58, 0x00, 0x00, 0x00, 0x10},
912 {0xb1, 0x6e, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10},
913 {0xd1, 0x6e, 0x2d, 0x14, 0x35, 0x61, 0x84, 0x10},
914 {0xd1, 0x6e, 0x31, 0xa2, 0xbd, 0xd8, 0xff, 0x10},
915 {0xd1, 0x6e, 0x35, 0x06, 0x1e, 0x12, 0x02, 0x10},
916 {0xd1, 0x6e, 0x39, 0xaa, 0x53, 0x37, 0xd5, 0x10},
917 {0xa1, 0x6e, 0x3d, 0xf2, 0x00, 0x00, 0x00, 0x10},
918 {0xd1, 0x6e, 0x3e, 0x00, 0x00, 0x80, 0x03, 0x10},
919 {0xd1, 0x6e, 0x42, 0x03, 0x00, 0x00, 0x00, 0x10},
920 {0xc1, 0x6e, 0x46, 0x00, 0x80, 0x80, 0x00, 0x10},
921 {0xd1, 0x6e, 0x4b, 0x02, 0xef, 0x08, 0xcd, 0x10},
922 {0xd1, 0x6e, 0x4f, 0x00, 0xd0, 0x00, 0xa0, 0x10},
923 {0xd1, 0x6e, 0x53, 0x01, 0xaa, 0x01, 0x40, 0x10},
924 {0xd1, 0x6e, 0x5a, 0x50, 0x04, 0x30, 0x03, 0x10},
925 {0xa1, 0x6e, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x10},
926 {0xd1, 0x6e, 0x5f, 0x10, 0x40, 0xff, 0x00, 0x10},
927
928 {0xd1, 0x6e, 0x63, 0x40, 0x40, 0x00, 0x00, 0x10},
929 {0xd1, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x10},
930 {0xd1, 0x6e, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x10},
931 {0xd1, 0x6e, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x10},
932 {0xc1, 0x6e, 0x73, 0x10, 0x80, 0xeb, 0x00, 0x10},
933 {}
934};
935static const u8 po1030_sensor_param1[][8] = {
936
937 {0xa1, 0x6e, 0x1e, 0x03, 0x00, 0x00, 0x00, 0x10},
938 {0xa1, 0x6e, 0x1e, 0x03, 0x00, 0x00, 0x00, 0x10},
939
940 {0xc1, 0x6e, 0x1a, 0x02, 0xd4, 0xa4, 0x00, 0x10},
941 {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10},
942 {0xc1, 0x6e, 0x16, 0x40, 0x40, 0x40, 0x00, 0x10},
943
944 {0xa1, 0x6e, 0x1d, 0x08, 0x00, 0x00, 0x00, 0x10},
945 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10},
946 {0xa1, 0x6e, 0x07, 0xd5, 0x00, 0x00, 0x00, 0x10},
947
948 {}
949};
950
951static const u8 po2030n_sensor_init[][8] = {
952 {0xa1, 0x6e, 0x1e, 0x1a, 0x00, 0x00, 0x00, 0x10},
953 {0xa1, 0x6e, 0x1f, 0x99, 0x00, 0x00, 0x00, 0x10},
954 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
955 {0xa1, 0x6e, 0x1e, 0x0a, 0x00, 0x00, 0x00, 0x10},
956 {0xa1, 0x6e, 0x1f, 0x19, 0x00, 0x00, 0x00, 0x10},
957 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
958 {0xa1, 0x6e, 0x20, 0x44, 0x00, 0x00, 0x00, 0x10},
959 {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10},
960 {0xa1, 0x6e, 0x05, 0x70, 0x00, 0x00, 0x00, 0x10},
961 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10},
962 {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10},
963 {0xd1, 0x6e, 0x08, 0x00, 0xd0, 0x00, 0x08, 0x10},
964 {0xd1, 0x6e, 0x0c, 0x03, 0x50, 0x01, 0xe8, 0x10},
965 {0xd1, 0x6e, 0x1d, 0x20, 0x0a, 0x19, 0x44, 0x10},
966 {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10},
967 {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x00, 0x10},
968 {0xd1, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00, 0x10},
969 {0xd1, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10},
970 {0xd1, 0x6e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10},
971 {0xd1, 0x6e, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10},
972 {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x00, 0x00, 0x10},
973 {0xd1, 0x6e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10},
974 {0xd1, 0x6e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x10},
975 {0xd1, 0x6e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x10},
976 {0xd1, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x00, 0x10},
977 {0xd1, 0x6e, 0x4d, 0x00, 0x00, 0x00, 0xed, 0x10},
978 {0xd1, 0x6e, 0x51, 0x17, 0x4a, 0x2f, 0xc0, 0x10},
979 {0xd1, 0x6e, 0x55, 0x00, 0x00, 0x00, 0x00, 0x10},
980 {0xd1, 0x6e, 0x59, 0x00, 0x00, 0x00, 0x00, 0x10},
981 {0xd1, 0x6e, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x10},
982 {0xd1, 0x6e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x10},
983 {0xd1, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x10},
984 {0xd1, 0x6e, 0x69, 0x00, 0x00, 0x00, 0x00, 0x10},
985 {0xd1, 0x6e, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x10},
986 {0xd1, 0x6e, 0x71, 0x00, 0x00, 0x00, 0x00, 0x10},
987 {0xd1, 0x6e, 0x75, 0x00, 0x00, 0x00, 0x00, 0x10},
988 {0xd1, 0x6e, 0x79, 0x00, 0x00, 0x00, 0x00, 0x10},
989 {0xd1, 0x6e, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x10},
990 {0xd1, 0x6e, 0x81, 0x00, 0x00, 0x00, 0x00, 0x10},
991 {0xd1, 0x6e, 0x85, 0x00, 0x00, 0x00, 0x08, 0x10},
992 {0xd1, 0x6e, 0x89, 0x01, 0xe8, 0x00, 0x01, 0x10},
993 {0xa1, 0x6e, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x10},
994 {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10},
995 {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x01, 0x10},
996 {0xd1, 0x6e, 0x29, 0xe6, 0x00, 0xbd, 0x03, 0x10},
997 {0xd1, 0x6e, 0x2d, 0x41, 0x38, 0x68, 0x40, 0x10},
998 {0xd1, 0x6e, 0x31, 0x2b, 0x00, 0x36, 0x00, 0x10},
999 {0xd1, 0x6e, 0x35, 0x30, 0x30, 0x08, 0x00, 0x10},
1000 {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x33, 0x06, 0x10},
1001 {0xb1, 0x6e, 0x3d, 0x06, 0x02, 0x00, 0x00, 0x10},
1002 {}
1003};
1004static const u8 po2030n_sensor_param1[][8] = {
1005 {0xa1, 0x6e, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x10},
1006 {DELAY, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1007 {0xa1, 0x6e, 0x1b, 0xf4, 0x00, 0x00, 0x00, 0x10},
1008 {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10},
1009 {0xd1, 0x6e, 0x16, 0x40, 0x40, 0x40, 0x40, 0x10},
1010
1011 {0xa1, 0x6e, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10},
1012 {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10},
1013 {0xa1, 0x6e, 0x05, 0x6f, 0x00, 0x00, 0x00, 0x10},
1014 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10},
1015 {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10},
1016 {}
1017};
1018
1019static const u8 soi768_sensor_init[][8] = {
1020 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
1021 {DELAY, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
1022 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10},
1023 {0xa1, 0x21, 0x13, 0x80, 0x00, 0x00, 0x00, 0x10},
1024 {0xa1, 0x21, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x10},
1025 {0xa1, 0x21, 0x19, 0x00, 0x00, 0x00, 0x00, 0x10},
1026 {}
1027};
1028static const u8 soi768_sensor_param1[][8] = {
1029 {0xa1, 0x21, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10},
1030 {0xa1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10},
1031 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10},
1032 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1033 {0xb1, 0x21, 0x01, 0x7f, 0x7f, 0x00, 0x00, 0x10},
1034
1035
1036
1037 {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10},
1038
1039 {0xa1, 0x21, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x10},
1040
1041 {0xa1, 0x21, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10},
1042
1043 {0xa1, 0x21, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x10},
1044 {0xa1, 0x21, 0x04, 0x06, 0x00, 0x00, 0x00, 0x10},
1045 {0xb1, 0x21, 0x2d, 0x63, 0x03, 0x00, 0x00, 0x10},
1046
1047 {}
1048};
1049
1050static const u8 sp80708_sensor_init[][8] = {
1051 {0xa1, 0x18, 0x06, 0xf9, 0x00, 0x00, 0x00, 0x10},
1052 {0xa1, 0x18, 0x09, 0x1f, 0x00, 0x00, 0x00, 0x10},
1053 {0xa1, 0x18, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10},
1054 {0xa1, 0x18, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x10},
1055 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
1056 {0xa1, 0x18, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x10},
1057 {0xa1, 0x18, 0x10, 0x40, 0x00, 0x00, 0x00, 0x10},
1058 {0xa1, 0x18, 0x11, 0x4e, 0x00, 0x00, 0x00, 0x10},
1059 {0xa1, 0x18, 0x12, 0x53, 0x00, 0x00, 0x00, 0x10},
1060 {0xa1, 0x18, 0x15, 0x80, 0x00, 0x00, 0x00, 0x10},
1061 {0xa1, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10},
1062 {0xa1, 0x18, 0x19, 0x18, 0x00, 0x00, 0x00, 0x10},
1063 {0xa1, 0x18, 0x1a, 0x10, 0x00, 0x00, 0x00, 0x10},
1064 {0xa1, 0x18, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x10},
1065 {0xa1, 0x18, 0x1c, 0x28, 0x00, 0x00, 0x00, 0x10},
1066 {0xa1, 0x18, 0x1d, 0x02, 0x00, 0x00, 0x00, 0x10},
1067 {0xa1, 0x18, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x10},
1068 {0xa1, 0x18, 0x26, 0x04, 0x00, 0x00, 0x00, 0x10},
1069 {0xa1, 0x18, 0x27, 0x1e, 0x00, 0x00, 0x00, 0x10},
1070 {0xa1, 0x18, 0x28, 0x5a, 0x00, 0x00, 0x00, 0x10},
1071 {0xa1, 0x18, 0x29, 0x28, 0x00, 0x00, 0x00, 0x10},
1072 {0xa1, 0x18, 0x2a, 0x78, 0x00, 0x00, 0x00, 0x10},
1073 {0xa1, 0x18, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x10},
1074 {0xa1, 0x18, 0x2c, 0xf7, 0x00, 0x00, 0x00, 0x10},
1075 {0xa1, 0x18, 0x2d, 0x2d, 0x00, 0x00, 0x00, 0x10},
1076 {0xa1, 0x18, 0x2e, 0xd5, 0x00, 0x00, 0x00, 0x10},
1077 {0xa1, 0x18, 0x39, 0x42, 0x00, 0x00, 0x00, 0x10},
1078 {0xa1, 0x18, 0x3a, 0x67, 0x00, 0x00, 0x00, 0x10},
1079 {0xa1, 0x18, 0x3b, 0x87, 0x00, 0x00, 0x00, 0x10},
1080 {0xa1, 0x18, 0x3c, 0xa3, 0x00, 0x00, 0x00, 0x10},
1081 {0xa1, 0x18, 0x3d, 0xb0, 0x00, 0x00, 0x00, 0x10},
1082 {0xa1, 0x18, 0x3e, 0xbc, 0x00, 0x00, 0x00, 0x10},
1083 {0xa1, 0x18, 0x3f, 0xc8, 0x00, 0x00, 0x00, 0x10},
1084 {0xa1, 0x18, 0x40, 0xd4, 0x00, 0x00, 0x00, 0x10},
1085 {0xa1, 0x18, 0x41, 0xdf, 0x00, 0x00, 0x00, 0x10},
1086 {0xa1, 0x18, 0x42, 0xea, 0x00, 0x00, 0x00, 0x10},
1087 {0xa1, 0x18, 0x43, 0xf5, 0x00, 0x00, 0x00, 0x10},
1088 {0xa1, 0x18, 0x45, 0x80, 0x00, 0x00, 0x00, 0x10},
1089 {0xa1, 0x18, 0x46, 0x60, 0x00, 0x00, 0x00, 0x10},
1090 {0xa1, 0x18, 0x47, 0x50, 0x00, 0x00, 0x00, 0x10},
1091 {0xa1, 0x18, 0x48, 0x30, 0x00, 0x00, 0x00, 0x10},
1092 {0xa1, 0x18, 0x49, 0x01, 0x00, 0x00, 0x00, 0x10},
1093 {0xa1, 0x18, 0x4d, 0xae, 0x00, 0x00, 0x00, 0x10},
1094 {0xa1, 0x18, 0x4e, 0x03, 0x00, 0x00, 0x00, 0x10},
1095 {0xa1, 0x18, 0x4f, 0x66, 0x00, 0x00, 0x00, 0x10},
1096 {0xa1, 0x18, 0x50, 0x1c, 0x00, 0x00, 0x00, 0x10},
1097 {0xa1, 0x18, 0x44, 0x10, 0x00, 0x00, 0x00, 0x10},
1098 {0xa1, 0x18, 0x4a, 0x30, 0x00, 0x00, 0x00, 0x10},
1099 {0xa1, 0x18, 0x51, 0x80, 0x00, 0x00, 0x00, 0x10},
1100 {0xa1, 0x18, 0x52, 0x80, 0x00, 0x00, 0x00, 0x10},
1101 {0xa1, 0x18, 0x53, 0x80, 0x00, 0x00, 0x00, 0x10},
1102 {0xa1, 0x18, 0x54, 0x80, 0x00, 0x00, 0x00, 0x10},
1103 {0xa1, 0x18, 0x55, 0x80, 0x00, 0x00, 0x00, 0x10},
1104 {0xa1, 0x18, 0x56, 0x80, 0x00, 0x00, 0x00, 0x10},
1105 {0xa1, 0x18, 0x57, 0xe0, 0x00, 0x00, 0x00, 0x10},
1106 {0xa1, 0x18, 0x58, 0xc0, 0x00, 0x00, 0x00, 0x10},
1107 {0xa1, 0x18, 0x59, 0xab, 0x00, 0x00, 0x00, 0x10},
1108 {0xa1, 0x18, 0x5a, 0xa0, 0x00, 0x00, 0x00, 0x10},
1109 {0xa1, 0x18, 0x5b, 0x99, 0x00, 0x00, 0x00, 0x10},
1110 {0xa1, 0x18, 0x5c, 0x90, 0x00, 0x00, 0x00, 0x10},
1111 {0xa1, 0x18, 0x5e, 0x24, 0x00, 0x00, 0x00, 0x10},
1112 {0xa1, 0x18, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x10},
1113 {0xa1, 0x18, 0x60, 0x00, 0x00, 0x00, 0x00, 0x10},
1114 {0xa1, 0x18, 0x61, 0x73, 0x00, 0x00, 0x00, 0x10},
1115 {0xa1, 0x18, 0x63, 0x42, 0x00, 0x00, 0x00, 0x10},
1116 {0xa1, 0x18, 0x64, 0x42, 0x00, 0x00, 0x00, 0x10},
1117 {0xa1, 0x18, 0x65, 0x42, 0x00, 0x00, 0x00, 0x10},
1118 {0xa1, 0x18, 0x66, 0x24, 0x00, 0x00, 0x00, 0x10},
1119 {0xa1, 0x18, 0x67, 0x24, 0x00, 0x00, 0x00, 0x10},
1120 {0xa1, 0x18, 0x68, 0x08, 0x00, 0x00, 0x00, 0x10},
1121 {0xa1, 0x18, 0x2f, 0xc9, 0x00, 0x00, 0x00, 0x10},
1122 {}
1123};
1124static const u8 sp80708_sensor_param1[][8] = {
1125 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
1126 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
1127 {0xa1, 0x18, 0x03, 0x01, 0x00, 0x00, 0x00, 0x10},
1128 {0xa1, 0x18, 0x04, 0xa4, 0x00, 0x00, 0x00, 0x10},
1129 {0xa1, 0x18, 0x14, 0x3f, 0x00, 0x00, 0x00, 0x10},
1130 {0xa1, 0x18, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x10},
1131 {0xb1, 0x18, 0x11, 0x40, 0x40, 0x00, 0x00, 0x10},
1132 {}
1133};
1134
1135static const u8 (*sensor_init[])[8] = {
1136[SENSOR_ADCM1700] = adcm1700_sensor_init,
1137[SENSOR_GC0307] = gc0307_sensor_init,
1138[SENSOR_HV7131R] = hv7131r_sensor_init,
1139[SENSOR_MI0360] = mi0360_sensor_init,
1140[SENSOR_MI0360B] = mi0360b_sensor_init,
1141[SENSOR_MO4000] = mo4000_sensor_init,
1142[SENSOR_MT9V111] = mt9v111_sensor_init,
1143[SENSOR_OM6802] = om6802_sensor_init,
1144[SENSOR_OV7630] = ov7630_sensor_init,
1145[SENSOR_OV7648] = ov7648_sensor_init,
1146[SENSOR_OV7660] = ov7660_sensor_init,
1147[SENSOR_PO1030] = po1030_sensor_init,
1148[SENSOR_PO2030N] = po2030n_sensor_init,
1149[SENSOR_SOI768] = soi768_sensor_init,
1150[SENSOR_SP80708] = sp80708_sensor_init,
1151};
1152
1153
1154static void reg_r(struct gspca_dev *gspca_dev,
1155 u16 value, int len)
1156{
1157 int ret;
1158
1159 if (gspca_dev->usb_err < 0)
1160 return;
1161 if (len > USB_BUF_SZ) {
1162 PERR("reg_r: buffer overflow\n");
1163 return;
1164 }
1165
1166 ret = usb_control_msg(gspca_dev->dev,
1167 usb_rcvctrlpipe(gspca_dev->dev, 0),
1168 0,
1169 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1170 value, 0,
1171 gspca_dev->usb_buf, len,
1172 500);
1173 PDEBUG(D_USBI, "reg_r [%02x] -> %02x", value, gspca_dev->usb_buf[0]);
1174 if (ret < 0) {
1175 pr_err("reg_r err %d\n", ret);
1176 gspca_dev->usb_err = ret;
1177 }
1178}
1179
1180static void reg_w1(struct gspca_dev *gspca_dev,
1181 u16 value,
1182 u8 data)
1183{
1184 int ret;
1185
1186 if (gspca_dev->usb_err < 0)
1187 return;
1188 PDEBUG(D_USBO, "reg_w1 [%04x] = %02x", value, data);
1189 gspca_dev->usb_buf[0] = data;
1190 ret = usb_control_msg(gspca_dev->dev,
1191 usb_sndctrlpipe(gspca_dev->dev, 0),
1192 0x08,
1193 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1194 value,
1195 0,
1196 gspca_dev->usb_buf, 1,
1197 500);
1198 if (ret < 0) {
1199 pr_err("reg_w1 err %d\n", ret);
1200 gspca_dev->usb_err = ret;
1201 }
1202}
1203static void reg_w(struct gspca_dev *gspca_dev,
1204 u16 value,
1205 const u8 *buffer,
1206 int len)
1207{
1208 int ret;
1209
1210 if (gspca_dev->usb_err < 0)
1211 return;
1212 PDEBUG(D_USBO, "reg_w [%04x] = %02x %02x ..",
1213 value, buffer[0], buffer[1]);
1214
1215 if (len > USB_BUF_SZ) {
1216 PERR("reg_w: buffer overflow\n");
1217 return;
1218 }
1219
1220 memcpy(gspca_dev->usb_buf, buffer, len);
1221 ret = usb_control_msg(gspca_dev->dev,
1222 usb_sndctrlpipe(gspca_dev->dev, 0),
1223 0x08,
1224 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1225 value, 0,
1226 gspca_dev->usb_buf, len,
1227 500);
1228 if (ret < 0) {
1229 pr_err("reg_w err %d\n", ret);
1230 gspca_dev->usb_err = ret;
1231 }
1232}
1233
1234
1235static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val)
1236{
1237 struct sd *sd = (struct sd *) gspca_dev;
1238 int ret;
1239
1240 if (gspca_dev->usb_err < 0)
1241 return;
1242 PDEBUG(D_USBO, "i2c_w1 [%02x] = %02x", reg, val);
1243 switch (sd->sensor) {
1244 case SENSOR_ADCM1700:
1245 case SENSOR_OM6802:
1246 case SENSOR_GC0307:
1247 gspca_dev->usb_buf[0] = 0x80 | (2 << 4);
1248 break;
1249 default:
1250 gspca_dev->usb_buf[0] = 0x81 | (2 << 4);
1251 break;
1252 }
1253 gspca_dev->usb_buf[1] = sd->i2c_addr;
1254 gspca_dev->usb_buf[2] = reg;
1255 gspca_dev->usb_buf[3] = val;
1256 gspca_dev->usb_buf[4] = 0;
1257 gspca_dev->usb_buf[5] = 0;
1258 gspca_dev->usb_buf[6] = 0;
1259 gspca_dev->usb_buf[7] = 0x10;
1260 ret = usb_control_msg(gspca_dev->dev,
1261 usb_sndctrlpipe(gspca_dev->dev, 0),
1262 0x08,
1263 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1264 0x08,
1265 0,
1266 gspca_dev->usb_buf, 8,
1267 500);
1268 msleep(2);
1269 if (ret < 0) {
1270 pr_err("i2c_w1 err %d\n", ret);
1271 gspca_dev->usb_err = ret;
1272 }
1273}
1274
1275
1276static void i2c_w8(struct gspca_dev *gspca_dev,
1277 const u8 *buffer)
1278{
1279 int ret;
1280
1281 if (gspca_dev->usb_err < 0)
1282 return;
1283 PDEBUG(D_USBO, "i2c_w8 [%02x] = %02x ..",
1284 buffer[2], buffer[3]);
1285 memcpy(gspca_dev->usb_buf, buffer, 8);
1286 ret = usb_control_msg(gspca_dev->dev,
1287 usb_sndctrlpipe(gspca_dev->dev, 0),
1288 0x08,
1289 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
1290 0x08, 0,
1291 gspca_dev->usb_buf, 8,
1292 500);
1293 msleep(2);
1294 if (ret < 0) {
1295 pr_err("i2c_w8 err %d\n", ret);
1296 gspca_dev->usb_err = ret;
1297 }
1298}
1299
1300
1301static void i2c_r(struct gspca_dev *gspca_dev, u8 reg, int len)
1302{
1303 struct sd *sd = (struct sd *) gspca_dev;
1304 u8 mode[8];
1305
1306 switch (sd->sensor) {
1307 case SENSOR_ADCM1700:
1308 case SENSOR_OM6802:
1309 case SENSOR_GC0307:
1310 mode[0] = 0x80 | 0x10;
1311 break;
1312 default:
1313 mode[0] = 0x81 | 0x10;
1314 break;
1315 }
1316 mode[1] = sd->i2c_addr;
1317 mode[2] = reg;
1318 mode[3] = 0;
1319 mode[4] = 0;
1320 mode[5] = 0;
1321 mode[6] = 0;
1322 mode[7] = 0x10;
1323 i2c_w8(gspca_dev, mode);
1324 msleep(2);
1325 mode[0] = (mode[0] & 0x81) | (len << 4) | 0x02;
1326 mode[2] = 0;
1327 i2c_w8(gspca_dev, mode);
1328 msleep(2);
1329 reg_r(gspca_dev, 0x0a, 5);
1330}
1331
1332static void i2c_w_seq(struct gspca_dev *gspca_dev,
1333 const u8 (*data)[8])
1334{
1335 while ((*data)[0] != 0) {
1336 if ((*data)[0] != DELAY)
1337 i2c_w8(gspca_dev, *data);
1338 else
1339 msleep((*data)[1]);
1340 data++;
1341 }
1342}
1343
1344
1345
1346static void hv7131r_probe(struct gspca_dev *gspca_dev)
1347{
1348 i2c_w1(gspca_dev, 0x02, 0);
1349 msleep(10);
1350 reg_w1(gspca_dev, 0x02, 0x66);
1351 msleep(10);
1352 i2c_r(gspca_dev, 0, 5);
1353 if (gspca_dev->usb_buf[0] == 0x02
1354 && gspca_dev->usb_buf[1] == 0x09
1355 && gspca_dev->usb_buf[2] == 0x01) {
1356 PDEBUG(D_PROBE, "Sensor HV7131R found");
1357 return;
1358 }
1359 pr_warn("Erroneous HV7131R ID 0x%02x 0x%02x 0x%02x\n",
1360 gspca_dev->usb_buf[0], gspca_dev->usb_buf[1],
1361 gspca_dev->usb_buf[2]);
1362}
1363
1364static void mi0360_probe(struct gspca_dev *gspca_dev)
1365{
1366 struct sd *sd = (struct sd *) gspca_dev;
1367 int i, j;
1368 u16 val = 0;
1369 static const u8 probe_tb[][4][8] = {
1370 {
1371 {0xb0, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10},
1372 {0x90, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1373 {0xa2, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1374 {0xb0, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10}
1375 },
1376 {
1377 {0xb0, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10},
1378 {0x90, 0x5c, 0x36, 0x00, 0x00, 0x00, 0x00, 0x10},
1379 {0xa2, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
1380 {}
1381 },
1382 };
1383
1384 for (i = 0; i < ARRAY_SIZE(probe_tb); i++) {
1385 reg_w1(gspca_dev, 0x17, 0x62);
1386 reg_w1(gspca_dev, 0x01, 0x08);
1387 for (j = 0; j < 3; j++)
1388 i2c_w8(gspca_dev, probe_tb[i][j]);
1389 msleep(2);
1390 reg_r(gspca_dev, 0x0a, 5);
1391 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1392 if (probe_tb[i][3][0] != 0)
1393 i2c_w8(gspca_dev, probe_tb[i][3]);
1394 reg_w1(gspca_dev, 0x01, 0x29);
1395 reg_w1(gspca_dev, 0x17, 0x42);
1396 if (val != 0xffff)
1397 break;
1398 }
1399 if (gspca_dev->usb_err < 0)
1400 return;
1401 switch (val) {
1402 case 0x8221:
1403 PDEBUG(D_PROBE, "Sensor mi0360b");
1404 sd->sensor = SENSOR_MI0360B;
1405 break;
1406 case 0x823a:
1407 PDEBUG(D_PROBE, "Sensor mt9v111");
1408 sd->sensor = SENSOR_MT9V111;
1409 break;
1410 case 0x8243:
1411 PDEBUG(D_PROBE, "Sensor mi0360");
1412 break;
1413 default:
1414 PDEBUG(D_PROBE, "Unknown sensor %04x - forced to mi0360", val);
1415 break;
1416 }
1417}
1418
1419static void ov7630_probe(struct gspca_dev *gspca_dev)
1420{
1421 struct sd *sd = (struct sd *) gspca_dev;
1422 u16 val;
1423
1424
1425 reg_w1(gspca_dev, 0x17, 0x62);
1426 reg_w1(gspca_dev, 0x01, 0x08);
1427 sd->i2c_addr = 0x21;
1428 i2c_r(gspca_dev, 0x0a, 2);
1429 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1430 reg_w1(gspca_dev, 0x01, 0x29);
1431 reg_w1(gspca_dev, 0x17, 0x42);
1432 if (gspca_dev->usb_err < 0)
1433 return;
1434 if (val == 0x7628) {
1435 sd->sensor = SENSOR_SOI768;
1436
1437 gspca_dev->cam.input_flags =
1438 V4L2_IN_ST_VFLIP | V4L2_IN_ST_HFLIP;
1439 PDEBUG(D_PROBE, "Sensor soi768");
1440 return;
1441 }
1442 PDEBUG(D_PROBE, "Sensor ov%04x", val);
1443}
1444
1445static void ov7648_probe(struct gspca_dev *gspca_dev)
1446{
1447 struct sd *sd = (struct sd *) gspca_dev;
1448 u16 val;
1449
1450
1451 reg_w1(gspca_dev, 0x17, 0x62);
1452 reg_w1(gspca_dev, 0x01, 0x08);
1453 sd->i2c_addr = 0x21;
1454 i2c_r(gspca_dev, 0x0a, 2);
1455 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1456 reg_w1(gspca_dev, 0x01, 0x29);
1457 reg_w1(gspca_dev, 0x17, 0x42);
1458 if ((val & 0xff00) == 0x7600) {
1459 PDEBUG(D_PROBE, "Sensor ov%04x", val);
1460 return;
1461 }
1462
1463
1464 reg_w1(gspca_dev, 0x17, 0x62);
1465 reg_w1(gspca_dev, 0x01, 0x08);
1466 sd->i2c_addr = 0x6e;
1467 i2c_r(gspca_dev, 0x00, 2);
1468 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1469 reg_w1(gspca_dev, 0x01, 0x29);
1470 reg_w1(gspca_dev, 0x17, 0x42);
1471 if (gspca_dev->usb_err < 0)
1472 return;
1473 if (val == 0x1030) {
1474 PDEBUG(D_PROBE, "Sensor po1030");
1475 sd->sensor = SENSOR_PO1030;
1476 return;
1477 }
1478 pr_err("Unknown sensor %04x\n", val);
1479}
1480
1481
1482static void po2030n_probe(struct gspca_dev *gspca_dev)
1483{
1484 struct sd *sd = (struct sd *) gspca_dev;
1485 u16 val;
1486
1487
1488 reg_w1(gspca_dev, 0x17, 0x62);
1489 reg_w1(gspca_dev, 0x01, 0x08);
1490 reg_w1(gspca_dev, 0x02, 0x22);
1491 sd->i2c_addr = 0x21;
1492 i2c_r(gspca_dev, 0x00, 1);
1493 val = gspca_dev->usb_buf[4];
1494 reg_w1(gspca_dev, 0x01, 0x29);
1495 reg_w1(gspca_dev, 0x17, 0x42);
1496 if (val == 0x99) {
1497 PDEBUG(D_PROBE, "Sensor gc0307");
1498 sd->sensor = SENSOR_GC0307;
1499 return;
1500 }
1501
1502
1503 reg_w1(gspca_dev, 0x17, 0x62);
1504 reg_w1(gspca_dev, 0x01, 0x0a);
1505 sd->i2c_addr = 0x6e;
1506 i2c_r(gspca_dev, 0x00, 2);
1507 val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4];
1508 reg_w1(gspca_dev, 0x01, 0x29);
1509 reg_w1(gspca_dev, 0x17, 0x42);
1510 if (gspca_dev->usb_err < 0)
1511 return;
1512 if (val == 0x2030) {
1513 PDEBUG(D_PROBE, "Sensor po2030n");
1514
1515 } else {
1516 pr_err("Unknown sensor ID %04x\n", val);
1517 }
1518}
1519
1520
1521static int sd_config(struct gspca_dev *gspca_dev,
1522 const struct usb_device_id *id)
1523{
1524 struct sd *sd = (struct sd *) gspca_dev;
1525 struct cam *cam;
1526
1527 sd->bridge = id->driver_info >> 16;
1528 sd->sensor = id->driver_info >> 8;
1529 sd->flags = id->driver_info;
1530
1531 cam = &gspca_dev->cam;
1532 if (sd->sensor == SENSOR_ADCM1700) {
1533 cam->cam_mode = cif_mode;
1534 cam->nmodes = ARRAY_SIZE(cif_mode);
1535 } else {
1536 cam->cam_mode = vga_mode;
1537 cam->nmodes = ARRAY_SIZE(vga_mode);
1538 }
1539 cam->npkt = 24;
1540
1541 sd->ag_cnt = -1;
1542 sd->quality = QUALITY_DEF;
1543
1544 INIT_WORK(&sd->work, qual_upd);
1545
1546 return 0;
1547}
1548
1549
1550static int sd_init(struct gspca_dev *gspca_dev)
1551{
1552 struct sd *sd = (struct sd *) gspca_dev;
1553 const u8 *sn9c1xx;
1554 u8 regGpio[] = { 0x29, 0x70 };
1555 u8 regF1;
1556
1557
1558 reg_w1(gspca_dev, 0xf1, 0x01);
1559 reg_r(gspca_dev, 0x00, 1);
1560 reg_w1(gspca_dev, 0xf1, 0x00);
1561 reg_r(gspca_dev, 0x00, 1);
1562 regF1 = gspca_dev->usb_buf[0];
1563 if (gspca_dev->usb_err < 0)
1564 return gspca_dev->usb_err;
1565 PDEBUG(D_PROBE, "Sonix chip id: %02x", regF1);
1566 if (gspca_dev->audio)
1567 regGpio[1] |= 0x04;
1568 switch (sd->bridge) {
1569 case BRIDGE_SN9C102P:
1570 case BRIDGE_SN9C105:
1571 if (regF1 != 0x11)
1572 return -ENODEV;
1573 break;
1574 default:
1575
1576
1577 if (regF1 != 0x12)
1578 return -ENODEV;
1579 }
1580
1581 switch (sd->sensor) {
1582 case SENSOR_MI0360:
1583 mi0360_probe(gspca_dev);
1584 break;
1585 case SENSOR_OV7630:
1586 ov7630_probe(gspca_dev);
1587 break;
1588 case SENSOR_OV7648:
1589 ov7648_probe(gspca_dev);
1590 break;
1591 case SENSOR_PO2030N:
1592 po2030n_probe(gspca_dev);
1593 break;
1594 }
1595
1596 switch (sd->bridge) {
1597 case BRIDGE_SN9C102P:
1598 reg_w1(gspca_dev, 0x02, regGpio[1]);
1599 break;
1600 default:
1601 reg_w(gspca_dev, 0x01, regGpio, 2);
1602 break;
1603 }
1604
1605
1606
1607 reg_w1(gspca_dev, 0xf1, 0x00);
1608
1609
1610 sn9c1xx = sn_tb[sd->sensor];
1611 sd->i2c_addr = sn9c1xx[9];
1612
1613 return gspca_dev->usb_err;
1614}
1615
1616static int sd_s_ctrl(struct v4l2_ctrl *ctrl);
1617
1618static const struct v4l2_ctrl_ops sd_ctrl_ops = {
1619 .s_ctrl = sd_s_ctrl,
1620};
1621
1622
1623static int sd_init_controls(struct gspca_dev *gspca_dev)
1624{
1625 struct sd *sd = (struct sd *) gspca_dev;
1626 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1627
1628 gspca_dev->vdev.ctrl_handler = hdl;
1629 v4l2_ctrl_handler_init(hdl, 14);
1630
1631 sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1632 V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
1633#define CONTRAST_MAX 127
1634 sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1635 V4L2_CID_CONTRAST, 0, CONTRAST_MAX, 1, 20);
1636#define COLORS_DEF 25
1637 sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1638 V4L2_CID_SATURATION, 0, 40, 1, COLORS_DEF);
1639 sd->red_bal = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1640 V4L2_CID_RED_BALANCE, 24, 40, 1, 32);
1641 sd->blue_bal = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1642 V4L2_CID_BLUE_BALANCE, 24, 40, 1, 32);
1643#define GAMMA_DEF 20
1644 sd->gamma = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1645 V4L2_CID_GAMMA, 0, 40, 1, GAMMA_DEF);
1646
1647 if (sd->sensor == SENSOR_OM6802)
1648 sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1649 V4L2_CID_SHARPNESS, 0, 255, 1, 16);
1650 else
1651 sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1652 V4L2_CID_SHARPNESS, 0, 255, 1, 90);
1653
1654 if (sd->flags & F_ILLUM)
1655 sd->illum = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1656 V4L2_CID_ILLUMINATORS_1, 0, 1, 1, 0);
1657
1658 if (sd->sensor == SENSOR_PO2030N) {
1659 gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1660 V4L2_CID_EXPOSURE, 500, 1500, 1, 1024);
1661 gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1662 V4L2_CID_GAIN, 4, 49, 1, 15);
1663 sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1664 V4L2_CID_HFLIP, 0, 1, 1, 0);
1665 }
1666
1667 if (sd->sensor != SENSOR_ADCM1700 && sd->sensor != SENSOR_OV7660 &&
1668 sd->sensor != SENSOR_PO1030 && sd->sensor != SENSOR_SOI768 &&
1669 sd->sensor != SENSOR_SP80708)
1670 gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1671 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1672
1673 if (sd->sensor == SENSOR_HV7131R || sd->sensor == SENSOR_OV7630 ||
1674 sd->sensor == SENSOR_OV7648 || sd->sensor == SENSOR_PO2030N)
1675 sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1676 V4L2_CID_VFLIP, 0, 1, 1, 0);
1677
1678 if (sd->sensor == SENSOR_OV7630 || sd->sensor == SENSOR_OV7648 ||
1679 sd->sensor == SENSOR_OV7660)
1680 sd->freq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
1681 V4L2_CID_POWER_LINE_FREQUENCY,
1682 V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
1683 V4L2_CID_POWER_LINE_FREQUENCY_50HZ);
1684
1685 if (hdl->error) {
1686 pr_err("Could not initialize controls\n");
1687 return hdl->error;
1688 }
1689
1690 v4l2_ctrl_cluster(2, &sd->red_bal);
1691 if (sd->sensor == SENSOR_PO2030N) {
1692 v4l2_ctrl_cluster(2, &sd->vflip);
1693 v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
1694 }
1695
1696 return 0;
1697}
1698
1699static u32 expo_adjust(struct gspca_dev *gspca_dev,
1700 u32 expo)
1701{
1702 struct sd *sd = (struct sd *) gspca_dev;
1703
1704 switch (sd->sensor) {
1705 case SENSOR_GC0307: {
1706 int a, b;
1707
1708
1709 a = 19 + expo * 25 / 256;
1710 i2c_w1(gspca_dev, 0x68, a);
1711 a -= 12;
1712 b = a * a * 4;
1713 i2c_w1(gspca_dev, 0x03, b >> 8);
1714 i2c_w1(gspca_dev, 0x04, b);
1715 break;
1716 }
1717 case SENSOR_HV7131R: {
1718 u8 Expodoit[] =
1719 { 0xc1, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x16 };
1720
1721 Expodoit[3] = expo >> 16;
1722 Expodoit[4] = expo >> 8;
1723 Expodoit[5] = expo;
1724 i2c_w8(gspca_dev, Expodoit);
1725 break;
1726 }
1727 case SENSOR_MI0360:
1728 case SENSOR_MI0360B: {
1729 u8 expoMi[] =
1730 { 0xb1, 0x5d, 0x09, 0x00, 0x00, 0x00, 0x00, 0x16 };
1731 static const u8 doit[] =
1732 { 0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10 };
1733 static const u8 sensorgo[] =
1734 { 0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10 };
1735
1736 if (expo > 0x0635)
1737 expo = 0x0635;
1738 else if (expo < 0x0001)
1739 expo = 0x0001;
1740 expoMi[3] = expo >> 8;
1741 expoMi[4] = expo;
1742 i2c_w8(gspca_dev, expoMi);
1743 i2c_w8(gspca_dev, doit);
1744 i2c_w8(gspca_dev, sensorgo);
1745 break;
1746 }
1747 case SENSOR_MO4000: {
1748 u8 expoMof[] =
1749 { 0xa1, 0x21, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x10 };
1750 u8 expoMo10[] =
1751 { 0xa1, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10 };
1752 static const u8 gainMo[] =
1753 { 0xa1, 0x21, 0x00, 0x10, 0x00, 0x00, 0x00, 0x1d };
1754
1755 if (expo > 0x1fff)
1756 expo = 0x1fff;
1757 else if (expo < 0x0001)
1758 expo = 0x0001;
1759 expoMof[3] = (expo & 0x03fc) >> 2;
1760 i2c_w8(gspca_dev, expoMof);
1761 expoMo10[3] = ((expo & 0x1c00) >> 10)
1762 | ((expo & 0x0003) << 4);
1763 i2c_w8(gspca_dev, expoMo10);
1764 i2c_w8(gspca_dev, gainMo);
1765 PDEBUG(D_FRAM, "set exposure %d",
1766 ((expoMo10[3] & 0x07) << 10)
1767 | (expoMof[3] << 2)
1768 | ((expoMo10[3] & 0x30) >> 4));
1769 break;
1770 }
1771 case SENSOR_MT9V111: {
1772 u8 expo_c1[] =
1773 { 0xb1, 0x5c, 0x09, 0x00, 0x00, 0x00, 0x00, 0x10 };
1774
1775 if (expo > 0x0390)
1776 expo = 0x0390;
1777 else if (expo < 0x0060)
1778 expo = 0x0060;
1779 expo_c1[3] = expo >> 8;
1780 expo_c1[4] = expo;
1781 i2c_w8(gspca_dev, expo_c1);
1782 break;
1783 }
1784 case SENSOR_OM6802: {
1785 u8 gainOm[] =
1786 { 0xa0, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x10 };
1787
1788
1789 if (expo > 0x03ff)
1790 expo = 0x03ff;
1791 if (expo < 0x0001)
1792 expo = 0x0001;
1793 gainOm[3] = expo >> 2;
1794 i2c_w8(gspca_dev, gainOm);
1795 reg_w1(gspca_dev, 0x96, expo >> 5);
1796 PDEBUG(D_FRAM, "set exposure %d", gainOm[3]);
1797 break;
1798 }
1799 }
1800 return expo;
1801}
1802
1803static void setbrightness(struct gspca_dev *gspca_dev)
1804{
1805 struct sd *sd = (struct sd *) gspca_dev;
1806 unsigned int expo;
1807 int brightness = sd->brightness->val;
1808 u8 k2;
1809
1810 k2 = (brightness - 0x80) >> 2;
1811 switch (sd->sensor) {
1812 case SENSOR_ADCM1700:
1813 if (k2 > 0x1f)
1814 k2 = 0;
1815 break;
1816 case SENSOR_HV7131R:
1817 expo = brightness << 12;
1818 if (expo > 0x002dc6c0)
1819 expo = 0x002dc6c0;
1820 else if (expo < 0x02a0)
1821 expo = 0x02a0;
1822 sd->exposure = expo_adjust(gspca_dev, expo);
1823 break;
1824 case SENSOR_MI0360:
1825 case SENSOR_MO4000:
1826 expo = brightness << 4;
1827 sd->exposure = expo_adjust(gspca_dev, expo);
1828 break;
1829 case SENSOR_MI0360B:
1830 expo = brightness << 2;
1831 sd->exposure = expo_adjust(gspca_dev, expo);
1832 break;
1833 case SENSOR_GC0307:
1834 expo = brightness;
1835 sd->exposure = expo_adjust(gspca_dev, expo);
1836 return;
1837 case SENSOR_MT9V111:
1838 expo = brightness << 2;
1839 sd->exposure = expo_adjust(gspca_dev, expo);
1840 return;
1841 case SENSOR_OM6802:
1842 expo = brightness << 2;
1843 sd->exposure = expo_adjust(gspca_dev, expo);
1844 return;
1845 }
1846
1847 reg_w1(gspca_dev, 0x96, k2);
1848}
1849
1850static void setcontrast(struct gspca_dev *gspca_dev)
1851{
1852 struct sd *sd = (struct sd *) gspca_dev;
1853 u8 k2;
1854 u8 contrast[6];
1855
1856 k2 = sd->contrast->val * 37 / (CONTRAST_MAX + 1)
1857 + 37;
1858 contrast[0] = (k2 + 1) / 2;
1859 contrast[1] = 0;
1860 contrast[2] = k2;
1861 contrast[3] = 0;
1862 contrast[4] = k2 / 5;
1863 contrast[5] = 0;
1864 reg_w(gspca_dev, 0x84, contrast, sizeof contrast);
1865}
1866
1867static void setcolors(struct gspca_dev *gspca_dev)
1868{
1869 struct sd *sd = (struct sd *) gspca_dev;
1870 int i, v, colors;
1871 const s16 *uv;
1872 u8 reg8a[12];
1873 static const s16 uv_com[6] = {
1874 -24, -38, 64,
1875 62, -51, -9
1876 };
1877 static const s16 uv_mi0360b[6] = {
1878 -20, -38, 64,
1879 60, -51, -9
1880 };
1881
1882 colors = sd->saturation->val;
1883 if (sd->sensor == SENSOR_MI0360B)
1884 uv = uv_mi0360b;
1885 else
1886 uv = uv_com;
1887 for (i = 0; i < 6; i++) {
1888 v = uv[i] * colors / COLORS_DEF;
1889 reg8a[i * 2] = v;
1890 reg8a[i * 2 + 1] = (v >> 8) & 0x0f;
1891 }
1892 reg_w(gspca_dev, 0x8a, reg8a, sizeof reg8a);
1893}
1894
1895static void setredblue(struct gspca_dev *gspca_dev)
1896{
1897 struct sd *sd = (struct sd *) gspca_dev;
1898
1899 if (sd->sensor == SENSOR_PO2030N) {
1900 u8 rg1b[] =
1901 {0xc1, 0x6e, 0x16, 0x00, 0x40, 0x00, 0x00, 0x10};
1902
1903
1904 rg1b[3] = sd->red_bal->val * 2;
1905 rg1b[5] = sd->blue_bal->val * 2;
1906 i2c_w8(gspca_dev, rg1b);
1907 return;
1908 }
1909 reg_w1(gspca_dev, 0x05, sd->red_bal->val);
1910
1911 reg_w1(gspca_dev, 0x06, sd->blue_bal->val);
1912}
1913
1914static void setgamma(struct gspca_dev *gspca_dev)
1915{
1916 struct sd *sd = (struct sd *) gspca_dev;
1917 int i, val;
1918 u8 gamma[17];
1919 const u8 *gamma_base;
1920 static const u8 delta[17] = {
1921 0x00, 0x14, 0x1c, 0x1c, 0x1c, 0x1c, 0x1b, 0x1a,
1922 0x18, 0x13, 0x10, 0x0e, 0x08, 0x07, 0x04, 0x02, 0x00
1923 };
1924
1925 switch (sd->sensor) {
1926 case SENSOR_ADCM1700:
1927 gamma_base = gamma_spec_0;
1928 break;
1929 case SENSOR_HV7131R:
1930 case SENSOR_MI0360B:
1931 case SENSOR_MT9V111:
1932 gamma_base = gamma_spec_1;
1933 break;
1934 case SENSOR_GC0307:
1935 gamma_base = gamma_spec_2;
1936 break;
1937 case SENSOR_SP80708:
1938 gamma_base = gamma_spec_3;
1939 break;
1940 default:
1941 gamma_base = gamma_def;
1942 break;
1943 }
1944
1945 val = sd->gamma->val;
1946 for (i = 0; i < sizeof gamma; i++)
1947 gamma[i] = gamma_base[i]
1948 + delta[i] * (val - GAMMA_DEF) / 32;
1949 reg_w(gspca_dev, 0x20, gamma, sizeof gamma);
1950}
1951
1952static void setexposure(struct gspca_dev *gspca_dev)
1953{
1954 struct sd *sd = (struct sd *) gspca_dev;
1955
1956 if (sd->sensor == SENSOR_PO2030N) {
1957 u8 rexpo[] =
1958 {0xa1, 0x6e, 0x1a, 0x00, 0x40, 0x00, 0x00, 0x10};
1959
1960 rexpo[3] = gspca_dev->exposure->val >> 8;
1961 i2c_w8(gspca_dev, rexpo);
1962 msleep(6);
1963 rexpo[2] = 0x1b;
1964 rexpo[3] = gspca_dev->exposure->val;
1965 i2c_w8(gspca_dev, rexpo);
1966 }
1967}
1968
1969static void setautogain(struct gspca_dev *gspca_dev)
1970{
1971 struct sd *sd = (struct sd *) gspca_dev;
1972
1973 switch (sd->sensor) {
1974 case SENSOR_OV7630:
1975 case SENSOR_OV7648: {
1976 u8 comb;
1977
1978 if (sd->sensor == SENSOR_OV7630)
1979 comb = 0xc0;
1980 else
1981 comb = 0xa0;
1982 if (gspca_dev->autogain->val)
1983 comb |= 0x03;
1984 i2c_w1(&sd->gspca_dev, 0x13, comb);
1985 return;
1986 }
1987 }
1988 if (gspca_dev->autogain->val)
1989 sd->ag_cnt = AG_CNT_START;
1990 else
1991 sd->ag_cnt = -1;
1992}
1993
1994static void setgain(struct gspca_dev *gspca_dev)
1995{
1996 struct sd *sd = (struct sd *) gspca_dev;
1997
1998 if (sd->sensor == SENSOR_PO2030N) {
1999 u8 rgain[] =
2000 {0xa1, 0x6e, 0x15, 0x00, 0x40, 0x00, 0x00, 0x15};
2001
2002 rgain[3] = gspca_dev->gain->val;
2003 i2c_w8(gspca_dev, rgain);
2004 }
2005}
2006
2007static void sethvflip(struct gspca_dev *gspca_dev)
2008{
2009 struct sd *sd = (struct sd *) gspca_dev;
2010 u8 comn;
2011
2012 switch (sd->sensor) {
2013 case SENSOR_HV7131R:
2014 comn = 0x18;
2015 if (sd->vflip->val)
2016 comn |= 0x01;
2017 i2c_w1(gspca_dev, 0x01, comn);
2018 break;
2019 case SENSOR_OV7630:
2020 comn = 0x02;
2021 if (!sd->vflip->val)
2022 comn |= 0x80;
2023 i2c_w1(gspca_dev, 0x75, comn);
2024 break;
2025 case SENSOR_OV7648:
2026 comn = 0x06;
2027 if (sd->vflip->val)
2028 comn |= 0x80;
2029 i2c_w1(gspca_dev, 0x75, comn);
2030 break;
2031 case SENSOR_PO2030N:
2032
2033
2034
2035
2036
2037
2038
2039
2040 comn = 0x0a;
2041 if (sd->hflip->val)
2042 comn |= 0x80;
2043 if (sd->vflip->val)
2044 comn |= 0x40;
2045 i2c_w1(&sd->gspca_dev, 0x1e, comn);
2046 break;
2047 }
2048}
2049
2050static void setsharpness(struct gspca_dev *gspca_dev)
2051{
2052 struct sd *sd = (struct sd *) gspca_dev;
2053
2054 reg_w1(gspca_dev, 0x99, sd->sharpness->val);
2055}
2056
2057static void setillum(struct gspca_dev *gspca_dev)
2058{
2059 struct sd *sd = (struct sd *) gspca_dev;
2060
2061 switch (sd->sensor) {
2062 case SENSOR_ADCM1700:
2063 reg_w1(gspca_dev, 0x02,
2064 sd->illum->val ? 0x64 : 0x60);
2065 break;
2066 case SENSOR_MT9V111:
2067 reg_w1(gspca_dev, 0x02,
2068 sd->illum->val ? 0x77 : 0x74);
2069
2070
2071
2072 break;
2073 }
2074}
2075
2076static void setfreq(struct gspca_dev *gspca_dev)
2077{
2078 struct sd *sd = (struct sd *) gspca_dev;
2079
2080 if (sd->sensor == SENSOR_OV7660) {
2081 u8 com8;
2082
2083 com8 = 0xdf;
2084 switch (sd->freq->val) {
2085 case 0:
2086 i2c_w1(gspca_dev, 0x13, com8 | 0x20);
2087 break;
2088 case 1:
2089 i2c_w1(gspca_dev, 0x13, com8);
2090 i2c_w1(gspca_dev, 0x3b, 0x0a);
2091 break;
2092 case 2:
2093 i2c_w1(gspca_dev, 0x13, com8);
2094 i2c_w1(gspca_dev, 0x3b, 0x02);
2095 break;
2096 }
2097 } else {
2098 u8 reg2a = 0, reg2b = 0, reg2d = 0;
2099
2100
2101 switch (sd->sensor) {
2102 case SENSOR_OV7630:
2103 reg2a = 0x08;
2104 reg2d = 0x01;
2105 break;
2106 case SENSOR_OV7648:
2107 reg2a = 0x11;
2108 reg2d = 0x81;
2109 break;
2110 }
2111
2112 switch (sd->freq->val) {
2113 case 0:
2114 break;
2115 case 1:
2116 reg2a |= 0x80;
2117 reg2b = 0xac;
2118 reg2d |= 0x04;
2119 break;
2120 case 2:
2121 reg2a |= 0x80;
2122 reg2d |= 0x04;
2123 break;
2124 }
2125 i2c_w1(gspca_dev, 0x2a, reg2a);
2126 i2c_w1(gspca_dev, 0x2b, reg2b);
2127 i2c_w1(gspca_dev, 0x2d, reg2d);
2128 }
2129}
2130
2131static void setjpegqual(struct gspca_dev *gspca_dev)
2132{
2133 struct sd *sd = (struct sd *) gspca_dev;
2134
2135 jpeg_set_qual(sd->jpeg_hdr, sd->quality);
2136#if USB_BUF_SZ < 64
2137#error "No room enough in usb_buf for quantization table"
2138#endif
2139 memcpy(gspca_dev->usb_buf, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64);
2140 usb_control_msg(gspca_dev->dev,
2141 usb_sndctrlpipe(gspca_dev->dev, 0),
2142 0x08,
2143 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
2144 0x0100, 0,
2145 gspca_dev->usb_buf, 64,
2146 500);
2147 memcpy(gspca_dev->usb_buf, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64);
2148 usb_control_msg(gspca_dev->dev,
2149 usb_sndctrlpipe(gspca_dev->dev, 0),
2150 0x08,
2151 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
2152 0x0140, 0,
2153 gspca_dev->usb_buf, 64,
2154 500);
2155
2156 sd->reg18 ^= 0x40;
2157 reg_w1(gspca_dev, 0x18, sd->reg18);
2158}
2159
2160
2161
2162static void qual_upd(struct work_struct *work)
2163{
2164 struct sd *sd = container_of(work, struct sd, work);
2165 struct gspca_dev *gspca_dev = &sd->gspca_dev;
2166
2167
2168 mutex_lock(&gspca_dev->usb_lock);
2169 PDEBUG(D_STREAM, "qual_upd %d%%", sd->quality);
2170 gspca_dev->usb_err = 0;
2171 setjpegqual(gspca_dev);
2172 mutex_unlock(&gspca_dev->usb_lock);
2173}
2174
2175
2176static int sd_start(struct gspca_dev *gspca_dev)
2177{
2178 struct sd *sd = (struct sd *) gspca_dev;
2179 int i;
2180 u8 reg01, reg17;
2181 u8 reg0102[2];
2182 const u8 *sn9c1xx;
2183 const u8 (*init)[8];
2184 const u8 *reg9a;
2185 int mode;
2186 static const u8 reg9a_def[] =
2187 {0x00, 0x40, 0x20, 0x00, 0x00, 0x00};
2188 static const u8 reg9a_spec[] =
2189 {0x00, 0x40, 0x38, 0x30, 0x00, 0x20};
2190 static const u8 regd4[] = {0x60, 0x00, 0x00};
2191 static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
2192 static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
2193 static const u8 CA_adcm1700[] =
2194 { 0x14, 0xec, 0x0a, 0xf6 };
2195 static const u8 CA_po2030n[] =
2196 { 0x1e, 0xe2, 0x14, 0xec };
2197 static const u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd };
2198 static const u8 CE_gc0307[] =
2199 { 0x32, 0xce, 0x2d, 0xd3 };
2200 static const u8 CE_ov76xx[] =
2201 { 0x32, 0xdd, 0x32, 0xdd };
2202 static const u8 CE_po2030n[] =
2203 { 0x14, 0xe7, 0x1e, 0xdd };
2204
2205
2206 jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,
2207 gspca_dev->pixfmt.width,
2208 0x21);
2209
2210
2211 sn9c1xx = sn_tb[sd->sensor];
2212
2213
2214
2215 reg01 = sn9c1xx[1];
2216 if (sd->flags & F_PDN_INV)
2217 reg01 ^= S_PDN_INV;
2218 reg_w1(gspca_dev, 0x01, reg01);
2219
2220
2221 reg0102[0] = reg01;
2222 reg0102[1] = sn9c1xx[2];
2223 if (gspca_dev->audio)
2224 reg0102[1] |= 0x04;
2225 reg_w(gspca_dev, 0x01, reg0102, 2);
2226 reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
2227 reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5);
2228 switch (sd->sensor) {
2229 case SENSOR_GC0307:
2230 case SENSOR_OV7660:
2231 case SENSOR_PO1030:
2232 case SENSOR_PO2030N:
2233 case SENSOR_SOI768:
2234 case SENSOR_SP80708:
2235 reg9a = reg9a_spec;
2236 break;
2237 default:
2238 reg9a = reg9a_def;
2239 break;
2240 }
2241 reg_w(gspca_dev, 0x9a, reg9a, 6);
2242
2243 reg_w(gspca_dev, 0xd4, regd4, sizeof regd4);
2244
2245 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
2246
2247 reg17 = sn9c1xx[0x17];
2248 switch (sd->sensor) {
2249 case SENSOR_GC0307:
2250 msleep(50);
2251 break;
2252 case SENSOR_OM6802:
2253 msleep(10);
2254 reg_w1(gspca_dev, 0x02, 0x73);
2255 reg17 |= SEN_CLK_EN;
2256 reg_w1(gspca_dev, 0x17, reg17);
2257 reg_w1(gspca_dev, 0x01, 0x22);
2258 msleep(100);
2259 reg01 = SCL_SEL_OD | S_PDN_INV;
2260 reg17 &= ~MCK_SIZE_MASK;
2261 reg17 |= 0x04;
2262 break;
2263 }
2264 reg01 |= SYS_SEL_48M;
2265 reg_w1(gspca_dev, 0x01, reg01);
2266 reg17 |= SEN_CLK_EN;
2267 reg_w1(gspca_dev, 0x17, reg17);
2268 reg01 &= ~S_PWR_DN;
2269 reg_w1(gspca_dev, 0x01, reg01);
2270 reg01 &= ~SCL_SEL_OD;
2271 reg_w1(gspca_dev, 0x01, reg01);
2272
2273 switch (sd->sensor) {
2274 case SENSOR_HV7131R:
2275 hv7131r_probe(gspca_dev);
2276 break;
2277 case SENSOR_OM6802:
2278 msleep(10);
2279 reg_w1(gspca_dev, 0x01, reg01);
2280 i2c_w8(gspca_dev, om6802_init0[0]);
2281 i2c_w8(gspca_dev, om6802_init0[1]);
2282 msleep(15);
2283 reg_w1(gspca_dev, 0x02, 0x71);
2284 msleep(150);
2285 break;
2286 case SENSOR_SP80708:
2287 msleep(100);
2288 reg_w1(gspca_dev, 0x02, 0x62);
2289 break;
2290 }
2291
2292
2293 i2c_w_seq(gspca_dev, sensor_init[sd->sensor]);
2294
2295 reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]);
2296 reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]);
2297 reg_w1(gspca_dev, 0x12, sn9c1xx[0x12]);
2298 reg_w1(gspca_dev, 0x13, sn9c1xx[0x13]);
2299 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
2300 if (sd->sensor == SENSOR_ADCM1700) {
2301 reg_w1(gspca_dev, 0xd2, 0x3a);
2302 reg_w1(gspca_dev, 0xd3, 0x30);
2303 } else {
2304 reg_w1(gspca_dev, 0xd2, 0x6a);
2305 reg_w1(gspca_dev, 0xd3, 0x50);
2306 }
2307 reg_w1(gspca_dev, 0xc6, 0x00);
2308 reg_w1(gspca_dev, 0xc7, 0x00);
2309 if (sd->sensor == SENSOR_ADCM1700) {
2310 reg_w1(gspca_dev, 0xc8, 0x2c);
2311 reg_w1(gspca_dev, 0xc9, 0x24);
2312 } else {
2313 reg_w1(gspca_dev, 0xc8, 0x50);
2314 reg_w1(gspca_dev, 0xc9, 0x3c);
2315 }
2316 reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
2317 switch (sd->sensor) {
2318 case SENSOR_OM6802:
2319
2320 break;
2321 default:
2322 reg17 |= DEF_EN;
2323 break;
2324 }
2325 reg_w1(gspca_dev, 0x17, reg17);
2326
2327 reg_w1(gspca_dev, 0x05, 0x00);
2328 reg_w1(gspca_dev, 0x07, 0x00);
2329 reg_w1(gspca_dev, 0x06, 0x00);
2330 reg_w1(gspca_dev, 0x14, sn9c1xx[0x14]);
2331
2332 setgamma(gspca_dev);
2333
2334
2335 for (i = 0; i < 8; i++)
2336 reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
2337 switch (sd->sensor) {
2338 case SENSOR_ADCM1700:
2339 case SENSOR_OV7660:
2340 case SENSOR_SP80708:
2341 reg_w1(gspca_dev, 0x9a, 0x05);
2342 break;
2343 case SENSOR_GC0307:
2344 case SENSOR_MT9V111:
2345 case SENSOR_MI0360B:
2346 reg_w1(gspca_dev, 0x9a, 0x07);
2347 break;
2348 case SENSOR_OV7630:
2349 case SENSOR_OV7648:
2350 reg_w1(gspca_dev, 0x9a, 0x0a);
2351 break;
2352 case SENSOR_PO2030N:
2353 case SENSOR_SOI768:
2354 reg_w1(gspca_dev, 0x9a, 0x06);
2355 break;
2356 default:
2357 reg_w1(gspca_dev, 0x9a, 0x08);
2358 break;
2359 }
2360 setsharpness(gspca_dev);
2361
2362 reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
2363 reg_w1(gspca_dev, 0x05, 0x20);
2364 reg_w1(gspca_dev, 0x07, 0x20);
2365 reg_w1(gspca_dev, 0x06, 0x20);
2366
2367 init = NULL;
2368 mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;
2369 reg01 |= SYS_SEL_48M | V_TX_EN;
2370 reg17 &= ~MCK_SIZE_MASK;
2371 reg17 |= 0x02;
2372 switch (sd->sensor) {
2373 case SENSOR_ADCM1700:
2374 init = adcm1700_sensor_param1;
2375 break;
2376 case SENSOR_GC0307:
2377 init = gc0307_sensor_param1;
2378 break;
2379 case SENSOR_HV7131R:
2380 case SENSOR_MI0360:
2381 if (!mode)
2382 reg01 &= ~SYS_SEL_48M;
2383 reg17 &= ~MCK_SIZE_MASK;
2384 reg17 |= 0x01;
2385 break;
2386 case SENSOR_MI0360B:
2387 init = mi0360b_sensor_param1;
2388 break;
2389 case SENSOR_MO4000:
2390 if (mode) {
2391 reg01 &= ~SYS_SEL_48M;
2392 reg17 &= ~MCK_SIZE_MASK;
2393 reg17 |= 0x01;
2394 }
2395 break;
2396 case SENSOR_MT9V111:
2397 init = mt9v111_sensor_param1;
2398 break;
2399 case SENSOR_OM6802:
2400 init = om6802_sensor_param1;
2401 if (!mode) {
2402 reg17 &= ~MCK_SIZE_MASK;
2403 reg17 |= 0x04;
2404 } else {
2405 reg01 &= ~SYS_SEL_48M;
2406 reg17 &= ~MCK_SIZE_MASK;
2407 reg17 |= 0x02;
2408 }
2409 break;
2410 case SENSOR_OV7630:
2411 init = ov7630_sensor_param1;
2412 break;
2413 case SENSOR_OV7648:
2414 init = ov7648_sensor_param1;
2415 reg17 &= ~MCK_SIZE_MASK;
2416 reg17 |= 0x01;
2417 break;
2418 case SENSOR_OV7660:
2419 init = ov7660_sensor_param1;
2420 break;
2421 case SENSOR_PO1030:
2422 init = po1030_sensor_param1;
2423 break;
2424 case SENSOR_PO2030N:
2425 init = po2030n_sensor_param1;
2426 break;
2427 case SENSOR_SOI768:
2428 init = soi768_sensor_param1;
2429 break;
2430 case SENSOR_SP80708:
2431 init = sp80708_sensor_param1;
2432 break;
2433 }
2434
2435
2436 if (init != NULL) {
2437 i2c_w_seq(gspca_dev, init);
2438
2439 }
2440
2441 reg_w(gspca_dev, 0xc0, C0, 6);
2442 switch (sd->sensor) {
2443 case SENSOR_ADCM1700:
2444 case SENSOR_GC0307:
2445 case SENSOR_SOI768:
2446 reg_w(gspca_dev, 0xca, CA_adcm1700, 4);
2447 break;
2448 case SENSOR_PO2030N:
2449 reg_w(gspca_dev, 0xca, CA_po2030n, 4);
2450 break;
2451 default:
2452 reg_w(gspca_dev, 0xca, CA, 4);
2453 break;
2454 }
2455 switch (sd->sensor) {
2456 case SENSOR_ADCM1700:
2457 case SENSOR_OV7630:
2458 case SENSOR_OV7648:
2459 case SENSOR_OV7660:
2460 case SENSOR_SOI768:
2461 reg_w(gspca_dev, 0xce, CE_ov76xx, 4);
2462 break;
2463 case SENSOR_GC0307:
2464 reg_w(gspca_dev, 0xce, CE_gc0307, 4);
2465 break;
2466 case SENSOR_PO2030N:
2467 reg_w(gspca_dev, 0xce, CE_po2030n, 4);
2468 break;
2469 default:
2470 reg_w(gspca_dev, 0xce, CE, 4);
2471
2472 break;
2473 }
2474
2475
2476 sd->reg18 = sn9c1xx[0x18] | (mode << 4) | 0x40;
2477 reg_w1(gspca_dev, 0x18, sd->reg18);
2478 setjpegqual(gspca_dev);
2479
2480 reg_w1(gspca_dev, 0x17, reg17);
2481 reg_w1(gspca_dev, 0x01, reg01);
2482 sd->reg01 = reg01;
2483 sd->reg17 = reg17;
2484
2485 sd->pktsz = sd->npkt = 0;
2486 sd->nchg = sd->short_mark = 0;
2487
2488 return gspca_dev->usb_err;
2489}
2490
2491static void sd_stopN(struct gspca_dev *gspca_dev)
2492{
2493 struct sd *sd = (struct sd *) gspca_dev;
2494 static const u8 stophv7131[] =
2495 { 0xa1, 0x11, 0x02, 0x09, 0x00, 0x00, 0x00, 0x10 };
2496 static const u8 stopmi0360[] =
2497 { 0xb1, 0x5d, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10 };
2498 static const u8 stopov7648[] =
2499 { 0xa1, 0x21, 0x76, 0x20, 0x00, 0x00, 0x00, 0x10 };
2500 static const u8 stopsoi768[] =
2501 { 0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10 };
2502 u8 reg01;
2503 u8 reg17;
2504
2505 reg01 = sd->reg01;
2506 reg17 = sd->reg17 & ~SEN_CLK_EN;
2507 switch (sd->sensor) {
2508 case SENSOR_ADCM1700:
2509 case SENSOR_GC0307:
2510 case SENSOR_PO2030N:
2511 case SENSOR_SP80708:
2512 reg01 |= LED;
2513 reg_w1(gspca_dev, 0x01, reg01);
2514 reg01 &= ~(LED | V_TX_EN);
2515 reg_w1(gspca_dev, 0x01, reg01);
2516
2517 break;
2518 case SENSOR_HV7131R:
2519 reg01 &= ~V_TX_EN;
2520 reg_w1(gspca_dev, 0x01, reg01);
2521 i2c_w8(gspca_dev, stophv7131);
2522 break;
2523 case SENSOR_MI0360:
2524 case SENSOR_MI0360B:
2525 reg01 &= ~V_TX_EN;
2526 reg_w1(gspca_dev, 0x01, reg01);
2527
2528 i2c_w8(gspca_dev, stopmi0360);
2529 break;
2530 case SENSOR_MT9V111:
2531 case SENSOR_OM6802:
2532 case SENSOR_PO1030:
2533 reg01 &= ~V_TX_EN;
2534 reg_w1(gspca_dev, 0x01, reg01);
2535 break;
2536 case SENSOR_OV7630:
2537 case SENSOR_OV7648:
2538 reg01 &= ~V_TX_EN;
2539 reg_w1(gspca_dev, 0x01, reg01);
2540 i2c_w8(gspca_dev, stopov7648);
2541 break;
2542 case SENSOR_OV7660:
2543 reg01 &= ~V_TX_EN;
2544 reg_w1(gspca_dev, 0x01, reg01);
2545 break;
2546 case SENSOR_SOI768:
2547 i2c_w8(gspca_dev, stopsoi768);
2548 break;
2549 }
2550
2551 reg01 |= SCL_SEL_OD;
2552 reg_w1(gspca_dev, 0x01, reg01);
2553 reg01 |= S_PWR_DN;
2554 reg_w1(gspca_dev, 0x01, reg01);
2555 reg_w1(gspca_dev, 0x17, reg17);
2556 reg01 &= ~SYS_SEL_48M;
2557 reg_w1(gspca_dev, 0x01, reg01);
2558 reg01 |= LED;
2559 reg_w1(gspca_dev, 0x01, reg01);
2560
2561
2562}
2563
2564
2565
2566static void sd_stop0(struct gspca_dev *gspca_dev)
2567{
2568 struct sd *sd = (struct sd *) gspca_dev;
2569
2570 mutex_unlock(&gspca_dev->usb_lock);
2571 flush_work(&sd->work);
2572 mutex_lock(&gspca_dev->usb_lock);
2573}
2574
2575static void do_autogain(struct gspca_dev *gspca_dev)
2576{
2577 struct sd *sd = (struct sd *) gspca_dev;
2578 int delta;
2579 int expotimes;
2580 u8 luma_mean = 130;
2581 u8 luma_delta = 20;
2582
2583
2584 if (sd->ag_cnt < 0)
2585 return;
2586 if (--sd->ag_cnt >= 0)
2587 return;
2588 sd->ag_cnt = AG_CNT_START;
2589
2590 delta = atomic_read(&sd->avg_lum);
2591 PDEBUG(D_FRAM, "mean lum %d", delta);
2592
2593 if (sd->sensor == SENSOR_PO2030N) {
2594 gspca_expo_autogain(gspca_dev, delta, luma_mean, luma_delta,
2595 15, 1024);
2596 return;
2597 }
2598
2599 if (delta < luma_mean - luma_delta ||
2600 delta > luma_mean + luma_delta) {
2601 switch (sd->sensor) {
2602 case SENSOR_GC0307:
2603 expotimes = sd->exposure;
2604 expotimes += (luma_mean - delta) >> 6;
2605 if (expotimes < 0)
2606 expotimes = 0;
2607 sd->exposure = expo_adjust(gspca_dev,
2608 (unsigned int) expotimes);
2609 break;
2610 case SENSOR_HV7131R:
2611 expotimes = sd->exposure >> 8;
2612 expotimes += (luma_mean - delta) >> 4;
2613 if (expotimes < 0)
2614 expotimes = 0;
2615 sd->exposure = expo_adjust(gspca_dev,
2616 (unsigned int) (expotimes << 8));
2617 break;
2618 case SENSOR_OM6802:
2619 case SENSOR_MT9V111:
2620 expotimes = sd->exposure;
2621 expotimes += (luma_mean - delta) >> 2;
2622 if (expotimes < 0)
2623 expotimes = 0;
2624 sd->exposure = expo_adjust(gspca_dev,
2625 (unsigned int) expotimes);
2626 setredblue(gspca_dev);
2627 break;
2628 default:
2629
2630
2631
2632 expotimes = sd->exposure;
2633 expotimes += (luma_mean - delta) >> 6;
2634 if (expotimes < 0)
2635 expotimes = 0;
2636 sd->exposure = expo_adjust(gspca_dev,
2637 (unsigned int) expotimes);
2638 setredblue(gspca_dev);
2639 break;
2640 }
2641 }
2642}
2643
2644
2645static void set_lum(struct sd *sd,
2646 u8 *data)
2647{
2648 int avg_lum;
2649
2650
2651
2652
2653
2654 avg_lum = (data[27] << 8) + data[28]
2655
2656 + (data[31] << 8) + data[32]
2657
2658 + (data[23] << 8) + data[24]
2659
2660 + (data[35] << 8) + data[36]
2661
2662 + (data[29] << 10) + (data[30] << 2);
2663 avg_lum >>= 10;
2664 atomic_set(&sd->avg_lum, avg_lum);
2665}
2666
2667
2668
2669static void sd_pkt_scan(struct gspca_dev *gspca_dev,
2670 u8 *data,
2671 int len)
2672{
2673 struct sd *sd = (struct sd *) gspca_dev;
2674 int i, new_qual;
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693 sd->npkt++;
2694 sd->pktsz += len;
2695
2696
2697
2698
2699
2700
2701 i = sd->short_mark;
2702 if (i != 0) {
2703 sd->short_mark = 0;
2704 if (i < 0
2705 && data[0] == 0xff
2706 && data[1] == 0x00)
2707 goto marker_found;
2708 if (data[0] == 0xff && data[1] == 0xff) {
2709 i = 0;
2710 goto marker_found;
2711 }
2712 len -= i;
2713 if (len <= 0)
2714 return;
2715 data += i;
2716 }
2717
2718
2719 for (i = len - 1; --i >= 0; ) {
2720 if (data[i] != 0xff) {
2721 i--;
2722 continue;
2723 }
2724 if (data[i + 1] == 0xff) {
2725
2726
2727 if (i + 2 >= len || data[i + 2] == 0x00)
2728 goto marker_found;
2729 }
2730 }
2731
2732
2733
2734 if (data[len - 1] == 0xff)
2735 sd->short_mark = -1;
2736 if (gspca_dev->last_packet_type == LAST_PACKET)
2737 gspca_frame_add(gspca_dev, FIRST_PACKET,
2738 sd->jpeg_hdr, JPEG_HDR_SZ);
2739 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
2740 return;
2741
2742
2743
2744marker_found:
2745 new_qual = 0;
2746 if (i > 2) {
2747 if (data[i - 2] != 0xff || data[i - 1] != 0xd9) {
2748 gspca_dev->last_packet_type = DISCARD_PACKET;
2749 new_qual = -3;
2750 }
2751 } else if (i + 6 < len) {
2752 if (data[i + 6] & 0x08) {
2753 gspca_dev->last_packet_type = DISCARD_PACKET;
2754 new_qual = -5;
2755 }
2756 }
2757
2758 gspca_frame_add(gspca_dev, LAST_PACKET, data, i);
2759
2760
2761 if (new_qual == 0) {
2762 int r;
2763
2764 r = (sd->pktsz * 100) /
2765 (sd->npkt *
2766 gspca_dev->urb[0]->iso_frame_desc[0].length);
2767 if (r >= 85)
2768 new_qual = -3;
2769 else if (r < 75)
2770 new_qual = 2;
2771 }
2772 if (new_qual != 0) {
2773 sd->nchg += new_qual;
2774 if (sd->nchg < -6 || sd->nchg >= 12) {
2775 sd->nchg = 0;
2776 new_qual += sd->quality;
2777 if (new_qual < QUALITY_MIN)
2778 new_qual = QUALITY_MIN;
2779 else if (new_qual > QUALITY_MAX)
2780 new_qual = QUALITY_MAX;
2781 if (new_qual != sd->quality) {
2782 sd->quality = new_qual;
2783 schedule_work(&sd->work);
2784 }
2785 }
2786 } else {
2787 sd->nchg = 0;
2788 }
2789 sd->pktsz = sd->npkt = 0;
2790
2791
2792
2793 if (i + 62 > len) {
2794 sd->short_mark = i + 62 - len;
2795 return;
2796 }
2797 if (sd->ag_cnt >= 0)
2798 set_lum(sd, data + i);
2799
2800
2801 i += 62;
2802 if (i < len) {
2803 data += i;
2804 len -= i;
2805 gspca_frame_add(gspca_dev, FIRST_PACKET,
2806 sd->jpeg_hdr, JPEG_HDR_SZ);
2807 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
2808 }
2809}
2810
2811static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
2812{
2813 struct gspca_dev *gspca_dev =
2814 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
2815
2816 gspca_dev->usb_err = 0;
2817
2818 if (!gspca_dev->streaming)
2819 return 0;
2820
2821 switch (ctrl->id) {
2822 case V4L2_CID_BRIGHTNESS:
2823 setbrightness(gspca_dev);
2824 break;
2825 case V4L2_CID_CONTRAST:
2826 setcontrast(gspca_dev);
2827 break;
2828 case V4L2_CID_SATURATION:
2829 setcolors(gspca_dev);
2830 break;
2831 case V4L2_CID_RED_BALANCE:
2832 setredblue(gspca_dev);
2833 break;
2834 case V4L2_CID_GAMMA:
2835 setgamma(gspca_dev);
2836 break;
2837 case V4L2_CID_AUTOGAIN:
2838 setautogain(gspca_dev);
2839 setexposure(gspca_dev);
2840 setgain(gspca_dev);
2841 break;
2842 case V4L2_CID_VFLIP:
2843 sethvflip(gspca_dev);
2844 break;
2845 case V4L2_CID_SHARPNESS:
2846 setsharpness(gspca_dev);
2847 break;
2848 case V4L2_CID_ILLUMINATORS_1:
2849 setillum(gspca_dev);
2850 break;
2851 case V4L2_CID_POWER_LINE_FREQUENCY:
2852 setfreq(gspca_dev);
2853 break;
2854 default:
2855 return -EINVAL;
2856 }
2857 return gspca_dev->usb_err;
2858}
2859
2860#if IS_ENABLED(CONFIG_INPUT)
2861static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
2862 u8 *data,
2863 int len)
2864{
2865 int ret = -EINVAL;
2866
2867 if (len == 1 && data[0] == 1) {
2868 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
2869 input_sync(gspca_dev->input_dev);
2870 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
2871 input_sync(gspca_dev->input_dev);
2872 ret = 0;
2873 }
2874
2875 return ret;
2876}
2877#endif
2878
2879
2880static const struct sd_desc sd_desc = {
2881 .name = MODULE_NAME,
2882 .config = sd_config,
2883 .init = sd_init,
2884 .init_controls = sd_init_controls,
2885 .start = sd_start,
2886 .stopN = sd_stopN,
2887 .stop0 = sd_stop0,
2888 .pkt_scan = sd_pkt_scan,
2889 .dq_callback = do_autogain,
2890#if IS_ENABLED(CONFIG_INPUT)
2891 .int_pkt_scan = sd_int_pkt_scan,
2892#endif
2893};
2894
2895
2896#define BS(bridge, sensor) \
2897 .driver_info = (BRIDGE_ ## bridge << 16) \
2898 | (SENSOR_ ## sensor << 8)
2899#define BSF(bridge, sensor, flags) \
2900 .driver_info = (BRIDGE_ ## bridge << 16) \
2901 | (SENSOR_ ## sensor << 8) \
2902 | (flags)
2903static const struct usb_device_id device_table[] = {
2904 {USB_DEVICE(0x0458, 0x7025), BSF(SN9C120, MI0360B, F_PDN_INV)},
2905 {USB_DEVICE(0x0458, 0x702e), BS(SN9C120, OV7660)},
2906 {USB_DEVICE(0x045e, 0x00f5), BSF(SN9C105, OV7660, F_PDN_INV)},
2907 {USB_DEVICE(0x045e, 0x00f7), BSF(SN9C105, OV7660, F_PDN_INV)},
2908 {USB_DEVICE(0x0471, 0x0327), BS(SN9C105, MI0360)},
2909 {USB_DEVICE(0x0471, 0x0328), BS(SN9C105, MI0360)},
2910 {USB_DEVICE(0x0471, 0x0330), BS(SN9C105, MI0360)},
2911 {USB_DEVICE(0x06f8, 0x3004), BS(SN9C105, OV7660)},
2912 {USB_DEVICE(0x06f8, 0x3008), BS(SN9C105, OV7660)},
2913
2914 {USB_DEVICE(0x0c45, 0x6040), BS(SN9C102P, HV7131R)},
2915
2916
2917 {USB_DEVICE(0x0c45, 0x607c), BS(SN9C102P, HV7131R)},
2918
2919 {USB_DEVICE(0x0c45, 0x60c0), BSF(SN9C105, MI0360, F_ILLUM)},
2920
2921
2922
2923
2924 {USB_DEVICE(0x0c45, 0x60ce), BS(SN9C105, SP80708)},
2925 {USB_DEVICE(0x0c45, 0x60ec), BS(SN9C105, MO4000)},
2926
2927
2928
2929 {USB_DEVICE(0x0c45, 0x60fb), BS(SN9C105, OV7660)},
2930 {USB_DEVICE(0x0c45, 0x60fc), BS(SN9C105, HV7131R)},
2931 {USB_DEVICE(0x0c45, 0x60fe), BS(SN9C105, OV7630)},
2932 {USB_DEVICE(0x0c45, 0x6100), BS(SN9C120, MI0360)},
2933 {USB_DEVICE(0x0c45, 0x6102), BS(SN9C120, PO2030N)},
2934
2935 {USB_DEVICE(0x0c45, 0x610a), BS(SN9C120, OV7648)},
2936 {USB_DEVICE(0x0c45, 0x610b), BS(SN9C120, OV7660)},
2937 {USB_DEVICE(0x0c45, 0x610c), BS(SN9C120, HV7131R)},
2938 {USB_DEVICE(0x0c45, 0x610e), BS(SN9C120, OV7630)},
2939
2940
2941
2942 {USB_DEVICE(0x0c45, 0x6128), BS(SN9C120, OM6802)},
2943
2944 {USB_DEVICE(0x0c45, 0x612a), BS(SN9C120, OV7648)},
2945 {USB_DEVICE(0x0c45, 0x612b), BS(SN9C110, ADCM1700)},
2946 {USB_DEVICE(0x0c45, 0x612c), BS(SN9C110, MO4000)},
2947 {USB_DEVICE(0x0c45, 0x612e), BS(SN9C110, OV7630)},
2948
2949 {USB_DEVICE(0x0c45, 0x6130), BS(SN9C120, MI0360)},
2950
2951
2952 {USB_DEVICE(0x0c45, 0x6138), BS(SN9C120, MO4000)},
2953 {USB_DEVICE(0x0c45, 0x613a), BS(SN9C120, OV7648)},
2954 {USB_DEVICE(0x0c45, 0x613b), BS(SN9C120, OV7660)},
2955 {USB_DEVICE(0x0c45, 0x613c), BS(SN9C120, HV7131R)},
2956 {USB_DEVICE(0x0c45, 0x613e), BS(SN9C120, OV7630)},
2957 {USB_DEVICE(0x0c45, 0x6142), BS(SN9C120, PO2030N)},
2958
2959 {USB_DEVICE(0x0c45, 0x6143), BS(SN9C120, SP80708)},
2960 {USB_DEVICE(0x0c45, 0x6148), BS(SN9C120, OM6802)},
2961 {USB_DEVICE(0x0c45, 0x614a), BSF(SN9C120, ADCM1700, F_ILLUM)},
2962
2963 {}
2964};
2965MODULE_DEVICE_TABLE(usb, device_table);
2966
2967
2968static int sd_probe(struct usb_interface *intf,
2969 const struct usb_device_id *id)
2970{
2971 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
2972 THIS_MODULE);
2973}
2974
2975static struct usb_driver sd_driver = {
2976 .name = MODULE_NAME,
2977 .id_table = device_table,
2978 .probe = sd_probe,
2979 .disconnect = gspca_disconnect,
2980#ifdef CONFIG_PM
2981 .suspend = gspca_suspend,
2982 .resume = gspca_resume,
2983 .reset_resume = gspca_resume,
2984#endif
2985};
2986
2987module_usb_driver(sd_driver);
2988