1 /***************************************************************************
2 * V4L2 driver for SN9C1xx PC Camera Controllers *
4 * Copyright (C) 2004-2007 by Luca Risolia <luca.risolia@studio.unibo.it> *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *
19 ***************************************************************************/
21 #include <linux/module.h>
22 #include <linux/init.h>
23 #include <linux/kernel.h>
24 #include <linux/param.h>
25 #include <linux/moduleparam.h>
26 #include <linux/errno.h>
27 #include <linux/slab.h>
28 #include <linux/device.h>
30 #include <linux/delay.h>
31 #include <linux/compiler.h>
32 #include <linux/ioctl.h>
33 #include <linux/poll.h>
34 #include <linux/stat.h>
36 #include <linux/vmalloc.h>
37 #include <linux/page-flags.h>
38 #include <linux/byteorder/generic.h>
40 #include <asm/uaccess.h>
44 /*****************************************************************************/
46 #define SN9C102_MODULE_NAME "V4L2 driver for SN9C1xx PC Camera Controllers"
47 #define SN9C102_MODULE_ALIAS "sn9c1xx"
48 #define SN9C102_MODULE_AUTHOR "(C) 2004-2007 Luca Risolia"
49 #define SN9C102_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
50 #define SN9C102_MODULE_LICENSE "GPL"
51 #define SN9C102_MODULE_VERSION "1:1.47"
52 #define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 1, 47)
54 /*****************************************************************************/
56 MODULE_DEVICE_TABLE(usb, sn9c102_id_table);
58 MODULE_AUTHOR(SN9C102_MODULE_AUTHOR " " SN9C102_AUTHOR_EMAIL);
59 MODULE_DESCRIPTION(SN9C102_MODULE_NAME);
60 MODULE_ALIAS(SN9C102_MODULE_ALIAS);
61 MODULE_VERSION(SN9C102_MODULE_VERSION);
62 MODULE_LICENSE(SN9C102_MODULE_LICENSE);
64 static short video_nr[] = {[0 ... SN9C102_MAX_DEVICES-1] = -1};
65 module_param_array(video_nr, short, NULL, 0444);
66 MODULE_PARM_DESC(video_nr,
68 "\nSpecify V4L2 minor mode number."
69 "\n-1 = use next available (default)"
70 "\n n = use minor number n (integer >= 0)"
71 "\nYou can specify up to "__MODULE_STRING(SN9C102_MAX_DEVICES)
74 "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
75 "\nthe second camera and use auto for the first"
76 "\none and for every other camera."
79 static short force_munmap[] = {[0 ... SN9C102_MAX_DEVICES-1] =
80 SN9C102_FORCE_MUNMAP};
81 module_param_array(force_munmap, bool, NULL, 0444);
82 MODULE_PARM_DESC(force_munmap,
84 "\nForce the application to unmap previously"
85 "\nmapped buffer memory before calling any VIDIOC_S_CROP or"
86 "\nVIDIOC_S_FMT ioctl's. Not all the applications support"
87 "\nthis feature. This parameter is specific for each"
89 "\n0 = do not force memory unmapping"
90 "\n1 = force memory unmapping (save memory)"
91 "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP)"."
94 static unsigned int frame_timeout[] = {[0 ... SN9C102_MAX_DEVICES-1] =
95 SN9C102_FRAME_TIMEOUT};
96 module_param_array(frame_timeout, uint, NULL, 0644);
97 MODULE_PARM_DESC(frame_timeout,
99 "\nTimeout for a video frame in seconds before"
100 "\nreturning an I/O error; 0 for infinity."
101 "\nThis parameter is specific for each detected camera."
102 "\nDefault value is "__MODULE_STRING(SN9C102_FRAME_TIMEOUT)"."
106 static unsigned short debug = SN9C102_DEBUG_LEVEL;
107 module_param(debug, ushort, 0644);
108 MODULE_PARM_DESC(debug,
110 "\nDebugging information level, from 0 to 3:"
111 "\n0 = none (use carefully)"
112 "\n1 = critical errors"
113 "\n2 = significant informations"
114 "\n3 = more verbose messages"
115 "\nLevel 3 is useful for testing only."
116 "\nDefault value is "__MODULE_STRING(SN9C102_DEBUG_LEVEL)"."
120 /*****************************************************************************/
123 sn9c102_request_buffers(struct sn9c102_device* cam, u32 count,
124 enum sn9c102_io_method io)
126 struct v4l2_pix_format* p = &(cam->sensor.pix_format);
127 struct v4l2_rect* r = &(cam->sensor.cropcap.bounds);
128 size_t imagesize = cam->module_param.force_munmap || io == IO_READ ?
129 (p->width * p->height * p->priv) / 8 :
130 (r->width * r->height * p->priv) / 8;
134 if (count > SN9C102_MAX_FRAMES)
135 count = SN9C102_MAX_FRAMES;
137 if (cam->bridge == BRIDGE_SN9C105 || cam->bridge == BRIDGE_SN9C120)
138 imagesize += 589 + 2; /* length of JPEG header + EOI marker */
140 cam->nbuffers = count;
141 while (cam->nbuffers > 0) {
142 if ((buff = vmalloc_32_user(cam->nbuffers *
143 PAGE_ALIGN(imagesize))))
148 for (i = 0; i < cam->nbuffers; i++) {
149 cam->frame[i].bufmem = buff + i*PAGE_ALIGN(imagesize);
150 cam->frame[i].buf.index = i;
151 cam->frame[i].buf.m.offset = i*PAGE_ALIGN(imagesize);
152 cam->frame[i].buf.length = imagesize;
153 cam->frame[i].buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
154 cam->frame[i].buf.sequence = 0;
155 cam->frame[i].buf.field = V4L2_FIELD_NONE;
156 cam->frame[i].buf.memory = V4L2_MEMORY_MMAP;
157 cam->frame[i].buf.flags = 0;
160 return cam->nbuffers;
164 static void sn9c102_release_buffers(struct sn9c102_device* cam)
167 vfree(cam->frame[0].bufmem);
170 cam->frame_current = NULL;
174 static void sn9c102_empty_framequeues(struct sn9c102_device* cam)
178 INIT_LIST_HEAD(&cam->inqueue);
179 INIT_LIST_HEAD(&cam->outqueue);
181 for (i = 0; i < SN9C102_MAX_FRAMES; i++) {
182 cam->frame[i].state = F_UNUSED;
183 cam->frame[i].buf.bytesused = 0;
188 static void sn9c102_requeue_outqueue(struct sn9c102_device* cam)
190 struct sn9c102_frame_t *i;
192 list_for_each_entry(i, &cam->outqueue, frame) {
194 list_add(&i->frame, &cam->inqueue);
197 INIT_LIST_HEAD(&cam->outqueue);
201 static void sn9c102_queue_unusedframes(struct sn9c102_device* cam)
203 unsigned long lock_flags;
206 for (i = 0; i < cam->nbuffers; i++)
207 if (cam->frame[i].state == F_UNUSED) {
208 cam->frame[i].state = F_QUEUED;
209 spin_lock_irqsave(&cam->queue_lock, lock_flags);
210 list_add_tail(&cam->frame[i].frame, &cam->inqueue);
211 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
215 /*****************************************************************************/
218 Write a sequence of count value/register pairs. Returns -1 after the first
219 failed write, or 0 for no errors.
221 int sn9c102_write_regs(struct sn9c102_device* cam, const u8 valreg[][2],
224 struct usb_device* udev = cam->usbdev;
225 u8* buff = cam->control_buffer;
228 for (i = 0; i < count; i++) {
229 u8 index = valreg[i][1];
232 index is a u8, so it must be <256 and can't be out of range.
233 If we put in a check anyway, gcc annoys us with a warning
234 hat our check is useless. People get all uppity when they
235 see warnings in the kernel compile.
238 *buff = valreg[i][0];
240 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08,
241 0x41, index, 0, buff, 1,
242 SN9C102_CTRL_TIMEOUT);
245 DBG(3, "Failed to write a register (value 0x%02X, "
246 "index 0x%02X, error %d)", *buff, index, res);
250 cam->reg[index] = *buff;
257 int sn9c102_write_reg(struct sn9c102_device* cam, u8 value, u16 index)
259 struct usb_device* udev = cam->usbdev;
260 u8* buff = cam->control_buffer;
263 if (index >= ARRAY_SIZE(cam->reg))
268 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
269 index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
271 DBG(3, "Failed to write a register (value 0x%02X, index "
272 "0x%02X, error %d)", value, index, res);
276 cam->reg[index] = value;
282 /* NOTE: with the SN9C10[123] reading some registers always returns 0 */
283 int sn9c102_read_reg(struct sn9c102_device* cam, u16 index)
285 struct usb_device* udev = cam->usbdev;
286 u8* buff = cam->control_buffer;
289 res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
290 index, 0, buff, 1, SN9C102_CTRL_TIMEOUT);
292 DBG(3, "Failed to read a register (index 0x%02X, error %d)",
295 return (res >= 0) ? (int)(*buff) : -1;
299 int sn9c102_pread_reg(struct sn9c102_device* cam, u16 index)
301 if (index >= ARRAY_SIZE(cam->reg))
304 return cam->reg[index];
309 sn9c102_i2c_wait(struct sn9c102_device* cam,
310 const struct sn9c102_sensor* sensor)
314 for (i = 1; i <= 5; i++) {
315 r = sn9c102_read_reg(cam, 0x08);
320 if (sensor->frequency & SN9C102_I2C_400KHZ)
330 sn9c102_i2c_detect_read_error(struct sn9c102_device* cam,
331 const struct sn9c102_sensor* sensor)
335 r = sn9c102_read_reg(cam, 0x08);
339 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102) {
347 return err ? -EIO : 0;
352 sn9c102_i2c_detect_write_error(struct sn9c102_device* cam,
353 const struct sn9c102_sensor* sensor)
356 r = sn9c102_read_reg(cam, 0x08);
357 return (r < 0 || (r >= 0 && (r & 0x08))) ? -EIO : 0;
362 sn9c102_i2c_try_raw_read(struct sn9c102_device* cam,
363 const struct sn9c102_sensor* sensor, u8 data0,
364 u8 data1, u8 n, u8 buffer[])
366 struct usb_device* udev = cam->usbdev;
367 u8* data = cam->control_buffer;
368 int i = 0, err = 0, res;
371 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
372 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) | 0x10;
373 data[1] = data0; /* I2C slave id */
374 data[2] = data1; /* address */
376 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
377 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
381 err += sn9c102_i2c_wait(cam, sensor);
383 /* Read cycle - n bytes */
384 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
385 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0) |
389 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
390 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
394 err += sn9c102_i2c_wait(cam, sensor);
396 /* The first read byte will be placed in data[4] */
397 res = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), 0x00, 0xc1,
398 0x0a, 0, data, 5, SN9C102_CTRL_TIMEOUT);
402 err += sn9c102_i2c_detect_read_error(cam, sensor);
404 PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1,
408 DBG(3, "I2C read failed for %s image sensor", sensor->name);
413 for (i = 0; i < n && i < 5; i++)
414 buffer[n-i-1] = data[4-i];
421 sn9c102_i2c_try_raw_write(struct sn9c102_device* cam,
422 const struct sn9c102_sensor* sensor, u8 n, u8 data0,
423 u8 data1, u8 data2, u8 data3, u8 data4, u8 data5)
425 struct usb_device* udev = cam->usbdev;
426 u8* data = cam->control_buffer;
429 /* Write cycle. It usually is address + value */
430 data[0] = ((sensor->interface == SN9C102_I2C_2WIRES) ? 0x80 : 0) |
431 ((sensor->frequency & SN9C102_I2C_400KHZ) ? 0x01 : 0)
440 res = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), 0x08, 0x41,
441 0x08, 0, data, 8, SN9C102_CTRL_TIMEOUT);
445 err += sn9c102_i2c_wait(cam, sensor);
446 err += sn9c102_i2c_detect_write_error(cam, sensor);
449 DBG(3, "I2C write failed for %s image sensor", sensor->name);
451 PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
452 "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
453 n, data0, data1, data2, data3, data4, data5);
460 sn9c102_i2c_try_read(struct sn9c102_device* cam,
461 const struct sn9c102_sensor* sensor, u8 address)
463 return sn9c102_i2c_try_raw_read(cam, sensor, sensor->i2c_slave_id,
469 sn9c102_i2c_try_write(struct sn9c102_device* cam,
470 const struct sn9c102_sensor* sensor, u8 address, u8 value)
472 return sn9c102_i2c_try_raw_write(cam, sensor, 3,
473 sensor->i2c_slave_id, address,
478 int sn9c102_i2c_read(struct sn9c102_device* cam, u8 address)
480 return sn9c102_i2c_try_read(cam, &cam->sensor, address);
484 int sn9c102_i2c_write(struct sn9c102_device* cam, u8 address, u8 value)
486 return sn9c102_i2c_try_write(cam, &cam->sensor, address, value);
489 /*****************************************************************************/
491 static size_t sn9c102_sof_length(struct sn9c102_device* cam)
493 switch (cam->bridge) {
509 sn9c102_find_sof_header(struct sn9c102_device* cam, void* mem, size_t len)
511 static const char marker[6] = {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
513 size_t soflen = 0, i, j;
515 soflen = sn9c102_sof_length(cam);
517 for (i = 0; i < len; i++) {
520 /* Read the variable part of the header */
521 if (unlikely(cam->sof.bytesread >= sizeof(marker))) {
522 cam->sof.header[cam->sof.bytesread] = *(m+i);
523 if (++cam->sof.bytesread == soflen) {
524 cam->sof.bytesread = 0;
530 /* Search for the SOF marker (fixed part) in the header */
531 for (j = 0, b=cam->sof.bytesread; j+b < sizeof(marker); j++) {
532 if (unlikely(i+j) == len)
534 if (*(m+i+j) == marker[cam->sof.bytesread]) {
535 cam->sof.header[cam->sof.bytesread] = *(m+i+j);
536 if (++cam->sof.bytesread == sizeof(marker)) {
537 PDBGG("Bytes to analyze: %zd. SOF "
538 "starts at byte #%zd", len, i);
543 cam->sof.bytesread = 0;
554 sn9c102_find_eof_header(struct sn9c102_device* cam, void* mem, size_t len)
556 static const u8 eof_header[4][4] = {
557 {0x00, 0x00, 0x00, 0x00},
558 {0x40, 0x00, 0x00, 0x00},
559 {0x80, 0x00, 0x00, 0x00},
560 {0xc0, 0x00, 0x00, 0x00},
564 /* The EOF header does not exist in compressed data */
565 if (cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X ||
566 cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
570 The EOF header might cross the packet boundary, but this is not a
571 problem, since the end of a frame is determined by checking its size
574 for (i = 0; (len >= 4) && (i <= len - 4); i++)
575 for (j = 0; j < ARRAY_SIZE(eof_header); j++)
576 if (!memcmp(mem + i, eof_header[j], 4))
584 sn9c102_write_jpegheader(struct sn9c102_device* cam, struct sn9c102_frame_t* f)
586 static const u8 jpeg_header[589] = {
587 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x06, 0x04, 0x05,
588 0x06, 0x05, 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x06,
589 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e,
590 0x0f, 0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14, 0x16,
591 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b, 0x23, 0x1c, 0x16,
592 0x16, 0x20, 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x29,
593 0x19, 0x1f, 0x2d, 0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29,
594 0x28, 0x01, 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
595 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, 0x28, 0x28,
596 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
597 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
598 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
599 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
600 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0xc4, 0x01, 0xa2,
601 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
602 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
603 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01,
604 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
605 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
606 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00,
607 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04,
608 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
609 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
610 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23,
611 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62,
612 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
613 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38,
614 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
615 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
616 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
617 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
618 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
619 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
620 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
621 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
622 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
623 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
624 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
625 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
626 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
627 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
628 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
629 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1,
630 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
631 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
632 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
633 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
634 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
635 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
636 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
637 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
638 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
639 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
640 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
641 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
642 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xc0, 0x00, 0x11,
643 0x08, 0x01, 0xe0, 0x02, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02,
644 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xda, 0x00, 0x0c, 0x03,
645 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
649 memcpy(pos, jpeg_header, sizeof(jpeg_header));
651 *(pos + 7 + 64) = 0x01;
652 if (cam->compression.quality == 0) {
653 memcpy(pos + 7, SN9C102_Y_QTABLE0, 64);
654 memcpy(pos + 8 + 64, SN9C102_UV_QTABLE0, 64);
655 } else if (cam->compression.quality == 1) {
656 memcpy(pos + 7, SN9C102_Y_QTABLE1, 64);
657 memcpy(pos + 8 + 64, SN9C102_UV_QTABLE1, 64);
659 *(pos + 564) = cam->sensor.pix_format.width & 0xFF;
660 *(pos + 563) = (cam->sensor.pix_format.width >> 8) & 0xFF;
661 *(pos + 562) = cam->sensor.pix_format.height & 0xFF;
662 *(pos + 561) = (cam->sensor.pix_format.height >> 8) & 0xFF;
665 f->buf.bytesused += sizeof(jpeg_header);
669 static void sn9c102_urb_complete(struct urb *urb)
671 struct sn9c102_device* cam = urb->context;
672 struct sn9c102_frame_t** f;
673 size_t imagesize, soflen;
677 if (urb->status == -ENOENT)
680 f = &cam->frame_current;
682 if (cam->stream == STREAM_INTERRUPT) {
683 cam->stream = STREAM_OFF;
685 (*f)->state = F_QUEUED;
686 cam->sof.bytesread = 0;
687 DBG(3, "Stream interrupted by application");
688 wake_up(&cam->wait_stream);
691 if (cam->state & DEV_DISCONNECTED)
694 if (cam->state & DEV_MISCONFIGURED) {
695 wake_up_interruptible(&cam->wait_frame);
699 if (cam->stream == STREAM_OFF || list_empty(&cam->inqueue))
703 (*f) = list_entry(cam->inqueue.next, struct sn9c102_frame_t,
706 imagesize = (cam->sensor.pix_format.width *
707 cam->sensor.pix_format.height *
708 cam->sensor.pix_format.priv) / 8;
709 if (cam->sensor.pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
710 imagesize += 589; /* length of jpeg header */
711 soflen = sn9c102_sof_length(cam);
713 for (i = 0; i < urb->number_of_packets; i++) {
714 unsigned int img, len, status;
715 void *pos, *sof, *eof;
717 len = urb->iso_frame_desc[i].actual_length;
718 status = urb->iso_frame_desc[i].status;
719 pos = urb->iso_frame_desc[i].offset + urb->transfer_buffer;
722 DBG(3, "Error in isochronous frame");
723 (*f)->state = F_ERROR;
724 cam->sof.bytesread = 0;
728 PDBGG("Isochrnous frame: length %u, #%u i", len, i);
731 sof = sn9c102_find_sof_header(cam, pos, len);
733 eof = sn9c102_find_eof_header(cam, pos, len);
734 if ((*f)->state == F_GRABBING) {
739 img = (eof > pos) ? eof - pos - 1 : 0;
741 if ((*f)->buf.bytesused + img > imagesize) {
743 b = (*f)->buf.bytesused + img -
745 img = imagesize - (*f)->buf.bytesused;
746 PDBGG("Expected EOF not found: video "
749 DBG(3, "Exceeded limit: +%u "
750 "bytes", (unsigned)(b));
753 memcpy((*f)->bufmem + (*f)->buf.bytesused, pos,
756 if ((*f)->buf.bytesused == 0)
757 do_gettimeofday(&(*f)->buf.timestamp);
759 (*f)->buf.bytesused += img;
761 if ((*f)->buf.bytesused == imagesize ||
762 ((cam->sensor.pix_format.pixelformat ==
763 V4L2_PIX_FMT_SN9C10X ||
764 cam->sensor.pix_format.pixelformat ==
765 V4L2_PIX_FMT_JPEG) && eof)) {
768 b = (*f)->buf.bytesused;
769 (*f)->state = F_DONE;
770 (*f)->buf.sequence= ++cam->frame_count;
772 spin_lock(&cam->queue_lock);
773 list_move_tail(&(*f)->frame,
775 if (!list_empty(&cam->inqueue))
778 struct sn9c102_frame_t,
782 spin_unlock(&cam->queue_lock);
784 memcpy(cam->sysfs.frame_header,
785 cam->sof.header, soflen);
787 DBG(3, "Video frame captured: %lu "
788 "bytes", (unsigned long)(b));
794 (*f)->state = F_ERROR;
795 DBG(3, "Not expected EOF after %lu "
796 "bytes of image data",
798 ((*f)->buf.bytesused));
805 DBG(3, "EOF without SOF");
809 PDBGG("Ignoring pointless isochronous frame");
813 } else if ((*f)->state == F_QUEUED || (*f)->state == F_ERROR) {
815 (*f)->state = F_GRABBING;
816 (*f)->buf.bytesused = 0;
819 if (cam->sensor.pix_format.pixelformat ==
821 sn9c102_write_jpegheader(cam, (*f));
822 DBG(3, "SOF detected: new video frame");
826 } else if ((*f)->state == F_GRABBING) {
827 eof = sn9c102_find_eof_header(cam, pos, len);
828 if (eof && eof < sof)
829 goto end_of_frame; /* (1) */
831 if (cam->sensor.pix_format.pixelformat ==
832 V4L2_PIX_FMT_SN9C10X ||
833 cam->sensor.pix_format.pixelformat ==
835 if (sof - pos >= soflen) {
837 } else { /* remove header */
839 (*f)->buf.bytesused -=
840 (soflen - (sof - pos));
844 DBG(3, "SOF before expected EOF after "
845 "%lu bytes of image data",
847 ((*f)->buf.bytesused));
855 urb->dev = cam->usbdev;
856 err = usb_submit_urb(urb, GFP_ATOMIC);
857 if (err < 0 && err != -EPERM) {
858 cam->state |= DEV_MISCONFIGURED;
859 DBG(1, "usb_submit_urb() failed");
862 wake_up_interruptible(&cam->wait_frame);
866 static int sn9c102_start_transfer(struct sn9c102_device* cam)
868 struct usb_device *udev = cam->usbdev;
870 struct usb_host_interface* altsetting = usb_altnum_to_altsetting(
871 usb_ifnum_to_if(udev, 0),
872 SN9C102_ALTERNATE_SETTING);
873 const unsigned int psz = le16_to_cpu(altsetting->
874 endpoint[0].desc.wMaxPacketSize);
878 for (i = 0; i < SN9C102_URBS; i++) {
879 cam->transfer_buffer[i] = kzalloc(SN9C102_ISO_PACKETS * psz,
881 if (!cam->transfer_buffer[i]) {
883 DBG(1, "Not enough memory");
888 for (i = 0; i < SN9C102_URBS; i++) {
889 urb = usb_alloc_urb(SN9C102_ISO_PACKETS, GFP_KERNEL);
893 DBG(1, "usb_alloc_urb() failed");
898 urb->pipe = usb_rcvisocpipe(udev, 1);
899 urb->transfer_flags = URB_ISO_ASAP;
900 urb->number_of_packets = SN9C102_ISO_PACKETS;
901 urb->complete = sn9c102_urb_complete;
902 urb->transfer_buffer = cam->transfer_buffer[i];
903 urb->transfer_buffer_length = psz * SN9C102_ISO_PACKETS;
905 for (j = 0; j < SN9C102_ISO_PACKETS; j++) {
906 urb->iso_frame_desc[j].offset = psz * j;
907 urb->iso_frame_desc[j].length = psz;
912 if (!(cam->reg[0x01] & 0x04)) {
913 err = sn9c102_write_reg(cam, cam->reg[0x01] | 0x04, 0x01);
916 DBG(1, "I/O hardware error");
921 err = usb_set_interface(udev, 0, SN9C102_ALTERNATE_SETTING);
923 DBG(1, "usb_set_interface() failed");
927 cam->frame_current = NULL;
928 cam->sof.bytesread = 0;
930 for (i = 0; i < SN9C102_URBS; i++) {
931 err = usb_submit_urb(cam->urb[i], GFP_KERNEL);
933 for (j = i-1; j >= 0; j--)
934 usb_kill_urb(cam->urb[j]);
935 DBG(1, "usb_submit_urb() failed, error %d", err);
943 for (i = 0; (i < SN9C102_URBS) && cam->urb[i]; i++)
944 usb_free_urb(cam->urb[i]);
947 for (i = 0; (i < SN9C102_URBS) && cam->transfer_buffer[i]; i++)
948 kfree(cam->transfer_buffer[i]);
954 static int sn9c102_stop_transfer(struct sn9c102_device* cam)
956 struct usb_device *udev = cam->usbdev;
960 if (cam->state & DEV_DISCONNECTED)
963 for (i = SN9C102_URBS-1; i >= 0; i--) {
964 usb_kill_urb(cam->urb[i]);
965 usb_free_urb(cam->urb[i]);
966 kfree(cam->transfer_buffer[i]);
969 err = usb_set_interface(udev, 0, 0); /* 0 Mb/s */
971 DBG(3, "usb_set_interface() failed");
977 static int sn9c102_stream_interrupt(struct sn9c102_device* cam)
981 cam->stream = STREAM_INTERRUPT;
982 timeout = wait_event_timeout(cam->wait_stream,
983 (cam->stream == STREAM_OFF) ||
984 (cam->state & DEV_DISCONNECTED),
985 SN9C102_URB_TIMEOUT);
986 if (cam->state & DEV_DISCONNECTED)
988 else if (cam->stream != STREAM_OFF) {
989 cam->state |= DEV_MISCONFIGURED;
990 DBG(1, "URB timeout reached. The camera is misconfigured. "
991 "To use it, close and open /dev/video%d again.",
999 /*****************************************************************************/
1001 #ifdef CONFIG_VIDEO_ADV_DEBUG
1002 static u16 sn9c102_strtou16(const char* buff, size_t len, ssize_t* count)
1009 strncpy(str, buff, len);
1012 strncpy(str, buff, 6);
1016 val = simple_strtoul(str, &endp, 0);
1020 *count = (ssize_t)(endp - str);
1021 if ((*count) && (len == *count+1) && (buff[*count] == '\n'))
1028 NOTE 1: being inside one of the following methods implies that the v4l
1029 device exists for sure (see kobjects and reference counters)
1030 NOTE 2: buffers are PAGE_SIZE long
1033 static ssize_t sn9c102_show_reg(struct class_device* cd, char* buf)
1035 struct sn9c102_device* cam;
1038 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1039 return -ERESTARTSYS;
1041 cam = video_get_drvdata(container_of(cd, struct video_device,
1044 mutex_unlock(&sn9c102_sysfs_lock);
1048 count = sprintf(buf, "%u\n", cam->sysfs.reg);
1050 mutex_unlock(&sn9c102_sysfs_lock);
1057 sn9c102_store_reg(struct class_device* cd, const char* buf, size_t len)
1059 struct sn9c102_device* cam;
1063 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1064 return -ERESTARTSYS;
1066 cam = video_get_drvdata(container_of(cd, struct video_device,
1069 mutex_unlock(&sn9c102_sysfs_lock);
1073 index = sn9c102_strtou16(buf, len, &count);
1074 if (index >= ARRAY_SIZE(cam->reg) || !count) {
1075 mutex_unlock(&sn9c102_sysfs_lock);
1079 cam->sysfs.reg = index;
1081 DBG(2, "Moved SN9C1XX register index to 0x%02X", cam->sysfs.reg);
1082 DBG(3, "Written bytes: %zd", count);
1084 mutex_unlock(&sn9c102_sysfs_lock);
1090 static ssize_t sn9c102_show_val(struct class_device* cd, char* buf)
1092 struct sn9c102_device* cam;
1096 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1097 return -ERESTARTSYS;
1099 cam = video_get_drvdata(container_of(cd, struct video_device,
1102 mutex_unlock(&sn9c102_sysfs_lock);
1106 if ((val = sn9c102_read_reg(cam, cam->sysfs.reg)) < 0) {
1107 mutex_unlock(&sn9c102_sysfs_lock);
1111 count = sprintf(buf, "%d\n", val);
1113 DBG(3, "Read bytes: %zd, value: %d", count, val);
1115 mutex_unlock(&sn9c102_sysfs_lock);
1122 sn9c102_store_val(struct class_device* cd, const char* buf, size_t len)
1124 struct sn9c102_device* cam;
1129 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1130 return -ERESTARTSYS;
1132 cam = video_get_drvdata(container_of(cd, struct video_device,
1135 mutex_unlock(&sn9c102_sysfs_lock);
1139 value = sn9c102_strtou16(buf, len, &count);
1141 mutex_unlock(&sn9c102_sysfs_lock);
1145 err = sn9c102_write_reg(cam, value, cam->sysfs.reg);
1147 mutex_unlock(&sn9c102_sysfs_lock);
1151 DBG(2, "Written SN9C1XX reg. 0x%02X, val. 0x%02X",
1152 cam->sysfs.reg, value);
1153 DBG(3, "Written bytes: %zd", count);
1155 mutex_unlock(&sn9c102_sysfs_lock);
1161 static ssize_t sn9c102_show_i2c_reg(struct class_device* cd, char* buf)
1163 struct sn9c102_device* cam;
1166 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1167 return -ERESTARTSYS;
1169 cam = video_get_drvdata(container_of(cd, struct video_device,
1172 mutex_unlock(&sn9c102_sysfs_lock);
1176 count = sprintf(buf, "%u\n", cam->sysfs.i2c_reg);
1178 DBG(3, "Read bytes: %zd", count);
1180 mutex_unlock(&sn9c102_sysfs_lock);
1187 sn9c102_store_i2c_reg(struct class_device* cd, const char* buf, size_t len)
1189 struct sn9c102_device* cam;
1193 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1194 return -ERESTARTSYS;
1196 cam = video_get_drvdata(container_of(cd, struct video_device,
1199 mutex_unlock(&sn9c102_sysfs_lock);
1203 index = sn9c102_strtou16(buf, len, &count);
1205 mutex_unlock(&sn9c102_sysfs_lock);
1209 cam->sysfs.i2c_reg = index;
1211 DBG(2, "Moved sensor register index to 0x%02X", cam->sysfs.i2c_reg);
1212 DBG(3, "Written bytes: %zd", count);
1214 mutex_unlock(&sn9c102_sysfs_lock);
1220 static ssize_t sn9c102_show_i2c_val(struct class_device* cd, char* buf)
1222 struct sn9c102_device* cam;
1226 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1227 return -ERESTARTSYS;
1229 cam = video_get_drvdata(container_of(cd, struct video_device,
1232 mutex_unlock(&sn9c102_sysfs_lock);
1236 if (!(cam->sensor.sysfs_ops & SN9C102_I2C_READ)) {
1237 mutex_unlock(&sn9c102_sysfs_lock);
1241 if ((val = sn9c102_i2c_read(cam, cam->sysfs.i2c_reg)) < 0) {
1242 mutex_unlock(&sn9c102_sysfs_lock);
1246 count = sprintf(buf, "%d\n", val);
1248 DBG(3, "Read bytes: %zd, value: %d", count, val);
1250 mutex_unlock(&sn9c102_sysfs_lock);
1257 sn9c102_store_i2c_val(struct class_device* cd, const char* buf, size_t len)
1259 struct sn9c102_device* cam;
1264 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1265 return -ERESTARTSYS;
1267 cam = video_get_drvdata(container_of(cd, struct video_device,
1270 mutex_unlock(&sn9c102_sysfs_lock);
1274 if (!(cam->sensor.sysfs_ops & SN9C102_I2C_WRITE)) {
1275 mutex_unlock(&sn9c102_sysfs_lock);
1279 value = sn9c102_strtou16(buf, len, &count);
1281 mutex_unlock(&sn9c102_sysfs_lock);
1285 err = sn9c102_i2c_write(cam, cam->sysfs.i2c_reg, value);
1287 mutex_unlock(&sn9c102_sysfs_lock);
1291 DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1292 cam->sysfs.i2c_reg, value);
1293 DBG(3, "Written bytes: %zd", count);
1295 mutex_unlock(&sn9c102_sysfs_lock);
1302 sn9c102_store_green(struct class_device* cd, const char* buf, size_t len)
1304 struct sn9c102_device* cam;
1305 enum sn9c102_bridge bridge;
1310 if (mutex_lock_interruptible(&sn9c102_sysfs_lock))
1311 return -ERESTARTSYS;
1313 cam = video_get_drvdata(container_of(cd, struct video_device,
1316 mutex_unlock(&sn9c102_sysfs_lock);
1320 bridge = cam->bridge;
1322 mutex_unlock(&sn9c102_sysfs_lock);
1324 value = sn9c102_strtou16(buf, len, &count);
1329 case BRIDGE_SN9C101:
1330 case BRIDGE_SN9C102:
1333 if ((res = sn9c102_store_reg(cd, "0x11", 4)) >= 0)
1334 res = sn9c102_store_val(cd, buf, len);
1336 case BRIDGE_SN9C103:
1337 case BRIDGE_SN9C105:
1338 case BRIDGE_SN9C120:
1341 if ((res = sn9c102_store_reg(cd, "0x07", 4)) >= 0)
1342 res = sn9c102_store_val(cd, buf, len);
1351 sn9c102_store_blue(struct class_device* cd, const char* buf, size_t len)
1357 value = sn9c102_strtou16(buf, len, &count);
1358 if (!count || value > 0x7f)
1361 if ((res = sn9c102_store_reg(cd, "0x06", 4)) >= 0)
1362 res = sn9c102_store_val(cd, buf, len);
1369 sn9c102_store_red(struct class_device* cd, const char* buf, size_t len)
1375 value = sn9c102_strtou16(buf, len, &count);
1376 if (!count || value > 0x7f)
1379 if ((res = sn9c102_store_reg(cd, "0x05", 4)) >= 0)
1380 res = sn9c102_store_val(cd, buf, len);
1386 static ssize_t sn9c102_show_frame_header(struct class_device* cd, char* buf)
1388 struct sn9c102_device* cam;
1391 cam = video_get_drvdata(container_of(cd, struct video_device,
1396 count = sizeof(cam->sysfs.frame_header);
1397 memcpy(buf, cam->sysfs.frame_header, count);
1399 DBG(3, "Frame header, read bytes: %zd", count);
1405 static CLASS_DEVICE_ATTR(reg, S_IRUGO | S_IWUSR,
1406 sn9c102_show_reg, sn9c102_store_reg);
1407 static CLASS_DEVICE_ATTR(val, S_IRUGO | S_IWUSR,
1408 sn9c102_show_val, sn9c102_store_val);
1409 static CLASS_DEVICE_ATTR(i2c_reg, S_IRUGO | S_IWUSR,
1410 sn9c102_show_i2c_reg, sn9c102_store_i2c_reg);
1411 static CLASS_DEVICE_ATTR(i2c_val, S_IRUGO | S_IWUSR,
1412 sn9c102_show_i2c_val, sn9c102_store_i2c_val);
1413 static CLASS_DEVICE_ATTR(green, S_IWUGO, NULL, sn9c102_store_green);
1414 static CLASS_DEVICE_ATTR(blue, S_IWUGO, NULL, sn9c102_store_blue);
1415 static CLASS_DEVICE_ATTR(red, S_IWUGO, NULL, sn9c102_store_red);
1416 static CLASS_DEVICE_ATTR(frame_header, S_IRUGO,
1417 sn9c102_show_frame_header, NULL);
1420 static int sn9c102_create_sysfs(struct sn9c102_device* cam)
1422 struct class_device *classdev = &(cam->v4ldev->class_dev);
1425 if ((err = class_device_create_file(classdev, &class_device_attr_reg)))
1427 if ((err = class_device_create_file(classdev, &class_device_attr_val)))
1429 if ((err = class_device_create_file(classdev,
1430 &class_device_attr_frame_header)))
1433 if (cam->sensor.sysfs_ops) {
1434 if ((err = class_device_create_file(classdev,
1435 &class_device_attr_i2c_reg)))
1436 goto err_frame_header;
1437 if ((err = class_device_create_file(classdev,
1438 &class_device_attr_i2c_val)))
1442 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102) {
1443 if ((err = class_device_create_file(classdev,
1444 &class_device_attr_green)))
1447 if ((err = class_device_create_file(classdev,
1448 &class_device_attr_blue)))
1450 if ((err = class_device_create_file(classdev,
1451 &class_device_attr_red)))
1458 class_device_remove_file(classdev, &class_device_attr_blue);
1460 if (cam->sensor.sysfs_ops)
1461 class_device_remove_file(classdev, &class_device_attr_i2c_val);
1463 if (cam->sensor.sysfs_ops)
1464 class_device_remove_file(classdev, &class_device_attr_i2c_reg);
1466 class_device_remove_file(classdev, &class_device_attr_frame_header);
1468 class_device_remove_file(classdev, &class_device_attr_val);
1470 class_device_remove_file(classdev, &class_device_attr_reg);
1474 #endif /* CONFIG_VIDEO_ADV_DEBUG */
1476 /*****************************************************************************/
1479 sn9c102_set_pix_format(struct sn9c102_device* cam, struct v4l2_pix_format* pix)
1483 if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X ||
1484 pix->pixelformat == V4L2_PIX_FMT_JPEG) {
1485 switch (cam->bridge) {
1486 case BRIDGE_SN9C101:
1487 case BRIDGE_SN9C102:
1488 case BRIDGE_SN9C103:
1489 err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80,
1492 case BRIDGE_SN9C105:
1493 case BRIDGE_SN9C120:
1494 err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f,
1499 switch (cam->bridge) {
1500 case BRIDGE_SN9C101:
1501 case BRIDGE_SN9C102:
1502 case BRIDGE_SN9C103:
1503 err += sn9c102_write_reg(cam, cam->reg[0x18] & 0x7f,
1506 case BRIDGE_SN9C105:
1507 case BRIDGE_SN9C120:
1508 err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x80,
1514 return err ? -EIO : 0;
1519 sn9c102_set_compression(struct sn9c102_device* cam,
1520 struct v4l2_jpegcompression* compression)
1524 switch (cam->bridge) {
1525 case BRIDGE_SN9C101:
1526 case BRIDGE_SN9C102:
1527 case BRIDGE_SN9C103:
1528 if (compression->quality == 0)
1529 err += sn9c102_write_reg(cam, cam->reg[0x17] | 0x01,
1531 else if (compression->quality == 1)
1532 err += sn9c102_write_reg(cam, cam->reg[0x17] & 0xfe,
1535 case BRIDGE_SN9C105:
1536 case BRIDGE_SN9C120:
1537 if (compression->quality == 0) {
1538 for (i = 0; i <= 63; i++) {
1539 err += sn9c102_write_reg(cam,
1540 SN9C102_Y_QTABLE1[i],
1542 err += sn9c102_write_reg(cam,
1543 SN9C102_UV_QTABLE1[i],
1546 err += sn9c102_write_reg(cam, cam->reg[0x18] & 0xbf,
1548 } else if (compression->quality == 1) {
1549 for (i = 0; i <= 63; i++) {
1550 err += sn9c102_write_reg(cam,
1551 SN9C102_Y_QTABLE1[i],
1553 err += sn9c102_write_reg(cam,
1554 SN9C102_UV_QTABLE1[i],
1557 err += sn9c102_write_reg(cam, cam->reg[0x18] | 0x40,
1563 return err ? -EIO : 0;
1567 static int sn9c102_set_scale(struct sn9c102_device* cam, u8 scale)
1573 r = cam->reg[0x18] & 0xcf;
1574 else if (scale == 2) {
1575 r = cam->reg[0x18] & 0xcf;
1577 } else if (scale == 4)
1578 r = cam->reg[0x18] | 0x20;
1580 err += sn9c102_write_reg(cam, r, 0x18);
1584 PDBGG("Scaling factor: %u", scale);
1590 static int sn9c102_set_crop(struct sn9c102_device* cam, struct v4l2_rect* rect)
1592 struct sn9c102_sensor* s = &cam->sensor;
1593 u8 h_start = (u8)(rect->left - s->cropcap.bounds.left),
1594 v_start = (u8)(rect->top - s->cropcap.bounds.top),
1595 h_size = (u8)(rect->width / 16),
1596 v_size = (u8)(rect->height / 16);
1599 err += sn9c102_write_reg(cam, h_start, 0x12);
1600 err += sn9c102_write_reg(cam, v_start, 0x13);
1601 err += sn9c102_write_reg(cam, h_size, 0x15);
1602 err += sn9c102_write_reg(cam, v_size, 0x16);
1606 PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
1607 "%u %u %u %u", h_start, v_start, h_size, v_size);
1613 static int sn9c102_init(struct sn9c102_device* cam)
1615 struct sn9c102_sensor* s = &cam->sensor;
1616 struct v4l2_control ctrl;
1617 struct v4l2_queryctrl *qctrl;
1618 struct v4l2_rect* rect;
1622 if (!(cam->state & DEV_INITIALIZED)) {
1623 mutex_init(&cam->open_mutex);
1624 init_waitqueue_head(&cam->wait_open);
1626 rect = &(s->cropcap.defrect);
1627 } else { /* use current values */
1632 err += sn9c102_set_scale(cam, rect->width / s->pix_format.width);
1633 err += sn9c102_set_crop(cam, rect);
1640 DBG(3, "Sensor initialization failed");
1645 if (!(cam->state & DEV_INITIALIZED))
1646 if (cam->bridge == BRIDGE_SN9C101 ||
1647 cam->bridge == BRIDGE_SN9C102 ||
1648 cam->bridge == BRIDGE_SN9C103) {
1649 if (s->pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
1650 s->pix_format.pixelformat= V4L2_PIX_FMT_SBGGR8;
1651 cam->compression.quality = cam->reg[0x17] & 0x01 ?
1654 if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X)
1655 s->pix_format.pixelformat = V4L2_PIX_FMT_JPEG;
1656 cam->compression.quality = cam->reg[0x18] & 0x40 ?
1658 err += sn9c102_set_compression(cam, &cam->compression);
1661 err += sn9c102_set_compression(cam, &cam->compression);
1662 err += sn9c102_set_pix_format(cam, &s->pix_format);
1663 if (s->set_pix_format)
1664 err += s->set_pix_format(cam, &s->pix_format);
1668 if (s->pix_format.pixelformat == V4L2_PIX_FMT_SN9C10X ||
1669 s->pix_format.pixelformat == V4L2_PIX_FMT_JPEG)
1670 DBG(3, "Compressed video format is active, quality %d",
1671 cam->compression.quality);
1673 DBG(3, "Uncompressed video format is active");
1676 if ((err = s->set_crop(cam, rect))) {
1677 DBG(3, "set_crop() failed");
1682 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
1683 if (s->qctrl[i].id != 0 &&
1684 !(s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)) {
1685 ctrl.id = s->qctrl[i].id;
1686 ctrl.value = qctrl[i].default_value;
1687 err = s->set_ctrl(cam, &ctrl);
1689 DBG(3, "Set %s control failed",
1693 DBG(3, "Image sensor supports '%s' control",
1698 if (!(cam->state & DEV_INITIALIZED)) {
1699 mutex_init(&cam->fileop_mutex);
1700 spin_lock_init(&cam->queue_lock);
1701 init_waitqueue_head(&cam->wait_frame);
1702 init_waitqueue_head(&cam->wait_stream);
1703 cam->nreadbuffers = 2;
1704 memcpy(s->_qctrl, s->qctrl, sizeof(s->qctrl));
1705 memcpy(&(s->_rect), &(s->cropcap.defrect),
1706 sizeof(struct v4l2_rect));
1707 cam->state |= DEV_INITIALIZED;
1710 DBG(2, "Initialization succeeded");
1714 /*****************************************************************************/
1716 static void sn9c102_release_resources(struct kref *kref)
1718 struct sn9c102_device *cam;
1720 mutex_lock(&sn9c102_sysfs_lock);
1722 cam = container_of(kref, struct sn9c102_device, kref);
1724 DBG(2, "V4L2 device /dev/video%d deregistered", cam->v4ldev->minor);
1725 video_set_drvdata(cam->v4ldev, NULL);
1726 video_unregister_device(cam->v4ldev);
1727 usb_put_dev(cam->usbdev);
1728 kfree(cam->control_buffer);
1731 mutex_unlock(&sn9c102_sysfs_lock);
1736 static int sn9c102_open(struct inode* inode, struct file* filp)
1738 struct sn9c102_device* cam;
1742 A read_trylock() in open() is the only safe way to prevent race
1743 conditions with disconnect(), one close() and multiple (not
1744 necessarily simultaneous) attempts to open(). For example, it
1745 prevents from waiting for a second access, while the device
1746 structure is being deallocated, after a possible disconnect() and
1747 during a following close() holding the write lock: given that, after
1748 this deallocation, no access will be possible anymore, using the
1749 non-trylock version would have let open() gain the access to the
1750 device structure improperly.
1751 For this reason the lock must also not be per-device.
1753 if (!down_read_trylock(&sn9c102_dev_lock))
1754 return -ERESTARTSYS;
1756 cam = video_get_drvdata(video_devdata(filp));
1758 if (wait_for_completion_interruptible(&cam->probe)) {
1759 up_read(&sn9c102_dev_lock);
1760 return -ERESTARTSYS;
1763 kref_get(&cam->kref);
1766 Make sure to isolate all the simultaneous opens.
1768 if (mutex_lock_interruptible(&cam->open_mutex)) {
1769 kref_put(&cam->kref, sn9c102_release_resources);
1770 up_read(&sn9c102_dev_lock);
1771 return -ERESTARTSYS;
1774 if (cam->state & DEV_DISCONNECTED) {
1775 DBG(1, "Device not present");
1781 DBG(2, "Device /dev/video%d is already in use",
1782 cam->v4ldev->minor);
1783 DBG(3, "Simultaneous opens are not supported");
1785 open() must follow the open flags and should block
1786 eventually while the device is in use.
1788 if ((filp->f_flags & O_NONBLOCK) ||
1789 (filp->f_flags & O_NDELAY)) {
1793 DBG(2, "A blocking open() has been requested. Wait for the "
1794 "device to be released...");
1795 up_read(&sn9c102_dev_lock);
1797 We will not release the "open_mutex" lock, so that only one
1798 process can be in the wait queue below. This way the process
1799 will be sleeping while holding the lock, without loosing its
1800 priority after any wake_up().
1802 err = wait_event_interruptible_exclusive(cam->wait_open,
1803 (cam->state & DEV_DISCONNECTED)
1805 down_read(&sn9c102_dev_lock);
1808 if (cam->state & DEV_DISCONNECTED) {
1814 if (cam->state & DEV_MISCONFIGURED) {
1815 err = sn9c102_init(cam);
1817 DBG(1, "Initialization failed again. "
1818 "I will retry on next open().");
1821 cam->state &= ~DEV_MISCONFIGURED;
1824 if ((err = sn9c102_start_transfer(cam)))
1827 filp->private_data = cam;
1830 cam->stream = STREAM_OFF;
1832 cam->frame_count = 0;
1833 sn9c102_empty_framequeues(cam);
1835 DBG(3, "Video device /dev/video%d is open", cam->v4ldev->minor);
1838 mutex_unlock(&cam->open_mutex);
1840 kref_put(&cam->kref, sn9c102_release_resources);
1842 up_read(&sn9c102_dev_lock);
1847 static int sn9c102_release(struct inode* inode, struct file* filp)
1849 struct sn9c102_device* cam;
1851 down_write(&sn9c102_dev_lock);
1853 cam = video_get_drvdata(video_devdata(filp));
1855 sn9c102_stop_transfer(cam);
1856 sn9c102_release_buffers(cam);
1858 wake_up_interruptible_nr(&cam->wait_open, 1);
1860 DBG(3, "Video device /dev/video%d closed", cam->v4ldev->minor);
1862 kref_put(&cam->kref, sn9c102_release_resources);
1864 up_write(&sn9c102_dev_lock);
1871 sn9c102_read(struct file* filp, char __user * buf, size_t count, loff_t* f_pos)
1873 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1874 struct sn9c102_frame_t* f, * i;
1875 unsigned long lock_flags;
1879 if (mutex_lock_interruptible(&cam->fileop_mutex))
1880 return -ERESTARTSYS;
1882 if (cam->state & DEV_DISCONNECTED) {
1883 DBG(1, "Device not present");
1884 mutex_unlock(&cam->fileop_mutex);
1888 if (cam->state & DEV_MISCONFIGURED) {
1889 DBG(1, "The camera is misconfigured. Close and open it "
1891 mutex_unlock(&cam->fileop_mutex);
1895 if (cam->io == IO_MMAP) {
1896 DBG(3, "Close and open the device again to choose "
1898 mutex_unlock(&cam->fileop_mutex);
1902 if (cam->io == IO_NONE) {
1903 if (!sn9c102_request_buffers(cam,cam->nreadbuffers, IO_READ)) {
1904 DBG(1, "read() failed, not enough memory");
1905 mutex_unlock(&cam->fileop_mutex);
1909 cam->stream = STREAM_ON;
1912 if (list_empty(&cam->inqueue)) {
1913 if (!list_empty(&cam->outqueue))
1914 sn9c102_empty_framequeues(cam);
1915 sn9c102_queue_unusedframes(cam);
1919 mutex_unlock(&cam->fileop_mutex);
1923 if (list_empty(&cam->outqueue)) {
1924 if (filp->f_flags & O_NONBLOCK) {
1925 mutex_unlock(&cam->fileop_mutex);
1928 if (!cam->module_param.frame_timeout) {
1929 err = wait_event_interruptible
1931 (!list_empty(&cam->outqueue)) ||
1932 (cam->state & DEV_DISCONNECTED) ||
1933 (cam->state & DEV_MISCONFIGURED) );
1935 mutex_unlock(&cam->fileop_mutex);
1939 timeout = wait_event_interruptible_timeout
1941 (!list_empty(&cam->outqueue)) ||
1942 (cam->state & DEV_DISCONNECTED) ||
1943 (cam->state & DEV_MISCONFIGURED),
1944 cam->module_param.frame_timeout *
1945 1000 * msecs_to_jiffies(1) );
1947 mutex_unlock(&cam->fileop_mutex);
1949 } else if (timeout == 0 &&
1950 !(cam->state & DEV_DISCONNECTED)) {
1951 DBG(1, "Video frame timeout elapsed");
1952 mutex_unlock(&cam->fileop_mutex);
1956 if (cam->state & DEV_DISCONNECTED) {
1957 mutex_unlock(&cam->fileop_mutex);
1960 if (cam->state & DEV_MISCONFIGURED) {
1961 mutex_unlock(&cam->fileop_mutex);
1966 f = list_entry(cam->outqueue.prev, struct sn9c102_frame_t, frame);
1968 if (count > f->buf.bytesused)
1969 count = f->buf.bytesused;
1971 if (copy_to_user(buf, f->bufmem, count)) {
1978 spin_lock_irqsave(&cam->queue_lock, lock_flags);
1979 list_for_each_entry(i, &cam->outqueue, frame)
1980 i->state = F_UNUSED;
1981 INIT_LIST_HEAD(&cam->outqueue);
1982 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
1984 sn9c102_queue_unusedframes(cam);
1986 PDBGG("Frame #%lu, bytes read: %zu",
1987 (unsigned long)f->buf.index, count);
1989 mutex_unlock(&cam->fileop_mutex);
1995 static unsigned int sn9c102_poll(struct file *filp, poll_table *wait)
1997 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
1998 struct sn9c102_frame_t* f;
1999 unsigned long lock_flags;
2000 unsigned int mask = 0;
2002 if (mutex_lock_interruptible(&cam->fileop_mutex))
2005 if (cam->state & DEV_DISCONNECTED) {
2006 DBG(1, "Device not present");
2010 if (cam->state & DEV_MISCONFIGURED) {
2011 DBG(1, "The camera is misconfigured. Close and open it "
2016 if (cam->io == IO_NONE) {
2017 if (!sn9c102_request_buffers(cam, cam->nreadbuffers,
2019 DBG(1, "poll() failed, not enough memory");
2023 cam->stream = STREAM_ON;
2026 if (cam->io == IO_READ) {
2027 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2028 list_for_each_entry(f, &cam->outqueue, frame)
2029 f->state = F_UNUSED;
2030 INIT_LIST_HEAD(&cam->outqueue);
2031 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2032 sn9c102_queue_unusedframes(cam);
2035 poll_wait(filp, &cam->wait_frame, wait);
2037 if (!list_empty(&cam->outqueue))
2038 mask |= POLLIN | POLLRDNORM;
2040 mutex_unlock(&cam->fileop_mutex);
2045 mutex_unlock(&cam->fileop_mutex);
2050 static void sn9c102_vm_open(struct vm_area_struct* vma)
2052 struct sn9c102_frame_t* f = vma->vm_private_data;
2057 static void sn9c102_vm_close(struct vm_area_struct* vma)
2059 /* NOTE: buffers are not freed here */
2060 struct sn9c102_frame_t* f = vma->vm_private_data;
2065 static struct vm_operations_struct sn9c102_vm_ops = {
2066 .open = sn9c102_vm_open,
2067 .close = sn9c102_vm_close,
2071 static int sn9c102_mmap(struct file* filp, struct vm_area_struct *vma)
2073 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
2074 unsigned long size = vma->vm_end - vma->vm_start,
2075 start = vma->vm_start;
2079 if (mutex_lock_interruptible(&cam->fileop_mutex))
2080 return -ERESTARTSYS;
2082 if (cam->state & DEV_DISCONNECTED) {
2083 DBG(1, "Device not present");
2084 mutex_unlock(&cam->fileop_mutex);
2088 if (cam->state & DEV_MISCONFIGURED) {
2089 DBG(1, "The camera is misconfigured. Close and open it "
2091 mutex_unlock(&cam->fileop_mutex);
2095 if (!(vma->vm_flags & (VM_WRITE | VM_READ))) {
2096 mutex_unlock(&cam->fileop_mutex);
2100 if (cam->io != IO_MMAP ||
2101 size != PAGE_ALIGN(cam->frame[0].buf.length)) {
2102 mutex_unlock(&cam->fileop_mutex);
2106 for (i = 0; i < cam->nbuffers; i++) {
2107 if ((cam->frame[i].buf.m.offset>>PAGE_SHIFT) == vma->vm_pgoff)
2110 if (i == cam->nbuffers) {
2111 mutex_unlock(&cam->fileop_mutex);
2115 vma->vm_flags |= VM_IO;
2116 vma->vm_flags |= VM_RESERVED;
2118 pos = cam->frame[i].bufmem;
2119 while (size > 0) { /* size is page-aligned */
2120 if (vm_insert_page(vma, start, vmalloc_to_page(pos))) {
2121 mutex_unlock(&cam->fileop_mutex);
2129 vma->vm_ops = &sn9c102_vm_ops;
2130 vma->vm_private_data = &cam->frame[i];
2131 sn9c102_vm_open(vma);
2133 mutex_unlock(&cam->fileop_mutex);
2138 /*****************************************************************************/
2141 sn9c102_vidioc_querycap(struct sn9c102_device* cam, void __user * arg)
2143 struct v4l2_capability cap = {
2144 .driver = "sn9c102",
2145 .version = SN9C102_MODULE_VERSION_CODE,
2146 .capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
2150 strlcpy(cap.card, cam->v4ldev->name, sizeof(cap.card));
2151 if (usb_make_path(cam->usbdev, cap.bus_info, sizeof(cap.bus_info)) < 0)
2152 strlcpy(cap.bus_info, cam->usbdev->dev.bus_id,
2153 sizeof(cap.bus_info));
2155 if (copy_to_user(arg, &cap, sizeof(cap)))
2163 sn9c102_vidioc_enuminput(struct sn9c102_device* cam, void __user * arg)
2165 struct v4l2_input i;
2167 if (copy_from_user(&i, arg, sizeof(i)))
2173 memset(&i, 0, sizeof(i));
2174 strcpy(i.name, "Camera");
2175 i.type = V4L2_INPUT_TYPE_CAMERA;
2177 if (copy_to_user(arg, &i, sizeof(i)))
2185 sn9c102_vidioc_g_input(struct sn9c102_device* cam, void __user * arg)
2189 if (copy_to_user(arg, &index, sizeof(index)))
2197 sn9c102_vidioc_s_input(struct sn9c102_device* cam, void __user * arg)
2201 if (copy_from_user(&index, arg, sizeof(index)))
2212 sn9c102_vidioc_query_ctrl(struct sn9c102_device* cam, void __user * arg)
2214 struct sn9c102_sensor* s = &cam->sensor;
2215 struct v4l2_queryctrl qc;
2218 if (copy_from_user(&qc, arg, sizeof(qc)))
2221 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2222 if (qc.id && qc.id == s->qctrl[i].id) {
2223 memcpy(&qc, &(s->qctrl[i]), sizeof(qc));
2224 if (copy_to_user(arg, &qc, sizeof(qc)))
2234 sn9c102_vidioc_g_ctrl(struct sn9c102_device* cam, void __user * arg)
2236 struct sn9c102_sensor* s = &cam->sensor;
2237 struct v4l2_control ctrl;
2241 if (!s->get_ctrl && !s->set_ctrl)
2244 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2248 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2249 if (ctrl.id && ctrl.id == s->qctrl[i].id) {
2250 ctrl.value = s->_qctrl[i].default_value;
2255 err = s->get_ctrl(cam, &ctrl);
2258 if (copy_to_user(arg, &ctrl, sizeof(ctrl)))
2261 PDBGG("VIDIOC_G_CTRL: id %lu, value %lu",
2262 (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2269 sn9c102_vidioc_s_ctrl(struct sn9c102_device* cam, void __user * arg)
2271 struct sn9c102_sensor* s = &cam->sensor;
2272 struct v4l2_control ctrl;
2279 if (copy_from_user(&ctrl, arg, sizeof(ctrl)))
2282 for (i = 0; i < ARRAY_SIZE(s->qctrl); i++)
2283 if (ctrl.id == s->qctrl[i].id) {
2284 if (s->qctrl[i].flags & V4L2_CTRL_FLAG_DISABLED)
2286 if (ctrl.value < s->qctrl[i].minimum ||
2287 ctrl.value > s->qctrl[i].maximum)
2289 ctrl.value -= ctrl.value % s->qctrl[i].step;
2293 if ((err = s->set_ctrl(cam, &ctrl)))
2296 s->_qctrl[i].default_value = ctrl.value;
2298 PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
2299 (unsigned long)ctrl.id, (unsigned long)ctrl.value);
2306 sn9c102_vidioc_cropcap(struct sn9c102_device* cam, void __user * arg)
2308 struct v4l2_cropcap* cc = &(cam->sensor.cropcap);
2310 cc->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2311 cc->pixelaspect.numerator = 1;
2312 cc->pixelaspect.denominator = 1;
2314 if (copy_to_user(arg, cc, sizeof(*cc)))
2322 sn9c102_vidioc_g_crop(struct sn9c102_device* cam, void __user * arg)
2324 struct sn9c102_sensor* s = &cam->sensor;
2325 struct v4l2_crop crop = {
2326 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE,
2329 memcpy(&(crop.c), &(s->_rect), sizeof(struct v4l2_rect));
2331 if (copy_to_user(arg, &crop, sizeof(crop)))
2339 sn9c102_vidioc_s_crop(struct sn9c102_device* cam, void __user * arg)
2341 struct sn9c102_sensor* s = &cam->sensor;
2342 struct v4l2_crop crop;
2343 struct v4l2_rect* rect;
2344 struct v4l2_rect* bounds = &(s->cropcap.bounds);
2345 struct v4l2_pix_format* pix_format = &(s->pix_format);
2347 const enum sn9c102_stream_state stream = cam->stream;
2348 const u32 nbuffers = cam->nbuffers;
2352 if (copy_from_user(&crop, arg, sizeof(crop)))
2357 if (crop.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2360 if (cam->module_param.force_munmap)
2361 for (i = 0; i < cam->nbuffers; i++)
2362 if (cam->frame[i].vma_use_count) {
2363 DBG(3, "VIDIOC_S_CROP failed. "
2364 "Unmap the buffers first.");
2368 /* Preserve R,G or B origin */
2369 rect->left = (s->_rect.left & 1L) ? rect->left | 1L : rect->left & ~1L;
2370 rect->top = (s->_rect.top & 1L) ? rect->top | 1L : rect->top & ~1L;
2372 if (rect->width < 16)
2374 if (rect->height < 16)
2376 if (rect->width > bounds->width)
2377 rect->width = bounds->width;
2378 if (rect->height > bounds->height)
2379 rect->height = bounds->height;
2380 if (rect->left < bounds->left)
2381 rect->left = bounds->left;
2382 if (rect->top < bounds->top)
2383 rect->top = bounds->top;
2384 if (rect->left + rect->width > bounds->left + bounds->width)
2385 rect->left = bounds->left+bounds->width - rect->width;
2386 if (rect->top + rect->height > bounds->top + bounds->height)
2387 rect->top = bounds->top+bounds->height - rect->height;
2389 rect->width &= ~15L;
2390 rect->height &= ~15L;
2392 if (SN9C102_PRESERVE_IMGSCALE) {
2393 /* Calculate the actual scaling factor */
2395 a = rect->width * rect->height;
2396 b = pix_format->width * pix_format->height;
2397 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2401 if (cam->stream == STREAM_ON)
2402 if ((err = sn9c102_stream_interrupt(cam)))
2405 if (copy_to_user(arg, &crop, sizeof(crop))) {
2406 cam->stream = stream;
2410 if (cam->module_param.force_munmap || cam->io == IO_READ)
2411 sn9c102_release_buffers(cam);
2413 err = sn9c102_set_crop(cam, rect);
2415 err += s->set_crop(cam, rect);
2416 err += sn9c102_set_scale(cam, scale);
2418 if (err) { /* atomic, no rollback in ioctl() */
2419 cam->state |= DEV_MISCONFIGURED;
2420 DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
2421 "use the camera, close and open /dev/video%d again.",
2422 cam->v4ldev->minor);
2426 s->pix_format.width = rect->width/scale;
2427 s->pix_format.height = rect->height/scale;
2428 memcpy(&(s->_rect), rect, sizeof(*rect));
2430 if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
2431 nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) {
2432 cam->state |= DEV_MISCONFIGURED;
2433 DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
2434 "use the camera, close and open /dev/video%d again.",
2435 cam->v4ldev->minor);
2439 if (cam->io == IO_READ)
2440 sn9c102_empty_framequeues(cam);
2441 else if (cam->module_param.force_munmap)
2442 sn9c102_requeue_outqueue(cam);
2444 cam->stream = stream;
2451 sn9c102_vidioc_enum_framesizes(struct sn9c102_device* cam, void __user * arg)
2453 struct v4l2_frmsizeenum frmsize;
2455 if (copy_from_user(&frmsize, arg, sizeof(frmsize)))
2458 if (frmsize.index != 0)
2461 switch (cam->bridge) {
2462 case BRIDGE_SN9C101:
2463 case BRIDGE_SN9C102:
2464 case BRIDGE_SN9C103:
2465 if (frmsize.pixel_format != V4L2_PIX_FMT_SN9C10X &&
2466 frmsize.pixel_format != V4L2_PIX_FMT_SBGGR8)
2468 case BRIDGE_SN9C105:
2469 case BRIDGE_SN9C120:
2470 if (frmsize.pixel_format != V4L2_PIX_FMT_JPEG &&
2471 frmsize.pixel_format != V4L2_PIX_FMT_SBGGR8)
2475 frmsize.type = V4L2_FRMSIZE_TYPE_STEPWISE;
2476 frmsize.stepwise.min_width = frmsize.stepwise.step_width = 16;
2477 frmsize.stepwise.min_height = frmsize.stepwise.step_height = 16;
2478 frmsize.stepwise.max_width = cam->sensor.cropcap.bounds.width;
2479 frmsize.stepwise.max_height = cam->sensor.cropcap.bounds.height;
2480 memset(&frmsize.reserved, 0, sizeof(frmsize.reserved));
2482 if (copy_to_user(arg, &frmsize, sizeof(frmsize)))
2490 sn9c102_vidioc_enum_fmt(struct sn9c102_device* cam, void __user * arg)
2492 struct v4l2_fmtdesc fmtd;
2494 if (copy_from_user(&fmtd, arg, sizeof(fmtd)))
2497 if (fmtd.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2500 if (fmtd.index == 0) {
2501 strcpy(fmtd.description, "bayer rgb");
2502 fmtd.pixelformat = V4L2_PIX_FMT_SBGGR8;
2503 } else if (fmtd.index == 1) {
2504 switch (cam->bridge) {
2505 case BRIDGE_SN9C101:
2506 case BRIDGE_SN9C102:
2507 case BRIDGE_SN9C103:
2508 strcpy(fmtd.description, "compressed");
2509 fmtd.pixelformat = V4L2_PIX_FMT_SN9C10X;
2511 case BRIDGE_SN9C105:
2512 case BRIDGE_SN9C120:
2513 strcpy(fmtd.description, "JPEG");
2514 fmtd.pixelformat = V4L2_PIX_FMT_JPEG;
2517 fmtd.flags = V4L2_FMT_FLAG_COMPRESSED;
2521 fmtd.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2522 memset(&fmtd.reserved, 0, sizeof(fmtd.reserved));
2524 if (copy_to_user(arg, &fmtd, sizeof(fmtd)))
2532 sn9c102_vidioc_g_fmt(struct sn9c102_device* cam, void __user * arg)
2534 struct v4l2_format format;
2535 struct v4l2_pix_format* pfmt = &(cam->sensor.pix_format);
2537 if (copy_from_user(&format, arg, sizeof(format)))
2540 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2543 pfmt->colorspace = (pfmt->pixelformat == V4L2_PIX_FMT_JPEG) ?
2544 V4L2_COLORSPACE_JPEG : V4L2_COLORSPACE_SRGB;
2545 pfmt->bytesperline = (pfmt->pixelformat == V4L2_PIX_FMT_SN9C10X ||
2546 pfmt->pixelformat == V4L2_PIX_FMT_JPEG)
2547 ? 0 : (pfmt->width * pfmt->priv) / 8;
2548 pfmt->sizeimage = pfmt->height * ((pfmt->width*pfmt->priv)/8);
2549 pfmt->field = V4L2_FIELD_NONE;
2550 memcpy(&(format.fmt.pix), pfmt, sizeof(*pfmt));
2552 if (copy_to_user(arg, &format, sizeof(format)))
2560 sn9c102_vidioc_try_s_fmt(struct sn9c102_device* cam, unsigned int cmd,
2563 struct sn9c102_sensor* s = &cam->sensor;
2564 struct v4l2_format format;
2565 struct v4l2_pix_format* pix;
2566 struct v4l2_pix_format* pfmt = &(s->pix_format);
2567 struct v4l2_rect* bounds = &(s->cropcap.bounds);
2568 struct v4l2_rect rect;
2570 const enum sn9c102_stream_state stream = cam->stream;
2571 const u32 nbuffers = cam->nbuffers;
2575 if (copy_from_user(&format, arg, sizeof(format)))
2578 pix = &(format.fmt.pix);
2580 if (format.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2583 memcpy(&rect, &(s->_rect), sizeof(rect));
2585 { /* calculate the actual scaling factor */
2587 a = rect.width * rect.height;
2588 b = pix->width * pix->height;
2589 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2592 rect.width = scale * pix->width;
2593 rect.height = scale * pix->height;
2595 if (rect.width < 16)
2597 if (rect.height < 16)
2599 if (rect.width > bounds->left + bounds->width - rect.left)
2600 rect.width = bounds->left + bounds->width - rect.left;
2601 if (rect.height > bounds->top + bounds->height - rect.top)
2602 rect.height = bounds->top + bounds->height - rect.top;
2605 rect.height &= ~15L;
2607 { /* adjust the scaling factor */
2609 a = rect.width * rect.height;
2610 b = pix->width * pix->height;
2611 scale = b ? (u8)((a / b) < 4 ? 1 : ((a / b) < 16 ? 2 : 4)) : 1;
2614 pix->width = rect.width / scale;
2615 pix->height = rect.height / scale;
2617 switch (cam->bridge) {
2618 case BRIDGE_SN9C101:
2619 case BRIDGE_SN9C102:
2620 case BRIDGE_SN9C103:
2621 if (pix->pixelformat != V4L2_PIX_FMT_SN9C10X &&
2622 pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
2623 pix->pixelformat = pfmt->pixelformat;
2625 case BRIDGE_SN9C105:
2626 case BRIDGE_SN9C120:
2627 if (pix->pixelformat != V4L2_PIX_FMT_JPEG &&
2628 pix->pixelformat != V4L2_PIX_FMT_SBGGR8)
2629 pix->pixelformat = pfmt->pixelformat;
2632 pix->priv = pfmt->priv; /* bpp */
2633 pix->colorspace = (pix->pixelformat == V4L2_PIX_FMT_JPEG) ?
2634 V4L2_COLORSPACE_JPEG : V4L2_COLORSPACE_SRGB;
2635 pix->bytesperline = (pix->pixelformat == V4L2_PIX_FMT_SN9C10X ||
2636 pix->pixelformat == V4L2_PIX_FMT_JPEG)
2637 ? 0 : (pix->width * pix->priv) / 8;
2638 pix->sizeimage = pix->height * ((pix->width * pix->priv) / 8);
2639 pix->field = V4L2_FIELD_NONE;
2641 if (cmd == VIDIOC_TRY_FMT) {
2642 if (copy_to_user(arg, &format, sizeof(format)))
2647 if (cam->module_param.force_munmap)
2648 for (i = 0; i < cam->nbuffers; i++)
2649 if (cam->frame[i].vma_use_count) {
2650 DBG(3, "VIDIOC_S_FMT failed. Unmap the "
2655 if (cam->stream == STREAM_ON)
2656 if ((err = sn9c102_stream_interrupt(cam)))
2659 if (copy_to_user(arg, &format, sizeof(format))) {
2660 cam->stream = stream;
2664 if (cam->module_param.force_munmap || cam->io == IO_READ)
2665 sn9c102_release_buffers(cam);
2667 err += sn9c102_set_pix_format(cam, pix);
2668 err += sn9c102_set_crop(cam, &rect);
2669 if (s->set_pix_format)
2670 err += s->set_pix_format(cam, pix);
2672 err += s->set_crop(cam, &rect);
2673 err += sn9c102_set_scale(cam, scale);
2675 if (err) { /* atomic, no rollback in ioctl() */
2676 cam->state |= DEV_MISCONFIGURED;
2677 DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
2678 "use the camera, close and open /dev/video%d again.",
2679 cam->v4ldev->minor);
2683 memcpy(pfmt, pix, sizeof(*pix));
2684 memcpy(&(s->_rect), &rect, sizeof(rect));
2686 if ((cam->module_param.force_munmap || cam->io == IO_READ) &&
2687 nbuffers != sn9c102_request_buffers(cam, nbuffers, cam->io)) {
2688 cam->state |= DEV_MISCONFIGURED;
2689 DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
2690 "use the camera, close and open /dev/video%d again.",
2691 cam->v4ldev->minor);
2695 if (cam->io == IO_READ)
2696 sn9c102_empty_framequeues(cam);
2697 else if (cam->module_param.force_munmap)
2698 sn9c102_requeue_outqueue(cam);
2700 cam->stream = stream;
2707 sn9c102_vidioc_g_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2709 if (copy_to_user(arg, &cam->compression, sizeof(cam->compression)))
2717 sn9c102_vidioc_s_jpegcomp(struct sn9c102_device* cam, void __user * arg)
2719 struct v4l2_jpegcompression jc;
2720 const enum sn9c102_stream_state stream = cam->stream;
2723 if (copy_from_user(&jc, arg, sizeof(jc)))
2726 if (jc.quality != 0 && jc.quality != 1)
2729 if (cam->stream == STREAM_ON)
2730 if ((err = sn9c102_stream_interrupt(cam)))
2733 err += sn9c102_set_compression(cam, &jc);
2734 if (err) { /* atomic, no rollback in ioctl() */
2735 cam->state |= DEV_MISCONFIGURED;
2736 DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
2737 "problems. To use the camera, close and open "
2738 "/dev/video%d again.", cam->v4ldev->minor);
2742 cam->compression.quality = jc.quality;
2744 cam->stream = stream;
2751 sn9c102_vidioc_reqbufs(struct sn9c102_device* cam, void __user * arg)
2753 struct v4l2_requestbuffers rb;
2757 if (copy_from_user(&rb, arg, sizeof(rb)))
2760 if (rb.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2761 rb.memory != V4L2_MEMORY_MMAP)
2764 if (cam->io == IO_READ) {
2765 DBG(3, "Close and open the device again to choose the mmap "
2770 for (i = 0; i < cam->nbuffers; i++)
2771 if (cam->frame[i].vma_use_count) {
2772 DBG(3, "VIDIOC_REQBUFS failed. Previous buffers are "
2777 if (cam->stream == STREAM_ON)
2778 if ((err = sn9c102_stream_interrupt(cam)))
2781 sn9c102_empty_framequeues(cam);
2783 sn9c102_release_buffers(cam);
2785 rb.count = sn9c102_request_buffers(cam, rb.count, IO_MMAP);
2787 if (copy_to_user(arg, &rb, sizeof(rb))) {
2788 sn9c102_release_buffers(cam);
2793 cam->io = rb.count ? IO_MMAP : IO_NONE;
2800 sn9c102_vidioc_querybuf(struct sn9c102_device* cam, void __user * arg)
2802 struct v4l2_buffer b;
2804 if (copy_from_user(&b, arg, sizeof(b)))
2807 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2808 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2811 memcpy(&b, &cam->frame[b.index].buf, sizeof(b));
2813 if (cam->frame[b.index].vma_use_count)
2814 b.flags |= V4L2_BUF_FLAG_MAPPED;
2816 if (cam->frame[b.index].state == F_DONE)
2817 b.flags |= V4L2_BUF_FLAG_DONE;
2818 else if (cam->frame[b.index].state != F_UNUSED)
2819 b.flags |= V4L2_BUF_FLAG_QUEUED;
2821 if (copy_to_user(arg, &b, sizeof(b)))
2829 sn9c102_vidioc_qbuf(struct sn9c102_device* cam, void __user * arg)
2831 struct v4l2_buffer b;
2832 unsigned long lock_flags;
2834 if (copy_from_user(&b, arg, sizeof(b)))
2837 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
2838 b.index >= cam->nbuffers || cam->io != IO_MMAP)
2841 if (cam->frame[b.index].state != F_UNUSED)
2844 cam->frame[b.index].state = F_QUEUED;
2846 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2847 list_add_tail(&cam->frame[b.index].frame, &cam->inqueue);
2848 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2850 PDBGG("Frame #%lu queued", (unsigned long)b.index);
2857 sn9c102_vidioc_dqbuf(struct sn9c102_device* cam, struct file* filp,
2860 struct v4l2_buffer b;
2861 struct sn9c102_frame_t *f;
2862 unsigned long lock_flags;
2866 if (copy_from_user(&b, arg, sizeof(b)))
2869 if (b.type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2872 if (list_empty(&cam->outqueue)) {
2873 if (cam->stream == STREAM_OFF)
2875 if (filp->f_flags & O_NONBLOCK)
2877 if (!cam->module_param.frame_timeout) {
2878 err = wait_event_interruptible
2880 (!list_empty(&cam->outqueue)) ||
2881 (cam->state & DEV_DISCONNECTED) ||
2882 (cam->state & DEV_MISCONFIGURED) );
2886 timeout = wait_event_interruptible_timeout
2888 (!list_empty(&cam->outqueue)) ||
2889 (cam->state & DEV_DISCONNECTED) ||
2890 (cam->state & DEV_MISCONFIGURED),
2891 cam->module_param.frame_timeout *
2892 1000 * msecs_to_jiffies(1) );
2895 else if (timeout == 0 &&
2896 !(cam->state & DEV_DISCONNECTED)) {
2897 DBG(1, "Video frame timeout elapsed");
2901 if (cam->state & DEV_DISCONNECTED)
2903 if (cam->state & DEV_MISCONFIGURED)
2907 spin_lock_irqsave(&cam->queue_lock, lock_flags);
2908 f = list_entry(cam->outqueue.next, struct sn9c102_frame_t, frame);
2909 list_del(cam->outqueue.next);
2910 spin_unlock_irqrestore(&cam->queue_lock, lock_flags);
2912 f->state = F_UNUSED;
2914 memcpy(&b, &f->buf, sizeof(b));
2915 if (f->vma_use_count)
2916 b.flags |= V4L2_BUF_FLAG_MAPPED;
2918 if (copy_to_user(arg, &b, sizeof(b)))
2921 PDBGG("Frame #%lu dequeued", (unsigned long)f->buf.index);
2928 sn9c102_vidioc_streamon(struct sn9c102_device* cam, void __user * arg)
2932 if (copy_from_user(&type, arg, sizeof(type)))
2935 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2938 cam->stream = STREAM_ON;
2940 DBG(3, "Stream on");
2947 sn9c102_vidioc_streamoff(struct sn9c102_device* cam, void __user * arg)
2951 if (copy_from_user(&type, arg, sizeof(type)))
2954 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE || cam->io != IO_MMAP)
2957 if (cam->stream == STREAM_ON)
2958 if ((err = sn9c102_stream_interrupt(cam)))
2961 sn9c102_empty_framequeues(cam);
2963 DBG(3, "Stream off");
2970 sn9c102_vidioc_g_parm(struct sn9c102_device* cam, void __user * arg)
2972 struct v4l2_streamparm sp;
2974 if (copy_from_user(&sp, arg, sizeof(sp)))
2977 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
2980 sp.parm.capture.extendedmode = 0;
2981 sp.parm.capture.readbuffers = cam->nreadbuffers;
2983 if (copy_to_user(arg, &sp, sizeof(sp)))
2991 sn9c102_vidioc_s_parm(struct sn9c102_device* cam, void __user * arg)
2993 struct v4l2_streamparm sp;
2995 if (copy_from_user(&sp, arg, sizeof(sp)))
2998 if (sp.type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
3001 sp.parm.capture.extendedmode = 0;
3003 if (sp.parm.capture.readbuffers == 0)
3004 sp.parm.capture.readbuffers = cam->nreadbuffers;
3006 if (sp.parm.capture.readbuffers > SN9C102_MAX_FRAMES)
3007 sp.parm.capture.readbuffers = SN9C102_MAX_FRAMES;
3009 if (copy_to_user(arg, &sp, sizeof(sp)))
3012 cam->nreadbuffers = sp.parm.capture.readbuffers;
3019 sn9c102_vidioc_enumaudio(struct sn9c102_device* cam, void __user * arg)
3021 struct v4l2_audio audio;
3023 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3026 if (copy_from_user(&audio, arg, sizeof(audio)))
3029 if (audio.index != 0)
3032 strcpy(audio.name, "Microphone");
3033 audio.capability = 0;
3036 if (copy_to_user(arg, &audio, sizeof(audio)))
3044 sn9c102_vidioc_g_audio(struct sn9c102_device* cam, void __user * arg)
3046 struct v4l2_audio audio;
3048 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3051 if (copy_from_user(&audio, arg, sizeof(audio)))
3054 memset(&audio, 0, sizeof(audio));
3055 strcpy(audio.name, "Microphone");
3057 if (copy_to_user(arg, &audio, sizeof(audio)))
3065 sn9c102_vidioc_s_audio(struct sn9c102_device* cam, void __user * arg)
3067 struct v4l2_audio audio;
3069 if (cam->bridge == BRIDGE_SN9C101 || cam->bridge == BRIDGE_SN9C102)
3072 if (copy_from_user(&audio, arg, sizeof(audio)))
3075 if (audio.index != 0)
3082 static int sn9c102_ioctl_v4l2(struct inode* inode, struct file* filp,
3083 unsigned int cmd, void __user * arg)
3085 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
3089 case VIDIOC_QUERYCAP:
3090 return sn9c102_vidioc_querycap(cam, arg);
3092 case VIDIOC_ENUMINPUT:
3093 return sn9c102_vidioc_enuminput(cam, arg);
3095 case VIDIOC_G_INPUT:
3096 return sn9c102_vidioc_g_input(cam, arg);
3098 case VIDIOC_S_INPUT:
3099 return sn9c102_vidioc_s_input(cam, arg);
3101 case VIDIOC_QUERYCTRL:
3102 return sn9c102_vidioc_query_ctrl(cam, arg);
3105 return sn9c102_vidioc_g_ctrl(cam, arg);
3108 return sn9c102_vidioc_s_ctrl(cam, arg);
3110 case VIDIOC_CROPCAP:
3111 return sn9c102_vidioc_cropcap(cam, arg);
3114 return sn9c102_vidioc_g_crop(cam, arg);
3117 return sn9c102_vidioc_s_crop(cam, arg);
3119 case VIDIOC_ENUM_FRAMESIZES:
3120 return sn9c102_vidioc_enum_framesizes(cam, arg);
3122 case VIDIOC_ENUM_FMT:
3123 return sn9c102_vidioc_enum_fmt(cam, arg);
3126 return sn9c102_vidioc_g_fmt(cam, arg);
3128 case VIDIOC_TRY_FMT:
3130 return sn9c102_vidioc_try_s_fmt(cam, cmd, arg);
3132 case VIDIOC_G_JPEGCOMP:
3133 return sn9c102_vidioc_g_jpegcomp(cam, arg);
3135 case VIDIOC_S_JPEGCOMP:
3136 return sn9c102_vidioc_s_jpegcomp(cam, arg);
3138 case VIDIOC_REQBUFS:
3139 return sn9c102_vidioc_reqbufs(cam, arg);
3141 case VIDIOC_QUERYBUF:
3142 return sn9c102_vidioc_querybuf(cam, arg);
3145 return sn9c102_vidioc_qbuf(cam, arg);
3148 return sn9c102_vidioc_dqbuf(cam, filp, arg);
3150 case VIDIOC_STREAMON:
3151 return sn9c102_vidioc_streamon(cam, arg);
3153 case VIDIOC_STREAMOFF:
3154 return sn9c102_vidioc_streamoff(cam, arg);
3157 return sn9c102_vidioc_g_parm(cam, arg);
3160 return sn9c102_vidioc_s_parm(cam, arg);
3162 case VIDIOC_ENUMAUDIO:
3163 return sn9c102_vidioc_enumaudio(cam, arg);
3165 case VIDIOC_G_AUDIO:
3166 return sn9c102_vidioc_g_audio(cam, arg);
3168 case VIDIOC_S_AUDIO:
3169 return sn9c102_vidioc_s_audio(cam, arg);
3173 case VIDIOC_QUERYSTD:
3174 case VIDIOC_ENUMSTD:
3175 case VIDIOC_QUERYMENU:
3176 case VIDIOC_ENUM_FRAMEINTERVALS:
3186 static int sn9c102_ioctl(struct inode* inode, struct file* filp,
3187 unsigned int cmd, unsigned long arg)
3189 struct sn9c102_device* cam = video_get_drvdata(video_devdata(filp));
3192 if (mutex_lock_interruptible(&cam->fileop_mutex))
3193 return -ERESTARTSYS;
3195 if (cam->state & DEV_DISCONNECTED) {
3196 DBG(1, "Device not present");
3197 mutex_unlock(&cam->fileop_mutex);
3201 if (cam->state & DEV_MISCONFIGURED) {
3202 DBG(1, "The camera is misconfigured. Close and open it "
3204 mutex_unlock(&cam->fileop_mutex);
3208 V4LDBG(3, "sn9c102", cmd);
3210 err = sn9c102_ioctl_v4l2(inode, filp, cmd, (void __user *)arg);
3212 mutex_unlock(&cam->fileop_mutex);
3217 /*****************************************************************************/
3219 static const struct file_operations sn9c102_fops = {
3220 .owner = THIS_MODULE,
3221 .open = sn9c102_open,
3222 .release = sn9c102_release,
3223 .ioctl = sn9c102_ioctl,
3224 .compat_ioctl = v4l_compat_ioctl32,
3225 .read = sn9c102_read,
3226 .poll = sn9c102_poll,
3227 .mmap = sn9c102_mmap,
3228 .llseek = no_llseek,
3231 /*****************************************************************************/
3233 /* It exists a single interface only. We do not need to validate anything. */
3235 sn9c102_usb_probe(struct usb_interface* intf, const struct usb_device_id* id)
3237 struct usb_device *udev = interface_to_usbdev(intf);
3238 struct sn9c102_device* cam;
3239 static unsigned int dev_nr = 0;
3243 if (!(cam = kzalloc(sizeof(struct sn9c102_device), GFP_KERNEL)))
3248 if (!(cam->control_buffer = kzalloc(8, GFP_KERNEL))) {
3249 DBG(1, "kzalloc() failed");
3254 if (!(cam->v4ldev = video_device_alloc())) {
3255 DBG(1, "video_device_alloc() failed");
3260 r = sn9c102_read_reg(cam, 0x00);
3261 if (r < 0 || (r != 0x10 && r != 0x11 && r != 0x12)) {
3262 DBG(1, "Sorry, this is not a SN9C1xx-based camera "
3263 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3268 cam->bridge = id->driver_info;
3269 switch (cam->bridge) {
3270 case BRIDGE_SN9C101:
3271 case BRIDGE_SN9C102:
3272 DBG(2, "SN9C10[12] PC Camera Controller detected "
3273 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3275 case BRIDGE_SN9C103:
3276 DBG(2, "SN9C103 PC Camera Controller detected "
3277 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3279 case BRIDGE_SN9C105:
3280 DBG(2, "SN9C105 PC Camera Controller detected "
3281 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3283 case BRIDGE_SN9C120:
3284 DBG(2, "SN9C120 PC Camera Controller detected "
3285 "(vid:pid 0x%04X:0x%04X)", id->idVendor, id->idProduct);
3289 for (i = 0; i < ARRAY_SIZE(sn9c102_sensor_table); i++) {
3290 err = sn9c102_sensor_table[i](cam);
3296 DBG(2, "%s image sensor detected", cam->sensor.name);
3297 DBG(3, "Support for %s maintained by %s",
3298 cam->sensor.name, cam->sensor.maintainer);
3300 DBG(1, "No supported image sensor detected for this bridge");
3305 if (!(cam->bridge & cam->sensor.supported_bridge)) {
3306 DBG(1, "Bridge not supported");
3311 if (sn9c102_init(cam)) {
3312 DBG(1, "Initialization failed. I will retry on open().");
3313 cam->state |= DEV_MISCONFIGURED;
3316 strcpy(cam->v4ldev->name, "SN9C1xx PC Camera");
3317 cam->v4ldev->owner = THIS_MODULE;
3318 cam->v4ldev->type = VID_TYPE_CAPTURE | VID_TYPE_SCALES;
3319 cam->v4ldev->hardware = 0;
3320 cam->v4ldev->fops = &sn9c102_fops;
3321 cam->v4ldev->minor = video_nr[dev_nr];
3322 cam->v4ldev->release = video_device_release;
3323 video_set_drvdata(cam->v4ldev, cam);
3325 init_completion(&cam->probe);
3327 err = video_register_device(cam->v4ldev, VFL_TYPE_GRABBER,
3330 DBG(1, "V4L2 device registration failed");
3331 if (err == -ENFILE && video_nr[dev_nr] == -1)
3332 DBG(1, "Free /dev/videoX node not found");
3333 video_nr[dev_nr] = -1;
3334 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3335 complete_all(&cam->probe);
3339 DBG(2, "V4L2 device registered as /dev/video%d", cam->v4ldev->minor);
3341 cam->module_param.force_munmap = force_munmap[dev_nr];
3342 cam->module_param.frame_timeout = frame_timeout[dev_nr];
3344 dev_nr = (dev_nr < SN9C102_MAX_DEVICES-1) ? dev_nr+1 : 0;
3346 #ifdef CONFIG_VIDEO_ADV_DEBUG
3347 err = sn9c102_create_sysfs(cam);
3349 DBG(2, "Optional device control through 'sysfs' "
3352 DBG(2, "Failed to create optional 'sysfs' interface for "
3353 "device controlling. Error #%d", err);
3355 DBG(2, "Optional device control through 'sysfs' interface disabled");
3356 DBG(3, "Compile the kernel with the 'CONFIG_VIDEO_ADV_DEBUG' "
3357 "configuration option to enable it.");
3360 usb_set_intfdata(intf, cam);
3361 kref_init(&cam->kref);
3362 usb_get_dev(cam->usbdev);
3364 complete_all(&cam->probe);
3370 kfree(cam->control_buffer);
3372 video_device_release(cam->v4ldev);
3379 static void sn9c102_usb_disconnect(struct usb_interface* intf)
3381 struct sn9c102_device* cam;
3383 down_write(&sn9c102_dev_lock);
3385 cam = usb_get_intfdata(intf);
3387 DBG(2, "Disconnecting %s...", cam->v4ldev->name);
3390 DBG(2, "Device /dev/video%d is open! Deregistration and "
3391 "memory deallocation are deferred.",
3392 cam->v4ldev->minor);
3393 cam->state |= DEV_MISCONFIGURED;
3394 sn9c102_stop_transfer(cam);
3395 cam->state |= DEV_DISCONNECTED;
3396 wake_up_interruptible(&cam->wait_frame);
3397 wake_up(&cam->wait_stream);
3399 cam->state |= DEV_DISCONNECTED;
3401 wake_up_interruptible_all(&cam->wait_open);
3403 kref_put(&cam->kref, sn9c102_release_resources);
3405 up_write(&sn9c102_dev_lock);
3409 static struct usb_driver sn9c102_usb_driver = {
3411 .id_table = sn9c102_id_table,
3412 .probe = sn9c102_usb_probe,
3413 .disconnect = sn9c102_usb_disconnect,
3416 /*****************************************************************************/
3418 static int __init sn9c102_module_init(void)
3422 KDBG(2, SN9C102_MODULE_NAME " v" SN9C102_MODULE_VERSION);
3423 KDBG(3, SN9C102_MODULE_AUTHOR);
3425 if ((err = usb_register(&sn9c102_usb_driver)))
3426 KDBG(1, "usb_register() failed");
3432 static void __exit sn9c102_module_exit(void)
3434 usb_deregister(&sn9c102_usb_driver);
3438 module_init(sn9c102_module_init);
3439 module_exit(sn9c102_module_exit);