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