2 * Mars MR97310A library
4 * The original mr97310a driver, which supported the Aiptek Pencam VGA+, is
5 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
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>
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>
15 * Support for the control settings for the VGA cameras is
16 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
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>
25 * The MR97311A support in gspca/mars.c has been helpful in understanding some
26 * of the registers in these cameras.
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
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.
39 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
41 #define MODULE_NAME "mr97310a"
45 #define CAM_TYPE_CIF 0
46 #define CAM_TYPE_VGA 1
48 #define MR97310A_BRIGHTNESS_DEFAULT 0
50 #define MR97310A_EXPOSURE_MIN 0
51 #define MR97310A_EXPOSURE_MAX 4095
52 #define MR97310A_EXPOSURE_DEFAULT 1000
54 #define MR97310A_GAIN_MIN 0
55 #define MR97310A_GAIN_MAX 31
56 #define MR97310A_GAIN_DEFAULT 25
58 #define MR97310A_CONTRAST_MIN 0
59 #define MR97310A_CONTRAST_MAX 31
60 #define MR97310A_CONTRAST_DEFAULT 23
62 #define MR97310A_CS_GAIN_MIN 0
63 #define MR97310A_CS_GAIN_MAX 0x7ff
64 #define MR97310A_CS_GAIN_DEFAULT 0x110
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
71 MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,Theodore Kilgore <kilgota@auburn.edu>");
72 MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
73 MODULE_LICENSE("GPL");
75 /* global parameters */
76 static int force_sensor_type
= -1;
77 module_param(force_sensor_type
, int, 0644);
78 MODULE_PARM_DESC(force_sensor_type
, "Force sensor type (-1 (auto), 0 or 1)");
80 /* specific webcam descriptor */
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
;
88 u8 cam_type
; /* 0 is CIF and 1 is VGA */
89 u8 sensor_type
; /* We use 0 and 1 here, too. */
94 struct sensor_w_data
{
101 static void sd_stopN(struct gspca_dev
*gspca_dev
);
103 static const struct v4l2_pix_format vga_mode
[] = {
104 {160, 120, V4L2_PIX_FMT_MR97310A
, V4L2_FIELD_NONE
,
106 .sizeimage
= 160 * 120,
107 .colorspace
= V4L2_COLORSPACE_SRGB
,
109 {176, 144, V4L2_PIX_FMT_MR97310A
, V4L2_FIELD_NONE
,
111 .sizeimage
= 176 * 144,
112 .colorspace
= V4L2_COLORSPACE_SRGB
,
114 {320, 240, V4L2_PIX_FMT_MR97310A
, V4L2_FIELD_NONE
,
116 .sizeimage
= 320 * 240,
117 .colorspace
= V4L2_COLORSPACE_SRGB
,
119 {352, 288, V4L2_PIX_FMT_MR97310A
, V4L2_FIELD_NONE
,
121 .sizeimage
= 352 * 288,
122 .colorspace
= V4L2_COLORSPACE_SRGB
,
124 {640, 480, V4L2_PIX_FMT_MR97310A
, V4L2_FIELD_NONE
,
126 .sizeimage
= 640 * 480,
127 .colorspace
= V4L2_COLORSPACE_SRGB
,
131 /* the bytes to write are in gspca_dev->usb_buf */
132 static int mr_write(struct gspca_dev
*gspca_dev
, int len
)
136 rc
= usb_bulk_msg(gspca_dev
->dev
,
137 usb_sndbulkpipe(gspca_dev
->dev
, 4),
138 gspca_dev
->usb_buf
, len
, NULL
, 500);
140 pr_err("reg write [%02x] error %d\n",
141 gspca_dev
->usb_buf
[0], rc
);
145 /* the bytes are read into gspca_dev->usb_buf */
146 static int mr_read(struct gspca_dev
*gspca_dev
, int len
)
150 rc
= usb_bulk_msg(gspca_dev
->dev
,
151 usb_rcvbulkpipe(gspca_dev
->dev
, 3),
152 gspca_dev
->usb_buf
, len
, NULL
, 500);
154 pr_err("reg read [%02x] error %d\n",
155 gspca_dev
->usb_buf
[0], rc
);
159 static int sensor_write_reg(struct gspca_dev
*gspca_dev
, u8 reg
, u8 flags
,
160 const u8
*data
, int len
)
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
);
167 return mr_write(gspca_dev
, len
+ 3);
170 static int sensor_write_regs(struct gspca_dev
*gspca_dev
,
171 const struct sensor_w_data
*data
, int len
)
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
);
185 static int sensor_write1(struct gspca_dev
*gspca_dev
, u8 reg
, u8 data
)
187 struct sd
*sd
= (struct sd
*) gspca_dev
;
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;
196 rc
= sensor_write_reg(gspca_dev
, reg
, 0x00, &buf
, 1);
203 rc
= sensor_write_reg(gspca_dev
, confirm_reg
, 0x00, &buf
, 1);
210 static int cam_get_response16(struct gspca_dev
*gspca_dev
, u8 reg
, int verbose
)
214 gspca_dev
->usb_buf
[0] = reg
;
215 err_code
= mr_write(gspca_dev
, 1);
219 err_code
= mr_read(gspca_dev
, 16);
224 gspca_dbg(gspca_dev
, D_PROBE
, "Register: %02x reads %02x%02x%02x\n",
226 gspca_dev
->usb_buf
[0],
227 gspca_dev
->usb_buf
[1],
228 gspca_dev
->usb_buf
[2]);
233 static int zero_the_pointer(struct gspca_dev
*gspca_dev
)
235 __u8
*data
= gspca_dev
->usb_buf
;
240 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
246 err_code
= mr_write(gspca_dev
, 2);
250 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
256 err_code
= mr_write(gspca_dev
, 2);
260 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
266 err_code
= mr_write(gspca_dev
, 2);
270 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
276 err_code
= mr_write(gspca_dev
, 2);
280 while (status
!= 0x0a && tries
< 256) {
281 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
288 gspca_err(gspca_dev
, "status is %02x\n", status
);
294 err_code
= mr_write(gspca_dev
, 2);
298 err_code
= cam_get_response16(gspca_dev
, 0x21, 0);
306 err_code
= mr_write(gspca_dev
, 1);
310 err_code
= mr_read(gspca_dev
, 16);
317 static int stream_start(struct gspca_dev
*gspca_dev
)
319 gspca_dev
->usb_buf
[0] = 0x01;
320 gspca_dev
->usb_buf
[1] = 0x01;
321 return mr_write(gspca_dev
, 2);
324 static void stream_stop(struct gspca_dev
*gspca_dev
)
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");
332 static void lcd_stop(struct gspca_dev
*gspca_dev
)
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");
340 static int isoc_enable(struct gspca_dev
*gspca_dev
)
342 gspca_dev
->usb_buf
[0] = 0x00;
343 gspca_dev
->usb_buf
[1] = 0x4d; /* ISOC transferring enable... */
344 return mr_write(gspca_dev
, 2);
347 /* This function is called at probe time */
348 static int sd_config(struct gspca_dev
*gspca_dev
,
349 const struct usb_device_id
*id
)
351 struct sd
*sd
= (struct sd
*) gspca_dev
;
355 cam
= &gspca_dev
->cam
;
356 cam
->cam_mode
= vga_mode
;
357 cam
->nmodes
= ARRAY_SIZE(vga_mode
);
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.
368 err_code
= zero_the_pointer(gspca_dev
);
372 err_code
= stream_start(gspca_dev
);
376 /* Now, the query for sensor type. */
377 err_code
= cam_get_response16(gspca_dev
, 0x07, 1);
381 if (id
->idProduct
== 0x0110 || id
->idProduct
== 0x010e) {
382 sd
->cam_type
= CAM_TYPE_CIF
;
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!
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
394 * Name sd->sensor_type reported by
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
405 switch (gspca_dev
->usb_buf
[0]) {
413 pr_err("Unknown CIF Sensor id : %02x\n",
414 gspca_dev
->usb_buf
[1]);
417 gspca_dbg(gspca_dev
, D_PROBE
, "MR97310A CIF camera detected, sensor: %d\n",
420 sd
->cam_type
= CAM_TYPE_VGA
;
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.
427 * Name gspca_dev->usb_buf[] sd->sensor_type
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
436 * Based upon these results, we assume default settings
437 * and then correct as necessary, as follows.
444 if (gspca_dev
->usb_buf
[0] == 0x01) {
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");
453 /* Sakar Digital color needs to be adjusted. */
454 if ((gspca_dev
->usb_buf
[0] == 0x03) &&
455 (gspca_dev
->usb_buf
[1] == 0x50))
457 if (gspca_dev
->usb_buf
[0] == 0x04) {
459 switch (gspca_dev
->usb_buf
[1]) {
462 gspca_dbg(gspca_dev
, D_PROBE
, "sensor_type corrected to 0\n");
465 /* Nothing to do here. */
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");
474 gspca_dbg(gspca_dev
, D_PROBE
, "MR97310A VGA camera detected, sensor: %d\n",
477 /* Stop streaming as we've started it only to probe the sensor type. */
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",
489 /* this function is called at probe and resume time */
490 static int sd_init(struct gspca_dev
*gspca_dev
)
495 static int start_cif_cam(struct gspca_dev
*gspca_dev
)
497 struct sd
*sd
= (struct sd
*) gspca_dev
;
498 __u8
*data
= gspca_dev
->usb_buf
;
500 static const __u8 startup_string
[] = {
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 */
514 /* Note: Some of the above descriptions guessed from MR97113A driver */
516 memcpy(data
, startup_string
, 11);
520 switch (gspca_dev
->pixfmt
.width
) {
522 data
[9] |= 0x04; /* reg 8, 2:1 scale down from 320 */
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 */
532 data
[9] |= 0x04; /* reg 8, 2:1 scale down from 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 */
541 err_code
= mr_write(gspca_dev
, 11);
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},
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},
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);
591 err_code
= sensor_write_regs(gspca_dev
, cif_sensor1_init_data
,
592 ARRAY_SIZE(cif_sensor1_init_data
));
597 static int start_vga_cam(struct gspca_dev
*gspca_dev
)
599 struct sd
*sd
= (struct sd
*) gspca_dev
;
600 __u8
*data
= gspca_dev
->usb_buf
;
602 static const __u8 startup_string
[] =
603 {0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00,
605 /* What some of these mean is explained in start_cif_cam(), above */
607 memcpy(data
, startup_string
, 11);
608 if (!sd
->sensor_type
) {
612 if (sd
->sensor_type
== 2) {
617 switch (gspca_dev
->pixfmt
.width
) {
619 data
[9] |= 0x0c; /* reg 8, 4:1 scale down */
622 data
[9] |= 0x04; /* reg 8, 2:1 scale down */
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) {
635 data
[8] = 0x04; /* Bayer tile shifted */
639 data
[9] |= 0x04; /* reg 8, 2:1 scale down */
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 */
647 data
[8] = 0x64; /* Bayer tile shifted */
651 err_code
= mr_write(gspca_dev
, 11);
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},
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}
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}
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, */
686 {0x11, 0x04, {0x01}, 1},
687 {0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
688 {0x11, 0x04, {0x01}, 1},
693 err_code
= sensor_write_regs(gspca_dev
, color_adj
,
694 ARRAY_SIZE(color_adj
));
696 err_code
= sensor_write_regs(gspca_dev
, color_no_adj
,
697 ARRAY_SIZE(color_no_adj
));
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
[] = {
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
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},
744 err_code
= sensor_write_regs(gspca_dev
, vga_sensor2_init_data
,
745 ARRAY_SIZE(vga_sensor2_init_data
));
750 static int sd_start(struct gspca_dev
*gspca_dev
)
752 struct sd
*sd
= (struct sd
*) gspca_dev
;
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
);
765 err_code
= stream_start(gspca_dev
);
769 if (sd
->cam_type
== CAM_TYPE_CIF
) {
770 err_code
= start_cif_cam(gspca_dev
);
772 err_code
= start_vga_cam(gspca_dev
);
777 return isoc_enable(gspca_dev
);
780 static void sd_stopN(struct gspca_dev
*gspca_dev
)
782 struct sd
*sd
= (struct sd
*) gspca_dev
;
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
);
791 static void setbrightness(struct gspca_dev
*gspca_dev
, s32 val
)
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
) {
804 /* Note register 7 is also seen as 0x8x or 0xCx in some dumps */
806 sensor_write1(gspca_dev
, sign_reg
, 0x00);
808 sensor_write1(gspca_dev
, sign_reg
, 0x01);
811 /* Use lookup table for funky Argus QuickClix brightness */
813 val
= quick_clix_table
[val
];
815 sensor_write1(gspca_dev
, value_reg
, val
);
818 static void setexposure(struct gspca_dev
*gspca_dev
, s32 expo
, s32 min_clockdiv
)
820 struct sd
*sd
= (struct sd
*) gspca_dev
;
821 int exposure
= MR97310A_EXPOSURE_DEFAULT
;
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) {
833 sensor_write1(gspca_dev
, 3, exposure
>> 8);
834 sensor_write1(gspca_dev
, 4, exposure
& 0xff);
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).
841 Note our 0 - 4095 exposure is mapped to 0 - 511
842 milliseconds exposure time */
843 u8 clockdiv
= (60 * expo
+ 7999) / 8000;
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)
851 if (sd
->cam_type
== CAM_TYPE_VGA
&& clockdiv
< 4)
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
);
860 /* exposure register value is reversed! */
861 exposure
= 511 - exposure
;
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
);
870 static void setgain(struct gspca_dev
*gspca_dev
, s32 val
)
872 struct sd
*sd
= (struct sd
*) gspca_dev
;
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);
883 sensor_write1(gspca_dev
, 0x10, val
);
886 static void setcontrast(struct gspca_dev
*gspca_dev
, s32 val
)
888 sensor_write1(gspca_dev
, 0x1c, val
);
891 static int sd_s_ctrl(struct v4l2_ctrl
*ctrl
)
893 struct gspca_dev
*gspca_dev
=
894 container_of(ctrl
->handler
, struct gspca_dev
, ctrl_handler
);
895 struct sd
*sd
= (struct sd
*)gspca_dev
;
897 gspca_dev
->usb_err
= 0;
899 if (!gspca_dev
->streaming
)
903 case V4L2_CID_BRIGHTNESS
:
904 setbrightness(gspca_dev
, ctrl
->val
);
906 case V4L2_CID_CONTRAST
:
907 setcontrast(gspca_dev
, ctrl
->val
);
909 case V4L2_CID_EXPOSURE
:
910 setexposure(gspca_dev
, sd
->exposure
->val
,
911 sd
->min_clockdiv
? sd
->min_clockdiv
->val
: 0);
914 setgain(gspca_dev
, ctrl
->val
);
917 return gspca_dev
->usb_err
;
920 static const struct v4l2_ctrl_ops sd_ctrl_ops
= {
924 static int sd_init_controls(struct gspca_dev
*gspca_dev
)
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
= {
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
,
936 .def
= MR97310A_MIN_CLOCKDIV_DEFAULT
,
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;
946 gspca_dev
->vdev
.ctrl_handler
= hdl
;
947 v4l2_ctrl_handler_init(hdl
, 4);
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;
955 has_exposure
= has_gain
= has_brightness
= true;
957 /* All controls need to be disabled if VGA sensor_type is 0 */
958 if (sd
->sensor_type
== 0)
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
=
966 has_exposure
= has_gain
= has_brightness
=
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. */
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.
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
);
988 v4l2_ctrl_new_std(hdl
, &sd_ctrl_ops
,
989 V4L2_CID_CONTRAST
, MR97310A_CONTRAST_MIN
,
990 MR97310A_CONTRAST_MAX
, 1, MR97310A_CONTRAST_DEFAULT
);
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
);
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
);
1004 sd
->min_clockdiv
= v4l2_ctrl_new_custom(hdl
, &clockdiv
, NULL
);
1007 pr_err("Could not initialize controls\n");
1010 if (has_exposure
&& has_clockdiv
)
1011 v4l2_ctrl_cluster(2, &sd
->exposure
);
1015 /* Include pac common sof detection functions */
1016 #include "pac_common.h"
1018 static void sd_pkt_scan(struct gspca_dev
*gspca_dev
,
1019 u8
*data
, /* isoc packet */
1020 int len
) /* iso packet length */
1022 struct sd
*sd
= (struct sd
*) gspca_dev
;
1025 sof
= pac_find_sof(gspca_dev
, &sd
->sof_read
, data
, len
);
1029 /* finish decoding current frame */
1031 if (n
> sizeof pac_sof_marker
)
1032 n
-= sizeof pac_sof_marker
;
1035 gspca_frame_add(gspca_dev
, LAST_PACKET
,
1037 /* Start next frame. */
1038 gspca_frame_add(gspca_dev
, FIRST_PACKET
,
1039 pac_sof_marker
, sizeof pac_sof_marker
);
1043 gspca_frame_add(gspca_dev
, INTER_PACKET
, data
, len
);
1046 /* sub-driver description */
1047 static const struct sd_desc sd_desc
= {
1048 .name
= MODULE_NAME
,
1049 .config
= sd_config
,
1051 .init_controls
= sd_init_controls
,
1054 .pkt_scan
= sd_pkt_scan
,
1057 /* -- module initialisation -- */
1058 static 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 */
1065 MODULE_DEVICE_TABLE(usb
, device_table
);
1067 /* -- device connect -- */
1068 static int sd_probe(struct usb_interface
*intf
,
1069 const struct usb_device_id
*id
)
1071 return gspca_dev_probe(intf
, id
, &sd_desc
, sizeof(struct sd
),
1075 static struct usb_driver sd_driver
= {
1076 .name
= MODULE_NAME
,
1077 .id_table
= device_table
,
1079 .disconnect
= gspca_disconnect
,
1081 .suspend
= gspca_suspend
,
1082 .resume
= gspca_resume
,
1083 .reset_resume
= gspca_resume
,
1087 module_usb_driver(sd_driver
);