[media] gspca: Fix coding style issues
[deliverable/linux.git] / drivers / media / video / gspca / xirlink_cit.c
1 /*
2 * USB IBM C-It Video Camera driver
3 *
4 * Supports Xirlink C-It Video Camera, IBM PC Camera,
5 * IBM NetCamera and Veo Stingray.
6 *
7 * Copyright (C) 2010 Hans de Goede <hdegoede@redhat.com>
8 *
9 * This driver is based on earlier work of:
10 *
11 * (C) Copyright 1999 Johannes Erdfelt
12 * (C) Copyright 1999 Randy Dunlap
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 *
28 */
29
30 #define MODULE_NAME "xirlink-cit"
31
32 #include "gspca.h"
33
34 MODULE_AUTHOR("Hans de Goede <hdegoede@redhat.com>");
35 MODULE_DESCRIPTION("Xirlink C-IT");
36 MODULE_LICENSE("GPL");
37
38 /* FIXME we should autodetect this */
39 static int ibm_netcam_pro;
40 module_param(ibm_netcam_pro, int, 0);
41 MODULE_PARM_DESC(ibm_netcam_pro,
42 "Use IBM Netcamera Pro init sequences for Model 3 cams");
43
44 /* FIXME this should be handled through the V4L2 input selection API */
45 static int rca_input;
46 module_param(rca_input, int, 0644);
47 MODULE_PARM_DESC(rca_input,
48 "Use rca input instead of ccd sensor on Model 3 cams");
49
50 /* specific webcam descriptor */
51 struct sd {
52 struct gspca_dev gspca_dev; /* !! must be the first item */
53 u8 model;
54 #define CIT_MODEL0 0 /* bcd version 0.01 cams ie the xvp-500 */
55 #define CIT_MODEL1 1 /* The model 1 - 4 nomenclature comes from the old */
56 #define CIT_MODEL2 2 /* ibmcam driver */
57 #define CIT_MODEL3 3
58 #define CIT_MODEL4 4
59 #define CIT_IBM_NETCAM_PRO 5
60 u8 input_index;
61 u8 stop_on_control_change;
62 u8 sof_read;
63 u8 sof_len;
64 u8 contrast;
65 u8 brightness;
66 u8 hue;
67 u8 sharpness;
68 u8 lighting;
69 u8 hflip;
70 };
71
72 /* V4L2 controls supported by the driver */
73 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
74 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
75 static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val);
76 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val);
77 static int sd_sethue(struct gspca_dev *gspca_dev, __s32 val);
78 static int sd_gethue(struct gspca_dev *gspca_dev, __s32 *val);
79 static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val);
80 static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val);
81 static int sd_setlighting(struct gspca_dev *gspca_dev, __s32 val);
82 static int sd_getlighting(struct gspca_dev *gspca_dev, __s32 *val);
83 static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val);
84 static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val);
85 static void sd_stop0(struct gspca_dev *gspca_dev);
86
87 static const struct ctrl sd_ctrls[] = {
88 #define SD_BRIGHTNESS 0
89 {
90 {
91 .id = V4L2_CID_BRIGHTNESS,
92 .type = V4L2_CTRL_TYPE_INTEGER,
93 .name = "Brightness",
94 .minimum = 0,
95 .maximum = 63,
96 .step = 1,
97 #define BRIGHTNESS_DEFAULT 32
98 .default_value = BRIGHTNESS_DEFAULT,
99 .flags = 0,
100 },
101 .set = sd_setbrightness,
102 .get = sd_getbrightness,
103 },
104 #define SD_CONTRAST 1
105 {
106 {
107 .id = V4L2_CID_CONTRAST,
108 .type = V4L2_CTRL_TYPE_INTEGER,
109 .name = "contrast",
110 .minimum = 0,
111 .maximum = 20,
112 .step = 1,
113 #define CONTRAST_DEFAULT 10
114 .default_value = CONTRAST_DEFAULT,
115 .flags = 0,
116 },
117 .set = sd_setcontrast,
118 .get = sd_getcontrast,
119 },
120 #define SD_HUE 2
121 {
122 {
123 .id = V4L2_CID_HUE,
124 .type = V4L2_CTRL_TYPE_INTEGER,
125 .name = "Hue",
126 .minimum = 0,
127 .maximum = 127,
128 .step = 1,
129 #define HUE_DEFAULT 63
130 .default_value = HUE_DEFAULT,
131 .flags = 0,
132 },
133 .set = sd_sethue,
134 .get = sd_gethue,
135 },
136 #define SD_SHARPNESS 3
137 {
138 {
139 .id = V4L2_CID_SHARPNESS,
140 .type = V4L2_CTRL_TYPE_INTEGER,
141 .name = "Sharpness",
142 .minimum = 0,
143 .maximum = 6,
144 .step = 1,
145 #define SHARPNESS_DEFAULT 3
146 .default_value = SHARPNESS_DEFAULT,
147 .flags = 0,
148 },
149 .set = sd_setsharpness,
150 .get = sd_getsharpness,
151 },
152 #define SD_LIGHTING 4
153 {
154 {
155 .id = V4L2_CID_BACKLIGHT_COMPENSATION,
156 .type = V4L2_CTRL_TYPE_INTEGER,
157 .name = "Lighting",
158 .minimum = 0,
159 .maximum = 2,
160 .step = 1,
161 #define LIGHTING_DEFAULT 1
162 .default_value = LIGHTING_DEFAULT,
163 .flags = 0,
164 },
165 .set = sd_setlighting,
166 .get = sd_getlighting,
167 },
168 #define SD_HFLIP 5
169 {
170 {
171 .id = V4L2_CID_HFLIP,
172 .type = V4L2_CTRL_TYPE_BOOLEAN,
173 .name = "Mirror",
174 .minimum = 0,
175 .maximum = 1,
176 .step = 1,
177 #define HFLIP_DEFAULT 0
178 .default_value = HFLIP_DEFAULT,
179 },
180 .set = sd_sethflip,
181 .get = sd_gethflip,
182 },
183 };
184
185 static const struct v4l2_pix_format cif_yuv_mode[] = {
186 {176, 144, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
187 .bytesperline = 176,
188 .sizeimage = 176 * 144 * 3 / 2,
189 .colorspace = V4L2_COLORSPACE_SRGB},
190 {352, 288, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
191 .bytesperline = 352,
192 .sizeimage = 352 * 288 * 3 / 2,
193 .colorspace = V4L2_COLORSPACE_SRGB},
194 };
195
196 static const struct v4l2_pix_format vga_yuv_mode[] = {
197 {160, 120, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
198 .bytesperline = 160,
199 .sizeimage = 160 * 120 * 3 / 2,
200 .colorspace = V4L2_COLORSPACE_SRGB},
201 {320, 240, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
202 .bytesperline = 320,
203 .sizeimage = 320 * 240 * 3 / 2,
204 .colorspace = V4L2_COLORSPACE_SRGB},
205 {640, 480, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
206 .bytesperline = 640,
207 .sizeimage = 640 * 480 * 3 / 2,
208 .colorspace = V4L2_COLORSPACE_SRGB},
209 };
210
211 static const struct v4l2_pix_format model0_mode[] = {
212 {160, 120, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
213 .bytesperline = 160,
214 .sizeimage = 160 * 120 * 3 / 2,
215 .colorspace = V4L2_COLORSPACE_SRGB},
216 {176, 144, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
217 .bytesperline = 176,
218 .sizeimage = 176 * 144 * 3 / 2,
219 .colorspace = V4L2_COLORSPACE_SRGB},
220 {320, 240, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
221 .bytesperline = 320,
222 .sizeimage = 320 * 240 * 3 / 2,
223 .colorspace = V4L2_COLORSPACE_SRGB},
224 };
225
226 static const struct v4l2_pix_format model2_mode[] = {
227 {160, 120, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
228 .bytesperline = 160,
229 .sizeimage = 160 * 120 * 3 / 2,
230 .colorspace = V4L2_COLORSPACE_SRGB},
231 {176, 144, V4L2_PIX_FMT_CIT_YYVYUY, V4L2_FIELD_NONE,
232 .bytesperline = 176,
233 .sizeimage = 176 * 144 * 3 / 2,
234 .colorspace = V4L2_COLORSPACE_SRGB},
235 {320, 240, V4L2_PIX_FMT_SGRBG8, V4L2_FIELD_NONE,
236 .bytesperline = 320,
237 .sizeimage = 320 * 240,
238 .colorspace = V4L2_COLORSPACE_SRGB},
239 {352, 288, V4L2_PIX_FMT_SGRBG8, V4L2_FIELD_NONE,
240 .bytesperline = 352,
241 .sizeimage = 352 * 288,
242 .colorspace = V4L2_COLORSPACE_SRGB},
243 };
244
245 /*
246 * 01.01.08 - Added for RCA video in support -LO
247 * This struct is used to init the Model3 cam to use the RCA video in port
248 * instead of the CCD sensor.
249 */
250 static const u16 rca_initdata[][3] = {
251 {0, 0x0000, 0x010c},
252 {0, 0x0006, 0x012c},
253 {0, 0x0078, 0x012d},
254 {0, 0x0046, 0x012f},
255 {0, 0xd141, 0x0124},
256 {0, 0x0000, 0x0127},
257 {0, 0xfea8, 0x0124},
258 {1, 0x0000, 0x0116},
259 {0, 0x0064, 0x0116},
260 {1, 0x0000, 0x0115},
261 {0, 0x0003, 0x0115},
262 {0, 0x0008, 0x0123},
263 {0, 0x0000, 0x0117},
264 {0, 0x0000, 0x0112},
265 {0, 0x0080, 0x0100},
266 {0, 0x0000, 0x0100},
267 {1, 0x0000, 0x0116},
268 {0, 0x0060, 0x0116},
269 {0, 0x0002, 0x0112},
270 {0, 0x0000, 0x0123},
271 {0, 0x0001, 0x0117},
272 {0, 0x0040, 0x0108},
273 {0, 0x0019, 0x012c},
274 {0, 0x0040, 0x0116},
275 {0, 0x000a, 0x0115},
276 {0, 0x000b, 0x0115},
277 {0, 0x0078, 0x012d},
278 {0, 0x0046, 0x012f},
279 {0, 0xd141, 0x0124},
280 {0, 0x0000, 0x0127},
281 {0, 0xfea8, 0x0124},
282 {0, 0x0064, 0x0116},
283 {0, 0x0000, 0x0115},
284 {0, 0x0001, 0x0115},
285 {0, 0xffff, 0x0124},
286 {0, 0xfff9, 0x0124},
287 {0, 0x0086, 0x0127},
288 {0, 0xfff8, 0x0124},
289 {0, 0xfffd, 0x0124},
290 {0, 0x00aa, 0x0127},
291 {0, 0xfff8, 0x0124},
292 {0, 0xfffd, 0x0124},
293 {0, 0x0000, 0x0127},
294 {0, 0xfff8, 0x0124},
295 {0, 0xfffd, 0x0124},
296 {0, 0xfffa, 0x0124},
297 {0, 0xffff, 0x0124},
298 {0, 0xfff9, 0x0124},
299 {0, 0x0086, 0x0127},
300 {0, 0xfff8, 0x0124},
301 {0, 0xfffd, 0x0124},
302 {0, 0x00f2, 0x0127},
303 {0, 0xfff8, 0x0124},
304 {0, 0xfffd, 0x0124},
305 {0, 0x000f, 0x0127},
306 {0, 0xfff8, 0x0124},
307 {0, 0xfffd, 0x0124},
308 {0, 0xfffa, 0x0124},
309 {0, 0xffff, 0x0124},
310 {0, 0xfff9, 0x0124},
311 {0, 0x0086, 0x0127},
312 {0, 0xfff8, 0x0124},
313 {0, 0xfffd, 0x0124},
314 {0, 0x00f8, 0x0127},
315 {0, 0xfff8, 0x0124},
316 {0, 0xfffd, 0x0124},
317 {0, 0x00fc, 0x0127},
318 {0, 0xfff8, 0x0124},
319 {0, 0xfffd, 0x0124},
320 {0, 0xfffa, 0x0124},
321 {0, 0xffff, 0x0124},
322 {0, 0xfff9, 0x0124},
323 {0, 0x0086, 0x0127},
324 {0, 0xfff8, 0x0124},
325 {0, 0xfffd, 0x0124},
326 {0, 0x00f9, 0x0127},
327 {0, 0xfff8, 0x0124},
328 {0, 0xfffd, 0x0124},
329 {0, 0x003c, 0x0127},
330 {0, 0xfff8, 0x0124},
331 {0, 0xfffd, 0x0124},
332 {0, 0xfffa, 0x0124},
333 {0, 0xffff, 0x0124},
334 {0, 0xfff9, 0x0124},
335 {0, 0x0086, 0x0127},
336 {0, 0xfff8, 0x0124},
337 {0, 0xfffd, 0x0124},
338 {0, 0x0027, 0x0127},
339 {0, 0xfff8, 0x0124},
340 {0, 0xfffd, 0x0124},
341 {0, 0x0019, 0x0127},
342 {0, 0xfff8, 0x0124},
343 {0, 0xfffd, 0x0124},
344 {0, 0xfffa, 0x0124},
345 {0, 0xfff9, 0x0124},
346 {0, 0x0086, 0x0127},
347 {0, 0xfff8, 0x0124},
348 {0, 0xfffd, 0x0124},
349 {0, 0x0037, 0x0127},
350 {0, 0xfff8, 0x0124},
351 {0, 0xfffd, 0x0124},
352 {0, 0x0000, 0x0127},
353 {0, 0xfff8, 0x0124},
354 {0, 0xfffd, 0x0124},
355 {0, 0x0021, 0x0127},
356 {0, 0xfff8, 0x0124},
357 {0, 0xfffd, 0x0124},
358 {0, 0xfffa, 0x0124},
359 {0, 0xfff9, 0x0124},
360 {0, 0x0086, 0x0127},
361 {0, 0xfff8, 0x0124},
362 {0, 0xfffd, 0x0124},
363 {0, 0x0038, 0x0127},
364 {0, 0xfff8, 0x0124},
365 {0, 0xfffd, 0x0124},
366 {0, 0x0006, 0x0127},
367 {0, 0xfff8, 0x0124},
368 {0, 0xfffd, 0x0124},
369 {0, 0x0045, 0x0127},
370 {0, 0xfff8, 0x0124},
371 {0, 0xfffd, 0x0124},
372 {0, 0xfffa, 0x0124},
373 {0, 0xfff9, 0x0124},
374 {0, 0x0086, 0x0127},
375 {0, 0xfff8, 0x0124},
376 {0, 0xfffd, 0x0124},
377 {0, 0x0037, 0x0127},
378 {0, 0xfff8, 0x0124},
379 {0, 0xfffd, 0x0124},
380 {0, 0x0001, 0x0127},
381 {0, 0xfff8, 0x0124},
382 {0, 0xfffd, 0x0124},
383 {0, 0x002a, 0x0127},
384 {0, 0xfff8, 0x0124},
385 {0, 0xfffd, 0x0124},
386 {0, 0xfffa, 0x0124},
387 {0, 0xfff9, 0x0124},
388 {0, 0x0086, 0x0127},
389 {0, 0xfff8, 0x0124},
390 {0, 0xfffd, 0x0124},
391 {0, 0x0038, 0x0127},
392 {0, 0xfff8, 0x0124},
393 {0, 0xfffd, 0x0124},
394 {0, 0x0000, 0x0127},
395 {0, 0xfff8, 0x0124},
396 {0, 0xfffd, 0x0124},
397 {0, 0x000e, 0x0127},
398 {0, 0xfff8, 0x0124},
399 {0, 0xfffd, 0x0124},
400 {0, 0xfffa, 0x0124},
401 {0, 0xfff9, 0x0124},
402 {0, 0x0086, 0x0127},
403 {0, 0xfff8, 0x0124},
404 {0, 0xfffd, 0x0124},
405 {0, 0x0037, 0x0127},
406 {0, 0xfff8, 0x0124},
407 {0, 0xfffd, 0x0124},
408 {0, 0x0001, 0x0127},
409 {0, 0xfff8, 0x0124},
410 {0, 0xfffd, 0x0124},
411 {0, 0x002b, 0x0127},
412 {0, 0xfff8, 0x0124},
413 {0, 0xfffd, 0x0124},
414 {0, 0xfffa, 0x0124},
415 {0, 0xfff9, 0x0124},
416 {0, 0x0086, 0x0127},
417 {0, 0xfff8, 0x0124},
418 {0, 0xfffd, 0x0124},
419 {0, 0x0038, 0x0127},
420 {0, 0xfff8, 0x0124},
421 {0, 0xfffd, 0x0124},
422 {0, 0x0001, 0x0127},
423 {0, 0xfff8, 0x0124},
424 {0, 0xfffd, 0x0124},
425 {0, 0x00f4, 0x0127},
426 {0, 0xfff8, 0x0124},
427 {0, 0xfffd, 0x0124},
428 {0, 0xfffa, 0x0124},
429 {0, 0xfff9, 0x0124},
430 {0, 0x0086, 0x0127},
431 {0, 0xfff8, 0x0124},
432 {0, 0xfffd, 0x0124},
433 {0, 0x0037, 0x0127},
434 {0, 0xfff8, 0x0124},
435 {0, 0xfffd, 0x0124},
436 {0, 0x0001, 0x0127},
437 {0, 0xfff8, 0x0124},
438 {0, 0xfffd, 0x0124},
439 {0, 0x002c, 0x0127},
440 {0, 0xfff8, 0x0124},
441 {0, 0xfffd, 0x0124},
442 {0, 0xfffa, 0x0124},
443 {0, 0xfff9, 0x0124},
444 {0, 0x0086, 0x0127},
445 {0, 0xfff8, 0x0124},
446 {0, 0xfffd, 0x0124},
447 {0, 0x0038, 0x0127},
448 {0, 0xfff8, 0x0124},
449 {0, 0xfffd, 0x0124},
450 {0, 0x0001, 0x0127},
451 {0, 0xfff8, 0x0124},
452 {0, 0xfffd, 0x0124},
453 {0, 0x0004, 0x0127},
454 {0, 0xfff8, 0x0124},
455 {0, 0xfffd, 0x0124},
456 {0, 0xfffa, 0x0124},
457 {0, 0xfff9, 0x0124},
458 {0, 0x0086, 0x0127},
459 {0, 0xfff8, 0x0124},
460 {0, 0xfffd, 0x0124},
461 {0, 0x0037, 0x0127},
462 {0, 0xfff8, 0x0124},
463 {0, 0xfffd, 0x0124},
464 {0, 0x0001, 0x0127},
465 {0, 0xfff8, 0x0124},
466 {0, 0xfffd, 0x0124},
467 {0, 0x002d, 0x0127},
468 {0, 0xfff8, 0x0124},
469 {0, 0xfffd, 0x0124},
470 {0, 0xfffa, 0x0124},
471 {0, 0xfff9, 0x0124},
472 {0, 0x0086, 0x0127},
473 {0, 0xfff8, 0x0124},
474 {0, 0xfffd, 0x0124},
475 {0, 0x0038, 0x0127},
476 {0, 0xfff8, 0x0124},
477 {0, 0xfffd, 0x0124},
478 {0, 0x0000, 0x0127},
479 {0, 0xfff8, 0x0124},
480 {0, 0xfffd, 0x0124},
481 {0, 0x0014, 0x0127},
482 {0, 0xfff8, 0x0124},
483 {0, 0xfffd, 0x0124},
484 {0, 0xfffa, 0x0124},
485 {0, 0xfff9, 0x0124},
486 {0, 0x0086, 0x0127},
487 {0, 0xfff8, 0x0124},
488 {0, 0xfffd, 0x0124},
489 {0, 0x0037, 0x0127},
490 {0, 0xfff8, 0x0124},
491 {0, 0xfffd, 0x0124},
492 {0, 0x0001, 0x0127},
493 {0, 0xfff8, 0x0124},
494 {0, 0xfffd, 0x0124},
495 {0, 0x002e, 0x0127},
496 {0, 0xfff8, 0x0124},
497 {0, 0xfffd, 0x0124},
498 {0, 0xfffa, 0x0124},
499 {0, 0xfff9, 0x0124},
500 {0, 0x0086, 0x0127},
501 {0, 0xfff8, 0x0124},
502 {0, 0xfffd, 0x0124},
503 {0, 0x0038, 0x0127},
504 {0, 0xfff8, 0x0124},
505 {0, 0xfffd, 0x0124},
506 {0, 0x0003, 0x0127},
507 {0, 0xfff8, 0x0124},
508 {0, 0xfffd, 0x0124},
509 {0, 0x0000, 0x0127},
510 {0, 0xfff8, 0x0124},
511 {0, 0xfffd, 0x0124},
512 {0, 0xfffa, 0x0124},
513 {0, 0xfff9, 0x0124},
514 {0, 0x0086, 0x0127},
515 {0, 0xfff8, 0x0124},
516 {0, 0xfffd, 0x0124},
517 {0, 0x0037, 0x0127},
518 {0, 0xfff8, 0x0124},
519 {0, 0xfffd, 0x0124},
520 {0, 0x0001, 0x0127},
521 {0, 0xfff8, 0x0124},
522 {0, 0xfffd, 0x0124},
523 {0, 0x002f, 0x0127},
524 {0, 0xfff8, 0x0124},
525 {0, 0xfffd, 0x0124},
526 {0, 0xfffa, 0x0124},
527 {0, 0xfff9, 0x0124},
528 {0, 0x0086, 0x0127},
529 {0, 0xfff8, 0x0124},
530 {0, 0xfffd, 0x0124},
531 {0, 0x0038, 0x0127},
532 {0, 0xfff8, 0x0124},
533 {0, 0xfffd, 0x0124},
534 {0, 0x0003, 0x0127},
535 {0, 0xfff8, 0x0124},
536 {0, 0xfffd, 0x0124},
537 {0, 0x0014, 0x0127},
538 {0, 0xfff8, 0x0124},
539 {0, 0xfffd, 0x0124},
540 {0, 0xfffa, 0x0124},
541 {0, 0xfff9, 0x0124},
542 {0, 0x0086, 0x0127},
543 {0, 0xfff8, 0x0124},
544 {0, 0xfffd, 0x0124},
545 {0, 0x0037, 0x0127},
546 {0, 0xfff8, 0x0124},
547 {0, 0xfffd, 0x0124},
548 {0, 0x0001, 0x0127},
549 {0, 0xfff8, 0x0124},
550 {0, 0xfffd, 0x0124},
551 {0, 0x0040, 0x0127},
552 {0, 0xfff8, 0x0124},
553 {0, 0xfffd, 0x0124},
554 {0, 0xfffa, 0x0124},
555 {0, 0xfff9, 0x0124},
556 {0, 0x0086, 0x0127},
557 {0, 0xfff8, 0x0124},
558 {0, 0xfffd, 0x0124},
559 {0, 0x0038, 0x0127},
560 {0, 0xfff8, 0x0124},
561 {0, 0xfffd, 0x0124},
562 {0, 0x0000, 0x0127},
563 {0, 0xfff8, 0x0124},
564 {0, 0xfffd, 0x0124},
565 {0, 0x0040, 0x0127},
566 {0, 0xfff8, 0x0124},
567 {0, 0xfffd, 0x0124},
568 {0, 0xfffa, 0x0124},
569 {0, 0xfff9, 0x0124},
570 {0, 0x0086, 0x0127},
571 {0, 0xfff8, 0x0124},
572 {0, 0xfffd, 0x0124},
573 {0, 0x0037, 0x0127},
574 {0, 0xfff8, 0x0124},
575 {0, 0xfffd, 0x0124},
576 {0, 0x0001, 0x0127},
577 {0, 0xfff8, 0x0124},
578 {0, 0xfffd, 0x0124},
579 {0, 0x0053, 0x0127},
580 {0, 0xfff8, 0x0124},
581 {0, 0xfffd, 0x0124},
582 {0, 0xfffa, 0x0124},
583 {0, 0xfff9, 0x0124},
584 {0, 0x0086, 0x0127},
585 {0, 0xfff8, 0x0124},
586 {0, 0xfffd, 0x0124},
587 {0, 0x0038, 0x0127},
588 {0, 0xfff8, 0x0124},
589 {0, 0xfffd, 0x0124},
590 {0, 0x0000, 0x0127},
591 {0, 0xfff8, 0x0124},
592 {0, 0xfffd, 0x0124},
593 {0, 0x0038, 0x0127},
594 {0, 0xfff8, 0x0124},
595 {0, 0xfffd, 0x0124},
596 {0, 0xfffa, 0x0124},
597 {0, 0x0000, 0x0101},
598 {0, 0x00a0, 0x0103},
599 {0, 0x0078, 0x0105},
600 {0, 0x0000, 0x010a},
601 {0, 0x0024, 0x010b},
602 {0, 0x0028, 0x0119},
603 {0, 0x0088, 0x011b},
604 {0, 0x0002, 0x011d},
605 {0, 0x0003, 0x011e},
606 {0, 0x0000, 0x0129},
607 {0, 0x00fc, 0x012b},
608 {0, 0x0008, 0x0102},
609 {0, 0x0000, 0x0104},
610 {0, 0x0008, 0x011a},
611 {0, 0x0028, 0x011c},
612 {0, 0x0021, 0x012a},
613 {0, 0x0000, 0x0118},
614 {0, 0x0000, 0x0132},
615 {0, 0x0000, 0x0109},
616 {0, 0xfff9, 0x0124},
617 {0, 0x0086, 0x0127},
618 {0, 0xfff8, 0x0124},
619 {0, 0xfffd, 0x0124},
620 {0, 0x0037, 0x0127},
621 {0, 0xfff8, 0x0124},
622 {0, 0xfffd, 0x0124},
623 {0, 0x0001, 0x0127},
624 {0, 0xfff8, 0x0124},
625 {0, 0xfffd, 0x0124},
626 {0, 0x0031, 0x0127},
627 {0, 0xfff8, 0x0124},
628 {0, 0xfffd, 0x0124},
629 {0, 0xfffa, 0x0124},
630 {0, 0xfff9, 0x0124},
631 {0, 0x0086, 0x0127},
632 {0, 0xfff8, 0x0124},
633 {0, 0xfffd, 0x0124},
634 {0, 0x0038, 0x0127},
635 {0, 0xfff8, 0x0124},
636 {0, 0xfffd, 0x0124},
637 {0, 0x0000, 0x0127},
638 {0, 0xfff8, 0x0124},
639 {0, 0xfffd, 0x0124},
640 {0, 0x0000, 0x0127},
641 {0, 0xfff8, 0x0124},
642 {0, 0xfffd, 0x0124},
643 {0, 0xfffa, 0x0124},
644 {0, 0xfff9, 0x0124},
645 {0, 0x0086, 0x0127},
646 {0, 0xfff8, 0x0124},
647 {0, 0xfffd, 0x0124},
648 {0, 0x0037, 0x0127},
649 {0, 0xfff8, 0x0124},
650 {0, 0xfffd, 0x0124},
651 {0, 0x0001, 0x0127},
652 {0, 0xfff8, 0x0124},
653 {0, 0xfffd, 0x0124},
654 {0, 0x0040, 0x0127},
655 {0, 0xfff8, 0x0124},
656 {0, 0xfffd, 0x0124},
657 {0, 0xfffa, 0x0124},
658 {0, 0xfff9, 0x0124},
659 {0, 0x0086, 0x0127},
660 {0, 0xfff8, 0x0124},
661 {0, 0xfffd, 0x0124},
662 {0, 0x0038, 0x0127},
663 {0, 0xfff8, 0x0124},
664 {0, 0xfffd, 0x0124},
665 {0, 0x0000, 0x0127},
666 {0, 0xfff8, 0x0124},
667 {0, 0xfffd, 0x0124},
668 {0, 0x0040, 0x0127},
669 {0, 0xfff8, 0x0124},
670 {0, 0xfffd, 0x0124},
671 {0, 0xfffa, 0x0124},
672 {0, 0xfff9, 0x0124},
673 {0, 0x0086, 0x0127},
674 {0, 0xfff8, 0x0124},
675 {0, 0xfffd, 0x0124},
676 {0, 0x0037, 0x0127},
677 {0, 0xfff8, 0x0124},
678 {0, 0xfffd, 0x0124},
679 {0, 0x0000, 0x0127},
680 {0, 0xfff8, 0x0124},
681 {0, 0xfffd, 0x0124},
682 {0, 0x00dc, 0x0127},
683 {0, 0xfff8, 0x0124},
684 {0, 0xfffd, 0x0124},
685 {0, 0xfffa, 0x0124},
686 {0, 0xfff9, 0x0124},
687 {0, 0x0086, 0x0127},
688 {0, 0xfff8, 0x0124},
689 {0, 0xfffd, 0x0124},
690 {0, 0x0038, 0x0127},
691 {0, 0xfff8, 0x0124},
692 {0, 0xfffd, 0x0124},
693 {0, 0x0000, 0x0127},
694 {0, 0xfff8, 0x0124},
695 {0, 0xfffd, 0x0124},
696 {0, 0x0000, 0x0127},
697 {0, 0xfff8, 0x0124},
698 {0, 0xfffd, 0x0124},
699 {0, 0xfffa, 0x0124},
700 {0, 0xfff9, 0x0124},
701 {0, 0x0086, 0x0127},
702 {0, 0xfff8, 0x0124},
703 {0, 0xfffd, 0x0124},
704 {0, 0x0037, 0x0127},
705 {0, 0xfff8, 0x0124},
706 {0, 0xfffd, 0x0124},
707 {0, 0x0001, 0x0127},
708 {0, 0xfff8, 0x0124},
709 {0, 0xfffd, 0x0124},
710 {0, 0x0032, 0x0127},
711 {0, 0xfff8, 0x0124},
712 {0, 0xfffd, 0x0124},
713 {0, 0xfffa, 0x0124},
714 {0, 0xfff9, 0x0124},
715 {0, 0x0086, 0x0127},
716 {0, 0xfff8, 0x0124},
717 {0, 0xfffd, 0x0124},
718 {0, 0x0038, 0x0127},
719 {0, 0xfff8, 0x0124},
720 {0, 0xfffd, 0x0124},
721 {0, 0x0001, 0x0127},
722 {0, 0xfff8, 0x0124},
723 {0, 0xfffd, 0x0124},
724 {0, 0x0020, 0x0127},
725 {0, 0xfff8, 0x0124},
726 {0, 0xfffd, 0x0124},
727 {0, 0xfffa, 0x0124},
728 {0, 0xfff9, 0x0124},
729 {0, 0x0086, 0x0127},
730 {0, 0xfff8, 0x0124},
731 {0, 0xfffd, 0x0124},
732 {0, 0x0037, 0x0127},
733 {0, 0xfff8, 0x0124},
734 {0, 0xfffd, 0x0124},
735 {0, 0x0001, 0x0127},
736 {0, 0xfff8, 0x0124},
737 {0, 0xfffd, 0x0124},
738 {0, 0x0040, 0x0127},
739 {0, 0xfff8, 0x0124},
740 {0, 0xfffd, 0x0124},
741 {0, 0xfffa, 0x0124},
742 {0, 0xfff9, 0x0124},
743 {0, 0x0086, 0x0127},
744 {0, 0xfff8, 0x0124},
745 {0, 0xfffd, 0x0124},
746 {0, 0x0038, 0x0127},
747 {0, 0xfff8, 0x0124},
748 {0, 0xfffd, 0x0124},
749 {0, 0x0000, 0x0127},
750 {0, 0xfff8, 0x0124},
751 {0, 0xfffd, 0x0124},
752 {0, 0x0040, 0x0127},
753 {0, 0xfff8, 0x0124},
754 {0, 0xfffd, 0x0124},
755 {0, 0xfffa, 0x0124},
756 {0, 0xfff9, 0x0124},
757 {0, 0x0086, 0x0127},
758 {0, 0xfff8, 0x0124},
759 {0, 0xfffd, 0x0124},
760 {0, 0x0037, 0x0127},
761 {0, 0xfff8, 0x0124},
762 {0, 0xfffd, 0x0124},
763 {0, 0x0000, 0x0127},
764 {0, 0xfff8, 0x0124},
765 {0, 0xfffd, 0x0124},
766 {0, 0x0030, 0x0127},
767 {0, 0xfff8, 0x0124},
768 {0, 0xfffd, 0x0124},
769 {0, 0xfffa, 0x0124},
770 {0, 0xfff9, 0x0124},
771 {0, 0x0086, 0x0127},
772 {0, 0xfff8, 0x0124},
773 {0, 0xfffd, 0x0124},
774 {0, 0x0038, 0x0127},
775 {0, 0xfff8, 0x0124},
776 {0, 0xfffd, 0x0124},
777 {0, 0x0008, 0x0127},
778 {0, 0xfff8, 0x0124},
779 {0, 0xfffd, 0x0124},
780 {0, 0x0000, 0x0127},
781 {0, 0xfff8, 0x0124},
782 {0, 0xfffd, 0x0124},
783 {0, 0xfffa, 0x0124},
784 {0, 0x0003, 0x0111},
785 };
786
787 /* TESTME the old ibmcam driver repeats certain commands to Model1 cameras, we
788 do the same for now (testing needed to see if this is really necessary) */
789 static const int cit_model1_ntries = 5;
790 static const int cit_model1_ntries2 = 2;
791
792 static int cit_write_reg(struct gspca_dev *gspca_dev, u16 value, u16 index)
793 {
794 struct usb_device *udev = gspca_dev->dev;
795 int err;
796
797 err = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x00,
798 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT,
799 value, index, NULL, 0, 1000);
800 if (err < 0)
801 err("Failed to write a register (index 0x%04X,"
802 " value 0x%02X, error %d)", index, value, err);
803
804 return 0;
805 }
806
807 static int cit_read_reg(struct gspca_dev *gspca_dev, u16 index)
808 {
809 struct usb_device *udev = gspca_dev->dev;
810 __u8 *buf = gspca_dev->usb_buf;
811 int res;
812
813 res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x01,
814 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_ENDPOINT,
815 0x00, index, buf, 8, 1000);
816 if (res < 0) {
817 err("Failed to read a register (index 0x%04X, error %d)",
818 index, res);
819 return res;
820 }
821
822 PDEBUG(D_PROBE,
823 "Register %04x value: %02x %02x %02x %02x %02x %02x %02x %02x",
824 index,
825 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
826
827 return 0;
828 }
829
830 /*
831 * cit_send_FF_04_02()
832 *
833 * This procedure sends magic 3-command prefix to the camera.
834 * The purpose of this prefix is not known.
835 *
836 * History:
837 * 1/2/00 Created.
838 */
839 static void cit_send_FF_04_02(struct gspca_dev *gspca_dev)
840 {
841 cit_write_reg(gspca_dev, 0x00FF, 0x0127);
842 cit_write_reg(gspca_dev, 0x0004, 0x0124);
843 cit_write_reg(gspca_dev, 0x0002, 0x0124);
844 }
845
846 static void cit_send_00_04_06(struct gspca_dev *gspca_dev)
847 {
848 cit_write_reg(gspca_dev, 0x0000, 0x0127);
849 cit_write_reg(gspca_dev, 0x0004, 0x0124);
850 cit_write_reg(gspca_dev, 0x0006, 0x0124);
851 }
852
853 static void cit_send_x_00(struct gspca_dev *gspca_dev, unsigned short x)
854 {
855 cit_write_reg(gspca_dev, x, 0x0127);
856 cit_write_reg(gspca_dev, 0x0000, 0x0124);
857 }
858
859 static void cit_send_x_00_05(struct gspca_dev *gspca_dev, unsigned short x)
860 {
861 cit_send_x_00(gspca_dev, x);
862 cit_write_reg(gspca_dev, 0x0005, 0x0124);
863 }
864
865 static void cit_send_x_00_05_02(struct gspca_dev *gspca_dev, unsigned short x)
866 {
867 cit_write_reg(gspca_dev, x, 0x0127);
868 cit_write_reg(gspca_dev, 0x0000, 0x0124);
869 cit_write_reg(gspca_dev, 0x0005, 0x0124);
870 cit_write_reg(gspca_dev, 0x0002, 0x0124);
871 }
872
873 static void cit_send_x_01_00_05(struct gspca_dev *gspca_dev, u16 x)
874 {
875 cit_write_reg(gspca_dev, x, 0x0127);
876 cit_write_reg(gspca_dev, 0x0001, 0x0124);
877 cit_write_reg(gspca_dev, 0x0000, 0x0124);
878 cit_write_reg(gspca_dev, 0x0005, 0x0124);
879 }
880
881 static void cit_send_x_00_05_02_01(struct gspca_dev *gspca_dev, u16 x)
882 {
883 cit_write_reg(gspca_dev, x, 0x0127);
884 cit_write_reg(gspca_dev, 0x0000, 0x0124);
885 cit_write_reg(gspca_dev, 0x0005, 0x0124);
886 cit_write_reg(gspca_dev, 0x0002, 0x0124);
887 cit_write_reg(gspca_dev, 0x0001, 0x0124);
888 }
889
890 static void cit_send_x_00_05_02_08_01(struct gspca_dev *gspca_dev, u16 x)
891 {
892 cit_write_reg(gspca_dev, x, 0x0127);
893 cit_write_reg(gspca_dev, 0x0000, 0x0124);
894 cit_write_reg(gspca_dev, 0x0005, 0x0124);
895 cit_write_reg(gspca_dev, 0x0002, 0x0124);
896 cit_write_reg(gspca_dev, 0x0008, 0x0124);
897 cit_write_reg(gspca_dev, 0x0001, 0x0124);
898 }
899
900 static void cit_Packet_Format1(struct gspca_dev *gspca_dev, u16 fkey, u16 val)
901 {
902 cit_send_x_01_00_05(gspca_dev, 0x0088);
903 cit_send_x_00_05(gspca_dev, fkey);
904 cit_send_x_00_05_02_08_01(gspca_dev, val);
905 cit_send_x_00_05(gspca_dev, 0x0088);
906 cit_send_x_00_05_02_01(gspca_dev, fkey);
907 cit_send_x_00_05(gspca_dev, 0x0089);
908 cit_send_x_00(gspca_dev, fkey);
909 cit_send_00_04_06(gspca_dev);
910 cit_read_reg(gspca_dev, 0x0126);
911 cit_send_FF_04_02(gspca_dev);
912 }
913
914 static void cit_PacketFormat2(struct gspca_dev *gspca_dev, u16 fkey, u16 val)
915 {
916 cit_send_x_01_00_05(gspca_dev, 0x0088);
917 cit_send_x_00_05(gspca_dev, fkey);
918 cit_send_x_00_05_02(gspca_dev, val);
919 }
920
921 static void cit_model2_Packet2(struct gspca_dev *gspca_dev)
922 {
923 cit_write_reg(gspca_dev, 0x00ff, 0x012d);
924 cit_write_reg(gspca_dev, 0xfea3, 0x0124);
925 }
926
927 static void cit_model2_Packet1(struct gspca_dev *gspca_dev, u16 v1, u16 v2)
928 {
929 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
930 cit_write_reg(gspca_dev, 0x00ff, 0x012e);
931 cit_write_reg(gspca_dev, v1, 0x012f);
932 cit_write_reg(gspca_dev, 0x00ff, 0x0130);
933 cit_write_reg(gspca_dev, 0xc719, 0x0124);
934 cit_write_reg(gspca_dev, v2, 0x0127);
935
936 cit_model2_Packet2(gspca_dev);
937 }
938
939 /*
940 * cit_model3_Packet1()
941 *
942 * 00_0078_012d
943 * 00_0097_012f
944 * 00_d141_0124
945 * 00_0096_0127
946 * 00_fea8_0124
947 */
948 static void cit_model3_Packet1(struct gspca_dev *gspca_dev, u16 v1, u16 v2)
949 {
950 cit_write_reg(gspca_dev, 0x0078, 0x012d);
951 cit_write_reg(gspca_dev, v1, 0x012f);
952 cit_write_reg(gspca_dev, 0xd141, 0x0124);
953 cit_write_reg(gspca_dev, v2, 0x0127);
954 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
955 }
956
957 static void cit_model4_Packet1(struct gspca_dev *gspca_dev, u16 v1, u16 v2)
958 {
959 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
960 cit_write_reg(gspca_dev, v1, 0x012f);
961 cit_write_reg(gspca_dev, 0xd141, 0x0124);
962 cit_write_reg(gspca_dev, v2, 0x0127);
963 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
964 }
965
966 static void cit_model4_BrightnessPacket(struct gspca_dev *gspca_dev, u16 val)
967 {
968 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
969 cit_write_reg(gspca_dev, 0x0026, 0x012f);
970 cit_write_reg(gspca_dev, 0xd141, 0x0124);
971 cit_write_reg(gspca_dev, val, 0x0127);
972 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
973 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
974 cit_write_reg(gspca_dev, 0x0038, 0x012d);
975 cit_write_reg(gspca_dev, 0x0004, 0x012f);
976 cit_write_reg(gspca_dev, 0xd145, 0x0124);
977 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
978 }
979
980 /* this function is called at probe time */
981 static int sd_config(struct gspca_dev *gspca_dev,
982 const struct usb_device_id *id)
983 {
984 struct sd *sd = (struct sd *) gspca_dev;
985 struct cam *cam;
986
987 sd->model = id->driver_info;
988 if (sd->model == CIT_MODEL3 && ibm_netcam_pro)
989 sd->model = CIT_IBM_NETCAM_PRO;
990
991 cam = &gspca_dev->cam;
992 switch (sd->model) {
993 case CIT_MODEL0:
994 cam->cam_mode = model0_mode;
995 cam->nmodes = ARRAY_SIZE(model0_mode);
996 cam->reverse_alts = 1;
997 gspca_dev->ctrl_dis = ~((1 << SD_CONTRAST) | (1 << SD_HFLIP));
998 sd->sof_len = 4;
999 break;
1000 case CIT_MODEL1:
1001 cam->cam_mode = cif_yuv_mode;
1002 cam->nmodes = ARRAY_SIZE(cif_yuv_mode);
1003 cam->reverse_alts = 1;
1004 gspca_dev->ctrl_dis = (1 << SD_HUE) | (1 << SD_HFLIP);
1005 sd->sof_len = 4;
1006 break;
1007 case CIT_MODEL2:
1008 cam->cam_mode = model2_mode + 1; /* no 160x120 */
1009 cam->nmodes = 3;
1010 gspca_dev->ctrl_dis = (1 << SD_CONTRAST) |
1011 (1 << SD_SHARPNESS) |
1012 (1 << SD_HFLIP);
1013 break;
1014 case CIT_MODEL3:
1015 cam->cam_mode = vga_yuv_mode;
1016 cam->nmodes = ARRAY_SIZE(vga_yuv_mode);
1017 gspca_dev->ctrl_dis = (1 << SD_HUE) |
1018 (1 << SD_LIGHTING) |
1019 (1 << SD_HFLIP);
1020 sd->stop_on_control_change = 1;
1021 sd->sof_len = 4;
1022 break;
1023 case CIT_MODEL4:
1024 cam->cam_mode = model2_mode;
1025 cam->nmodes = ARRAY_SIZE(model2_mode);
1026 gspca_dev->ctrl_dis = (1 << SD_CONTRAST) |
1027 (1 << SD_SHARPNESS) |
1028 (1 << SD_LIGHTING) |
1029 (1 << SD_HFLIP);
1030 break;
1031 case CIT_IBM_NETCAM_PRO:
1032 cam->cam_mode = vga_yuv_mode;
1033 cam->nmodes = 2; /* no 640 x 480 */
1034 cam->input_flags = V4L2_IN_ST_VFLIP;
1035 gspca_dev->ctrl_dis = ~(1 << SD_CONTRAST);
1036 sd->stop_on_control_change = 1;
1037 sd->sof_len = 4;
1038 break;
1039 }
1040
1041 sd->brightness = BRIGHTNESS_DEFAULT;
1042 sd->contrast = CONTRAST_DEFAULT;
1043 sd->hue = HUE_DEFAULT;
1044 sd->sharpness = SHARPNESS_DEFAULT;
1045 sd->lighting = LIGHTING_DEFAULT;
1046 sd->hflip = HFLIP_DEFAULT;
1047
1048 return 0;
1049 }
1050
1051 static int cit_init_model0(struct gspca_dev *gspca_dev)
1052 {
1053 cit_write_reg(gspca_dev, 0x0000, 0x0100); /* turn on led */
1054 cit_write_reg(gspca_dev, 0x0001, 0x0112); /* turn on autogain ? */
1055 cit_write_reg(gspca_dev, 0x0000, 0x0400);
1056 cit_write_reg(gspca_dev, 0x0001, 0x0400);
1057 cit_write_reg(gspca_dev, 0x0000, 0x0420);
1058 cit_write_reg(gspca_dev, 0x0001, 0x0420);
1059 cit_write_reg(gspca_dev, 0x000d, 0x0409);
1060 cit_write_reg(gspca_dev, 0x0002, 0x040a);
1061 cit_write_reg(gspca_dev, 0x0018, 0x0405);
1062 cit_write_reg(gspca_dev, 0x0008, 0x0435);
1063 cit_write_reg(gspca_dev, 0x0026, 0x040b);
1064 cit_write_reg(gspca_dev, 0x0007, 0x0437);
1065 cit_write_reg(gspca_dev, 0x0015, 0x042f);
1066 cit_write_reg(gspca_dev, 0x002b, 0x0439);
1067 cit_write_reg(gspca_dev, 0x0026, 0x043a);
1068 cit_write_reg(gspca_dev, 0x0008, 0x0438);
1069 cit_write_reg(gspca_dev, 0x001e, 0x042b);
1070 cit_write_reg(gspca_dev, 0x0041, 0x042c);
1071
1072 return 0;
1073 }
1074
1075 static int cit_init_ibm_netcam_pro(struct gspca_dev *gspca_dev)
1076 {
1077 cit_read_reg(gspca_dev, 0x128);
1078 cit_write_reg(gspca_dev, 0x0003, 0x0133);
1079 cit_write_reg(gspca_dev, 0x0000, 0x0117);
1080 cit_write_reg(gspca_dev, 0x0008, 0x0123);
1081 cit_write_reg(gspca_dev, 0x0000, 0x0100);
1082 cit_read_reg(gspca_dev, 0x0116);
1083 cit_write_reg(gspca_dev, 0x0060, 0x0116);
1084 cit_write_reg(gspca_dev, 0x0002, 0x0112);
1085 cit_write_reg(gspca_dev, 0x0000, 0x0133);
1086 cit_write_reg(gspca_dev, 0x0000, 0x0123);
1087 cit_write_reg(gspca_dev, 0x0001, 0x0117);
1088 cit_write_reg(gspca_dev, 0x0040, 0x0108);
1089 cit_write_reg(gspca_dev, 0x0019, 0x012c);
1090 cit_write_reg(gspca_dev, 0x0060, 0x0116);
1091 cit_write_reg(gspca_dev, 0x0002, 0x0115);
1092 cit_write_reg(gspca_dev, 0x000b, 0x0115);
1093
1094 cit_write_reg(gspca_dev, 0x0078, 0x012d);
1095 cit_write_reg(gspca_dev, 0x0001, 0x012f);
1096 cit_write_reg(gspca_dev, 0xd141, 0x0124);
1097 cit_write_reg(gspca_dev, 0x0079, 0x012d);
1098 cit_write_reg(gspca_dev, 0x00ff, 0x0130);
1099 cit_write_reg(gspca_dev, 0xcd41, 0x0124);
1100 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
1101 cit_read_reg(gspca_dev, 0x0126);
1102
1103 cit_model3_Packet1(gspca_dev, 0x0000, 0x0000);
1104 cit_model3_Packet1(gspca_dev, 0x0000, 0x0001);
1105 cit_model3_Packet1(gspca_dev, 0x000b, 0x0000);
1106 cit_model3_Packet1(gspca_dev, 0x000c, 0x0008);
1107 cit_model3_Packet1(gspca_dev, 0x000d, 0x003a);
1108 cit_model3_Packet1(gspca_dev, 0x000e, 0x0060);
1109 cit_model3_Packet1(gspca_dev, 0x000f, 0x0060);
1110 cit_model3_Packet1(gspca_dev, 0x0010, 0x0008);
1111 cit_model3_Packet1(gspca_dev, 0x0011, 0x0004);
1112 cit_model3_Packet1(gspca_dev, 0x0012, 0x0028);
1113 cit_model3_Packet1(gspca_dev, 0x0013, 0x0002);
1114 cit_model3_Packet1(gspca_dev, 0x0014, 0x0000);
1115 cit_model3_Packet1(gspca_dev, 0x0015, 0x00fb);
1116 cit_model3_Packet1(gspca_dev, 0x0016, 0x0002);
1117 cit_model3_Packet1(gspca_dev, 0x0017, 0x0037);
1118 cit_model3_Packet1(gspca_dev, 0x0018, 0x0036);
1119 cit_model3_Packet1(gspca_dev, 0x001e, 0x0000);
1120 cit_model3_Packet1(gspca_dev, 0x001f, 0x0008);
1121 cit_model3_Packet1(gspca_dev, 0x0020, 0x00c1);
1122 cit_model3_Packet1(gspca_dev, 0x0021, 0x0034);
1123 cit_model3_Packet1(gspca_dev, 0x0022, 0x0034);
1124 cit_model3_Packet1(gspca_dev, 0x0025, 0x0002);
1125 cit_model3_Packet1(gspca_dev, 0x0028, 0x0022);
1126 cit_model3_Packet1(gspca_dev, 0x0029, 0x000a);
1127 cit_model3_Packet1(gspca_dev, 0x002b, 0x0000);
1128 cit_model3_Packet1(gspca_dev, 0x002c, 0x0000);
1129 cit_model3_Packet1(gspca_dev, 0x002d, 0x00ff);
1130 cit_model3_Packet1(gspca_dev, 0x002e, 0x00ff);
1131 cit_model3_Packet1(gspca_dev, 0x002f, 0x00ff);
1132 cit_model3_Packet1(gspca_dev, 0x0030, 0x00ff);
1133 cit_model3_Packet1(gspca_dev, 0x0031, 0x00ff);
1134 cit_model3_Packet1(gspca_dev, 0x0032, 0x0007);
1135 cit_model3_Packet1(gspca_dev, 0x0033, 0x0005);
1136 cit_model3_Packet1(gspca_dev, 0x0037, 0x0040);
1137 cit_model3_Packet1(gspca_dev, 0x0039, 0x0000);
1138 cit_model3_Packet1(gspca_dev, 0x003a, 0x0000);
1139 cit_model3_Packet1(gspca_dev, 0x003b, 0x0001);
1140 cit_model3_Packet1(gspca_dev, 0x003c, 0x0000);
1141 cit_model3_Packet1(gspca_dev, 0x0040, 0x000c);
1142 cit_model3_Packet1(gspca_dev, 0x0041, 0x00fb);
1143 cit_model3_Packet1(gspca_dev, 0x0042, 0x0002);
1144 cit_model3_Packet1(gspca_dev, 0x0043, 0x0000);
1145 cit_model3_Packet1(gspca_dev, 0x0045, 0x0000);
1146 cit_model3_Packet1(gspca_dev, 0x0046, 0x0000);
1147 cit_model3_Packet1(gspca_dev, 0x0047, 0x0000);
1148 cit_model3_Packet1(gspca_dev, 0x0048, 0x0000);
1149 cit_model3_Packet1(gspca_dev, 0x0049, 0x0000);
1150 cit_model3_Packet1(gspca_dev, 0x004a, 0x00ff);
1151 cit_model3_Packet1(gspca_dev, 0x004b, 0x00ff);
1152 cit_model3_Packet1(gspca_dev, 0x004c, 0x00ff);
1153 cit_model3_Packet1(gspca_dev, 0x004f, 0x0000);
1154 cit_model3_Packet1(gspca_dev, 0x0050, 0x0000);
1155 cit_model3_Packet1(gspca_dev, 0x0051, 0x0002);
1156 cit_model3_Packet1(gspca_dev, 0x0055, 0x0000);
1157 cit_model3_Packet1(gspca_dev, 0x0056, 0x0000);
1158 cit_model3_Packet1(gspca_dev, 0x0057, 0x0000);
1159 cit_model3_Packet1(gspca_dev, 0x0058, 0x0002);
1160 cit_model3_Packet1(gspca_dev, 0x0059, 0x0000);
1161 cit_model3_Packet1(gspca_dev, 0x005c, 0x0016);
1162 cit_model3_Packet1(gspca_dev, 0x005d, 0x0022);
1163 cit_model3_Packet1(gspca_dev, 0x005e, 0x003c);
1164 cit_model3_Packet1(gspca_dev, 0x005f, 0x0050);
1165 cit_model3_Packet1(gspca_dev, 0x0060, 0x0044);
1166 cit_model3_Packet1(gspca_dev, 0x0061, 0x0005);
1167 cit_model3_Packet1(gspca_dev, 0x006a, 0x007e);
1168 cit_model3_Packet1(gspca_dev, 0x006f, 0x0000);
1169 cit_model3_Packet1(gspca_dev, 0x0072, 0x001b);
1170 cit_model3_Packet1(gspca_dev, 0x0073, 0x0005);
1171 cit_model3_Packet1(gspca_dev, 0x0074, 0x000a);
1172 cit_model3_Packet1(gspca_dev, 0x0075, 0x001b);
1173 cit_model3_Packet1(gspca_dev, 0x0076, 0x002a);
1174 cit_model3_Packet1(gspca_dev, 0x0077, 0x003c);
1175 cit_model3_Packet1(gspca_dev, 0x0078, 0x0050);
1176 cit_model3_Packet1(gspca_dev, 0x007b, 0x0000);
1177 cit_model3_Packet1(gspca_dev, 0x007c, 0x0011);
1178 cit_model3_Packet1(gspca_dev, 0x007d, 0x0024);
1179 cit_model3_Packet1(gspca_dev, 0x007e, 0x0043);
1180 cit_model3_Packet1(gspca_dev, 0x007f, 0x005a);
1181 cit_model3_Packet1(gspca_dev, 0x0084, 0x0020);
1182 cit_model3_Packet1(gspca_dev, 0x0085, 0x0033);
1183 cit_model3_Packet1(gspca_dev, 0x0086, 0x000a);
1184 cit_model3_Packet1(gspca_dev, 0x0087, 0x0030);
1185 cit_model3_Packet1(gspca_dev, 0x0088, 0x0070);
1186 cit_model3_Packet1(gspca_dev, 0x008b, 0x0008);
1187 cit_model3_Packet1(gspca_dev, 0x008f, 0x0000);
1188 cit_model3_Packet1(gspca_dev, 0x0090, 0x0006);
1189 cit_model3_Packet1(gspca_dev, 0x0091, 0x0028);
1190 cit_model3_Packet1(gspca_dev, 0x0092, 0x005a);
1191 cit_model3_Packet1(gspca_dev, 0x0093, 0x0082);
1192 cit_model3_Packet1(gspca_dev, 0x0096, 0x0014);
1193 cit_model3_Packet1(gspca_dev, 0x0097, 0x0020);
1194 cit_model3_Packet1(gspca_dev, 0x0098, 0x0000);
1195 cit_model3_Packet1(gspca_dev, 0x00b0, 0x0046);
1196 cit_model3_Packet1(gspca_dev, 0x00b1, 0x0000);
1197 cit_model3_Packet1(gspca_dev, 0x00b2, 0x0000);
1198 cit_model3_Packet1(gspca_dev, 0x00b3, 0x0004);
1199 cit_model3_Packet1(gspca_dev, 0x00b4, 0x0007);
1200 cit_model3_Packet1(gspca_dev, 0x00b6, 0x0002);
1201 cit_model3_Packet1(gspca_dev, 0x00b7, 0x0004);
1202 cit_model3_Packet1(gspca_dev, 0x00bb, 0x0000);
1203 cit_model3_Packet1(gspca_dev, 0x00bc, 0x0001);
1204 cit_model3_Packet1(gspca_dev, 0x00bd, 0x0000);
1205 cit_model3_Packet1(gspca_dev, 0x00bf, 0x0000);
1206 cit_model3_Packet1(gspca_dev, 0x00c0, 0x00c8);
1207 cit_model3_Packet1(gspca_dev, 0x00c1, 0x0014);
1208 cit_model3_Packet1(gspca_dev, 0x00c2, 0x0001);
1209 cit_model3_Packet1(gspca_dev, 0x00c3, 0x0000);
1210 cit_model3_Packet1(gspca_dev, 0x00c4, 0x0004);
1211 cit_model3_Packet1(gspca_dev, 0x00cb, 0x00bf);
1212 cit_model3_Packet1(gspca_dev, 0x00cc, 0x00bf);
1213 cit_model3_Packet1(gspca_dev, 0x00cd, 0x00bf);
1214 cit_model3_Packet1(gspca_dev, 0x00ce, 0x0000);
1215 cit_model3_Packet1(gspca_dev, 0x00cf, 0x0020);
1216 cit_model3_Packet1(gspca_dev, 0x00d0, 0x0040);
1217 cit_model3_Packet1(gspca_dev, 0x00d1, 0x00bf);
1218 cit_model3_Packet1(gspca_dev, 0x00d1, 0x00bf);
1219 cit_model3_Packet1(gspca_dev, 0x00d2, 0x00bf);
1220 cit_model3_Packet1(gspca_dev, 0x00d3, 0x00bf);
1221 cit_model3_Packet1(gspca_dev, 0x00ea, 0x0008);
1222 cit_model3_Packet1(gspca_dev, 0x00eb, 0x0000);
1223 cit_model3_Packet1(gspca_dev, 0x00ec, 0x00e8);
1224 cit_model3_Packet1(gspca_dev, 0x00ed, 0x0001);
1225 cit_model3_Packet1(gspca_dev, 0x00ef, 0x0022);
1226 cit_model3_Packet1(gspca_dev, 0x00f0, 0x0000);
1227 cit_model3_Packet1(gspca_dev, 0x00f2, 0x0028);
1228 cit_model3_Packet1(gspca_dev, 0x00f4, 0x0002);
1229 cit_model3_Packet1(gspca_dev, 0x00f5, 0x0000);
1230 cit_model3_Packet1(gspca_dev, 0x00fa, 0x0000);
1231 cit_model3_Packet1(gspca_dev, 0x00fb, 0x0001);
1232 cit_model3_Packet1(gspca_dev, 0x00fc, 0x0000);
1233 cit_model3_Packet1(gspca_dev, 0x00fd, 0x0000);
1234 cit_model3_Packet1(gspca_dev, 0x00fe, 0x0000);
1235 cit_model3_Packet1(gspca_dev, 0x00ff, 0x0000);
1236
1237 cit_model3_Packet1(gspca_dev, 0x00be, 0x0003);
1238 cit_model3_Packet1(gspca_dev, 0x00c8, 0x0000);
1239 cit_model3_Packet1(gspca_dev, 0x00c9, 0x0020);
1240 cit_model3_Packet1(gspca_dev, 0x00ca, 0x0040);
1241 cit_model3_Packet1(gspca_dev, 0x0053, 0x0001);
1242 cit_model3_Packet1(gspca_dev, 0x0082, 0x000e);
1243 cit_model3_Packet1(gspca_dev, 0x0083, 0x0020);
1244 cit_model3_Packet1(gspca_dev, 0x0034, 0x003c);
1245 cit_model3_Packet1(gspca_dev, 0x006e, 0x0055);
1246 cit_model3_Packet1(gspca_dev, 0x0062, 0x0005);
1247 cit_model3_Packet1(gspca_dev, 0x0063, 0x0008);
1248 cit_model3_Packet1(gspca_dev, 0x0066, 0x000a);
1249 cit_model3_Packet1(gspca_dev, 0x0067, 0x0006);
1250 cit_model3_Packet1(gspca_dev, 0x006b, 0x0010);
1251 cit_model3_Packet1(gspca_dev, 0x005a, 0x0001);
1252 cit_model3_Packet1(gspca_dev, 0x005b, 0x000a);
1253 cit_model3_Packet1(gspca_dev, 0x0023, 0x0006);
1254 cit_model3_Packet1(gspca_dev, 0x0026, 0x0004);
1255 cit_model3_Packet1(gspca_dev, 0x0036, 0x0069);
1256 cit_model3_Packet1(gspca_dev, 0x0038, 0x0064);
1257 cit_model3_Packet1(gspca_dev, 0x003d, 0x0003);
1258 cit_model3_Packet1(gspca_dev, 0x003e, 0x0001);
1259 cit_model3_Packet1(gspca_dev, 0x00b8, 0x0014);
1260 cit_model3_Packet1(gspca_dev, 0x00b9, 0x0014);
1261 cit_model3_Packet1(gspca_dev, 0x00e6, 0x0004);
1262 cit_model3_Packet1(gspca_dev, 0x00e8, 0x0001);
1263
1264 return 0;
1265 }
1266
1267 /* this function is called at probe and resume time */
1268 static int sd_init(struct gspca_dev *gspca_dev)
1269 {
1270 struct sd *sd = (struct sd *) gspca_dev;
1271
1272 switch (sd->model) {
1273 case CIT_MODEL0:
1274 cit_init_model0(gspca_dev);
1275 sd_stop0(gspca_dev);
1276 break;
1277 case CIT_MODEL1:
1278 case CIT_MODEL2:
1279 case CIT_MODEL3:
1280 case CIT_MODEL4:
1281 break; /* All is done in sd_start */
1282 case CIT_IBM_NETCAM_PRO:
1283 cit_init_ibm_netcam_pro(gspca_dev);
1284 sd_stop0(gspca_dev);
1285 break;
1286 }
1287 return 0;
1288 }
1289
1290 static int cit_set_brightness(struct gspca_dev *gspca_dev)
1291 {
1292 struct sd *sd = (struct sd *) gspca_dev;
1293 int i;
1294
1295 switch (sd->model) {
1296 case CIT_MODEL0:
1297 case CIT_IBM_NETCAM_PRO:
1298 /* No (known) brightness control for these */
1299 break;
1300 case CIT_MODEL1:
1301 /* Model 1: Brightness range 0 - 63 */
1302 cit_Packet_Format1(gspca_dev, 0x0031, sd->brightness);
1303 cit_Packet_Format1(gspca_dev, 0x0032, sd->brightness);
1304 cit_Packet_Format1(gspca_dev, 0x0033, sd->brightness);
1305 break;
1306 case CIT_MODEL2:
1307 /* Model 2: Brightness range 0x60 - 0xee */
1308 /* Scale 0 - 63 to 0x60 - 0xee */
1309 i = 0x60 + sd->brightness * 2254 / 1000;
1310 cit_model2_Packet1(gspca_dev, 0x001a, i);
1311 break;
1312 case CIT_MODEL3:
1313 /* Model 3: Brightness range 'i' in [0x0C..0x3F] */
1314 i = sd->brightness;
1315 if (i < 0x0c)
1316 i = 0x0c;
1317 cit_model3_Packet1(gspca_dev, 0x0036, i);
1318 break;
1319 case CIT_MODEL4:
1320 /* Model 4: Brightness range 'i' in [0x04..0xb4] */
1321 /* Scale 0 - 63 to 0x04 - 0xb4 */
1322 i = 0x04 + sd->brightness * 2794 / 1000;
1323 cit_model4_BrightnessPacket(gspca_dev, i);
1324 break;
1325 }
1326
1327 return 0;
1328 }
1329
1330 static int cit_set_contrast(struct gspca_dev *gspca_dev)
1331 {
1332 struct sd *sd = (struct sd *) gspca_dev;
1333
1334 switch (sd->model) {
1335 case CIT_MODEL0: {
1336 int i;
1337 /* gain 0-15, 0-20 -> 0-15 */
1338 i = sd->contrast * 1000 / 1333;
1339 cit_write_reg(gspca_dev, i, 0x0422);
1340 /* gain 0-31, may not be lower then 0x0422, 0-20 -> 0-31 */
1341 i = sd->contrast * 2000 / 1333;
1342 cit_write_reg(gspca_dev, i, 0x0423);
1343 /* gain 0-127, may not be lower then 0x0423, 0-20 -> 0-63 */
1344 i = sd->contrast * 4000 / 1333;
1345 cit_write_reg(gspca_dev, i, 0x0424);
1346 /* gain 0-127, may not be lower then 0x0424, , 0-20 -> 0-127 */
1347 i = sd->contrast * 8000 / 1333;
1348 cit_write_reg(gspca_dev, i, 0x0425);
1349 break;
1350 }
1351 case CIT_MODEL2:
1352 case CIT_MODEL4:
1353 /* These models do not have this control. */
1354 break;
1355 case CIT_MODEL1:
1356 {
1357 /* Scale 0 - 20 to 15 - 0 */
1358 int i, new_contrast = (20 - sd->contrast) * 1000 / 1333;
1359 for (i = 0; i < cit_model1_ntries; i++) {
1360 cit_Packet_Format1(gspca_dev, 0x0014, new_contrast);
1361 cit_send_FF_04_02(gspca_dev);
1362 }
1363 break;
1364 }
1365 case CIT_MODEL3:
1366 { /* Preset hardware values */
1367 static const struct {
1368 unsigned short cv1;
1369 unsigned short cv2;
1370 unsigned short cv3;
1371 } cv[7] = {
1372 { 0x05, 0x05, 0x0f }, /* Minimum */
1373 { 0x04, 0x04, 0x16 },
1374 { 0x02, 0x03, 0x16 },
1375 { 0x02, 0x08, 0x16 },
1376 { 0x01, 0x0c, 0x16 },
1377 { 0x01, 0x0e, 0x16 },
1378 { 0x01, 0x10, 0x16 } /* Maximum */
1379 };
1380 int i = sd->contrast / 3;
1381 cit_model3_Packet1(gspca_dev, 0x0067, cv[i].cv1);
1382 cit_model3_Packet1(gspca_dev, 0x005b, cv[i].cv2);
1383 cit_model3_Packet1(gspca_dev, 0x005c, cv[i].cv3);
1384 break;
1385 }
1386 case CIT_IBM_NETCAM_PRO:
1387 cit_model3_Packet1(gspca_dev, 0x005b, sd->contrast + 1);
1388 break;
1389 }
1390 return 0;
1391 }
1392
1393 static int cit_set_hue(struct gspca_dev *gspca_dev)
1394 {
1395 struct sd *sd = (struct sd *) gspca_dev;
1396
1397 switch (sd->model) {
1398 case CIT_MODEL0:
1399 case CIT_MODEL1:
1400 case CIT_IBM_NETCAM_PRO:
1401 /* No hue control for these models */
1402 break;
1403 case CIT_MODEL2:
1404 cit_model2_Packet1(gspca_dev, 0x0024, sd->hue);
1405 /* cit_model2_Packet1(gspca_dev, 0x0020, sat); */
1406 break;
1407 case CIT_MODEL3: {
1408 /* Model 3: Brightness range 'i' in [0x05..0x37] */
1409 /* TESTME according to the ibmcam driver this does not work */
1410 if (0) {
1411 /* Scale 0 - 127 to 0x05 - 0x37 */
1412 int i = 0x05 + sd->hue * 1000 / 2540;
1413 cit_model3_Packet1(gspca_dev, 0x007e, i);
1414 }
1415 break;
1416 }
1417 case CIT_MODEL4:
1418 /* HDG: taken from ibmcam, setting the color gains does not
1419 * really belong here.
1420 *
1421 * I am not sure r/g/b_gain variables exactly control gain
1422 * of those channels. Most likely they subtly change some
1423 * very internal image processing settings in the camera.
1424 * In any case, here is what they do, and feel free to tweak:
1425 *
1426 * r_gain: seriously affects red gain
1427 * g_gain: seriously affects green gain
1428 * b_gain: seriously affects blue gain
1429 * hue: changes average color from violet (0) to red (0xFF)
1430 */
1431 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
1432 cit_write_reg(gspca_dev, 0x001e, 0x012f);
1433 cit_write_reg(gspca_dev, 0xd141, 0x0124);
1434 cit_write_reg(gspca_dev, 160, 0x0127); /* Green gain */
1435 cit_write_reg(gspca_dev, 160, 0x012e); /* Red gain */
1436 cit_write_reg(gspca_dev, 160, 0x0130); /* Blue gain */
1437 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
1438 cit_write_reg(gspca_dev, sd->hue, 0x012d); /* Hue */
1439 cit_write_reg(gspca_dev, 0xf545, 0x0124);
1440 break;
1441 }
1442 return 0;
1443 }
1444
1445 static int cit_set_sharpness(struct gspca_dev *gspca_dev)
1446 {
1447 struct sd *sd = (struct sd *) gspca_dev;
1448
1449 switch (sd->model) {
1450 case CIT_MODEL0:
1451 case CIT_MODEL2:
1452 case CIT_MODEL4:
1453 case CIT_IBM_NETCAM_PRO:
1454 /* These models do not have this control */
1455 break;
1456 case CIT_MODEL1: {
1457 int i;
1458 const unsigned short sa[] = {
1459 0x11, 0x13, 0x16, 0x18, 0x1a, 0x8, 0x0a };
1460
1461 for (i = 0; i < cit_model1_ntries; i++)
1462 cit_PacketFormat2(gspca_dev, 0x0013, sa[sd->sharpness]);
1463 break;
1464 }
1465 case CIT_MODEL3:
1466 { /*
1467 * "Use a table of magic numbers.
1468 * This setting doesn't really change much.
1469 * But that's how Windows does it."
1470 */
1471 static const struct {
1472 unsigned short sv1;
1473 unsigned short sv2;
1474 unsigned short sv3;
1475 unsigned short sv4;
1476 } sv[7] = {
1477 { 0x00, 0x00, 0x05, 0x14 }, /* Smoothest */
1478 { 0x01, 0x04, 0x05, 0x14 },
1479 { 0x02, 0x04, 0x05, 0x14 },
1480 { 0x03, 0x04, 0x05, 0x14 },
1481 { 0x03, 0x05, 0x05, 0x14 },
1482 { 0x03, 0x06, 0x05, 0x14 },
1483 { 0x03, 0x07, 0x05, 0x14 } /* Sharpest */
1484 };
1485 cit_model3_Packet1(gspca_dev, 0x0060, sv[sd->sharpness].sv1);
1486 cit_model3_Packet1(gspca_dev, 0x0061, sv[sd->sharpness].sv2);
1487 cit_model3_Packet1(gspca_dev, 0x0062, sv[sd->sharpness].sv3);
1488 cit_model3_Packet1(gspca_dev, 0x0063, sv[sd->sharpness].sv4);
1489 break;
1490 }
1491 }
1492 return 0;
1493 }
1494
1495 /*
1496 * cit_set_lighting()
1497 *
1498 * Camera model 1:
1499 * We have 3 levels of lighting conditions: 0=Bright, 1=Medium, 2=Low.
1500 *
1501 * Camera model 2:
1502 * We have 16 levels of lighting, 0 for bright light and up to 15 for
1503 * low light. But values above 5 or so are useless because camera is
1504 * not really capable to produce anything worth viewing at such light.
1505 * This setting may be altered only in certain camera state.
1506 *
1507 * Low lighting forces slower FPS.
1508 *
1509 * History:
1510 * 1/5/00 Created.
1511 * 2/20/00 Added support for Model 2 cameras.
1512 */
1513 static void cit_set_lighting(struct gspca_dev *gspca_dev)
1514 {
1515 struct sd *sd = (struct sd *) gspca_dev;
1516
1517 switch (sd->model) {
1518 case CIT_MODEL0:
1519 case CIT_MODEL2:
1520 case CIT_MODEL3:
1521 case CIT_MODEL4:
1522 case CIT_IBM_NETCAM_PRO:
1523 break;
1524 case CIT_MODEL1: {
1525 int i;
1526 for (i = 0; i < cit_model1_ntries; i++)
1527 cit_Packet_Format1(gspca_dev, 0x0027, sd->lighting);
1528 break;
1529 }
1530 }
1531 }
1532
1533 static void cit_set_hflip(struct gspca_dev *gspca_dev)
1534 {
1535 struct sd *sd = (struct sd *) gspca_dev;
1536
1537 switch (sd->model) {
1538 case CIT_MODEL0:
1539 if (sd->hflip)
1540 cit_write_reg(gspca_dev, 0x0020, 0x0115);
1541 else
1542 cit_write_reg(gspca_dev, 0x0040, 0x0115);
1543 break;
1544 case CIT_MODEL1:
1545 case CIT_MODEL2:
1546 case CIT_MODEL3:
1547 case CIT_MODEL4:
1548 case CIT_IBM_NETCAM_PRO:
1549 break;
1550 }
1551 }
1552
1553 static int cit_restart_stream(struct gspca_dev *gspca_dev)
1554 {
1555 struct sd *sd = (struct sd *) gspca_dev;
1556
1557 switch (sd->model) {
1558 case CIT_MODEL0:
1559 case CIT_MODEL1:
1560 case CIT_MODEL3:
1561 case CIT_IBM_NETCAM_PRO:
1562 cit_write_reg(gspca_dev, 0x0001, 0x0114);
1563 /* Fall through */
1564 case CIT_MODEL2:
1565 case CIT_MODEL4:
1566 cit_write_reg(gspca_dev, 0x00c0, 0x010c); /* Go! */
1567 usb_clear_halt(gspca_dev->dev, gspca_dev->urb[0]->pipe);
1568 /* This happens repeatedly while streaming with the ibm netcam
1569 pro and the ibmcam driver did it for model3 after changing
1570 settings, but it does not seem to have any effect. */
1571 /* cit_write_reg(gspca_dev, 0x0001, 0x0113); */
1572 break;
1573 }
1574
1575 sd->sof_read = 0;
1576
1577 return 0;
1578 }
1579
1580 static int cit_get_packet_size(struct gspca_dev *gspca_dev)
1581 {
1582 struct usb_host_interface *alt;
1583 struct usb_interface *intf;
1584
1585 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface);
1586 alt = usb_altnum_to_altsetting(intf, gspca_dev->alt);
1587 if (!alt) {
1588 err("Couldn't get altsetting");
1589 return -EIO;
1590 }
1591
1592 return le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
1593 }
1594
1595 /* Calculate the clockdiv giving us max fps given the available bandwidth */
1596 static int cit_get_clock_div(struct gspca_dev *gspca_dev)
1597 {
1598 int clock_div = 7; /* 0=30 1=25 2=20 3=15 4=12 5=7.5 6=6 7=3fps ?? */
1599 int fps[8] = { 30, 25, 20, 15, 12, 8, 6, 3 };
1600 int packet_size;
1601
1602 packet_size = cit_get_packet_size(gspca_dev);
1603 if (packet_size < 0)
1604 return packet_size;
1605
1606 while (clock_div > 3 &&
1607 1000 * packet_size >
1608 gspca_dev->width * gspca_dev->height *
1609 fps[clock_div - 1] * 3 / 2)
1610 clock_div--;
1611
1612 PDEBUG(D_PROBE,
1613 "PacketSize: %d, res: %dx%d -> using clockdiv: %d (%d fps)",
1614 packet_size, gspca_dev->width, gspca_dev->height, clock_div,
1615 fps[clock_div]);
1616
1617 return clock_div;
1618 }
1619
1620 static int cit_start_model0(struct gspca_dev *gspca_dev)
1621 {
1622 const unsigned short compression = 0; /* 0=none, 7=best frame rate */
1623 int clock_div;
1624
1625 clock_div = cit_get_clock_div(gspca_dev);
1626 if (clock_div < 0)
1627 return clock_div;
1628
1629 cit_write_reg(gspca_dev, 0x0000, 0x0100); /* turn on led */
1630 cit_write_reg(gspca_dev, 0x0003, 0x0438);
1631 cit_write_reg(gspca_dev, 0x001e, 0x042b);
1632 cit_write_reg(gspca_dev, 0x0041, 0x042c);
1633 cit_write_reg(gspca_dev, 0x0008, 0x0436);
1634 cit_write_reg(gspca_dev, 0x0024, 0x0403);
1635 cit_write_reg(gspca_dev, 0x002c, 0x0404);
1636 cit_write_reg(gspca_dev, 0x0002, 0x0426);
1637 cit_write_reg(gspca_dev, 0x0014, 0x0427);
1638
1639 switch (gspca_dev->width) {
1640 case 160: /* 160x120 */
1641 cit_write_reg(gspca_dev, 0x0004, 0x010b);
1642 cit_write_reg(gspca_dev, 0x0001, 0x010a);
1643 cit_write_reg(gspca_dev, 0x0010, 0x0102);
1644 cit_write_reg(gspca_dev, 0x00a0, 0x0103);
1645 cit_write_reg(gspca_dev, 0x0000, 0x0104);
1646 cit_write_reg(gspca_dev, 0x0078, 0x0105);
1647 break;
1648
1649 case 176: /* 176x144 */
1650 cit_write_reg(gspca_dev, 0x0006, 0x010b);
1651 cit_write_reg(gspca_dev, 0x0000, 0x010a);
1652 cit_write_reg(gspca_dev, 0x0005, 0x0102);
1653 cit_write_reg(gspca_dev, 0x00b0, 0x0103);
1654 cit_write_reg(gspca_dev, 0x0000, 0x0104);
1655 cit_write_reg(gspca_dev, 0x0090, 0x0105);
1656 break;
1657
1658 case 320: /* 320x240 */
1659 cit_write_reg(gspca_dev, 0x0008, 0x010b);
1660 cit_write_reg(gspca_dev, 0x0004, 0x010a);
1661 cit_write_reg(gspca_dev, 0x0005, 0x0102);
1662 cit_write_reg(gspca_dev, 0x00a0, 0x0103);
1663 cit_write_reg(gspca_dev, 0x0010, 0x0104);
1664 cit_write_reg(gspca_dev, 0x0078, 0x0105);
1665 break;
1666 }
1667
1668 cit_write_reg(gspca_dev, compression, 0x0109);
1669 cit_write_reg(gspca_dev, clock_div, 0x0111);
1670
1671 return 0;
1672 }
1673
1674 static int cit_start_model1(struct gspca_dev *gspca_dev)
1675 {
1676 struct sd *sd = (struct sd *) gspca_dev;
1677 int i, clock_div;
1678
1679 clock_div = cit_get_clock_div(gspca_dev);
1680 if (clock_div < 0)
1681 return clock_div;
1682
1683 cit_read_reg(gspca_dev, 0x0128);
1684 cit_read_reg(gspca_dev, 0x0100);
1685 cit_write_reg(gspca_dev, 0x01, 0x0100); /* LED On */
1686 cit_read_reg(gspca_dev, 0x0100);
1687 cit_write_reg(gspca_dev, 0x81, 0x0100); /* LED Off */
1688 cit_read_reg(gspca_dev, 0x0100);
1689 cit_write_reg(gspca_dev, 0x01, 0x0100); /* LED On */
1690 cit_write_reg(gspca_dev, 0x01, 0x0108);
1691
1692 cit_write_reg(gspca_dev, 0x03, 0x0112);
1693 cit_read_reg(gspca_dev, 0x0115);
1694 cit_write_reg(gspca_dev, 0x06, 0x0115);
1695 cit_read_reg(gspca_dev, 0x0116);
1696 cit_write_reg(gspca_dev, 0x44, 0x0116);
1697 cit_read_reg(gspca_dev, 0x0116);
1698 cit_write_reg(gspca_dev, 0x40, 0x0116);
1699 cit_read_reg(gspca_dev, 0x0115);
1700 cit_write_reg(gspca_dev, 0x0e, 0x0115);
1701 cit_write_reg(gspca_dev, 0x19, 0x012c);
1702
1703 cit_Packet_Format1(gspca_dev, 0x00, 0x1e);
1704 cit_Packet_Format1(gspca_dev, 0x39, 0x0d);
1705 cit_Packet_Format1(gspca_dev, 0x39, 0x09);
1706 cit_Packet_Format1(gspca_dev, 0x3b, 0x00);
1707 cit_Packet_Format1(gspca_dev, 0x28, 0x22);
1708 cit_Packet_Format1(gspca_dev, 0x27, 0x00);
1709 cit_Packet_Format1(gspca_dev, 0x2b, 0x1f);
1710 cit_Packet_Format1(gspca_dev, 0x39, 0x08);
1711
1712 for (i = 0; i < cit_model1_ntries; i++)
1713 cit_Packet_Format1(gspca_dev, 0x2c, 0x00);
1714
1715 for (i = 0; i < cit_model1_ntries; i++)
1716 cit_Packet_Format1(gspca_dev, 0x30, 0x14);
1717
1718 cit_PacketFormat2(gspca_dev, 0x39, 0x02);
1719 cit_PacketFormat2(gspca_dev, 0x01, 0xe1);
1720 cit_PacketFormat2(gspca_dev, 0x02, 0xcd);
1721 cit_PacketFormat2(gspca_dev, 0x03, 0xcd);
1722 cit_PacketFormat2(gspca_dev, 0x04, 0xfa);
1723 cit_PacketFormat2(gspca_dev, 0x3f, 0xff);
1724 cit_PacketFormat2(gspca_dev, 0x39, 0x00);
1725
1726 cit_PacketFormat2(gspca_dev, 0x39, 0x02);
1727 cit_PacketFormat2(gspca_dev, 0x0a, 0x37);
1728 cit_PacketFormat2(gspca_dev, 0x0b, 0xb8);
1729 cit_PacketFormat2(gspca_dev, 0x0c, 0xf3);
1730 cit_PacketFormat2(gspca_dev, 0x0d, 0xe3);
1731 cit_PacketFormat2(gspca_dev, 0x0e, 0x0d);
1732 cit_PacketFormat2(gspca_dev, 0x0f, 0xf2);
1733 cit_PacketFormat2(gspca_dev, 0x10, 0xd5);
1734 cit_PacketFormat2(gspca_dev, 0x11, 0xba);
1735 cit_PacketFormat2(gspca_dev, 0x12, 0x53);
1736 cit_PacketFormat2(gspca_dev, 0x3f, 0xff);
1737 cit_PacketFormat2(gspca_dev, 0x39, 0x00);
1738
1739 cit_PacketFormat2(gspca_dev, 0x39, 0x02);
1740 cit_PacketFormat2(gspca_dev, 0x16, 0x00);
1741 cit_PacketFormat2(gspca_dev, 0x17, 0x28);
1742 cit_PacketFormat2(gspca_dev, 0x18, 0x7d);
1743 cit_PacketFormat2(gspca_dev, 0x19, 0xbe);
1744 cit_PacketFormat2(gspca_dev, 0x3f, 0xff);
1745 cit_PacketFormat2(gspca_dev, 0x39, 0x00);
1746
1747 for (i = 0; i < cit_model1_ntries; i++)
1748 cit_Packet_Format1(gspca_dev, 0x00, 0x18);
1749 for (i = 0; i < cit_model1_ntries; i++)
1750 cit_Packet_Format1(gspca_dev, 0x13, 0x18);
1751 for (i = 0; i < cit_model1_ntries; i++)
1752 cit_Packet_Format1(gspca_dev, 0x14, 0x06);
1753
1754 /* TESTME These are handled through controls
1755 KEEP until someone can test leaving this out is ok */
1756 if (0) {
1757 /* This is default brightness */
1758 for (i = 0; i < cit_model1_ntries; i++)
1759 cit_Packet_Format1(gspca_dev, 0x31, 0x37);
1760 for (i = 0; i < cit_model1_ntries; i++)
1761 cit_Packet_Format1(gspca_dev, 0x32, 0x46);
1762 for (i = 0; i < cit_model1_ntries; i++)
1763 cit_Packet_Format1(gspca_dev, 0x33, 0x55);
1764 }
1765
1766 cit_Packet_Format1(gspca_dev, 0x2e, 0x04);
1767 for (i = 0; i < cit_model1_ntries; i++)
1768 cit_Packet_Format1(gspca_dev, 0x2d, 0x04);
1769 for (i = 0; i < cit_model1_ntries; i++)
1770 cit_Packet_Format1(gspca_dev, 0x29, 0x80);
1771 cit_Packet_Format1(gspca_dev, 0x2c, 0x01);
1772 cit_Packet_Format1(gspca_dev, 0x30, 0x17);
1773 cit_Packet_Format1(gspca_dev, 0x39, 0x08);
1774 for (i = 0; i < cit_model1_ntries; i++)
1775 cit_Packet_Format1(gspca_dev, 0x34, 0x00);
1776
1777 cit_write_reg(gspca_dev, 0x00, 0x0101);
1778 cit_write_reg(gspca_dev, 0x00, 0x010a);
1779
1780 switch (gspca_dev->width) {
1781 case 128: /* 128x96 */
1782 cit_write_reg(gspca_dev, 0x80, 0x0103);
1783 cit_write_reg(gspca_dev, 0x60, 0x0105);
1784 cit_write_reg(gspca_dev, 0x0c, 0x010b);
1785 cit_write_reg(gspca_dev, 0x04, 0x011b); /* Same everywhere */
1786 cit_write_reg(gspca_dev, 0x0b, 0x011d);
1787 cit_write_reg(gspca_dev, 0x00, 0x011e); /* Same everywhere */
1788 cit_write_reg(gspca_dev, 0x00, 0x0129);
1789 break;
1790 case 176: /* 176x144 */
1791 cit_write_reg(gspca_dev, 0xb0, 0x0103);
1792 cit_write_reg(gspca_dev, 0x8f, 0x0105);
1793 cit_write_reg(gspca_dev, 0x06, 0x010b);
1794 cit_write_reg(gspca_dev, 0x04, 0x011b); /* Same everywhere */
1795 cit_write_reg(gspca_dev, 0x0d, 0x011d);
1796 cit_write_reg(gspca_dev, 0x00, 0x011e); /* Same everywhere */
1797 cit_write_reg(gspca_dev, 0x03, 0x0129);
1798 break;
1799 case 352: /* 352x288 */
1800 cit_write_reg(gspca_dev, 0xb0, 0x0103);
1801 cit_write_reg(gspca_dev, 0x90, 0x0105);
1802 cit_write_reg(gspca_dev, 0x02, 0x010b);
1803 cit_write_reg(gspca_dev, 0x04, 0x011b); /* Same everywhere */
1804 cit_write_reg(gspca_dev, 0x05, 0x011d);
1805 cit_write_reg(gspca_dev, 0x00, 0x011e); /* Same everywhere */
1806 cit_write_reg(gspca_dev, 0x00, 0x0129);
1807 break;
1808 }
1809
1810 cit_write_reg(gspca_dev, 0xff, 0x012b);
1811
1812 /* TESTME These are handled through controls
1813 KEEP until someone can test leaving this out is ok */
1814 if (0) {
1815 /* This is another brightness - don't know why */
1816 for (i = 0; i < cit_model1_ntries; i++)
1817 cit_Packet_Format1(gspca_dev, 0x31, 0xc3);
1818 for (i = 0; i < cit_model1_ntries; i++)
1819 cit_Packet_Format1(gspca_dev, 0x32, 0xd2);
1820 for (i = 0; i < cit_model1_ntries; i++)
1821 cit_Packet_Format1(gspca_dev, 0x33, 0xe1);
1822
1823 /* Default contrast */
1824 for (i = 0; i < cit_model1_ntries; i++)
1825 cit_Packet_Format1(gspca_dev, 0x14, 0x0a);
1826
1827 /* Default sharpness */
1828 for (i = 0; i < cit_model1_ntries2; i++)
1829 cit_PacketFormat2(gspca_dev, 0x13, 0x1a);
1830
1831 /* Default lighting conditions */
1832 cit_Packet_Format1(gspca_dev, 0x0027, sd->lighting);
1833 }
1834
1835 /* Assorted init */
1836 switch (gspca_dev->width) {
1837 case 128: /* 128x96 */
1838 cit_Packet_Format1(gspca_dev, 0x2b, 0x1e);
1839 cit_write_reg(gspca_dev, 0xc9, 0x0119); /* Same everywhere */
1840 cit_write_reg(gspca_dev, 0x80, 0x0109); /* Same everywhere */
1841 cit_write_reg(gspca_dev, 0x36, 0x0102);
1842 cit_write_reg(gspca_dev, 0x1a, 0x0104);
1843 cit_write_reg(gspca_dev, 0x04, 0x011a); /* Same everywhere */
1844 cit_write_reg(gspca_dev, 0x2b, 0x011c);
1845 cit_write_reg(gspca_dev, 0x23, 0x012a); /* Same everywhere */
1846 break;
1847 case 176: /* 176x144 */
1848 cit_Packet_Format1(gspca_dev, 0x2b, 0x1e);
1849 cit_write_reg(gspca_dev, 0xc9, 0x0119); /* Same everywhere */
1850 cit_write_reg(gspca_dev, 0x80, 0x0109); /* Same everywhere */
1851 cit_write_reg(gspca_dev, 0x04, 0x0102);
1852 cit_write_reg(gspca_dev, 0x02, 0x0104);
1853 cit_write_reg(gspca_dev, 0x04, 0x011a); /* Same everywhere */
1854 cit_write_reg(gspca_dev, 0x2b, 0x011c);
1855 cit_write_reg(gspca_dev, 0x23, 0x012a); /* Same everywhere */
1856 break;
1857 case 352: /* 352x288 */
1858 cit_Packet_Format1(gspca_dev, 0x2b, 0x1f);
1859 cit_write_reg(gspca_dev, 0xc9, 0x0119); /* Same everywhere */
1860 cit_write_reg(gspca_dev, 0x80, 0x0109); /* Same everywhere */
1861 cit_write_reg(gspca_dev, 0x08, 0x0102);
1862 cit_write_reg(gspca_dev, 0x01, 0x0104);
1863 cit_write_reg(gspca_dev, 0x04, 0x011a); /* Same everywhere */
1864 cit_write_reg(gspca_dev, 0x2f, 0x011c);
1865 cit_write_reg(gspca_dev, 0x23, 0x012a); /* Same everywhere */
1866 break;
1867 }
1868
1869 cit_write_reg(gspca_dev, 0x01, 0x0100); /* LED On */
1870 cit_write_reg(gspca_dev, clock_div, 0x0111);
1871
1872 return 0;
1873 }
1874
1875 static int cit_start_model2(struct gspca_dev *gspca_dev)
1876 {
1877 struct sd *sd = (struct sd *) gspca_dev;
1878 int clock_div = 0;
1879
1880 cit_write_reg(gspca_dev, 0x0000, 0x0100); /* LED on */
1881 cit_read_reg(gspca_dev, 0x0116);
1882 cit_write_reg(gspca_dev, 0x0060, 0x0116);
1883 cit_write_reg(gspca_dev, 0x0002, 0x0112);
1884 cit_write_reg(gspca_dev, 0x00bc, 0x012c);
1885 cit_write_reg(gspca_dev, 0x0008, 0x012b);
1886 cit_write_reg(gspca_dev, 0x0000, 0x0108);
1887 cit_write_reg(gspca_dev, 0x0001, 0x0133);
1888 cit_write_reg(gspca_dev, 0x0001, 0x0102);
1889 switch (gspca_dev->width) {
1890 case 176: /* 176x144 */
1891 cit_write_reg(gspca_dev, 0x002c, 0x0103); /* All except 320x240 */
1892 cit_write_reg(gspca_dev, 0x0000, 0x0104); /* Same */
1893 cit_write_reg(gspca_dev, 0x0024, 0x0105); /* 176x144, 352x288 */
1894 cit_write_reg(gspca_dev, 0x00b9, 0x010a); /* Unique to this mode */
1895 cit_write_reg(gspca_dev, 0x0038, 0x0119); /* Unique to this mode */
1896 /* TESTME HDG: this does not seem right
1897 (it is 2 for all other resolutions) */
1898 sd->sof_len = 10;
1899 break;
1900 case 320: /* 320x240 */
1901 cit_write_reg(gspca_dev, 0x0028, 0x0103); /* Unique to this mode */
1902 cit_write_reg(gspca_dev, 0x0000, 0x0104); /* Same */
1903 cit_write_reg(gspca_dev, 0x001e, 0x0105); /* 320x240, 352x240 */
1904 cit_write_reg(gspca_dev, 0x0039, 0x010a); /* All except 176x144 */
1905 cit_write_reg(gspca_dev, 0x0070, 0x0119); /* All except 176x144 */
1906 sd->sof_len = 2;
1907 break;
1908 /* case VIDEOSIZE_352x240: */
1909 cit_write_reg(gspca_dev, 0x002c, 0x0103); /* All except 320x240 */
1910 cit_write_reg(gspca_dev, 0x0000, 0x0104); /* Same */
1911 cit_write_reg(gspca_dev, 0x001e, 0x0105); /* 320x240, 352x240 */
1912 cit_write_reg(gspca_dev, 0x0039, 0x010a); /* All except 176x144 */
1913 cit_write_reg(gspca_dev, 0x0070, 0x0119); /* All except 176x144 */
1914 sd->sof_len = 2;
1915 break;
1916 case 352: /* 352x288 */
1917 cit_write_reg(gspca_dev, 0x002c, 0x0103); /* All except 320x240 */
1918 cit_write_reg(gspca_dev, 0x0000, 0x0104); /* Same */
1919 cit_write_reg(gspca_dev, 0x0024, 0x0105); /* 176x144, 352x288 */
1920 cit_write_reg(gspca_dev, 0x0039, 0x010a); /* All except 176x144 */
1921 cit_write_reg(gspca_dev, 0x0070, 0x0119); /* All except 176x144 */
1922 sd->sof_len = 2;
1923 break;
1924 }
1925
1926 cit_write_reg(gspca_dev, 0x0000, 0x0100); /* LED on */
1927
1928 switch (gspca_dev->width) {
1929 case 176: /* 176x144 */
1930 cit_write_reg(gspca_dev, 0x0050, 0x0111);
1931 cit_write_reg(gspca_dev, 0x00d0, 0x0111);
1932 break;
1933 case 320: /* 320x240 */
1934 case 352: /* 352x288 */
1935 cit_write_reg(gspca_dev, 0x0040, 0x0111);
1936 cit_write_reg(gspca_dev, 0x00c0, 0x0111);
1937 break;
1938 }
1939 cit_write_reg(gspca_dev, 0x009b, 0x010f);
1940 cit_write_reg(gspca_dev, 0x00bb, 0x010f);
1941
1942 /*
1943 * Hardware settings, may affect CMOS sensor; not user controls!
1944 * -------------------------------------------------------------
1945 * 0x0004: no effect
1946 * 0x0006: hardware effect
1947 * 0x0008: no effect
1948 * 0x000a: stops video stream, probably important h/w setting
1949 * 0x000c: changes color in hardware manner (not user setting)
1950 * 0x0012: changes number of colors (does not affect speed)
1951 * 0x002a: no effect
1952 * 0x002c: hardware setting (related to scan lines)
1953 * 0x002e: stops video stream, probably important h/w setting
1954 */
1955 cit_model2_Packet1(gspca_dev, 0x000a, 0x005c);
1956 cit_model2_Packet1(gspca_dev, 0x0004, 0x0000);
1957 cit_model2_Packet1(gspca_dev, 0x0006, 0x00fb);
1958 cit_model2_Packet1(gspca_dev, 0x0008, 0x0000);
1959 cit_model2_Packet1(gspca_dev, 0x000c, 0x0009);
1960 cit_model2_Packet1(gspca_dev, 0x0012, 0x000a);
1961 cit_model2_Packet1(gspca_dev, 0x002a, 0x0000);
1962 cit_model2_Packet1(gspca_dev, 0x002c, 0x0000);
1963 cit_model2_Packet1(gspca_dev, 0x002e, 0x0008);
1964
1965 /*
1966 * Function 0x0030 pops up all over the place. Apparently
1967 * it is a hardware control register, with every bit assigned to
1968 * do something.
1969 */
1970 cit_model2_Packet1(gspca_dev, 0x0030, 0x0000);
1971
1972 /*
1973 * Magic control of CMOS sensor. Only lower values like
1974 * 0-3 work, and picture shifts left or right. Don't change.
1975 */
1976 switch (gspca_dev->width) {
1977 case 176: /* 176x144 */
1978 cit_model2_Packet1(gspca_dev, 0x0014, 0x0002);
1979 cit_model2_Packet1(gspca_dev, 0x0016, 0x0002); /* Horizontal shift */
1980 cit_model2_Packet1(gspca_dev, 0x0018, 0x004a); /* Another hardware setting */
1981 clock_div = 6;
1982 break;
1983 case 320: /* 320x240 */
1984 cit_model2_Packet1(gspca_dev, 0x0014, 0x0009);
1985 cit_model2_Packet1(gspca_dev, 0x0016, 0x0005); /* Horizontal shift */
1986 cit_model2_Packet1(gspca_dev, 0x0018, 0x0044); /* Another hardware setting */
1987 clock_div = 8;
1988 break;
1989 /* case VIDEOSIZE_352x240: */
1990 /* This mode doesn't work as Windows programs it; changed to work */
1991 cit_model2_Packet1(gspca_dev, 0x0014, 0x0009); /* Windows sets this to 8 */
1992 cit_model2_Packet1(gspca_dev, 0x0016, 0x0003); /* Horizontal shift */
1993 cit_model2_Packet1(gspca_dev, 0x0018, 0x0044); /* Windows sets this to 0x0045 */
1994 clock_div = 10;
1995 break;
1996 case 352: /* 352x288 */
1997 cit_model2_Packet1(gspca_dev, 0x0014, 0x0003);
1998 cit_model2_Packet1(gspca_dev, 0x0016, 0x0002); /* Horizontal shift */
1999 cit_model2_Packet1(gspca_dev, 0x0018, 0x004a); /* Another hardware setting */
2000 clock_div = 16;
2001 break;
2002 }
2003
2004 /* TESTME These are handled through controls
2005 KEEP until someone can test leaving this out is ok */
2006 if (0)
2007 cit_model2_Packet1(gspca_dev, 0x001a, 0x005a);
2008
2009 /*
2010 * We have our own frame rate setting varying from 0 (slowest) to 6
2011 * (fastest). The camera model 2 allows frame rate in range [0..0x1F]
2012 # where 0 is also the slowest setting. However for all practical
2013 # reasons high settings make no sense because USB is not fast enough
2014 # to support high FPS. Be aware that the picture datastream will be
2015 # severely disrupted if you ask for frame rate faster than allowed
2016 # for the video size - see below:
2017 *
2018 * Allowable ranges (obtained experimentally on OHCI, K6-3, 450 MHz):
2019 * -----------------------------------------------------------------
2020 * 176x144: [6..31]
2021 * 320x240: [8..31]
2022 * 352x240: [10..31]
2023 * 352x288: [16..31] I have to raise lower threshold for stability...
2024 *
2025 * As usual, slower FPS provides better sensitivity.
2026 */
2027 cit_model2_Packet1(gspca_dev, 0x001c, clock_div);
2028
2029 /*
2030 * This setting does not visibly affect pictures; left it here
2031 * because it was present in Windows USB data stream. This function
2032 * does not allow arbitrary values and apparently is a bit mask, to
2033 * be activated only at appropriate time. Don't change it randomly!
2034 */
2035 switch (gspca_dev->width) {
2036 case 176: /* 176x144 */
2037 cit_model2_Packet1(gspca_dev, 0x0026, 0x00c2);
2038 break;
2039 case 320: /* 320x240 */
2040 cit_model2_Packet1(gspca_dev, 0x0026, 0x0044);
2041 break;
2042 /* case VIDEOSIZE_352x240: */
2043 cit_model2_Packet1(gspca_dev, 0x0026, 0x0046);
2044 break;
2045 case 352: /* 352x288 */
2046 cit_model2_Packet1(gspca_dev, 0x0026, 0x0048);
2047 break;
2048 }
2049
2050 /* FIXME this cannot be changed while streaming, so we
2051 should report a grabbed flag for this control. */
2052 cit_model2_Packet1(gspca_dev, 0x0028, sd->lighting);
2053 /* color balance rg2 */
2054 cit_model2_Packet1(gspca_dev, 0x001e, 0x002f);
2055 /* saturation */
2056 cit_model2_Packet1(gspca_dev, 0x0020, 0x0034);
2057 /* color balance yb */
2058 cit_model2_Packet1(gspca_dev, 0x0022, 0x00a0);
2059
2060 /* Hardware control command */
2061 cit_model2_Packet1(gspca_dev, 0x0030, 0x0004);
2062
2063 return 0;
2064 }
2065
2066 static int cit_start_model3(struct gspca_dev *gspca_dev)
2067 {
2068 const unsigned short compression = 0; /* 0=none, 7=best frame rate */
2069 int i, clock_div = 0;
2070
2071 /* HDG not in ibmcam driver, added to see if it helps with
2072 auto-detecting between model3 and ibm netcamera pro */
2073 cit_read_reg(gspca_dev, 0x128);
2074
2075 cit_write_reg(gspca_dev, 0x0000, 0x0100);
2076 cit_read_reg(gspca_dev, 0x0116);
2077 cit_write_reg(gspca_dev, 0x0060, 0x0116);
2078 cit_write_reg(gspca_dev, 0x0002, 0x0112);
2079 cit_write_reg(gspca_dev, 0x0000, 0x0123);
2080 cit_write_reg(gspca_dev, 0x0001, 0x0117);
2081 cit_write_reg(gspca_dev, 0x0040, 0x0108);
2082 cit_write_reg(gspca_dev, 0x0019, 0x012c);
2083 cit_write_reg(gspca_dev, 0x0060, 0x0116);
2084 cit_write_reg(gspca_dev, 0x0002, 0x0115);
2085 cit_write_reg(gspca_dev, 0x0003, 0x0115);
2086 cit_read_reg(gspca_dev, 0x0115);
2087 cit_write_reg(gspca_dev, 0x000b, 0x0115);
2088
2089 /* TESTME HDG not in ibmcam driver, added to see if it helps with
2090 auto-detecting between model3 and ibm netcamera pro */
2091 if (0) {
2092 cit_write_reg(gspca_dev, 0x0078, 0x012d);
2093 cit_write_reg(gspca_dev, 0x0001, 0x012f);
2094 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2095 cit_write_reg(gspca_dev, 0x0079, 0x012d);
2096 cit_write_reg(gspca_dev, 0x00ff, 0x0130);
2097 cit_write_reg(gspca_dev, 0xcd41, 0x0124);
2098 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2099 cit_read_reg(gspca_dev, 0x0126);
2100 }
2101
2102 cit_model3_Packet1(gspca_dev, 0x000a, 0x0040);
2103 cit_model3_Packet1(gspca_dev, 0x000b, 0x00f6);
2104 cit_model3_Packet1(gspca_dev, 0x000c, 0x0002);
2105 cit_model3_Packet1(gspca_dev, 0x000d, 0x0020);
2106 cit_model3_Packet1(gspca_dev, 0x000e, 0x0033);
2107 cit_model3_Packet1(gspca_dev, 0x000f, 0x0007);
2108 cit_model3_Packet1(gspca_dev, 0x0010, 0x0000);
2109 cit_model3_Packet1(gspca_dev, 0x0011, 0x0070);
2110 cit_model3_Packet1(gspca_dev, 0x0012, 0x0030);
2111 cit_model3_Packet1(gspca_dev, 0x0013, 0x0000);
2112 cit_model3_Packet1(gspca_dev, 0x0014, 0x0001);
2113 cit_model3_Packet1(gspca_dev, 0x0015, 0x0001);
2114 cit_model3_Packet1(gspca_dev, 0x0016, 0x0001);
2115 cit_model3_Packet1(gspca_dev, 0x0017, 0x0001);
2116 cit_model3_Packet1(gspca_dev, 0x0018, 0x0000);
2117 cit_model3_Packet1(gspca_dev, 0x001e, 0x00c3);
2118 cit_model3_Packet1(gspca_dev, 0x0020, 0x0000);
2119 cit_model3_Packet1(gspca_dev, 0x0028, 0x0010);
2120 cit_model3_Packet1(gspca_dev, 0x0029, 0x0054);
2121 cit_model3_Packet1(gspca_dev, 0x002a, 0x0013);
2122 cit_model3_Packet1(gspca_dev, 0x002b, 0x0007);
2123 cit_model3_Packet1(gspca_dev, 0x002d, 0x0028);
2124 cit_model3_Packet1(gspca_dev, 0x002e, 0x0000);
2125 cit_model3_Packet1(gspca_dev, 0x0031, 0x0000);
2126 cit_model3_Packet1(gspca_dev, 0x0032, 0x0000);
2127 cit_model3_Packet1(gspca_dev, 0x0033, 0x0000);
2128 cit_model3_Packet1(gspca_dev, 0x0034, 0x0000);
2129 cit_model3_Packet1(gspca_dev, 0x0035, 0x0038);
2130 cit_model3_Packet1(gspca_dev, 0x003a, 0x0001);
2131 cit_model3_Packet1(gspca_dev, 0x003c, 0x001e);
2132 cit_model3_Packet1(gspca_dev, 0x003f, 0x000a);
2133 cit_model3_Packet1(gspca_dev, 0x0041, 0x0000);
2134 cit_model3_Packet1(gspca_dev, 0x0046, 0x003f);
2135 cit_model3_Packet1(gspca_dev, 0x0047, 0x0000);
2136 cit_model3_Packet1(gspca_dev, 0x0050, 0x0005);
2137 cit_model3_Packet1(gspca_dev, 0x0052, 0x001a);
2138 cit_model3_Packet1(gspca_dev, 0x0053, 0x0003);
2139 cit_model3_Packet1(gspca_dev, 0x005a, 0x006b);
2140 cit_model3_Packet1(gspca_dev, 0x005d, 0x001e);
2141 cit_model3_Packet1(gspca_dev, 0x005e, 0x0030);
2142 cit_model3_Packet1(gspca_dev, 0x005f, 0x0041);
2143 cit_model3_Packet1(gspca_dev, 0x0064, 0x0008);
2144 cit_model3_Packet1(gspca_dev, 0x0065, 0x0015);
2145 cit_model3_Packet1(gspca_dev, 0x0068, 0x000f);
2146 cit_model3_Packet1(gspca_dev, 0x0079, 0x0000);
2147 cit_model3_Packet1(gspca_dev, 0x007a, 0x0000);
2148 cit_model3_Packet1(gspca_dev, 0x007c, 0x003f);
2149 cit_model3_Packet1(gspca_dev, 0x0082, 0x000f);
2150 cit_model3_Packet1(gspca_dev, 0x0085, 0x0000);
2151 cit_model3_Packet1(gspca_dev, 0x0099, 0x0000);
2152 cit_model3_Packet1(gspca_dev, 0x009b, 0x0023);
2153 cit_model3_Packet1(gspca_dev, 0x009c, 0x0022);
2154 cit_model3_Packet1(gspca_dev, 0x009d, 0x0096);
2155 cit_model3_Packet1(gspca_dev, 0x009e, 0x0096);
2156 cit_model3_Packet1(gspca_dev, 0x009f, 0x000a);
2157
2158 switch (gspca_dev->width) {
2159 case 160:
2160 cit_write_reg(gspca_dev, 0x0000, 0x0101); /* Same on 160x120, 320x240 */
2161 cit_write_reg(gspca_dev, 0x00a0, 0x0103); /* Same on 160x120, 320x240 */
2162 cit_write_reg(gspca_dev, 0x0078, 0x0105); /* Same on 160x120, 320x240 */
2163 cit_write_reg(gspca_dev, 0x0000, 0x010a); /* Same */
2164 cit_write_reg(gspca_dev, 0x0024, 0x010b); /* Differs everywhere */
2165 cit_write_reg(gspca_dev, 0x00a9, 0x0119);
2166 cit_write_reg(gspca_dev, 0x0016, 0x011b);
2167 cit_write_reg(gspca_dev, 0x0002, 0x011d); /* Same on 160x120, 320x240 */
2168 cit_write_reg(gspca_dev, 0x0003, 0x011e); /* Same on 160x120, 640x480 */
2169 cit_write_reg(gspca_dev, 0x0000, 0x0129); /* Same */
2170 cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
2171 cit_write_reg(gspca_dev, 0x0018, 0x0102);
2172 cit_write_reg(gspca_dev, 0x0004, 0x0104);
2173 cit_write_reg(gspca_dev, 0x0004, 0x011a);
2174 cit_write_reg(gspca_dev, 0x0028, 0x011c);
2175 cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
2176 cit_write_reg(gspca_dev, 0x0000, 0x0118);
2177 cit_write_reg(gspca_dev, 0x0000, 0x0132);
2178 cit_model3_Packet1(gspca_dev, 0x0021, 0x0001); /* Same */
2179 cit_write_reg(gspca_dev, compression, 0x0109);
2180 clock_div = 3;
2181 break;
2182 case 320:
2183 cit_write_reg(gspca_dev, 0x0000, 0x0101); /* Same on 160x120, 320x240 */
2184 cit_write_reg(gspca_dev, 0x00a0, 0x0103); /* Same on 160x120, 320x240 */
2185 cit_write_reg(gspca_dev, 0x0078, 0x0105); /* Same on 160x120, 320x240 */
2186 cit_write_reg(gspca_dev, 0x0000, 0x010a); /* Same */
2187 cit_write_reg(gspca_dev, 0x0028, 0x010b); /* Differs everywhere */
2188 cit_write_reg(gspca_dev, 0x0002, 0x011d); /* Same */
2189 cit_write_reg(gspca_dev, 0x0000, 0x011e);
2190 cit_write_reg(gspca_dev, 0x0000, 0x0129); /* Same */
2191 cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
2192 /* 4 commands from 160x120 skipped */
2193 cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
2194 cit_model3_Packet1(gspca_dev, 0x0021, 0x0001); /* Same */
2195 cit_write_reg(gspca_dev, compression, 0x0109);
2196 cit_write_reg(gspca_dev, 0x00d9, 0x0119);
2197 cit_write_reg(gspca_dev, 0x0006, 0x011b);
2198 cit_write_reg(gspca_dev, 0x0021, 0x0102); /* Same on 320x240, 640x480 */
2199 cit_write_reg(gspca_dev, 0x0010, 0x0104);
2200 cit_write_reg(gspca_dev, 0x0004, 0x011a);
2201 cit_write_reg(gspca_dev, 0x003f, 0x011c);
2202 cit_write_reg(gspca_dev, 0x001c, 0x0118);
2203 cit_write_reg(gspca_dev, 0x0000, 0x0132);
2204 clock_div = 5;
2205 break;
2206 case 640:
2207 cit_write_reg(gspca_dev, 0x00f0, 0x0105);
2208 cit_write_reg(gspca_dev, 0x0000, 0x010a); /* Same */
2209 cit_write_reg(gspca_dev, 0x0038, 0x010b); /* Differs everywhere */
2210 cit_write_reg(gspca_dev, 0x00d9, 0x0119); /* Same on 320x240, 640x480 */
2211 cit_write_reg(gspca_dev, 0x0006, 0x011b); /* Same on 320x240, 640x480 */
2212 cit_write_reg(gspca_dev, 0x0004, 0x011d); /* NC */
2213 cit_write_reg(gspca_dev, 0x0003, 0x011e); /* Same on 160x120, 640x480 */
2214 cit_write_reg(gspca_dev, 0x0000, 0x0129); /* Same */
2215 cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
2216 cit_write_reg(gspca_dev, 0x0021, 0x0102); /* Same on 320x240, 640x480 */
2217 cit_write_reg(gspca_dev, 0x0016, 0x0104); /* NC */
2218 cit_write_reg(gspca_dev, 0x0004, 0x011a); /* Same on 320x240, 640x480 */
2219 cit_write_reg(gspca_dev, 0x003f, 0x011c); /* Same on 320x240, 640x480 */
2220 cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
2221 cit_write_reg(gspca_dev, 0x001c, 0x0118); /* Same on 320x240, 640x480 */
2222 cit_model3_Packet1(gspca_dev, 0x0021, 0x0001); /* Same */
2223 cit_write_reg(gspca_dev, compression, 0x0109);
2224 cit_write_reg(gspca_dev, 0x0040, 0x0101);
2225 cit_write_reg(gspca_dev, 0x0040, 0x0103);
2226 cit_write_reg(gspca_dev, 0x0000, 0x0132); /* Same on 320x240, 640x480 */
2227 clock_div = 7;
2228 break;
2229 }
2230
2231 cit_model3_Packet1(gspca_dev, 0x007e, 0x000e); /* Hue */
2232 cit_model3_Packet1(gspca_dev, 0x0036, 0x0011); /* Brightness */
2233 cit_model3_Packet1(gspca_dev, 0x0060, 0x0002); /* Sharpness */
2234 cit_model3_Packet1(gspca_dev, 0x0061, 0x0004); /* Sharpness */
2235 cit_model3_Packet1(gspca_dev, 0x0062, 0x0005); /* Sharpness */
2236 cit_model3_Packet1(gspca_dev, 0x0063, 0x0014); /* Sharpness */
2237 cit_model3_Packet1(gspca_dev, 0x0096, 0x00a0); /* Red sharpness */
2238 cit_model3_Packet1(gspca_dev, 0x0097, 0x0096); /* Blue sharpness */
2239 cit_model3_Packet1(gspca_dev, 0x0067, 0x0001); /* Contrast */
2240 cit_model3_Packet1(gspca_dev, 0x005b, 0x000c); /* Contrast */
2241 cit_model3_Packet1(gspca_dev, 0x005c, 0x0016); /* Contrast */
2242 cit_model3_Packet1(gspca_dev, 0x0098, 0x000b);
2243 cit_model3_Packet1(gspca_dev, 0x002c, 0x0003); /* Was 1, broke 640x480 */
2244 cit_model3_Packet1(gspca_dev, 0x002f, 0x002a);
2245 cit_model3_Packet1(gspca_dev, 0x0030, 0x0029);
2246 cit_model3_Packet1(gspca_dev, 0x0037, 0x0002);
2247 cit_model3_Packet1(gspca_dev, 0x0038, 0x0059);
2248 cit_model3_Packet1(gspca_dev, 0x003d, 0x002e);
2249 cit_model3_Packet1(gspca_dev, 0x003e, 0x0028);
2250 cit_model3_Packet1(gspca_dev, 0x0078, 0x0005);
2251 cit_model3_Packet1(gspca_dev, 0x007b, 0x0011);
2252 cit_model3_Packet1(gspca_dev, 0x007d, 0x004b);
2253 cit_model3_Packet1(gspca_dev, 0x007f, 0x0022);
2254 cit_model3_Packet1(gspca_dev, 0x0080, 0x000c);
2255 cit_model3_Packet1(gspca_dev, 0x0081, 0x000b);
2256 cit_model3_Packet1(gspca_dev, 0x0083, 0x00fd);
2257 cit_model3_Packet1(gspca_dev, 0x0086, 0x000b);
2258 cit_model3_Packet1(gspca_dev, 0x0087, 0x000b);
2259 cit_model3_Packet1(gspca_dev, 0x007e, 0x000e);
2260 cit_model3_Packet1(gspca_dev, 0x0096, 0x00a0); /* Red sharpness */
2261 cit_model3_Packet1(gspca_dev, 0x0097, 0x0096); /* Blue sharpness */
2262 cit_model3_Packet1(gspca_dev, 0x0098, 0x000b);
2263
2264 /* FIXME we should probably use cit_get_clock_div() here (in
2265 combination with isoc negotiation using the programmable isoc size)
2266 like with the IBM netcam pro). */
2267 cit_write_reg(gspca_dev, clock_div, 0x0111); /* Clock Divider */
2268
2269 switch (gspca_dev->width) {
2270 case 160:
2271 cit_model3_Packet1(gspca_dev, 0x001f, 0x0000); /* Same */
2272 cit_model3_Packet1(gspca_dev, 0x0039, 0x001f); /* Same */
2273 cit_model3_Packet1(gspca_dev, 0x003b, 0x003c); /* Same */
2274 cit_model3_Packet1(gspca_dev, 0x0040, 0x000a);
2275 cit_model3_Packet1(gspca_dev, 0x0051, 0x000a);
2276 break;
2277 case 320:
2278 cit_model3_Packet1(gspca_dev, 0x001f, 0x0000); /* Same */
2279 cit_model3_Packet1(gspca_dev, 0x0039, 0x001f); /* Same */
2280 cit_model3_Packet1(gspca_dev, 0x003b, 0x003c); /* Same */
2281 cit_model3_Packet1(gspca_dev, 0x0040, 0x0008);
2282 cit_model3_Packet1(gspca_dev, 0x0051, 0x000b);
2283 break;
2284 case 640:
2285 cit_model3_Packet1(gspca_dev, 0x001f, 0x0002); /* !Same */
2286 cit_model3_Packet1(gspca_dev, 0x0039, 0x003e); /* !Same */
2287 cit_model3_Packet1(gspca_dev, 0x0040, 0x0008);
2288 cit_model3_Packet1(gspca_dev, 0x0051, 0x000a);
2289 break;
2290 }
2291
2292 /* if (sd->input_index) { */
2293 if (rca_input) {
2294 for (i = 0; i < ARRAY_SIZE(rca_initdata); i++) {
2295 if (rca_initdata[i][0])
2296 cit_read_reg(gspca_dev, rca_initdata[i][2]);
2297 else
2298 cit_write_reg(gspca_dev, rca_initdata[i][1],
2299 rca_initdata[i][2]);
2300 }
2301 }
2302
2303 return 0;
2304 }
2305
2306 static int cit_start_model4(struct gspca_dev *gspca_dev)
2307 {
2308 struct sd *sd = (struct sd *) gspca_dev;
2309
2310 cit_write_reg(gspca_dev, 0x0000, 0x0100);
2311 cit_write_reg(gspca_dev, 0x00c0, 0x0111);
2312 cit_write_reg(gspca_dev, 0x00bc, 0x012c);
2313 cit_write_reg(gspca_dev, 0x0080, 0x012b);
2314 cit_write_reg(gspca_dev, 0x0000, 0x0108);
2315 cit_write_reg(gspca_dev, 0x0001, 0x0133);
2316 cit_write_reg(gspca_dev, 0x009b, 0x010f);
2317 cit_write_reg(gspca_dev, 0x00bb, 0x010f);
2318 cit_model4_Packet1(gspca_dev, 0x0038, 0x0000);
2319 cit_model4_Packet1(gspca_dev, 0x000a, 0x005c);
2320
2321 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2322 cit_write_reg(gspca_dev, 0x0004, 0x012f);
2323 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2324 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2325 cit_write_reg(gspca_dev, 0x00fb, 0x012e);
2326 cit_write_reg(gspca_dev, 0x0000, 0x0130);
2327 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2328 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2329 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2330 cit_write_reg(gspca_dev, 0x000c, 0x0127);
2331 cit_write_reg(gspca_dev, 0x0009, 0x012e);
2332 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2333
2334 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2335 cit_write_reg(gspca_dev, 0x0012, 0x012f);
2336 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2337 cit_write_reg(gspca_dev, 0x0008, 0x0127);
2338 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2339 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2340 cit_write_reg(gspca_dev, 0x002a, 0x012d);
2341 cit_write_reg(gspca_dev, 0x0000, 0x012f);
2342 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2343 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2344 cit_model4_Packet1(gspca_dev, 0x0034, 0x0000);
2345
2346 switch (gspca_dev->width) {
2347 case 128: /* 128x96 */
2348 cit_write_reg(gspca_dev, 0x0070, 0x0119);
2349 cit_write_reg(gspca_dev, 0x00d0, 0x0111);
2350 cit_write_reg(gspca_dev, 0x0039, 0x010a);
2351 cit_write_reg(gspca_dev, 0x0001, 0x0102);
2352 cit_write_reg(gspca_dev, 0x0028, 0x0103);
2353 cit_write_reg(gspca_dev, 0x0000, 0x0104);
2354 cit_write_reg(gspca_dev, 0x001e, 0x0105);
2355 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2356 cit_write_reg(gspca_dev, 0x0016, 0x012f);
2357 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2358 cit_write_reg(gspca_dev, 0x000a, 0x0127);
2359 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2360 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2361 cit_write_reg(gspca_dev, 0x0014, 0x012d);
2362 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2363 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2364 cit_write_reg(gspca_dev, 0x00aa, 0x012e);
2365 cit_write_reg(gspca_dev, 0x001a, 0x0130);
2366 cit_write_reg(gspca_dev, 0x8a0a, 0x0124);
2367 cit_write_reg(gspca_dev, 0x005a, 0x012d);
2368 cit_write_reg(gspca_dev, 0x9545, 0x0124);
2369 cit_write_reg(gspca_dev, 0x00aa, 0x0127);
2370 cit_write_reg(gspca_dev, 0x0018, 0x012e);
2371 cit_write_reg(gspca_dev, 0x0043, 0x0130);
2372 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2373 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2374 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2375 cit_write_reg(gspca_dev, 0x001c, 0x0127);
2376 cit_write_reg(gspca_dev, 0x00eb, 0x012e);
2377 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2378 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2379 cit_write_reg(gspca_dev, 0x0032, 0x012f);
2380 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2381 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2382 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2383 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2384 cit_write_reg(gspca_dev, 0x0036, 0x012d);
2385 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2386 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2387 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2388 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2389 cit_write_reg(gspca_dev, 0x001e, 0x012f);
2390 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2391 cit_write_reg(gspca_dev, 0x0017, 0x0127);
2392 cit_write_reg(gspca_dev, 0x0013, 0x012e);
2393 cit_write_reg(gspca_dev, 0x0031, 0x0130);
2394 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2395 cit_write_reg(gspca_dev, 0x0017, 0x012d);
2396 cit_write_reg(gspca_dev, 0x0078, 0x012f);
2397 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2398 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2399 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
2400 sd->sof_len = 2;
2401 break;
2402 case 160: /* 160x120 */
2403 cit_write_reg(gspca_dev, 0x0038, 0x0119);
2404 cit_write_reg(gspca_dev, 0x00d0, 0x0111);
2405 cit_write_reg(gspca_dev, 0x00b9, 0x010a);
2406 cit_write_reg(gspca_dev, 0x0001, 0x0102);
2407 cit_write_reg(gspca_dev, 0x0028, 0x0103);
2408 cit_write_reg(gspca_dev, 0x0000, 0x0104);
2409 cit_write_reg(gspca_dev, 0x001e, 0x0105);
2410 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2411 cit_write_reg(gspca_dev, 0x0016, 0x012f);
2412 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2413 cit_write_reg(gspca_dev, 0x000b, 0x0127);
2414 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2415 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2416 cit_write_reg(gspca_dev, 0x0014, 0x012d);
2417 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2418 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2419 cit_write_reg(gspca_dev, 0x00aa, 0x012e);
2420 cit_write_reg(gspca_dev, 0x001a, 0x0130);
2421 cit_write_reg(gspca_dev, 0x8a0a, 0x0124);
2422 cit_write_reg(gspca_dev, 0x005a, 0x012d);
2423 cit_write_reg(gspca_dev, 0x9545, 0x0124);
2424 cit_write_reg(gspca_dev, 0x00aa, 0x0127);
2425 cit_write_reg(gspca_dev, 0x0018, 0x012e);
2426 cit_write_reg(gspca_dev, 0x0043, 0x0130);
2427 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2428 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2429 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2430 cit_write_reg(gspca_dev, 0x001c, 0x0127);
2431 cit_write_reg(gspca_dev, 0x00c7, 0x012e);
2432 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2433 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2434 cit_write_reg(gspca_dev, 0x0032, 0x012f);
2435 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2436 cit_write_reg(gspca_dev, 0x0025, 0x0127);
2437 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2438 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2439 cit_write_reg(gspca_dev, 0x0036, 0x012d);
2440 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2441 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2442 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2443 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2444 cit_write_reg(gspca_dev, 0x001e, 0x012f);
2445 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2446 cit_write_reg(gspca_dev, 0x0048, 0x0127);
2447 cit_write_reg(gspca_dev, 0x0035, 0x012e);
2448 cit_write_reg(gspca_dev, 0x00d0, 0x0130);
2449 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2450 cit_write_reg(gspca_dev, 0x0048, 0x012d);
2451 cit_write_reg(gspca_dev, 0x0090, 0x012f);
2452 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2453 cit_write_reg(gspca_dev, 0x0001, 0x0127);
2454 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
2455 sd->sof_len = 2;
2456 break;
2457 case 176: /* 176x144 */
2458 cit_write_reg(gspca_dev, 0x0038, 0x0119);
2459 cit_write_reg(gspca_dev, 0x00d0, 0x0111);
2460 cit_write_reg(gspca_dev, 0x00b9, 0x010a);
2461 cit_write_reg(gspca_dev, 0x0001, 0x0102);
2462 cit_write_reg(gspca_dev, 0x002c, 0x0103);
2463 cit_write_reg(gspca_dev, 0x0000, 0x0104);
2464 cit_write_reg(gspca_dev, 0x0024, 0x0105);
2465 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2466 cit_write_reg(gspca_dev, 0x0016, 0x012f);
2467 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2468 cit_write_reg(gspca_dev, 0x0007, 0x0127);
2469 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2470 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2471 cit_write_reg(gspca_dev, 0x0014, 0x012d);
2472 cit_write_reg(gspca_dev, 0x0001, 0x012f);
2473 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2474 cit_write_reg(gspca_dev, 0x00aa, 0x012e);
2475 cit_write_reg(gspca_dev, 0x001a, 0x0130);
2476 cit_write_reg(gspca_dev, 0x8a0a, 0x0124);
2477 cit_write_reg(gspca_dev, 0x005e, 0x012d);
2478 cit_write_reg(gspca_dev, 0x9545, 0x0124);
2479 cit_write_reg(gspca_dev, 0x00aa, 0x0127);
2480 cit_write_reg(gspca_dev, 0x0018, 0x012e);
2481 cit_write_reg(gspca_dev, 0x0049, 0x0130);
2482 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2483 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2484 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2485 cit_write_reg(gspca_dev, 0x001c, 0x0127);
2486 cit_write_reg(gspca_dev, 0x00c7, 0x012e);
2487 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2488 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2489 cit_write_reg(gspca_dev, 0x0032, 0x012f);
2490 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2491 cit_write_reg(gspca_dev, 0x0028, 0x0127);
2492 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2493 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2494 cit_write_reg(gspca_dev, 0x0036, 0x012d);
2495 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2496 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2497 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2498 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2499 cit_write_reg(gspca_dev, 0x001e, 0x012f);
2500 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2501 cit_write_reg(gspca_dev, 0x0010, 0x0127);
2502 cit_write_reg(gspca_dev, 0x0013, 0x012e);
2503 cit_write_reg(gspca_dev, 0x002a, 0x0130);
2504 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2505 cit_write_reg(gspca_dev, 0x0010, 0x012d);
2506 cit_write_reg(gspca_dev, 0x006d, 0x012f);
2507 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2508 cit_write_reg(gspca_dev, 0x0001, 0x0127);
2509 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
2510 /* TESTME HDG: this does not seem right
2511 (it is 2 for all other resolutions) */
2512 sd->sof_len = 10;
2513 break;
2514 case 320: /* 320x240 */
2515 cit_write_reg(gspca_dev, 0x0070, 0x0119);
2516 cit_write_reg(gspca_dev, 0x00d0, 0x0111);
2517 cit_write_reg(gspca_dev, 0x0039, 0x010a);
2518 cit_write_reg(gspca_dev, 0x0001, 0x0102);
2519 cit_write_reg(gspca_dev, 0x0028, 0x0103);
2520 cit_write_reg(gspca_dev, 0x0000, 0x0104);
2521 cit_write_reg(gspca_dev, 0x001e, 0x0105);
2522 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2523 cit_write_reg(gspca_dev, 0x0016, 0x012f);
2524 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2525 cit_write_reg(gspca_dev, 0x000a, 0x0127);
2526 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2527 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2528 cit_write_reg(gspca_dev, 0x0014, 0x012d);
2529 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2530 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2531 cit_write_reg(gspca_dev, 0x00aa, 0x012e);
2532 cit_write_reg(gspca_dev, 0x001a, 0x0130);
2533 cit_write_reg(gspca_dev, 0x8a0a, 0x0124);
2534 cit_write_reg(gspca_dev, 0x005a, 0x012d);
2535 cit_write_reg(gspca_dev, 0x9545, 0x0124);
2536 cit_write_reg(gspca_dev, 0x00aa, 0x0127);
2537 cit_write_reg(gspca_dev, 0x0018, 0x012e);
2538 cit_write_reg(gspca_dev, 0x0043, 0x0130);
2539 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2540 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2541 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2542 cit_write_reg(gspca_dev, 0x001c, 0x0127);
2543 cit_write_reg(gspca_dev, 0x00eb, 0x012e);
2544 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2545 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2546 cit_write_reg(gspca_dev, 0x0032, 0x012f);
2547 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2548 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2549 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2550 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2551 cit_write_reg(gspca_dev, 0x0036, 0x012d);
2552 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2553 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2554 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2555 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2556 cit_write_reg(gspca_dev, 0x001e, 0x012f);
2557 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2558 cit_write_reg(gspca_dev, 0x0017, 0x0127);
2559 cit_write_reg(gspca_dev, 0x0013, 0x012e);
2560 cit_write_reg(gspca_dev, 0x0031, 0x0130);
2561 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2562 cit_write_reg(gspca_dev, 0x0017, 0x012d);
2563 cit_write_reg(gspca_dev, 0x0078, 0x012f);
2564 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2565 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2566 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
2567 sd->sof_len = 2;
2568 break;
2569 case 352: /* 352x288 */
2570 cit_write_reg(gspca_dev, 0x0070, 0x0119);
2571 cit_write_reg(gspca_dev, 0x00c0, 0x0111);
2572 cit_write_reg(gspca_dev, 0x0039, 0x010a);
2573 cit_write_reg(gspca_dev, 0x0001, 0x0102);
2574 cit_write_reg(gspca_dev, 0x002c, 0x0103);
2575 cit_write_reg(gspca_dev, 0x0000, 0x0104);
2576 cit_write_reg(gspca_dev, 0x0024, 0x0105);
2577 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2578 cit_write_reg(gspca_dev, 0x0016, 0x012f);
2579 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2580 cit_write_reg(gspca_dev, 0x0006, 0x0127);
2581 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2582 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2583 cit_write_reg(gspca_dev, 0x0014, 0x012d);
2584 cit_write_reg(gspca_dev, 0x0002, 0x012f);
2585 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2586 cit_write_reg(gspca_dev, 0x00aa, 0x012e);
2587 cit_write_reg(gspca_dev, 0x001a, 0x0130);
2588 cit_write_reg(gspca_dev, 0x8a0a, 0x0124);
2589 cit_write_reg(gspca_dev, 0x005e, 0x012d);
2590 cit_write_reg(gspca_dev, 0x9545, 0x0124);
2591 cit_write_reg(gspca_dev, 0x00aa, 0x0127);
2592 cit_write_reg(gspca_dev, 0x0018, 0x012e);
2593 cit_write_reg(gspca_dev, 0x0049, 0x0130);
2594 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2595 cit_write_reg(gspca_dev, 0x00aa, 0x012f);
2596 cit_write_reg(gspca_dev, 0xd055, 0x0124);
2597 cit_write_reg(gspca_dev, 0x001c, 0x0127);
2598 cit_write_reg(gspca_dev, 0x00cf, 0x012e);
2599 cit_write_reg(gspca_dev, 0xaa28, 0x0124);
2600 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2601 cit_write_reg(gspca_dev, 0x0032, 0x012f);
2602 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2603 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2604 cit_write_reg(gspca_dev, 0x00aa, 0x0130);
2605 cit_write_reg(gspca_dev, 0x82a8, 0x0124);
2606 cit_write_reg(gspca_dev, 0x0036, 0x012d);
2607 cit_write_reg(gspca_dev, 0x0008, 0x012f);
2608 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2609 cit_write_reg(gspca_dev, 0xfffa, 0x0124);
2610 cit_write_reg(gspca_dev, 0x00aa, 0x012d);
2611 cit_write_reg(gspca_dev, 0x001e, 0x012f);
2612 cit_write_reg(gspca_dev, 0xd141, 0x0124);
2613 cit_write_reg(gspca_dev, 0x0010, 0x0127);
2614 cit_write_reg(gspca_dev, 0x0013, 0x012e);
2615 cit_write_reg(gspca_dev, 0x0025, 0x0130);
2616 cit_write_reg(gspca_dev, 0x8a28, 0x0124);
2617 cit_write_reg(gspca_dev, 0x0010, 0x012d);
2618 cit_write_reg(gspca_dev, 0x0048, 0x012f);
2619 cit_write_reg(gspca_dev, 0xd145, 0x0124);
2620 cit_write_reg(gspca_dev, 0x0000, 0x0127);
2621 cit_write_reg(gspca_dev, 0xfea8, 0x0124);
2622 sd->sof_len = 2;
2623 break;
2624 }
2625
2626 cit_model4_Packet1(gspca_dev, 0x0038, 0x0004);
2627
2628 return 0;
2629 }
2630
2631 static int cit_start_ibm_netcam_pro(struct gspca_dev *gspca_dev)
2632 {
2633 const unsigned short compression = 0; /* 0=none, 7=best frame rate */
2634 int i, clock_div;
2635
2636 clock_div = cit_get_clock_div(gspca_dev);
2637 if (clock_div < 0)
2638 return clock_div;
2639
2640 cit_write_reg(gspca_dev, 0x0003, 0x0133);
2641 cit_write_reg(gspca_dev, 0x0000, 0x0117);
2642 cit_write_reg(gspca_dev, 0x0008, 0x0123);
2643 cit_write_reg(gspca_dev, 0x0000, 0x0100);
2644 cit_write_reg(gspca_dev, 0x0060, 0x0116);
2645 /* cit_write_reg(gspca_dev, 0x0002, 0x0112); see sd_stop0 */
2646 cit_write_reg(gspca_dev, 0x0000, 0x0133);
2647 cit_write_reg(gspca_dev, 0x0000, 0x0123);
2648 cit_write_reg(gspca_dev, 0x0001, 0x0117);
2649 cit_write_reg(gspca_dev, 0x0040, 0x0108);
2650 cit_write_reg(gspca_dev, 0x0019, 0x012c);
2651 cit_write_reg(gspca_dev, 0x0060, 0x0116);
2652 /* cit_write_reg(gspca_dev, 0x000b, 0x0115); see sd_stop0 */
2653
2654 cit_model3_Packet1(gspca_dev, 0x0049, 0x0000);
2655
2656 cit_write_reg(gspca_dev, 0x0000, 0x0101); /* Same on 160x120, 320x240 */
2657 cit_write_reg(gspca_dev, 0x003a, 0x0102); /* Hstart */
2658 cit_write_reg(gspca_dev, 0x00a0, 0x0103); /* Same on 160x120, 320x240 */
2659 cit_write_reg(gspca_dev, 0x0078, 0x0105); /* Same on 160x120, 320x240 */
2660 cit_write_reg(gspca_dev, 0x0000, 0x010a); /* Same */
2661 cit_write_reg(gspca_dev, 0x0002, 0x011d); /* Same on 160x120, 320x240 */
2662 cit_write_reg(gspca_dev, 0x0000, 0x0129); /* Same */
2663 cit_write_reg(gspca_dev, 0x00fc, 0x012b); /* Same */
2664 cit_write_reg(gspca_dev, 0x0022, 0x012a); /* Same */
2665
2666 switch (gspca_dev->width) {
2667 case 160: /* 160x120 */
2668 cit_write_reg(gspca_dev, 0x0024, 0x010b);
2669 cit_write_reg(gspca_dev, 0x0089, 0x0119);
2670 cit_write_reg(gspca_dev, 0x000a, 0x011b);
2671 cit_write_reg(gspca_dev, 0x0003, 0x011e);
2672 cit_write_reg(gspca_dev, 0x0007, 0x0104);
2673 cit_write_reg(gspca_dev, 0x0009, 0x011a);
2674 cit_write_reg(gspca_dev, 0x008b, 0x011c);
2675 cit_write_reg(gspca_dev, 0x0008, 0x0118);
2676 cit_write_reg(gspca_dev, 0x0000, 0x0132);
2677 break;
2678 case 320: /* 320x240 */
2679 cit_write_reg(gspca_dev, 0x0028, 0x010b);
2680 cit_write_reg(gspca_dev, 0x00d9, 0x0119);
2681 cit_write_reg(gspca_dev, 0x0006, 0x011b);
2682 cit_write_reg(gspca_dev, 0x0000, 0x011e);
2683 cit_write_reg(gspca_dev, 0x000e, 0x0104);
2684 cit_write_reg(gspca_dev, 0x0004, 0x011a);
2685 cit_write_reg(gspca_dev, 0x003f, 0x011c);
2686 cit_write_reg(gspca_dev, 0x000c, 0x0118);
2687 cit_write_reg(gspca_dev, 0x0000, 0x0132);
2688 break;
2689 }
2690
2691 cit_model3_Packet1(gspca_dev, 0x0019, 0x0031);
2692 cit_model3_Packet1(gspca_dev, 0x001a, 0x0003);
2693 cit_model3_Packet1(gspca_dev, 0x001b, 0x0038);
2694 cit_model3_Packet1(gspca_dev, 0x001c, 0x0000);
2695 cit_model3_Packet1(gspca_dev, 0x0024, 0x0001);
2696 cit_model3_Packet1(gspca_dev, 0x0027, 0x0001);
2697 cit_model3_Packet1(gspca_dev, 0x002a, 0x0004);
2698 cit_model3_Packet1(gspca_dev, 0x0035, 0x000b);
2699 cit_model3_Packet1(gspca_dev, 0x003f, 0x0001);
2700 cit_model3_Packet1(gspca_dev, 0x0044, 0x0000);
2701 cit_model3_Packet1(gspca_dev, 0x0054, 0x0000);
2702 cit_model3_Packet1(gspca_dev, 0x00c4, 0x0000);
2703 cit_model3_Packet1(gspca_dev, 0x00e7, 0x0001);
2704 cit_model3_Packet1(gspca_dev, 0x00e9, 0x0001);
2705 cit_model3_Packet1(gspca_dev, 0x00ee, 0x0000);
2706 cit_model3_Packet1(gspca_dev, 0x00f3, 0x00c0);
2707
2708 cit_write_reg(gspca_dev, compression, 0x0109);
2709 cit_write_reg(gspca_dev, clock_div, 0x0111);
2710
2711 /* if (sd->input_index) { */
2712 if (rca_input) {
2713 for (i = 0; i < ARRAY_SIZE(rca_initdata); i++) {
2714 if (rca_initdata[i][0])
2715 cit_read_reg(gspca_dev, rca_initdata[i][2]);
2716 else
2717 cit_write_reg(gspca_dev, rca_initdata[i][1],
2718 rca_initdata[i][2]);
2719 }
2720 }
2721
2722 return 0;
2723 }
2724
2725 /* -- start the camera -- */
2726 static int sd_start(struct gspca_dev *gspca_dev)
2727 {
2728 struct sd *sd = (struct sd *) gspca_dev;
2729 int packet_size;
2730
2731 packet_size = cit_get_packet_size(gspca_dev);
2732 if (packet_size < 0)
2733 return packet_size;
2734
2735 switch (sd->model) {
2736 case CIT_MODEL0:
2737 cit_start_model0(gspca_dev);
2738 break;
2739 case CIT_MODEL1:
2740 cit_start_model1(gspca_dev);
2741 break;
2742 case CIT_MODEL2:
2743 cit_start_model2(gspca_dev);
2744 break;
2745 case CIT_MODEL3:
2746 cit_start_model3(gspca_dev);
2747 break;
2748 case CIT_MODEL4:
2749 cit_start_model4(gspca_dev);
2750 break;
2751 case CIT_IBM_NETCAM_PRO:
2752 cit_start_ibm_netcam_pro(gspca_dev);
2753 break;
2754 }
2755
2756 cit_set_brightness(gspca_dev);
2757 cit_set_contrast(gspca_dev);
2758 cit_set_hue(gspca_dev);
2759 cit_set_sharpness(gspca_dev);
2760 cit_set_lighting(gspca_dev);
2761 cit_set_hflip(gspca_dev);
2762
2763 /* Program max isoc packet size */
2764 cit_write_reg(gspca_dev, packet_size >> 8, 0x0106);
2765 cit_write_reg(gspca_dev, packet_size & 0xff, 0x0107);
2766
2767 cit_restart_stream(gspca_dev);
2768
2769 return 0;
2770 }
2771
2772 static int sd_isoc_nego(struct gspca_dev *gspca_dev)
2773 {
2774 int ret, packet_size;
2775 struct usb_host_interface *alt;
2776
2777 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
2778 packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
2779 packet_size -= 100;
2780 if (packet_size < 300)
2781 return -EIO;
2782 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(packet_size);
2783
2784 ret = usb_set_interface(gspca_dev->dev, gspca_dev->iface, 1);
2785 if (ret < 0)
2786 err("set alt 1 err %d", ret);
2787
2788 return ret;
2789 }
2790
2791 static void sd_stopN(struct gspca_dev *gspca_dev)
2792 {
2793 cit_write_reg(gspca_dev, 0x0000, 0x010c);
2794 }
2795
2796 static void sd_stop0(struct gspca_dev *gspca_dev)
2797 {
2798 struct sd *sd = (struct sd *) gspca_dev;
2799 struct usb_host_interface *alt;
2800
2801 /* We cannot use gspca_dev->present here as that is not set when
2802 sd_init gets called and we get called from sd_init */
2803 if (!gspca_dev->dev)
2804 return;
2805
2806 alt = &gspca_dev->dev->config->intf_cache[0]->altsetting[1];
2807
2808 switch (sd->model) {
2809 case CIT_MODEL0:
2810 /* HDG windows does this, but it causes the cams autogain to
2811 restart from a gain of 0, which does not look good when
2812 changing resolutions. */
2813 /* cit_write_reg(gspca_dev, 0x0000, 0x0112); */
2814 cit_write_reg(gspca_dev, 0x00c0, 0x0100); /* LED Off */
2815 break;
2816 case CIT_MODEL1:
2817 cit_send_FF_04_02(gspca_dev);
2818 cit_read_reg(gspca_dev, 0x0100);
2819 cit_write_reg(gspca_dev, 0x81, 0x0100); /* LED Off */
2820 break;
2821 case CIT_MODEL2:
2822 case CIT_MODEL4:
2823 cit_model2_Packet1(gspca_dev, 0x0030, 0x0004);
2824
2825 cit_write_reg(gspca_dev, 0x0080, 0x0100); /* LED Off */
2826 cit_write_reg(gspca_dev, 0x0020, 0x0111);
2827 cit_write_reg(gspca_dev, 0x00a0, 0x0111);
2828
2829 cit_model2_Packet1(gspca_dev, 0x0030, 0x0002);
2830
2831 cit_write_reg(gspca_dev, 0x0020, 0x0111);
2832 cit_write_reg(gspca_dev, 0x0000, 0x0112);
2833 break;
2834 case CIT_MODEL3:
2835 cit_write_reg(gspca_dev, 0x0006, 0x012c);
2836 cit_model3_Packet1(gspca_dev, 0x0046, 0x0000);
2837 cit_read_reg(gspca_dev, 0x0116);
2838 cit_write_reg(gspca_dev, 0x0064, 0x0116);
2839 cit_read_reg(gspca_dev, 0x0115);
2840 cit_write_reg(gspca_dev, 0x0003, 0x0115);
2841 cit_write_reg(gspca_dev, 0x0008, 0x0123);
2842 cit_write_reg(gspca_dev, 0x0000, 0x0117);
2843 cit_write_reg(gspca_dev, 0x0000, 0x0112);
2844 cit_write_reg(gspca_dev, 0x0080, 0x0100);
2845 break;
2846 case CIT_IBM_NETCAM_PRO:
2847 cit_model3_Packet1(gspca_dev, 0x0049, 0x00ff);
2848 cit_write_reg(gspca_dev, 0x0006, 0x012c);
2849 cit_write_reg(gspca_dev, 0x0000, 0x0116);
2850 /* HDG windows does this, but I cannot get the camera
2851 to restart with this without redoing the entire init
2852 sequence which makes switching modes really slow */
2853 /* cit_write_reg(gspca_dev, 0x0006, 0x0115); */
2854 cit_write_reg(gspca_dev, 0x0008, 0x0123);
2855 cit_write_reg(gspca_dev, 0x0000, 0x0117);
2856 cit_write_reg(gspca_dev, 0x0003, 0x0133);
2857 cit_write_reg(gspca_dev, 0x0000, 0x0111);
2858 /* HDG windows does this, but I get a green picture when
2859 restarting the stream after this */
2860 /* cit_write_reg(gspca_dev, 0x0000, 0x0112); */
2861 cit_write_reg(gspca_dev, 0x00c0, 0x0100);
2862
2863 /* Start isoc bandwidth "negotiation" at max isoc bandwith
2864 next stream start */
2865 alt->endpoint[0].desc.wMaxPacketSize = cpu_to_le16(1022);
2866 break;
2867 }
2868 }
2869
2870 static u8 *cit_find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
2871 {
2872 struct sd *sd = (struct sd *) gspca_dev;
2873 u8 byte3 = 0, byte4 = 0;
2874 int i;
2875
2876 switch (sd->model) {
2877 case CIT_MODEL0:
2878 case CIT_MODEL1:
2879 case CIT_MODEL3:
2880 case CIT_IBM_NETCAM_PRO:
2881 switch (gspca_dev->width) {
2882 case 160: /* 160x120 */
2883 byte3 = 0x02;
2884 byte4 = 0x0a;
2885 break;
2886 case 176: /* 176x144 */
2887 byte3 = 0x02;
2888 byte4 = 0x0e;
2889 break;
2890 case 320: /* 320x240 */
2891 byte3 = 0x02;
2892 byte4 = 0x08;
2893 break;
2894 case 352: /* 352x288 */
2895 byte3 = 0x02;
2896 byte4 = 0x00;
2897 break;
2898 case 640:
2899 byte3 = 0x03;
2900 byte4 = 0x08;
2901 break;
2902 }
2903
2904 /* These have a different byte3 */
2905 if (sd->model <= CIT_MODEL1)
2906 byte3 = 0x00;
2907
2908 for (i = 0; i < len; i++) {
2909 /* For this model the SOF always starts at offset 0
2910 so no need to search the entire frame */
2911 if (sd->model == CIT_MODEL0 && sd->sof_read != i)
2912 break;
2913
2914 switch (sd->sof_read) {
2915 case 0:
2916 if (data[i] == 0x00)
2917 sd->sof_read++;
2918 break;
2919 case 1:
2920 if (data[i] == 0xff)
2921 sd->sof_read++;
2922 else if (data[i] == 0x00)
2923 sd->sof_read = 1;
2924 else
2925 sd->sof_read = 0;
2926 break;
2927 case 2:
2928 if (data[i] == byte3)
2929 sd->sof_read++;
2930 else if (data[i] == 0x00)
2931 sd->sof_read = 1;
2932 else
2933 sd->sof_read = 0;
2934 break;
2935 case 3:
2936 if (data[i] == byte4) {
2937 sd->sof_read = 0;
2938 return data + i + (sd->sof_len - 3);
2939 }
2940 if (byte3 == 0x00 && data[i] == 0xff)
2941 sd->sof_read = 2;
2942 else if (data[i] == 0x00)
2943 sd->sof_read = 1;
2944 else
2945 sd->sof_read = 0;
2946 break;
2947 }
2948 }
2949 break;
2950 case CIT_MODEL2:
2951 case CIT_MODEL4:
2952 /* TESTME we need to find a longer sof signature to avoid
2953 false positives */
2954 for (i = 0; i < len; i++) {
2955 switch (sd->sof_read) {
2956 case 0:
2957 if (data[i] == 0x00)
2958 sd->sof_read++;
2959 break;
2960 case 1:
2961 sd->sof_read = 0;
2962 if (data[i] == 0xff) {
2963 if (i >= 4)
2964 PDEBUG(D_FRAM,
2965 "header found at offset: %d: %02x %02x 00 %02x %02x %02x\n",
2966 i - 1,
2967 data[i - 4],
2968 data[i - 3],
2969 data[i],
2970 data[i + 1],
2971 data[i + 2]);
2972 else
2973 PDEBUG(D_FRAM,
2974 "header found at offset: %d: 00 %02x %02x %02x\n",
2975 i - 1,
2976 data[i],
2977 data[i + 1],
2978 data[i + 2]);
2979 return data + i + (sd->sof_len - 1);
2980 }
2981 break;
2982 }
2983 }
2984 break;
2985 }
2986 return NULL;
2987 }
2988
2989 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
2990 u8 *data, int len)
2991 {
2992 struct sd *sd = (struct sd *) gspca_dev;
2993 unsigned char *sof;
2994
2995 sof = cit_find_sof(gspca_dev, data, len);
2996 if (sof) {
2997 int n;
2998
2999 /* finish decoding current frame */
3000 n = sof - data;
3001 if (n > sd->sof_len)
3002 n -= sd->sof_len;
3003 else
3004 n = 0;
3005 gspca_frame_add(gspca_dev, LAST_PACKET,
3006 data, n);
3007 gspca_frame_add(gspca_dev, FIRST_PACKET, NULL, 0);
3008 len -= sof - data;
3009 data = sof;
3010 }
3011
3012 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
3013 }
3014
3015 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
3016 {
3017 struct sd *sd = (struct sd *) gspca_dev;
3018
3019 sd->brightness = val;
3020 if (gspca_dev->streaming) {
3021 if (sd->stop_on_control_change)
3022 sd_stopN(gspca_dev);
3023 cit_set_brightness(gspca_dev);
3024 if (sd->stop_on_control_change)
3025 cit_restart_stream(gspca_dev);
3026 }
3027
3028 return 0;
3029 }
3030
3031 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
3032 {
3033 struct sd *sd = (struct sd *) gspca_dev;
3034
3035 *val = sd->brightness;
3036
3037 return 0;
3038 }
3039
3040 static int sd_setcontrast(struct gspca_dev *gspca_dev, __s32 val)
3041 {
3042 struct sd *sd = (struct sd *) gspca_dev;
3043
3044 sd->contrast = val;
3045 if (gspca_dev->streaming) {
3046 if (sd->stop_on_control_change)
3047 sd_stopN(gspca_dev);
3048 cit_set_contrast(gspca_dev);
3049 if (sd->stop_on_control_change)
3050 cit_restart_stream(gspca_dev);
3051 }
3052
3053 return 0;
3054 }
3055
3056 static int sd_getcontrast(struct gspca_dev *gspca_dev, __s32 *val)
3057 {
3058 struct sd *sd = (struct sd *) gspca_dev;
3059
3060 *val = sd->contrast;
3061
3062 return 0;
3063 }
3064
3065 static int sd_sethue(struct gspca_dev *gspca_dev, __s32 val)
3066 {
3067 struct sd *sd = (struct sd *) gspca_dev;
3068
3069 sd->hue = val;
3070 if (gspca_dev->streaming) {
3071 if (sd->stop_on_control_change)
3072 sd_stopN(gspca_dev);
3073 cit_set_hue(gspca_dev);
3074 if (sd->stop_on_control_change)
3075 cit_restart_stream(gspca_dev);
3076 }
3077 return 0;
3078 }
3079
3080 static int sd_gethue(struct gspca_dev *gspca_dev, __s32 *val)
3081 {
3082 struct sd *sd = (struct sd *) gspca_dev;
3083
3084 *val = sd->hue;
3085
3086 return 0;
3087 }
3088
3089 static int sd_setsharpness(struct gspca_dev *gspca_dev, __s32 val)
3090 {
3091 struct sd *sd = (struct sd *) gspca_dev;
3092
3093 sd->sharpness = val;
3094 if (gspca_dev->streaming) {
3095 if (sd->stop_on_control_change)
3096 sd_stopN(gspca_dev);
3097 cit_set_sharpness(gspca_dev);
3098 if (sd->stop_on_control_change)
3099 cit_restart_stream(gspca_dev);
3100 }
3101 return 0;
3102 }
3103
3104 static int sd_getsharpness(struct gspca_dev *gspca_dev, __s32 *val)
3105 {
3106 struct sd *sd = (struct sd *) gspca_dev;
3107
3108 *val = sd->sharpness;
3109
3110 return 0;
3111 }
3112
3113 static int sd_setlighting(struct gspca_dev *gspca_dev, __s32 val)
3114 {
3115 struct sd *sd = (struct sd *) gspca_dev;
3116
3117 sd->lighting = val;
3118 if (gspca_dev->streaming) {
3119 if (sd->stop_on_control_change)
3120 sd_stopN(gspca_dev);
3121 cit_set_lighting(gspca_dev);
3122 if (sd->stop_on_control_change)
3123 cit_restart_stream(gspca_dev);
3124 }
3125 return 0;
3126 }
3127
3128 static int sd_getlighting(struct gspca_dev *gspca_dev, __s32 *val)
3129 {
3130 struct sd *sd = (struct sd *) gspca_dev;
3131
3132 *val = sd->lighting;
3133
3134 return 0;
3135 }
3136
3137 static int sd_sethflip(struct gspca_dev *gspca_dev, __s32 val)
3138 {
3139 struct sd *sd = (struct sd *) gspca_dev;
3140
3141 sd->hflip = val;
3142 if (gspca_dev->streaming) {
3143 if (sd->stop_on_control_change)
3144 sd_stopN(gspca_dev);
3145 cit_set_hflip(gspca_dev);
3146 if (sd->stop_on_control_change)
3147 cit_restart_stream(gspca_dev);
3148 }
3149 return 0;
3150 }
3151
3152 static int sd_gethflip(struct gspca_dev *gspca_dev, __s32 *val)
3153 {
3154 struct sd *sd = (struct sd *) gspca_dev;
3155
3156 *val = sd->hflip;
3157
3158 return 0;
3159 }
3160
3161
3162 /* sub-driver description */
3163 static const struct sd_desc sd_desc = {
3164 .name = MODULE_NAME,
3165 .ctrls = sd_ctrls,
3166 .nctrls = ARRAY_SIZE(sd_ctrls),
3167 .config = sd_config,
3168 .init = sd_init,
3169 .start = sd_start,
3170 .stopN = sd_stopN,
3171 .stop0 = sd_stop0,
3172 .pkt_scan = sd_pkt_scan,
3173 };
3174
3175 static const struct sd_desc sd_desc_isoc_nego = {
3176 .name = MODULE_NAME,
3177 .ctrls = sd_ctrls,
3178 .nctrls = ARRAY_SIZE(sd_ctrls),
3179 .config = sd_config,
3180 .init = sd_init,
3181 .start = sd_start,
3182 .isoc_nego = sd_isoc_nego,
3183 .stopN = sd_stopN,
3184 .stop0 = sd_stop0,
3185 .pkt_scan = sd_pkt_scan,
3186 };
3187
3188 /* -- module initialisation -- */
3189 static const __devinitdata struct usb_device_id device_table[] = {
3190 { USB_DEVICE_VER(0x0545, 0x8080, 0x0001, 0x0001), .driver_info = CIT_MODEL0 },
3191 { USB_DEVICE_VER(0x0545, 0x8080, 0x0002, 0x0002), .driver_info = CIT_MODEL1 },
3192 { USB_DEVICE_VER(0x0545, 0x8080, 0x030a, 0x030a), .driver_info = CIT_MODEL2 },
3193 { USB_DEVICE_VER(0x0545, 0x8080, 0x0301, 0x0301), .driver_info = CIT_MODEL3 },
3194 { USB_DEVICE_VER(0x0545, 0x8002, 0x030a, 0x030a), .driver_info = CIT_MODEL4 },
3195 { USB_DEVICE_VER(0x0545, 0x800c, 0x030a, 0x030a), .driver_info = CIT_MODEL2 },
3196 { USB_DEVICE_VER(0x0545, 0x800d, 0x030a, 0x030a), .driver_info = CIT_MODEL4 },
3197 {}
3198 };
3199 MODULE_DEVICE_TABLE(usb, device_table);
3200
3201 /* -- device connect -- */
3202 static int sd_probe(struct usb_interface *intf,
3203 const struct usb_device_id *id)
3204 {
3205 const struct sd_desc *desc = &sd_desc;
3206
3207 switch (id->driver_info) {
3208 case CIT_MODEL0:
3209 case CIT_MODEL1:
3210 if (intf->cur_altsetting->desc.bInterfaceNumber != 2)
3211 return -ENODEV;
3212 break;
3213 case CIT_MODEL2:
3214 case CIT_MODEL4:
3215 if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
3216 return -ENODEV;
3217 break;
3218 case CIT_MODEL3:
3219 if (intf->cur_altsetting->desc.bInterfaceNumber != 0)
3220 return -ENODEV;
3221 /* FIXME this likely applies to all model3 cams and probably
3222 to other models too. */
3223 if (ibm_netcam_pro)
3224 desc = &sd_desc_isoc_nego;
3225 break;
3226 }
3227
3228 return gspca_dev_probe2(intf, id, desc, sizeof(struct sd), THIS_MODULE);
3229 }
3230
3231 static struct usb_driver sd_driver = {
3232 .name = MODULE_NAME,
3233 .id_table = device_table,
3234 .probe = sd_probe,
3235 .disconnect = gspca_disconnect,
3236 #ifdef CONFIG_PM
3237 .suspend = gspca_suspend,
3238 .resume = gspca_resume,
3239 #endif
3240 };
3241
3242 /* -- module insert / remove -- */
3243 static int __init sd_mod_init(void)
3244 {
3245 return usb_register(&sd_driver);
3246 }
3247 static void __exit sd_mod_exit(void)
3248 {
3249 usb_deregister(&sd_driver);
3250 }
3251
3252 module_init(sd_mod_init);
3253 module_exit(sd_mod_exit);
This page took 0.147717 seconds and 5 git commands to generate.