2 * Mars MR97310A library
4 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
6 * Support for the MR97310A cameras in addition to the Aiptek Pencam VGA+
7 * and for the routines for detecting and classifying these various cameras,
9 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
13 * The MR97311A support in gspca/mars.c has been helpful in understanding some
14 * of the registers in these cameras.
16 * Hans de Goede <hdgoede@redhat.com> and
17 * Thomas Kaiser <thomas@kaiser-linux.li>
18 * have assisted with their experience. Each of them has also helped by
19 * testing a previously unsupported camera.
21 * This program is free software; you can redistribute it and/or modify
22 * it under the terms of the GNU General Public License as published by
23 * the Free Software Foundation; either version 2 of the License, or
26 * This program is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * GNU General Public License for more details.
31 * You should have received a copy of the GNU General Public License
32 * along with this program; if not, write to the Free Software
33 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
36 #define MODULE_NAME "mr97310a"
40 #define CAM_TYPE_CIF 0
41 #define CAM_TYPE_VGA 1
43 #define MR97310A_BRIGHTNESS_MIN -254
44 #define MR97310A_BRIGHTNESS_MAX 255
45 #define MR97310A_BRIGHTNESS_DEFAULT 0
47 #define MR97310A_EXPOSURE_MIN 300
48 #define MR97310A_EXPOSURE_MAX 4095
49 #define MR97310A_EXPOSURE_DEFAULT 1000
51 #define MR97310A_GAIN_MIN 0
52 #define MR97310A_GAIN_MAX 31
53 #define MR97310A_GAIN_DEFAULT 25
55 MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,"
56 "Theodore Kilgore <kilgota@auburn.edu>");
57 MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
58 MODULE_LICENSE("GPL");
60 /* global parameters */
61 int force_sensor_type = -1;
62 module_param(force_sensor_type, int, 0644);
63 MODULE_PARM_DESC(force_sensor_type, "Force sensor type (-1 (auto), 0 or 1)");
65 /* specific webcam descriptor */
67 struct gspca_dev gspca_dev; /* !! must be the first item */
69 u8 cam_type; /* 0 is CIF and 1 is VGA */
70 u8 sensor_type; /* We use 0 and 1 here, too. */
78 struct sensor_w_data {
85 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
86 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
87 static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val);
88 static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val);
89 static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val);
90 static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val);
91 static void setbrightness(struct gspca_dev *gspca_dev);
92 static void setexposure(struct gspca_dev *gspca_dev);
93 static void setgain(struct gspca_dev *gspca_dev);
95 /* V4L2 controls supported by the driver */
96 static struct ctrl sd_ctrls[] = {
98 #define BRIGHTNESS_IDX 0
100 .id = V4L2_CID_BRIGHTNESS,
101 .type = V4L2_CTRL_TYPE_INTEGER,
102 .name = "Brightness",
103 .minimum = MR97310A_BRIGHTNESS_MIN,
104 .maximum = MR97310A_BRIGHTNESS_MAX,
106 .default_value = MR97310A_BRIGHTNESS_DEFAULT,
109 .set = sd_setbrightness,
110 .get = sd_getbrightness,
113 #define EXPOSURE_IDX 1
115 .id = V4L2_CID_EXPOSURE,
116 .type = V4L2_CTRL_TYPE_INTEGER,
118 .minimum = MR97310A_EXPOSURE_MIN,
119 .maximum = MR97310A_EXPOSURE_MAX,
121 .default_value = MR97310A_EXPOSURE_DEFAULT,
124 .set = sd_setexposure,
125 .get = sd_getexposure,
131 .type = V4L2_CTRL_TYPE_INTEGER,
133 .minimum = MR97310A_GAIN_MIN,
134 .maximum = MR97310A_GAIN_MAX,
136 .default_value = MR97310A_GAIN_DEFAULT,
144 static const struct v4l2_pix_format vga_mode[] = {
145 {160, 120, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
147 .sizeimage = 160 * 120,
148 .colorspace = V4L2_COLORSPACE_SRGB,
150 {176, 144, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
152 .sizeimage = 176 * 144,
153 .colorspace = V4L2_COLORSPACE_SRGB,
155 {320, 240, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
157 .sizeimage = 320 * 240,
158 .colorspace = V4L2_COLORSPACE_SRGB,
160 {352, 288, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
162 .sizeimage = 352 * 288,
163 .colorspace = V4L2_COLORSPACE_SRGB,
165 {640, 480, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
167 .sizeimage = 640 * 480,
168 .colorspace = V4L2_COLORSPACE_SRGB,
172 /* the bytes to write are in gspca_dev->usb_buf */
173 static int mr_write(struct gspca_dev *gspca_dev, int len)
177 rc = usb_bulk_msg(gspca_dev->dev,
178 usb_sndbulkpipe(gspca_dev->dev, 4),
179 gspca_dev->usb_buf, len, NULL, 500);
181 PDEBUG(D_ERR, "reg write [%02x] error %d",
182 gspca_dev->usb_buf[0], rc);
186 /* the bytes are read into gspca_dev->usb_buf */
187 static int mr_read(struct gspca_dev *gspca_dev, int len)
191 rc = usb_bulk_msg(gspca_dev->dev,
192 usb_rcvbulkpipe(gspca_dev->dev, 3),
193 gspca_dev->usb_buf, len, NULL, 500);
195 PDEBUG(D_ERR, "reg read [%02x] error %d",
196 gspca_dev->usb_buf[0], rc);
200 static int sensor_write_reg(struct gspca_dev *gspca_dev, u8 reg, u8 flags,
201 const u8 *data, int len)
203 gspca_dev->usb_buf[0] = 0x1f;
204 gspca_dev->usb_buf[1] = flags;
205 gspca_dev->usb_buf[2] = reg;
206 memcpy(gspca_dev->usb_buf + 3, data, len);
208 return mr_write(gspca_dev, len + 3);
211 static int sensor_write_regs(struct gspca_dev *gspca_dev,
212 const struct sensor_w_data *data, int len)
216 for (i = 0; i < len; i++) {
217 rc = sensor_write_reg(gspca_dev, data[i].reg, data[i].flags,
218 data[i].data, data[i].len);
226 static int sensor_write1(struct gspca_dev *gspca_dev, u8 reg, u8 data)
228 struct sd *sd = (struct sd *) gspca_dev;
233 rc = sensor_write_reg(gspca_dev, reg, 0x01, &buf, 1);
238 confirm_reg = sd->sensor_type ? 0x13 : 0x11;
239 rc = sensor_write_reg(gspca_dev, confirm_reg, 0x00, &buf, 1);
246 static int cam_get_response16(struct gspca_dev *gspca_dev)
248 __u8 *data = gspca_dev->usb_buf;
252 err_code = mr_write(gspca_dev, 1);
256 err_code = mr_read(gspca_dev, 16);
260 static int zero_the_pointer(struct gspca_dev *gspca_dev)
262 __u8 *data = gspca_dev->usb_buf;
267 err_code = cam_get_response16(gspca_dev);
271 err_code = mr_write(gspca_dev, 1);
274 err_code = mr_write(gspca_dev, 2);
278 err_code = cam_get_response16(gspca_dev);
284 err_code = mr_write(gspca_dev, 2);
288 err_code = cam_get_response16(gspca_dev);
294 err_code = mr_write(gspca_dev, 2);
298 err_code = cam_get_response16(gspca_dev);
304 err_code = mr_write(gspca_dev, 2);
308 while (status != 0x0a && tries < 256) {
309 err_code = cam_get_response16(gspca_dev);
316 PDEBUG(D_ERR, "status is %02x", status);
322 err_code = mr_write(gspca_dev, 2);
326 err_code = cam_get_response16(gspca_dev);
334 err_code = mr_write(gspca_dev, 1);
338 err_code = mr_read(gspca_dev, 16);
345 static u8 get_sensor_id(struct gspca_dev *gspca_dev)
349 gspca_dev->usb_buf[0] = 0x1e;
350 err_code = mr_write(gspca_dev, 1);
354 err_code = mr_read(gspca_dev, 16);
358 PDEBUG(D_PROBE, "Byte zero reported is %01x", gspca_dev->usb_buf[0]);
360 return gspca_dev->usb_buf[0];
363 /* this function is called at probe time */
364 static int sd_config(struct gspca_dev *gspca_dev,
365 const struct usb_device_id *id)
367 struct sd *sd = (struct sd *) gspca_dev;
369 __u8 *data = gspca_dev->usb_buf;
372 cam = &gspca_dev->cam;
373 cam->cam_mode = vga_mode;
374 cam->nmodes = ARRAY_SIZE(vga_mode);
376 if (id->idProduct == 0x010e) {
377 sd->cam_type = CAM_TYPE_CIF;
382 err_code = mr_write(gspca_dev, 2);
387 data[0] = get_sensor_id(gspca_dev);
389 * Known CIF cameras. If you have another to report, please do
391 * Name byte just read sd->sensor_type
393 * Sakar Spy-shot 0x28 T. Kilgore 0
394 * Innovage 0xf5 (unstable) T. Kilgore 0
395 * Vivitar Mini 0x53 H. De Goede 0
396 * Vivitar Mini 0x08 T. Kilgore 1
397 * Elta-Media 8212dc 0x23 T. Kaiser 1
398 * Philips dig. keych. 0x37 T. Kilgore 1
400 if ((data[0] & 0x78) == 8 ||
401 ((data[0] & 0x2) == 0x2 && data[0] != 0x53))
406 PDEBUG(D_PROBE, "MR97310A CIF camera detected, sensor: %d",
409 if (force_sensor_type != -1) {
410 sd->sensor_type = !! force_sensor_type;
411 PDEBUG(D_PROBE, "Forcing sensor type to: %d",
415 if (sd->sensor_type == 0)
416 gspca_dev->ctrl_dis = (1 << BRIGHTNESS_IDX);
418 sd->cam_type = CAM_TYPE_VGA;
419 PDEBUG(D_PROBE, "MR97310A VGA camera detected");
420 gspca_dev->ctrl_dis = (1 << BRIGHTNESS_IDX) |
421 (1 << EXPOSURE_IDX) | (1 << GAIN_IDX);
424 sd->brightness = MR97310A_BRIGHTNESS_DEFAULT;
425 sd->exposure = MR97310A_EXPOSURE_DEFAULT;
426 sd->gain = MR97310A_GAIN_DEFAULT;
431 /* this function is called at probe and resume time */
432 static int sd_init(struct gspca_dev *gspca_dev)
437 static int start_cif_cam(struct gspca_dev *gspca_dev)
439 struct sd *sd = (struct sd *) gspca_dev;
440 __u8 *data = gspca_dev->usb_buf;
442 const __u8 startup_string[] = {
446 0x00, /* Hsize/8 for 352 or 320 */
447 0x00, /* Vsize/4 for 288 or 240 */
448 0x13, /* or 0xbb, depends on sensor */
449 0x00, /* Hstart, depends on res. */
450 0x00, /* reserved ? */
451 0x00, /* Vstart, depends on res. and sensor */
452 0x50, /* 0x54 to get 176 or 160 */
456 /* Note: Some of the above descriptions guessed from MR97113A driver */
459 err_code = mr_write(gspca_dev, 2);
463 memcpy(data, startup_string, 11);
467 switch (gspca_dev->width) {
469 data[9] |= 0x04; /* reg 8, 2:1 scale down from 320 */
473 data[3] = 0x28; /* reg 2, H size/8 */
474 data[4] = 0x3c; /* reg 3, V size/4 */
475 data[6] = 0x14; /* reg 5, H start */
476 data[8] = 0x1a + sd->sensor_type; /* reg 7, V start */
479 data[9] |= 0x04; /* reg 8, 2:1 scale down from 352 */
482 data[3] = 0x2c; /* reg 2, H size/8 */
483 data[4] = 0x48; /* reg 3, V size/4 */
484 data[6] = 0x06; /* reg 5, H start */
485 data[8] = 0x06 + sd->sensor_type; /* reg 7, V start */
488 err_code = mr_write(gspca_dev, 11);
492 if (!sd->sensor_type) {
493 const struct sensor_w_data cif_sensor0_init_data[] = {
494 {0x02, 0x00, {0x03, 0x5a, 0xb5, 0x01,
495 0x0f, 0x14, 0x0f, 0x10}, 8},
496 {0x0c, 0x00, {0x04, 0x01, 0x01, 0x00, 0x1f}, 5},
497 {0x12, 0x00, {0x07}, 1},
498 {0x1f, 0x00, {0x06}, 1},
499 {0x27, 0x00, {0x04}, 1},
500 {0x29, 0x00, {0x0c}, 1},
501 {0x40, 0x00, {0x40, 0x00, 0x04}, 3},
502 {0x50, 0x00, {0x60}, 1},
503 {0x60, 0x00, {0x06}, 1},
504 {0x6b, 0x00, {0x85, 0x85, 0xc8, 0xc8, 0xc8, 0xc8}, 6},
505 {0x72, 0x00, {0x1e, 0x56}, 2},
506 {0x75, 0x00, {0x58, 0x40, 0xa2, 0x02, 0x31, 0x02,
507 0x31, 0x80, 0x00}, 9},
508 {0x11, 0x00, {0x01}, 1},
511 err_code = sensor_write_regs(gspca_dev, cif_sensor0_init_data,
512 ARRAY_SIZE(cif_sensor0_init_data));
513 } else { /* sd->sensor_type = 1 */
514 const struct sensor_w_data cif_sensor1_init_data[] = {
515 /* Reg 3,4, 7,8 get set by the controls */
516 {0x02, 0x00, {0x10}, 1},
517 {0x05, 0x01, {0x22}, 1}, /* 5/6 also seen as 65h/32h */
518 {0x06, 0x01, {0x00}, 1},
519 {0x09, 0x02, {0x0e}, 1},
520 {0x0a, 0x02, {0x05}, 1},
521 {0x0b, 0x02, {0x05}, 1},
522 {0x0c, 0x02, {0x0f}, 1},
523 {0x0d, 0x02, {0x07}, 1},
524 {0x0e, 0x02, {0x0c}, 1},
525 {0x0f, 0x00, {0x00}, 1},
526 {0x10, 0x00, {0x06}, 1},
527 {0x11, 0x00, {0x07}, 1},
528 {0x12, 0x00, {0x00}, 1},
529 {0x13, 0x00, {0x01}, 1},
532 err_code = sensor_write_regs(gspca_dev, cif_sensor1_init_data,
533 ARRAY_SIZE(cif_sensor1_init_data));
538 setbrightness(gspca_dev);
539 setexposure(gspca_dev);
545 data[1] = 0x4d; /* ISOC transfering enable... */
546 err_code = mr_write(gspca_dev, 2);
553 static int start_vga_cam(struct gspca_dev *gspca_dev)
555 struct sd *sd = (struct sd *) gspca_dev;
556 __u8 *data = gspca_dev->usb_buf;
558 const __u8 startup_string[] = {0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b,
559 0x00, 0x00, 0x00, 0x50, 0xc0};
561 /* What some of these mean is explained in start_cif_cam(), above */
565 * We have to know which camera we have, because the register writes
566 * depend upon the camera. This test, run before we actually enter
567 * the initialization routine, distinguishes most of the cameras, If
568 * needed, another routine is done later, too.
572 err_code = mr_write(gspca_dev, 1);
576 err_code = mr_read(gspca_dev, 16);
580 PDEBUG(D_PROBE, "Byte reported is %02x", data[0]);
584 * Known VGA cameras. If you have another to report, please do
586 * Name byte just read sd->sensor_type
588 * Aiptek Pencam VGA+ 0x31 0 1
589 * ION digital 0x31 0 1
590 * Argus DC-1620 0x30 1 0
591 * Argus QuickClix 0x30 1 1 (not caught here)
593 sd->sensor_type = data[0] & 1;
594 sd->do_lcd_stop = (~data[0]) & 1;
598 /* Streaming setup begins here. */
603 err_code = mr_write(gspca_dev, 2);
608 * A second test can now resolve any remaining ambiguity in the
609 * identification of the camera type,
611 if (!sd->sensor_type) {
612 data[0] = get_sensor_id(gspca_dev);
613 if (data[0] == 0x7f) {
615 PDEBUG(D_PROBE, "sensor_type corrected to 1");
620 if (force_sensor_type != -1) {
621 sd->sensor_type = !! force_sensor_type;
622 PDEBUG(D_PROBE, "Forcing sensor type to: %d",
628 * This test is only run if the previous test returned 0x30, but
629 * here is the information for all others, too, just for reference.
631 * Name byte just read sd->sensor_type
633 * Aiptek Pencam VGA+ 0xfb (this test not run) 1
634 * ION digital 0xbd (this test not run) 1
635 * Argus DC-1620 0xe5 (no change) 0
636 * Argus QuickClix 0x7f (reclassified) 1
638 memcpy(data, startup_string, 11);
639 if (!sd->sensor_type) {
644 switch (gspca_dev->width) {
646 data[9] |= 0x0c; /* reg 8, 4:1 scale down */
649 data[9] |= 0x04; /* reg 8, 2:1 scale down */
653 data[3] = 0x50; /* reg 2, H size/8 */
654 data[4] = 0x78; /* reg 3, V size/4 */
655 data[6] = 0x04; /* reg 5, H start */
656 data[8] = 0x03; /* reg 7, V start */
658 data[8] = 0x04; /* Bayer tile shifted */
662 data[9] |= 0x04; /* reg 8, 2:1 scale down */
665 data[3] = 0x2c; /* reg 2, H size */
666 data[4] = 0x48; /* reg 3, V size */
667 data[6] = 0x94; /* reg 5, H start */
668 data[8] = 0x63; /* reg 7, V start */
670 data[8] = 0x64; /* Bayer tile shifted */
674 err_code = mr_write(gspca_dev, 11);
678 if (!sd->sensor_type) {
679 /* The only known sensor_type 0 cam is the Argus DC-1620 */
680 const struct sensor_w_data vga_sensor0_init_data[] = {
681 {0x01, 0x00, {0x0c, 0x00, 0x04}, 3},
682 {0x14, 0x00, {0x01, 0xe4, 0x02, 0x84}, 4},
683 {0x20, 0x00, {0x00, 0x80, 0x00, 0x08}, 4},
684 {0x25, 0x00, {0x03, 0xa9, 0x80}, 3},
685 {0x30, 0x00, {0x30, 0x18, 0x10, 0x18}, 4},
688 err_code = sensor_write_regs(gspca_dev, vga_sensor0_init_data,
689 ARRAY_SIZE(vga_sensor0_init_data));
690 } else { /* sd->sensor_type = 1 */
691 const struct sensor_w_data vga_sensor1_init_data[] = {
692 {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
693 0x07, 0x00, 0x01}, 8},
694 {0x11, 0x04, {0x01}, 1},
695 /*{0x0a, 0x00, {0x00, 0x01, 0x00, 0x00, 0x01, */
696 {0x0a, 0x00, {0x01, 0x06, 0x00, 0x00, 0x01,
698 {0x11, 0x04, {0x01}, 1},
699 {0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
700 {0x11, 0x04, {0x01}, 1},
703 err_code = sensor_write_regs(gspca_dev, vga_sensor1_init_data,
704 ARRAY_SIZE(vga_sensor1_init_data));
711 data[1] = 0x4d; /* ISOC transfering enable... */
712 err_code = mr_write(gspca_dev, 2);
717 static int sd_start(struct gspca_dev *gspca_dev)
719 struct sd *sd = (struct sd *) gspca_dev;
723 cam = &gspca_dev->cam;
726 * Some of the supported cameras require the memory pointer to be
727 * set to 0, or else they will not stream.
729 zero_the_pointer(gspca_dev);
731 if (sd->cam_type == CAM_TYPE_CIF) {
732 err_code = start_cif_cam(gspca_dev);
734 err_code = start_vga_cam(gspca_dev);
739 static void sd_stopN(struct gspca_dev *gspca_dev)
741 struct sd *sd = (struct sd *) gspca_dev;
744 gspca_dev->usb_buf[0] = 1;
745 gspca_dev->usb_buf[1] = 0;
746 result = mr_write(gspca_dev, 2);
748 PDEBUG(D_ERR, "Camera Stop failed");
750 /* Not all the cams need this, but even if not, probably a good idea */
751 zero_the_pointer(gspca_dev);
752 if (sd->do_lcd_stop) {
753 gspca_dev->usb_buf[0] = 0x19;
754 gspca_dev->usb_buf[1] = 0x54;
755 result = mr_write(gspca_dev, 2);
757 PDEBUG(D_ERR, "Camera Stop failed");
761 static void setbrightness(struct gspca_dev *gspca_dev)
763 struct sd *sd = (struct sd *) gspca_dev;
766 if (gspca_dev->ctrl_dis & (1 << BRIGHTNESS_IDX))
769 /* Note register 7 is also seen as 0x8x or 0xCx in dumps */
770 if (sd->brightness > 0) {
771 sensor_write1(gspca_dev, 7, 0x00);
772 val = sd->brightness;
774 sensor_write1(gspca_dev, 7, 0x01);
775 val = 257 - sd->brightness;
777 sensor_write1(gspca_dev, 8, val);
780 static void setexposure(struct gspca_dev *gspca_dev)
782 struct sd *sd = (struct sd *) gspca_dev;
785 if (gspca_dev->ctrl_dis & (1 << EXPOSURE_IDX))
788 if (sd->sensor_type) {
789 val = sd->exposure >> 4;
790 sensor_write1(gspca_dev, 3, val);
791 val = sd->exposure & 0xf;
792 sensor_write1(gspca_dev, 4, val);
797 /* We have both a clock divider and an exposure register.
798 We first calculate the clock divider, as that determines
799 the maximum exposure and then we calculayte the exposure
800 register setting (which goes from 0 - 511).
802 Note our 0 - 4095 exposure is mapped to 0 - 511
803 milliseconds exposure time */
804 clockdiv = (60 * sd->exposure + 7999) / 8000;
806 /* Limit framerate to not exceed usb bandwidth */
807 if (clockdiv < 3 && gspca_dev->width >= 320)
809 else if (clockdiv < 2)
812 /* Frame exposure time in ms = 1000 * clockdiv / 60 ->
813 exposure = (sd->exposure / 8) * 511 / (1000 * clockdiv / 60) */
814 exposure = (60 * 511 * sd->exposure) / (8000 * clockdiv);
818 /* exposure register value is reversed! */
819 exposure = 511 - exposure;
821 sensor_write1(gspca_dev, 0x02, clockdiv);
822 sensor_write1(gspca_dev, 0x0e, exposure & 0xff);
823 sensor_write1(gspca_dev, 0x0f, exposure >> 8);
827 static void setgain(struct gspca_dev *gspca_dev)
829 struct sd *sd = (struct sd *) gspca_dev;
831 if (gspca_dev->ctrl_dis & (1 << GAIN_IDX))
834 if (sd->sensor_type) {
835 sensor_write1(gspca_dev, 0x0e, sd->gain);
837 sensor_write1(gspca_dev, 0x10, sd->gain);
841 static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
843 struct sd *sd = (struct sd *) gspca_dev;
845 sd->brightness = val;
846 if (gspca_dev->streaming)
847 setbrightness(gspca_dev);
851 static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
853 struct sd *sd = (struct sd *) gspca_dev;
855 *val = sd->brightness;
859 static int sd_setexposure(struct gspca_dev *gspca_dev, __s32 val)
861 struct sd *sd = (struct sd *) gspca_dev;
864 if (gspca_dev->streaming)
865 setexposure(gspca_dev);
869 static int sd_getexposure(struct gspca_dev *gspca_dev, __s32 *val)
871 struct sd *sd = (struct sd *) gspca_dev;
877 static int sd_setgain(struct gspca_dev *gspca_dev, __s32 val)
879 struct sd *sd = (struct sd *) gspca_dev;
882 if (gspca_dev->streaming)
887 static int sd_getgain(struct gspca_dev *gspca_dev, __s32 *val)
889 struct sd *sd = (struct sd *) gspca_dev;
895 /* Include pac common sof detection functions */
896 #include "pac_common.h"
898 static void sd_pkt_scan(struct gspca_dev *gspca_dev,
899 struct gspca_frame *frame, /* target */
900 __u8 *data, /* isoc packet */
901 int len) /* iso packet length */
905 sof = pac_find_sof(gspca_dev, data, len);
909 /* finish decoding current frame */
911 if (n > sizeof pac_sof_marker)
912 n -= sizeof pac_sof_marker;
915 frame = gspca_frame_add(gspca_dev, LAST_PACKET, frame,
917 /* Start next frame. */
918 gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
919 pac_sof_marker, sizeof pac_sof_marker);
923 gspca_frame_add(gspca_dev, INTER_PACKET, frame, data, len);
926 /* sub-driver description */
927 static const struct sd_desc sd_desc = {
930 .nctrls = ARRAY_SIZE(sd_ctrls),
935 .pkt_scan = sd_pkt_scan,
938 /* -- module initialisation -- */
939 static const __devinitdata struct usb_device_id device_table[] = {
940 {USB_DEVICE(0x08ca, 0x0111)}, /* Aiptek Pencam VGA+ */
941 {USB_DEVICE(0x093a, 0x010f)}, /* All other known MR97310A VGA cams */
942 {USB_DEVICE(0x093a, 0x010e)}, /* All known MR97310A CIF cams */
945 MODULE_DEVICE_TABLE(usb, device_table);
947 /* -- device connect -- */
948 static int sd_probe(struct usb_interface *intf,
949 const struct usb_device_id *id)
951 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
955 static struct usb_driver sd_driver = {
957 .id_table = device_table,
959 .disconnect = gspca_disconnect,
961 .suspend = gspca_suspend,
962 .resume = gspca_resume,
966 /* -- module insert / remove -- */
967 static int __init sd_mod_init(void)
971 ret = usb_register(&sd_driver);
974 PDEBUG(D_PROBE, "registered");
977 static void __exit sd_mod_exit(void)
979 usb_deregister(&sd_driver);
980 PDEBUG(D_PROBE, "deregistered");
983 module_init(sd_mod_init);
984 module_exit(sd_mod_exit);