blob: bea1963612155f7f3efdafc6d113779ef7e4f8dd [file] [log] [blame]
Andrew Scullb4b6d4a2019-01-02 15:54:55 +00001/*
2 * Mars MR97310A library
3 *
4 * The original mr97310a driver, which supported the Aiptek Pencam VGA+, is
5 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
6 *
7 * Support for the MR97310A cameras in addition to the Aiptek Pencam VGA+
8 * and for the routines for detecting and classifying these various cameras,
9 * is Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
10 *
11 * Support for the control settings for the CIF cameras is
12 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com> and
13 * Thomas Kaiser <thomas@kaiser-linux.li>
14 *
15 * Support for the control settings for the VGA cameras is
16 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
17 *
18 * Several previously unsupported cameras are owned and have been tested by
19 * Hans de Goede <hdegoede@redhat.com> and
20 * Thomas Kaiser <thomas@kaiser-linux.li> and
21 * Theodore Kilgore <kilgota@auburn.edu> and
22 * Edmond Rodriguez <erodrig_97@yahoo.com> and
23 * Aurelien Jacobs <aurel@gnuage.org>
24 *
25 * The MR97311A support in gspca/mars.c has been helpful in understanding some
26 * of the registers in these cameras.
27 *
28 * This program is free software; you can redistribute it and/or modify
29 * it under the terms of the GNU General Public License as published by
30 * the Free Software Foundation; either version 2 of the License, or
31 * any later version.
32 *
33 * This program is distributed in the hope that it will be useful,
34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36 * GNU General Public License for more details.
37 */
38
39#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
40
41#define MODULE_NAME "mr97310a"
42
43#include "gspca.h"
44
45#define CAM_TYPE_CIF 0
46#define CAM_TYPE_VGA 1
47
48#define MR97310A_BRIGHTNESS_DEFAULT 0
49
50#define MR97310A_EXPOSURE_MIN 0
51#define MR97310A_EXPOSURE_MAX 4095
52#define MR97310A_EXPOSURE_DEFAULT 1000
53
54#define MR97310A_GAIN_MIN 0
55#define MR97310A_GAIN_MAX 31
56#define MR97310A_GAIN_DEFAULT 25
57
58#define MR97310A_CONTRAST_MIN 0
59#define MR97310A_CONTRAST_MAX 31
60#define MR97310A_CONTRAST_DEFAULT 23
61
62#define MR97310A_CS_GAIN_MIN 0
63#define MR97310A_CS_GAIN_MAX 0x7ff
64#define MR97310A_CS_GAIN_DEFAULT 0x110
65
66#define MR97310A_CID_CLOCKDIV (V4L2_CTRL_CLASS_USER + 0x1000)
67#define MR97310A_MIN_CLOCKDIV_MIN 3
68#define MR97310A_MIN_CLOCKDIV_MAX 8
69#define MR97310A_MIN_CLOCKDIV_DEFAULT 3
70
71MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,Theodore Kilgore <kilgota@auburn.edu>");
72MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
73MODULE_LICENSE("GPL");
74
75/* global parameters */
76static int force_sensor_type = -1;
77module_param(force_sensor_type, int, 0644);
78MODULE_PARM_DESC(force_sensor_type, "Force sensor type (-1 (auto), 0 or 1)");
79
80/* specific webcam descriptor */
81struct sd {
82 struct gspca_dev gspca_dev; /* !! must be the first item */
83 struct { /* exposure/min_clockdiv control cluster */
84 struct v4l2_ctrl *exposure;
85 struct v4l2_ctrl *min_clockdiv;
86 };
87 u8 sof_read;
88 u8 cam_type; /* 0 is CIF and 1 is VGA */
89 u8 sensor_type; /* We use 0 and 1 here, too. */
90 u8 do_lcd_stop;
91 u8 adj_colors;
92};
93
94struct sensor_w_data {
95 u8 reg;
96 u8 flags;
97 u8 data[16];
98 int len;
99};
100
101static void sd_stopN(struct gspca_dev *gspca_dev);
102
103static const struct v4l2_pix_format vga_mode[] = {
104 {160, 120, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
105 .bytesperline = 160,
106 .sizeimage = 160 * 120,
107 .colorspace = V4L2_COLORSPACE_SRGB,
108 .priv = 4},
109 {176, 144, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
110 .bytesperline = 176,
111 .sizeimage = 176 * 144,
112 .colorspace = V4L2_COLORSPACE_SRGB,
113 .priv = 3},
114 {320, 240, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
115 .bytesperline = 320,
116 .sizeimage = 320 * 240,
117 .colorspace = V4L2_COLORSPACE_SRGB,
118 .priv = 2},
119 {352, 288, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
120 .bytesperline = 352,
121 .sizeimage = 352 * 288,
122 .colorspace = V4L2_COLORSPACE_SRGB,
123 .priv = 1},
124 {640, 480, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
125 .bytesperline = 640,
126 .sizeimage = 640 * 480,
127 .colorspace = V4L2_COLORSPACE_SRGB,
128 .priv = 0},
129};
130
131/* the bytes to write are in gspca_dev->usb_buf */
132static int mr_write(struct gspca_dev *gspca_dev, int len)
133{
134 int rc;
135
136 rc = usb_bulk_msg(gspca_dev->dev,
137 usb_sndbulkpipe(gspca_dev->dev, 4),
138 gspca_dev->usb_buf, len, NULL, 500);
139 if (rc < 0)
140 pr_err("reg write [%02x] error %d\n",
141 gspca_dev->usb_buf[0], rc);
142 return rc;
143}
144
145/* the bytes are read into gspca_dev->usb_buf */
146static int mr_read(struct gspca_dev *gspca_dev, int len)
147{
148 int rc;
149
150 rc = usb_bulk_msg(gspca_dev->dev,
151 usb_rcvbulkpipe(gspca_dev->dev, 3),
152 gspca_dev->usb_buf, len, NULL, 500);
153 if (rc < 0)
154 pr_err("reg read [%02x] error %d\n",
155 gspca_dev->usb_buf[0], rc);
156 return rc;
157}
158
159static int sensor_write_reg(struct gspca_dev *gspca_dev, u8 reg, u8 flags,
160 const u8 *data, int len)
161{
162 gspca_dev->usb_buf[0] = 0x1f;
163 gspca_dev->usb_buf[1] = flags;
164 gspca_dev->usb_buf[2] = reg;
165 memcpy(gspca_dev->usb_buf + 3, data, len);
166
167 return mr_write(gspca_dev, len + 3);
168}
169
170static int sensor_write_regs(struct gspca_dev *gspca_dev,
171 const struct sensor_w_data *data, int len)
172{
173 int i, rc;
174
175 for (i = 0; i < len; i++) {
176 rc = sensor_write_reg(gspca_dev, data[i].reg, data[i].flags,
177 data[i].data, data[i].len);
178 if (rc < 0)
179 return rc;
180 }
181
182 return 0;
183}
184
185static int sensor_write1(struct gspca_dev *gspca_dev, u8 reg, u8 data)
186{
187 struct sd *sd = (struct sd *) gspca_dev;
188 u8 buf, confirm_reg;
189 int rc;
190
191 buf = data;
192 if (sd->cam_type == CAM_TYPE_CIF) {
193 rc = sensor_write_reg(gspca_dev, reg, 0x01, &buf, 1);
194 confirm_reg = sd->sensor_type ? 0x13 : 0x11;
195 } else {
196 rc = sensor_write_reg(gspca_dev, reg, 0x00, &buf, 1);
197 confirm_reg = 0x11;
198 }
199 if (rc < 0)
200 return rc;
201
202 buf = 0x01;
203 rc = sensor_write_reg(gspca_dev, confirm_reg, 0x00, &buf, 1);
204 if (rc < 0)
205 return rc;
206
207 return 0;
208}
209
210static int cam_get_response16(struct gspca_dev *gspca_dev, u8 reg, int verbose)
211{
212 int err_code;
213
214 gspca_dev->usb_buf[0] = reg;
215 err_code = mr_write(gspca_dev, 1);
216 if (err_code < 0)
217 return err_code;
218
219 err_code = mr_read(gspca_dev, 16);
220 if (err_code < 0)
221 return err_code;
222
223 if (verbose)
224 gspca_dbg(gspca_dev, D_PROBE, "Register: %02x reads %02x%02x%02x\n",
225 reg,
226 gspca_dev->usb_buf[0],
227 gspca_dev->usb_buf[1],
228 gspca_dev->usb_buf[2]);
229
230 return 0;
231}
232
233static int zero_the_pointer(struct gspca_dev *gspca_dev)
234{
235 __u8 *data = gspca_dev->usb_buf;
236 int err_code;
237 u8 status = 0;
238 int tries = 0;
239
240 err_code = cam_get_response16(gspca_dev, 0x21, 0);
241 if (err_code < 0)
242 return err_code;
243
244 data[0] = 0x19;
245 data[1] = 0x51;
246 err_code = mr_write(gspca_dev, 2);
247 if (err_code < 0)
248 return err_code;
249
250 err_code = cam_get_response16(gspca_dev, 0x21, 0);
251 if (err_code < 0)
252 return err_code;
253
254 data[0] = 0x19;
255 data[1] = 0xba;
256 err_code = mr_write(gspca_dev, 2);
257 if (err_code < 0)
258 return err_code;
259
260 err_code = cam_get_response16(gspca_dev, 0x21, 0);
261 if (err_code < 0)
262 return err_code;
263
264 data[0] = 0x19;
265 data[1] = 0x00;
266 err_code = mr_write(gspca_dev, 2);
267 if (err_code < 0)
268 return err_code;
269
270 err_code = cam_get_response16(gspca_dev, 0x21, 0);
271 if (err_code < 0)
272 return err_code;
273
274 data[0] = 0x19;
275 data[1] = 0x00;
276 err_code = mr_write(gspca_dev, 2);
277 if (err_code < 0)
278 return err_code;
279
280 while (status != 0x0a && tries < 256) {
281 err_code = cam_get_response16(gspca_dev, 0x21, 0);
282 status = data[0];
283 tries++;
284 if (err_code < 0)
285 return err_code;
286 }
287 if (status != 0x0a)
288 gspca_err(gspca_dev, "status is %02x\n", status);
289
290 tries = 0;
291 while (tries < 4) {
292 data[0] = 0x19;
293 data[1] = 0x00;
294 err_code = mr_write(gspca_dev, 2);
295 if (err_code < 0)
296 return err_code;
297
298 err_code = cam_get_response16(gspca_dev, 0x21, 0);
299 status = data[0];
300 tries++;
301 if (err_code < 0)
302 return err_code;
303 }
304
305 data[0] = 0x19;
306 err_code = mr_write(gspca_dev, 1);
307 if (err_code < 0)
308 return err_code;
309
310 err_code = mr_read(gspca_dev, 16);
311 if (err_code < 0)
312 return err_code;
313
314 return 0;
315}
316
317static int stream_start(struct gspca_dev *gspca_dev)
318{
319 gspca_dev->usb_buf[0] = 0x01;
320 gspca_dev->usb_buf[1] = 0x01;
321 return mr_write(gspca_dev, 2);
322}
323
324static void stream_stop(struct gspca_dev *gspca_dev)
325{
326 gspca_dev->usb_buf[0] = 0x01;
327 gspca_dev->usb_buf[1] = 0x00;
328 if (mr_write(gspca_dev, 2) < 0)
329 gspca_err(gspca_dev, "Stream Stop failed\n");
330}
331
332static void lcd_stop(struct gspca_dev *gspca_dev)
333{
334 gspca_dev->usb_buf[0] = 0x19;
335 gspca_dev->usb_buf[1] = 0x54;
336 if (mr_write(gspca_dev, 2) < 0)
337 gspca_err(gspca_dev, "LCD Stop failed\n");
338}
339
340static int isoc_enable(struct gspca_dev *gspca_dev)
341{
342 gspca_dev->usb_buf[0] = 0x00;
343 gspca_dev->usb_buf[1] = 0x4d; /* ISOC transferring enable... */
344 return mr_write(gspca_dev, 2);
345}
346
347/* This function is called at probe time */
348static int sd_config(struct gspca_dev *gspca_dev,
349 const struct usb_device_id *id)
350{
351 struct sd *sd = (struct sd *) gspca_dev;
352 struct cam *cam;
353 int err_code;
354
355 cam = &gspca_dev->cam;
356 cam->cam_mode = vga_mode;
357 cam->nmodes = ARRAY_SIZE(vga_mode);
358 sd->do_lcd_stop = 0;
359
360 /* Several of the supported CIF cameras share the same USB ID but
361 * require different initializations and different control settings.
362 * The same is true of the VGA cameras. Therefore, we are forced
363 * to start the initialization process in order to determine which
364 * camera is present. Some of the supported cameras require the
365 * memory pointer to be set to 0 as the very first item of business
366 * or else they will not stream. So we do that immediately.
367 */
368 err_code = zero_the_pointer(gspca_dev);
369 if (err_code < 0)
370 return err_code;
371
372 err_code = stream_start(gspca_dev);
373 if (err_code < 0)
374 return err_code;
375
376 /* Now, the query for sensor type. */
377 err_code = cam_get_response16(gspca_dev, 0x07, 1);
378 if (err_code < 0)
379 return err_code;
380
381 if (id->idProduct == 0x0110 || id->idProduct == 0x010e) {
382 sd->cam_type = CAM_TYPE_CIF;
383 cam->nmodes--;
384 /*
385 * All but one of the known CIF cameras share the same USB ID,
386 * but two different init routines are in use, and the control
387 * settings are different, too. We need to detect which camera
388 * of the two known varieties is connected!
389 *
390 * A list of known CIF cameras follows. They all report either
391 * 0200 for type 0 or 0300 for type 1.
392 * If you have another to report, please do
393 *
394 * Name sd->sensor_type reported by
395 *
396 * Sakar 56379 Spy-shot 0 T. Kilgore
397 * Innovage 0 T. Kilgore
398 * Vivitar Mini 0 H. De Goede
399 * Vivitar Mini 0 E. Rodriguez
400 * Vivitar Mini 1 T. Kilgore
401 * Elta-Media 8212dc 1 T. Kaiser
402 * Philips dig. keych. 1 T. Kilgore
403 * Trust Spyc@m 100 1 A. Jacobs
404 */
405 switch (gspca_dev->usb_buf[0]) {
406 case 2:
407 sd->sensor_type = 0;
408 break;
409 case 3:
410 sd->sensor_type = 1;
411 break;
412 default:
413 pr_err("Unknown CIF Sensor id : %02x\n",
414 gspca_dev->usb_buf[1]);
415 return -ENODEV;
416 }
417 gspca_dbg(gspca_dev, D_PROBE, "MR97310A CIF camera detected, sensor: %d\n",
418 sd->sensor_type);
419 } else {
420 sd->cam_type = CAM_TYPE_VGA;
421
422 /*
423 * Here is a table of the responses to the query for sensor
424 * type, from the known MR97310A VGA cameras. Six different
425 * cameras of which five share the same USB ID.
426 *
427 * Name gspca_dev->usb_buf[] sd->sensor_type
428 * sd->do_lcd_stop
429 * Aiptek Pencam VGA+ 0300 0 1
430 * ION digital 0300 0 1
431 * Argus DC-1620 0450 1 0
432 * Argus QuickClix 0420 1 1
433 * Sakar 77379 Digital 0350 0 1
434 * Sakar 1638x CyberPix 0120 0 2
435 *
436 * Based upon these results, we assume default settings
437 * and then correct as necessary, as follows.
438 *
439 */
440
441 sd->sensor_type = 1;
442 sd->do_lcd_stop = 0;
443 sd->adj_colors = 0;
444 if (gspca_dev->usb_buf[0] == 0x01) {
445 sd->sensor_type = 2;
446 } else if ((gspca_dev->usb_buf[0] != 0x03) &&
447 (gspca_dev->usb_buf[0] != 0x04)) {
448 pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
449 gspca_dev->usb_buf[0]);
450 pr_err("Defaults assumed, may not work\n");
451 pr_err("Please report this\n");
452 }
453 /* Sakar Digital color needs to be adjusted. */
454 if ((gspca_dev->usb_buf[0] == 0x03) &&
455 (gspca_dev->usb_buf[1] == 0x50))
456 sd->adj_colors = 1;
457 if (gspca_dev->usb_buf[0] == 0x04) {
458 sd->do_lcd_stop = 1;
459 switch (gspca_dev->usb_buf[1]) {
460 case 0x50:
461 sd->sensor_type = 0;
462 gspca_dbg(gspca_dev, D_PROBE, "sensor_type corrected to 0\n");
463 break;
464 case 0x20:
465 /* Nothing to do here. */
466 break;
467 default:
468 pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
469 gspca_dev->usb_buf[1]);
470 pr_err("Defaults assumed, may not work\n");
471 pr_err("Please report this\n");
472 }
473 }
474 gspca_dbg(gspca_dev, D_PROBE, "MR97310A VGA camera detected, sensor: %d\n",
475 sd->sensor_type);
476 }
477 /* Stop streaming as we've started it only to probe the sensor type. */
478 sd_stopN(gspca_dev);
479
480 if (force_sensor_type != -1) {
481 sd->sensor_type = !!force_sensor_type;
482 gspca_dbg(gspca_dev, D_PROBE, "Forcing sensor type to: %d\n",
483 sd->sensor_type);
484 }
485
486 return 0;
487}
488
489/* this function is called at probe and resume time */
490static int sd_init(struct gspca_dev *gspca_dev)
491{
492 return 0;
493}
494
495static int start_cif_cam(struct gspca_dev *gspca_dev)
496{
497 struct sd *sd = (struct sd *) gspca_dev;
498 __u8 *data = gspca_dev->usb_buf;
499 int err_code;
500 static const __u8 startup_string[] = {
501 0x00,
502 0x0d,
503 0x01,
504 0x00, /* Hsize/8 for 352 or 320 */
505 0x00, /* Vsize/4 for 288 or 240 */
506 0x13, /* or 0xbb, depends on sensor */
507 0x00, /* Hstart, depends on res. */
508 0x00, /* reserved ? */
509 0x00, /* Vstart, depends on res. and sensor */
510 0x50, /* 0x54 to get 176 or 160 */
511 0xc0
512 };
513
514 /* Note: Some of the above descriptions guessed from MR97113A driver */
515
516 memcpy(data, startup_string, 11);
517 if (sd->sensor_type)
518 data[5] = 0xbb;
519
520 switch (gspca_dev->pixfmt.width) {
521 case 160:
522 data[9] |= 0x04; /* reg 8, 2:1 scale down from 320 */
523 /* fall thru */
524 case 320:
525 default:
526 data[3] = 0x28; /* reg 2, H size/8 */
527 data[4] = 0x3c; /* reg 3, V size/4 */
528 data[6] = 0x14; /* reg 5, H start */
529 data[8] = 0x1a + sd->sensor_type; /* reg 7, V start */
530 break;
531 case 176:
532 data[9] |= 0x04; /* reg 8, 2:1 scale down from 352 */
533 /* fall thru */
534 case 352:
535 data[3] = 0x2c; /* reg 2, H size/8 */
536 data[4] = 0x48; /* reg 3, V size/4 */
537 data[6] = 0x06; /* reg 5, H start */
538 data[8] = 0x06 - sd->sensor_type; /* reg 7, V start */
539 break;
540 }
541 err_code = mr_write(gspca_dev, 11);
542 if (err_code < 0)
543 return err_code;
544
545 if (!sd->sensor_type) {
546 static const struct sensor_w_data cif_sensor0_init_data[] = {
547 {0x02, 0x00, {0x03, 0x5a, 0xb5, 0x01,
548 0x0f, 0x14, 0x0f, 0x10}, 8},
549 {0x0c, 0x00, {0x04, 0x01, 0x01, 0x00, 0x1f}, 5},
550 {0x12, 0x00, {0x07}, 1},
551 {0x1f, 0x00, {0x06}, 1},
552 {0x27, 0x00, {0x04}, 1},
553 {0x29, 0x00, {0x0c}, 1},
554 {0x40, 0x00, {0x40, 0x00, 0x04}, 3},
555 {0x50, 0x00, {0x60}, 1},
556 {0x60, 0x00, {0x06}, 1},
557 {0x6b, 0x00, {0x85, 0x85, 0xc8, 0xc8, 0xc8, 0xc8}, 6},
558 {0x72, 0x00, {0x1e, 0x56}, 2},
559 {0x75, 0x00, {0x58, 0x40, 0xa2, 0x02, 0x31, 0x02,
560 0x31, 0x80, 0x00}, 9},
561 {0x11, 0x00, {0x01}, 1},
562 {0, 0, {0}, 0}
563 };
564 err_code = sensor_write_regs(gspca_dev, cif_sensor0_init_data,
565 ARRAY_SIZE(cif_sensor0_init_data));
566 } else { /* sd->sensor_type = 1 */
567 static const struct sensor_w_data cif_sensor1_init_data[] = {
568 /* Reg 3,4, 7,8 get set by the controls */
569 {0x02, 0x00, {0x10}, 1},
570 {0x05, 0x01, {0x22}, 1}, /* 5/6 also seen as 65h/32h */
571 {0x06, 0x01, {0x00}, 1},
572 {0x09, 0x02, {0x0e}, 1},
573 {0x0a, 0x02, {0x05}, 1},
574 {0x0b, 0x02, {0x05}, 1},
575 {0x0c, 0x02, {0x0f}, 1},
576 {0x0d, 0x02, {0x07}, 1},
577 {0x0e, 0x02, {0x0c}, 1},
578 {0x0f, 0x00, {0x00}, 1},
579 {0x10, 0x00, {0x06}, 1},
580 {0x11, 0x00, {0x07}, 1},
581 {0x12, 0x00, {0x00}, 1},
582 {0x13, 0x00, {0x01}, 1},
583 {0, 0, {0}, 0}
584 };
585 /* Without this command the cam won't work with USB-UHCI */
586 gspca_dev->usb_buf[0] = 0x0a;
587 gspca_dev->usb_buf[1] = 0x00;
588 err_code = mr_write(gspca_dev, 2);
589 if (err_code < 0)
590 return err_code;
591 err_code = sensor_write_regs(gspca_dev, cif_sensor1_init_data,
592 ARRAY_SIZE(cif_sensor1_init_data));
593 }
594 return err_code;
595}
596
597static int start_vga_cam(struct gspca_dev *gspca_dev)
598{
599 struct sd *sd = (struct sd *) gspca_dev;
600 __u8 *data = gspca_dev->usb_buf;
601 int err_code;
602 static const __u8 startup_string[] =
603 {0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00,
604 0x00, 0x50, 0xc0};
605 /* What some of these mean is explained in start_cif_cam(), above */
606
607 memcpy(data, startup_string, 11);
608 if (!sd->sensor_type) {
609 data[5] = 0x00;
610 data[10] = 0x91;
611 }
612 if (sd->sensor_type == 2) {
613 data[5] = 0x00;
614 data[10] = 0x18;
615 }
616
617 switch (gspca_dev->pixfmt.width) {
618 case 160:
619 data[9] |= 0x0c; /* reg 8, 4:1 scale down */
620 /* fall thru */
621 case 320:
622 data[9] |= 0x04; /* reg 8, 2:1 scale down */
623 /* fall thru */
624 case 640:
625 default:
626 data[3] = 0x50; /* reg 2, H size/8 */
627 data[4] = 0x78; /* reg 3, V size/4 */
628 data[6] = 0x04; /* reg 5, H start */
629 data[8] = 0x03; /* reg 7, V start */
630 if (sd->sensor_type == 2) {
631 data[6] = 2;
632 data[8] = 1;
633 }
634 if (sd->do_lcd_stop)
635 data[8] = 0x04; /* Bayer tile shifted */
636 break;
637
638 case 176:
639 data[9] |= 0x04; /* reg 8, 2:1 scale down */
640 /* fall thru */
641 case 352:
642 data[3] = 0x2c; /* reg 2, H size */
643 data[4] = 0x48; /* reg 3, V size */
644 data[6] = 0x94; /* reg 5, H start */
645 data[8] = 0x63; /* reg 7, V start */
646 if (sd->do_lcd_stop)
647 data[8] = 0x64; /* Bayer tile shifted */
648 break;
649 }
650
651 err_code = mr_write(gspca_dev, 11);
652 if (err_code < 0)
653 return err_code;
654
655 if (!sd->sensor_type) {
656 static const struct sensor_w_data vga_sensor0_init_data[] = {
657 {0x01, 0x00, {0x0c, 0x00, 0x04}, 3},
658 {0x14, 0x00, {0x01, 0xe4, 0x02, 0x84}, 4},
659 {0x20, 0x00, {0x00, 0x80, 0x00, 0x08}, 4},
660 {0x25, 0x00, {0x03, 0xa9, 0x80}, 3},
661 {0x30, 0x00, {0x30, 0x18, 0x10, 0x18}, 4},
662 {0, 0, {0}, 0}
663 };
664 err_code = sensor_write_regs(gspca_dev, vga_sensor0_init_data,
665 ARRAY_SIZE(vga_sensor0_init_data));
666 } else if (sd->sensor_type == 1) {
667 static const struct sensor_w_data color_adj[] = {
668 {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
669 /* adjusted blue, green, red gain correct
670 too much blue from the Sakar Digital */
671 0x05, 0x01, 0x04}, 8}
672 };
673
674 static const struct sensor_w_data color_no_adj[] = {
675 {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
676 /* default blue, green, red gain settings */
677 0x07, 0x00, 0x01}, 8}
678 };
679
680 static const struct sensor_w_data vga_sensor1_init_data[] = {
681 {0x11, 0x04, {0x01}, 1},
682 {0x0a, 0x00, {0x00, 0x01, 0x00, 0x00, 0x01,
683 /* These settings may be better for some cameras */
684 /* {0x0a, 0x00, {0x01, 0x06, 0x00, 0x00, 0x01, */
685 0x00, 0x0a}, 7},
686 {0x11, 0x04, {0x01}, 1},
687 {0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
688 {0x11, 0x04, {0x01}, 1},
689 {0, 0, {0}, 0}
690 };
691
692 if (sd->adj_colors)
693 err_code = sensor_write_regs(gspca_dev, color_adj,
694 ARRAY_SIZE(color_adj));
695 else
696 err_code = sensor_write_regs(gspca_dev, color_no_adj,
697 ARRAY_SIZE(color_no_adj));
698
699 if (err_code < 0)
700 return err_code;
701
702 err_code = sensor_write_regs(gspca_dev, vga_sensor1_init_data,
703 ARRAY_SIZE(vga_sensor1_init_data));
704 } else { /* sensor type == 2 */
705 static const struct sensor_w_data vga_sensor2_init_data[] = {
706
707 {0x01, 0x00, {0x48}, 1},
708 {0x02, 0x00, {0x22}, 1},
709 /* Reg 3 msb and 4 is lsb of the exposure setting*/
710 {0x05, 0x00, {0x10}, 1},
711 {0x06, 0x00, {0x00}, 1},
712 {0x07, 0x00, {0x00}, 1},
713 {0x08, 0x00, {0x00}, 1},
714 {0x09, 0x00, {0x00}, 1},
715 /* The following are used in the gain control
716 * which is BTW completely borked in the OEM driver
717 * The values for each color go from 0 to 0x7ff
718 *{0x0a, 0x00, {0x01}, 1}, green1 gain msb
719 *{0x0b, 0x00, {0x10}, 1}, green1 gain lsb
720 *{0x0c, 0x00, {0x01}, 1}, red gain msb
721 *{0x0d, 0x00, {0x10}, 1}, red gain lsb
722 *{0x0e, 0x00, {0x01}, 1}, blue gain msb
723 *{0x0f, 0x00, {0x10}, 1}, blue gain lsb
724 *{0x10, 0x00, {0x01}, 1}, green2 gain msb
725 *{0x11, 0x00, {0x10}, 1}, green2 gain lsb
726 */
727 {0x12, 0x00, {0x00}, 1},
728 {0x13, 0x00, {0x04}, 1}, /* weird effect on colors */
729 {0x14, 0x00, {0x00}, 1},
730 {0x15, 0x00, {0x06}, 1},
731 {0x16, 0x00, {0x01}, 1},
732 {0x17, 0x00, {0xe2}, 1}, /* vertical alignment */
733 {0x18, 0x00, {0x02}, 1},
734 {0x19, 0x00, {0x82}, 1}, /* don't mess with */
735 {0x1a, 0x00, {0x00}, 1},
736 {0x1b, 0x00, {0x20}, 1},
737 /* {0x1c, 0x00, {0x17}, 1}, contrast control */
738 {0x1d, 0x00, {0x80}, 1}, /* moving causes a mess */
739 {0x1e, 0x00, {0x08}, 1}, /* moving jams the camera */
740 {0x1f, 0x00, {0x0c}, 1},
741 {0x20, 0x00, {0x00}, 1},
742 {0, 0, {0}, 0}
743 };
744 err_code = sensor_write_regs(gspca_dev, vga_sensor2_init_data,
745 ARRAY_SIZE(vga_sensor2_init_data));
746 }
747 return err_code;
748}
749
750static int sd_start(struct gspca_dev *gspca_dev)
751{
752 struct sd *sd = (struct sd *) gspca_dev;
753 int err_code;
754
755 sd->sof_read = 0;
756
757 /* Some of the VGA cameras require the memory pointer
758 * to be set to 0 again. We have been forced to start the
759 * stream in sd_config() to detect the hardware, and closed it.
760 * Thus, we need here to do a completely fresh and clean start. */
761 err_code = zero_the_pointer(gspca_dev);
762 if (err_code < 0)
763 return err_code;
764
765 err_code = stream_start(gspca_dev);
766 if (err_code < 0)
767 return err_code;
768
769 if (sd->cam_type == CAM_TYPE_CIF) {
770 err_code = start_cif_cam(gspca_dev);
771 } else {
772 err_code = start_vga_cam(gspca_dev);
773 }
774 if (err_code < 0)
775 return err_code;
776
777 return isoc_enable(gspca_dev);
778}
779
780static void sd_stopN(struct gspca_dev *gspca_dev)
781{
782 struct sd *sd = (struct sd *) gspca_dev;
783
784 stream_stop(gspca_dev);
785 /* Not all the cams need this, but even if not, probably a good idea */
786 zero_the_pointer(gspca_dev);
787 if (sd->do_lcd_stop)
788 lcd_stop(gspca_dev);
789}
790
791static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
792{
793 struct sd *sd = (struct sd *) gspca_dev;
794 u8 sign_reg = 7; /* This reg and the next one used on CIF cams. */
795 u8 value_reg = 8; /* VGA cams seem to use regs 0x0b and 0x0c */
796 static const u8 quick_clix_table[] =
797 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
798 { 0, 4, 8, 12, 1, 2, 3, 5, 6, 9, 7, 10, 13, 11, 14, 15};
799 if (sd->cam_type == CAM_TYPE_VGA) {
800 sign_reg += 4;
801 value_reg += 4;
802 }
803
804 /* Note register 7 is also seen as 0x8x or 0xCx in some dumps */
805 if (val > 0) {
806 sensor_write1(gspca_dev, sign_reg, 0x00);
807 } else {
808 sensor_write1(gspca_dev, sign_reg, 0x01);
809 val = 257 - val;
810 }
811 /* Use lookup table for funky Argus QuickClix brightness */
812 if (sd->do_lcd_stop)
813 val = quick_clix_table[val];
814
815 sensor_write1(gspca_dev, value_reg, val);
816}
817
818static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 min_clockdiv)
819{
820 struct sd *sd = (struct sd *) gspca_dev;
821 int exposure = MR97310A_EXPOSURE_DEFAULT;
822 u8 buf[2];
823
824 if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1) {
825 /* This cam does not like exposure settings < 300,
826 so scale 0 - 4095 to 300 - 4095 */
827 exposure = (expo * 9267) / 10000 + 300;
828 sensor_write1(gspca_dev, 3, exposure >> 4);
829 sensor_write1(gspca_dev, 4, exposure & 0x0f);
830 } else if (sd->sensor_type == 2) {
831 exposure = expo;
832 exposure >>= 3;
833 sensor_write1(gspca_dev, 3, exposure >> 8);
834 sensor_write1(gspca_dev, 4, exposure & 0xff);
835 } else {
836 /* We have both a clock divider and an exposure register.
837 We first calculate the clock divider, as that determines
838 the maximum exposure and then we calculate the exposure
839 register setting (which goes from 0 - 511).
840
841 Note our 0 - 4095 exposure is mapped to 0 - 511
842 milliseconds exposure time */
843 u8 clockdiv = (60 * expo + 7999) / 8000;
844
845 /* Limit framerate to not exceed usb bandwidth */
846 if (clockdiv < min_clockdiv && gspca_dev->pixfmt.width >= 320)
847 clockdiv = min_clockdiv;
848 else if (clockdiv < 2)
849 clockdiv = 2;
850
851 if (sd->cam_type == CAM_TYPE_VGA && clockdiv < 4)
852 clockdiv = 4;
853
854 /* Frame exposure time in ms = 1000 * clockdiv / 60 ->
855 exposure = (sd->exposure / 8) * 511 / (1000 * clockdiv / 60) */
856 exposure = (60 * 511 * expo) / (8000 * clockdiv);
857 if (exposure > 511)
858 exposure = 511;
859
860 /* exposure register value is reversed! */
861 exposure = 511 - exposure;
862
863 buf[0] = exposure & 0xff;
864 buf[1] = exposure >> 8;
865 sensor_write_reg(gspca_dev, 0x0e, 0, buf, 2);
866 sensor_write1(gspca_dev, 0x02, clockdiv);
867 }
868}
869
870static void setgain(struct gspca_dev *gspca_dev, s32 val)
871{
872 struct sd *sd = (struct sd *) gspca_dev;
873 u8 gainreg;
874
875 if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1)
876 sensor_write1(gspca_dev, 0x0e, val);
877 else if (sd->cam_type == CAM_TYPE_VGA && sd->sensor_type == 2)
878 for (gainreg = 0x0a; gainreg < 0x11; gainreg += 2) {
879 sensor_write1(gspca_dev, gainreg, val >> 8);
880 sensor_write1(gspca_dev, gainreg + 1, val & 0xff);
881 }
882 else
883 sensor_write1(gspca_dev, 0x10, val);
884}
885
886static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
887{
888 sensor_write1(gspca_dev, 0x1c, val);
889}
890
891static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
892{
893 struct gspca_dev *gspca_dev =
894 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
895 struct sd *sd = (struct sd *)gspca_dev;
896
897 gspca_dev->usb_err = 0;
898
899 if (!gspca_dev->streaming)
900 return 0;
901
902 switch (ctrl->id) {
903 case V4L2_CID_BRIGHTNESS:
904 setbrightness(gspca_dev, ctrl->val);
905 break;
906 case V4L2_CID_CONTRAST:
907 setcontrast(gspca_dev, ctrl->val);
908 break;
909 case V4L2_CID_EXPOSURE:
910 setexposure(gspca_dev, sd->exposure->val,
911 sd->min_clockdiv ? sd->min_clockdiv->val : 0);
912 break;
913 case V4L2_CID_GAIN:
914 setgain(gspca_dev, ctrl->val);
915 break;
916 }
917 return gspca_dev->usb_err;
918}
919
920static const struct v4l2_ctrl_ops sd_ctrl_ops = {
921 .s_ctrl = sd_s_ctrl,
922};
923
924static int sd_init_controls(struct gspca_dev *gspca_dev)
925{
926 struct sd *sd = (struct sd *)gspca_dev;
927 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
928 static const struct v4l2_ctrl_config clockdiv = {
929 .ops = &sd_ctrl_ops,
930 .id = MR97310A_CID_CLOCKDIV,
931 .type = V4L2_CTRL_TYPE_INTEGER,
932 .name = "Minimum Clock Divider",
933 .min = MR97310A_MIN_CLOCKDIV_MIN,
934 .max = MR97310A_MIN_CLOCKDIV_MAX,
935 .step = 1,
936 .def = MR97310A_MIN_CLOCKDIV_DEFAULT,
937 };
938 bool has_brightness = false;
939 bool has_argus_brightness = false;
940 bool has_contrast = false;
941 bool has_gain = false;
942 bool has_cs_gain = false;
943 bool has_exposure = false;
944 bool has_clockdiv = false;
945
946 gspca_dev->vdev.ctrl_handler = hdl;
947 v4l2_ctrl_handler_init(hdl, 4);
948
949 /* Setup controls depending on camera type */
950 if (sd->cam_type == CAM_TYPE_CIF) {
951 /* No brightness for sensor_type 0 */
952 if (sd->sensor_type == 0)
953 has_exposure = has_gain = has_clockdiv = true;
954 else
955 has_exposure = has_gain = has_brightness = true;
956 } else {
957 /* All controls need to be disabled if VGA sensor_type is 0 */
958 if (sd->sensor_type == 0)
959 ; /* no controls! */
960 else if (sd->sensor_type == 2)
961 has_exposure = has_cs_gain = has_contrast = true;
962 else if (sd->do_lcd_stop)
963 has_exposure = has_gain = has_argus_brightness =
964 has_clockdiv = true;
965 else
966 has_exposure = has_gain = has_brightness =
967 has_clockdiv = true;
968 }
969
970 /* Separate brightness control description for Argus QuickClix as it has
971 * different limits from the other mr97310a cameras, and separate gain
972 * control for Sakar CyberPix camera. */
973 /*
974 * This control is disabled for CIF type 1 and VGA type 0 cameras.
975 * It does not quite act linearly for the Argus QuickClix camera,
976 * but it does control brightness. The values are 0 - 15 only, and
977 * the table above makes them act consecutively.
978 */
979 if (has_brightness)
980 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
981 V4L2_CID_BRIGHTNESS, -254, 255, 1,
982 MR97310A_BRIGHTNESS_DEFAULT);
983 else if (has_argus_brightness)
984 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
985 V4L2_CID_BRIGHTNESS, 0, 15, 1,
986 MR97310A_BRIGHTNESS_DEFAULT);
987 if (has_contrast)
988 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
989 V4L2_CID_CONTRAST, MR97310A_CONTRAST_MIN,
990 MR97310A_CONTRAST_MAX, 1, MR97310A_CONTRAST_DEFAULT);
991 if (has_gain)
992 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
993 V4L2_CID_GAIN, MR97310A_GAIN_MIN, MR97310A_GAIN_MAX,
994 1, MR97310A_GAIN_DEFAULT);
995 else if (has_cs_gain)
996 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, V4L2_CID_GAIN,
997 MR97310A_CS_GAIN_MIN, MR97310A_CS_GAIN_MAX,
998 1, MR97310A_CS_GAIN_DEFAULT);
999 if (has_exposure)
1000 sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1001 V4L2_CID_EXPOSURE, MR97310A_EXPOSURE_MIN,
1002 MR97310A_EXPOSURE_MAX, 1, MR97310A_EXPOSURE_DEFAULT);
1003 if (has_clockdiv)
1004 sd->min_clockdiv = v4l2_ctrl_new_custom(hdl, &clockdiv, NULL);
1005
1006 if (hdl->error) {
1007 pr_err("Could not initialize controls\n");
1008 return hdl->error;
1009 }
1010 if (has_exposure && has_clockdiv)
1011 v4l2_ctrl_cluster(2, &sd->exposure);
1012 return 0;
1013}
1014
1015/* Include pac common sof detection functions */
1016#include "pac_common.h"
1017
1018static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1019 u8 *data, /* isoc packet */
1020 int len) /* iso packet length */
1021{
1022 struct sd *sd = (struct sd *) gspca_dev;
1023 unsigned char *sof;
1024
1025 sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
1026 if (sof) {
1027 int n;
1028
1029 /* finish decoding current frame */
1030 n = sof - data;
1031 if (n > sizeof pac_sof_marker)
1032 n -= sizeof pac_sof_marker;
1033 else
1034 n = 0;
1035 gspca_frame_add(gspca_dev, LAST_PACKET,
1036 data, n);
1037 /* Start next frame. */
1038 gspca_frame_add(gspca_dev, FIRST_PACKET,
1039 pac_sof_marker, sizeof pac_sof_marker);
1040 len -= sof - data;
1041 data = sof;
1042 }
1043 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1044}
1045
1046/* sub-driver description */
1047static const struct sd_desc sd_desc = {
1048 .name = MODULE_NAME,
1049 .config = sd_config,
1050 .init = sd_init,
1051 .init_controls = sd_init_controls,
1052 .start = sd_start,
1053 .stopN = sd_stopN,
1054 .pkt_scan = sd_pkt_scan,
1055};
1056
1057/* -- module initialisation -- */
1058static const struct usb_device_id device_table[] = {
1059 {USB_DEVICE(0x08ca, 0x0110)}, /* Trust Spyc@m 100 */
1060 {USB_DEVICE(0x08ca, 0x0111)}, /* Aiptek Pencam VGA+ */
1061 {USB_DEVICE(0x093a, 0x010f)}, /* All other known MR97310A VGA cams */
1062 {USB_DEVICE(0x093a, 0x010e)}, /* All known MR97310A CIF cams */
1063 {}
1064};
1065MODULE_DEVICE_TABLE(usb, device_table);
1066
1067/* -- device connect -- */
1068static int sd_probe(struct usb_interface *intf,
1069 const struct usb_device_id *id)
1070{
1071 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1072 THIS_MODULE);
1073}
1074
1075static struct usb_driver sd_driver = {
1076 .name = MODULE_NAME,
1077 .id_table = device_table,
1078 .probe = sd_probe,
1079 .disconnect = gspca_disconnect,
1080#ifdef CONFIG_PM
1081 .suspend = gspca_suspend,
1082 .resume = gspca_resume,
1083 .reset_resume = gspca_resume,
1084#endif
1085};
1086
1087module_usb_driver(sd_driver);