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/errno.h>
26 #include <linux/slab.h>
27 #include <linux/device.h>
29 #include <linux/delay.h>
30 #include <linux/compiler.h>
31 #include <linux/ioctl.h>
32 #include <linux/poll.h>
33 #include <linux/stat.h>
35 #include <linux/vmalloc.h>
36 #include <linux/version.h>
37 #include <linux/page-flags.h>
38 #include <asm/byteorder.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.48"
53 /*****************************************************************************/
55 MODULE_DEVICE_TABLE(usb
, sn9c102_id_table
);
57 MODULE_AUTHOR(SN9C102_MODULE_AUTHOR
" " SN9C102_AUTHOR_EMAIL
);
58 MODULE_DESCRIPTION(SN9C102_MODULE_NAME
);
59 MODULE_ALIAS(SN9C102_MODULE_ALIAS
);
60 MODULE_VERSION(SN9C102_MODULE_VERSION
);
61 MODULE_LICENSE(SN9C102_MODULE_LICENSE
);
63 static short video_nr
[] = {[0 ... SN9C102_MAX_DEVICES
-1] = -1};
64 module_param_array(video_nr
, short, NULL
, 0444);
65 MODULE_PARM_DESC(video_nr
,
67 "\nSpecify V4L2 minor mode number."
68 "\n-1 = use next available (default)"
69 "\n n = use minor number n (integer >= 0)"
70 "\nYou can specify up to "__MODULE_STRING(SN9C102_MAX_DEVICES
)
73 "\nvideo_nr=-1,2,-1 would assign minor number 2 to"
74 "\nthe second camera and use auto for the first"
75 "\none and for every other camera."
78 static short force_munmap
[] = {[0 ... SN9C102_MAX_DEVICES
-1] =
79 SN9C102_FORCE_MUNMAP
};
80 module_param_array(force_munmap
, bool, NULL
, 0444);
81 MODULE_PARM_DESC(force_munmap
,
83 "\nForce the application to unmap previously"
84 "\nmapped buffer memory before calling any VIDIOC_S_CROP or"
85 "\nVIDIOC_S_FMT ioctl's. Not all the applications support"
86 "\nthis feature. This parameter is specific for each"
88 "\n0 = do not force memory unmapping"
89 "\n1 = force memory unmapping (save memory)"
90 "\nDefault value is "__MODULE_STRING(SN9C102_FORCE_MUNMAP
)"."
93 static unsigned int frame_timeout
[] = {[0 ... SN9C102_MAX_DEVICES
-1] =
94 SN9C102_FRAME_TIMEOUT
};
95 module_param_array(frame_timeout
, uint
, NULL
, 0644);
96 MODULE_PARM_DESC(frame_timeout
,
98 "\nTimeout for a video frame in seconds before"
99 "\nreturning an I/O error; 0 for infinity."
100 "\nThis parameter is specific for each detected camera."
101 "\nDefault value is "__MODULE_STRING(SN9C102_FRAME_TIMEOUT
)"."
105 static unsigned short debug
= SN9C102_DEBUG_LEVEL
;
106 module_param(debug
, ushort
, 0644);
107 MODULE_PARM_DESC(debug
,
109 "\nDebugging information level, from 0 to 3:"
110 "\n0 = none (use carefully)"
111 "\n1 = critical errors"
112 "\n2 = significant informations"
113 "\n3 = more verbose messages"
114 "\nLevel 3 is useful for testing only."
115 "\nDefault value is "__MODULE_STRING(SN9C102_DEBUG_LEVEL
)"."
120 Add the probe entries to this table. Be sure to add the entry in the right
121 place, since, on failure, the next probing routine is called according to
122 the order of the list below, from top to bottom.
124 static int (*sn9c102_sensor_table
[])(struct sn9c102_device
*) = {
125 &sn9c102_probe_hv7131d
, /* strong detection based on SENSOR ids */
126 &sn9c102_probe_hv7131r
, /* strong detection based on SENSOR ids */
127 &sn9c102_probe_mi0343
, /* strong detection based on SENSOR ids */
128 &sn9c102_probe_mi0360
, /* strong detection based on SENSOR ids */
129 &sn9c102_probe_mt9v111
, /* strong detection based on SENSOR ids */
130 &sn9c102_probe_pas106b
, /* strong detection based on SENSOR ids */
131 &sn9c102_probe_pas202bcb
, /* strong detection based on SENSOR ids */
132 &sn9c102_probe_ov7630
, /* strong detection based on SENSOR ids */
133 &sn9c102_probe_ov7660
, /* strong detection based on SENSOR ids */
134 &sn9c102_probe_tas5110c1b
, /* detection based on USB pid/vid */
135 &sn9c102_probe_tas5110d
, /* detection based on USB pid/vid */
136 &sn9c102_probe_tas5130d1b
, /* detection based on USB pid/vid */
139 /*****************************************************************************/
142 sn9c102_request_buffers(struct sn9c102_device
* cam
, u32 count
,
143 enum sn9c102_io_method io
)
145 struct v4l2_pix_format
* p
= &(cam
->sensor
.pix_format
);
146 struct v4l2_rect
* r
= &(cam
->sensor
.cropcap
.bounds
);
147 size_t imagesize
= cam
->module_param
.force_munmap
|| io
== IO_READ
?
148 (p
->width
* p
->height
* p
->priv
) / 8 :
149 (r
->width
* r
->height
* p
->priv
) / 8;
153 if (count
> SN9C102_MAX_FRAMES
)
154 count
= SN9C102_MAX_FRAMES
;
156 if (cam
->bridge
== BRIDGE_SN9C105
|| cam
->bridge
== BRIDGE_SN9C120
)
157 imagesize
+= 589 + 2; /* length of JPEG header + EOI marker */
159 cam
->nbuffers
= count
;
160 while (cam
->nbuffers
> 0) {
161 if ((buff
= vmalloc_32_user(cam
->nbuffers
*
162 PAGE_ALIGN(imagesize
))))
167 for (i
= 0; i
< cam
->nbuffers
; i
++) {
168 cam
->frame
[i
].bufmem
= buff
+ i
*PAGE_ALIGN(imagesize
);
169 cam
->frame
[i
].buf
.index
= i
;
170 cam
->frame
[i
].buf
.m
.offset
= i
*PAGE_ALIGN(imagesize
);
171 cam
->frame
[i
].buf
.length
= imagesize
;
172 cam
->frame
[i
].buf
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
173 cam
->frame
[i
].buf
.sequence
= 0;
174 cam
->frame
[i
].buf
.field
= V4L2_FIELD_NONE
;
175 cam
->frame
[i
].buf
.memory
= V4L2_MEMORY_MMAP
;
176 cam
->frame
[i
].buf
.flags
= 0;
179 return cam
->nbuffers
;
183 static void sn9c102_release_buffers(struct sn9c102_device
* cam
)
186 vfree(cam
->frame
[0].bufmem
);
189 cam
->frame_current
= NULL
;
193 static void sn9c102_empty_framequeues(struct sn9c102_device
* cam
)
197 INIT_LIST_HEAD(&cam
->inqueue
);
198 INIT_LIST_HEAD(&cam
->outqueue
);
200 for (i
= 0; i
< SN9C102_MAX_FRAMES
; i
++) {
201 cam
->frame
[i
].state
= F_UNUSED
;
202 cam
->frame
[i
].buf
.bytesused
= 0;
207 static void sn9c102_requeue_outqueue(struct sn9c102_device
* cam
)
209 struct sn9c102_frame_t
*i
;
211 list_for_each_entry(i
, &cam
->outqueue
, frame
) {
213 list_add(&i
->frame
, &cam
->inqueue
);
216 INIT_LIST_HEAD(&cam
->outqueue
);
220 static void sn9c102_queue_unusedframes(struct sn9c102_device
* cam
)
222 unsigned long lock_flags
;
225 for (i
= 0; i
< cam
->nbuffers
; i
++)
226 if (cam
->frame
[i
].state
== F_UNUSED
) {
227 cam
->frame
[i
].state
= F_QUEUED
;
228 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
229 list_add_tail(&cam
->frame
[i
].frame
, &cam
->inqueue
);
230 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
234 /*****************************************************************************/
237 Write a sequence of count value/register pairs. Returns -1 after the first
238 failed write, or 0 for no errors.
240 int sn9c102_write_regs(struct sn9c102_device
* cam
, const u8 valreg
[][2],
243 struct usb_device
* udev
= cam
->usbdev
;
244 u8
* buff
= cam
->control_buffer
;
247 for (i
= 0; i
< count
; i
++) {
248 u8 index
= valreg
[i
][1];
251 index is a u8, so it must be <256 and can't be out of range.
252 If we put in a check anyway, gcc annoys us with a warning
253 hat our check is useless. People get all uppity when they
254 see warnings in the kernel compile.
257 *buff
= valreg
[i
][0];
259 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08,
260 0x41, index
, 0, buff
, 1,
261 SN9C102_CTRL_TIMEOUT
);
264 DBG(3, "Failed to write a register (value 0x%02X, "
265 "index 0x%02X, error %d)", *buff
, index
, res
);
269 cam
->reg
[index
] = *buff
;
276 int sn9c102_write_reg(struct sn9c102_device
* cam
, u8 value
, u16 index
)
278 struct usb_device
* udev
= cam
->usbdev
;
279 u8
* buff
= cam
->control_buffer
;
282 if (index
>= ARRAY_SIZE(cam
->reg
))
287 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
288 index
, 0, buff
, 1, SN9C102_CTRL_TIMEOUT
);
290 DBG(3, "Failed to write a register (value 0x%02X, index "
291 "0x%02X, error %d)", value
, index
, res
);
295 cam
->reg
[index
] = value
;
301 /* NOTE: with the SN9C10[123] reading some registers always returns 0 */
302 int sn9c102_read_reg(struct sn9c102_device
* cam
, u16 index
)
304 struct usb_device
* udev
= cam
->usbdev
;
305 u8
* buff
= cam
->control_buffer
;
308 res
= usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0), 0x00, 0xc1,
309 index
, 0, buff
, 1, SN9C102_CTRL_TIMEOUT
);
311 DBG(3, "Failed to read a register (index 0x%02X, error %d)",
314 return (res
>= 0) ? (int)(*buff
) : -1;
318 int sn9c102_pread_reg(struct sn9c102_device
* cam
, u16 index
)
320 if (index
>= ARRAY_SIZE(cam
->reg
))
323 return cam
->reg
[index
];
328 sn9c102_i2c_wait(struct sn9c102_device
* cam
,
329 const struct sn9c102_sensor
* sensor
)
333 for (i
= 1; i
<= 5; i
++) {
334 r
= sn9c102_read_reg(cam
, 0x08);
339 if (sensor
->frequency
& SN9C102_I2C_400KHZ
)
349 sn9c102_i2c_detect_read_error(struct sn9c102_device
* cam
,
350 const struct sn9c102_sensor
* sensor
)
354 r
= sn9c102_read_reg(cam
, 0x08);
358 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
) {
366 return err
? -EIO
: 0;
371 sn9c102_i2c_detect_write_error(struct sn9c102_device
* cam
,
372 const struct sn9c102_sensor
* sensor
)
375 r
= sn9c102_read_reg(cam
, 0x08);
376 return (r
< 0 || (r
>= 0 && (r
& 0x08))) ? -EIO
: 0;
381 sn9c102_i2c_try_raw_read(struct sn9c102_device
* cam
,
382 const struct sn9c102_sensor
* sensor
, u8 data0
,
383 u8 data1
, u8 n
, u8 buffer
[])
385 struct usb_device
* udev
= cam
->usbdev
;
386 u8
* data
= cam
->control_buffer
;
387 int i
= 0, err
= 0, res
;
390 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
391 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0) | 0x10;
392 data
[1] = data0
; /* I2C slave id */
393 data
[2] = data1
; /* address */
395 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
396 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
400 err
+= sn9c102_i2c_wait(cam
, sensor
);
402 /* Read cycle - n bytes */
403 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
404 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0) |
408 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
409 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
413 err
+= sn9c102_i2c_wait(cam
, sensor
);
415 /* The first read byte will be placed in data[4] */
416 res
= usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0), 0x00, 0xc1,
417 0x0a, 0, data
, 5, SN9C102_CTRL_TIMEOUT
);
421 err
+= sn9c102_i2c_detect_read_error(cam
, sensor
);
423 PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1
,
427 DBG(3, "I2C read failed for %s image sensor", sensor
->name
);
432 for (i
= 0; i
< n
&& i
< 5; i
++)
433 buffer
[n
-i
-1] = data
[4-i
];
440 sn9c102_i2c_try_raw_write(struct sn9c102_device
* cam
,
441 const struct sn9c102_sensor
* sensor
, u8 n
, u8 data0
,
442 u8 data1
, u8 data2
, u8 data3
, u8 data4
, u8 data5
)
444 struct usb_device
* udev
= cam
->usbdev
;
445 u8
* data
= cam
->control_buffer
;
448 /* Write cycle. It usually is address + value */
449 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
450 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0)
459 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
460 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
464 err
+= sn9c102_i2c_wait(cam
, sensor
);
465 err
+= sn9c102_i2c_detect_write_error(cam
, sensor
);
468 DBG(3, "I2C write failed for %s image sensor", sensor
->name
);
470 PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
471 "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
472 n
, data0
, data1
, data2
, data3
, data4
, data5
);
479 sn9c102_i2c_try_read(struct sn9c102_device
* cam
,
480 const struct sn9c102_sensor
* sensor
, u8 address
)
482 return sn9c102_i2c_try_raw_read(cam
, sensor
, sensor
->i2c_slave_id
,
487 static int sn9c102_i2c_try_write(struct sn9c102_device
* cam
,
488 const struct sn9c102_sensor
* sensor
,
489 u8 address
, u8 value
)
491 return sn9c102_i2c_try_raw_write(cam
, sensor
, 3,
492 sensor
->i2c_slave_id
, address
,
497 int sn9c102_i2c_read(struct sn9c102_device
* cam
, u8 address
)
499 return sn9c102_i2c_try_read(cam
, &cam
->sensor
, address
);
503 int sn9c102_i2c_write(struct sn9c102_device
* cam
, u8 address
, u8 value
)
505 return sn9c102_i2c_try_write(cam
, &cam
->sensor
, address
, value
);
508 /*****************************************************************************/
510 static size_t sn9c102_sof_length(struct sn9c102_device
* cam
)
512 switch (cam
->bridge
) {
528 sn9c102_find_sof_header(struct sn9c102_device
* cam
, void* mem
, size_t len
)
530 static const char marker
[6] = {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
532 size_t soflen
= 0, i
, j
;
534 soflen
= sn9c102_sof_length(cam
);
536 for (i
= 0; i
< len
; i
++) {
539 /* Read the variable part of the header */
540 if (unlikely(cam
->sof
.bytesread
>= sizeof(marker
))) {
541 cam
->sof
.header
[cam
->sof
.bytesread
] = *(m
+i
);
542 if (++cam
->sof
.bytesread
== soflen
) {
543 cam
->sof
.bytesread
= 0;
549 /* Search for the SOF marker (fixed part) in the header */
550 for (j
= 0, b
=cam
->sof
.bytesread
; j
+b
< sizeof(marker
); j
++) {
551 if (unlikely(i
+j
== len
))
553 if (*(m
+i
+j
) == marker
[cam
->sof
.bytesread
]) {
554 cam
->sof
.header
[cam
->sof
.bytesread
] = *(m
+i
+j
);
555 if (++cam
->sof
.bytesread
== sizeof(marker
)) {
556 PDBGG("Bytes to analyze: %zd. SOF "
557 "starts at byte #%zd", len
, i
);
562 cam
->sof
.bytesread
= 0;
573 sn9c102_find_eof_header(struct sn9c102_device
* cam
, void* mem
, size_t len
)
575 static const u8 eof_header
[4][4] = {
576 {0x00, 0x00, 0x00, 0x00},
577 {0x40, 0x00, 0x00, 0x00},
578 {0x80, 0x00, 0x00, 0x00},
579 {0xc0, 0x00, 0x00, 0x00},
583 /* The EOF header does not exist in compressed data */
584 if (cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
||
585 cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
589 The EOF header might cross the packet boundary, but this is not a
590 problem, since the end of a frame is determined by checking its size
593 for (i
= 0; (len
>= 4) && (i
<= len
- 4); i
++)
594 for (j
= 0; j
< ARRAY_SIZE(eof_header
); j
++)
595 if (!memcmp(mem
+ i
, eof_header
[j
], 4))
603 sn9c102_write_jpegheader(struct sn9c102_device
* cam
, struct sn9c102_frame_t
* f
)
605 static const u8 jpeg_header
[589] = {
606 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x06, 0x04, 0x05,
607 0x06, 0x05, 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x06,
608 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e,
609 0x0f, 0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14, 0x16,
610 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b, 0x23, 0x1c, 0x16,
611 0x16, 0x20, 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x29,
612 0x19, 0x1f, 0x2d, 0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29,
613 0x28, 0x01, 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
614 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, 0x28, 0x28,
615 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
616 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
617 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
618 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
619 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0xff, 0xc4, 0x01, 0xa2,
620 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
622 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01,
623 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
624 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
625 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00,
626 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04,
627 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
628 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
629 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23,
630 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62,
631 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
632 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38,
633 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
634 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
635 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
636 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
637 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
638 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
639 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
640 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
641 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
642 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
643 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
644 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
645 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
646 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
647 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
648 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1,
649 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
650 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
651 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
652 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
653 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
654 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
655 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
656 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
657 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
658 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
659 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
660 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
661 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xc0, 0x00, 0x11,
662 0x08, 0x01, 0xe0, 0x02, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02,
663 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xda, 0x00, 0x0c, 0x03,
664 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
668 memcpy(pos
, jpeg_header
, sizeof(jpeg_header
));
670 *(pos
+ 7 + 64) = 0x01;
671 if (cam
->compression
.quality
== 0) {
672 memcpy(pos
+ 7, SN9C102_Y_QTABLE0
, 64);
673 memcpy(pos
+ 8 + 64, SN9C102_UV_QTABLE0
, 64);
674 } else if (cam
->compression
.quality
== 1) {
675 memcpy(pos
+ 7, SN9C102_Y_QTABLE1
, 64);
676 memcpy(pos
+ 8 + 64, SN9C102_UV_QTABLE1
, 64);
678 *(pos
+ 564) = cam
->sensor
.pix_format
.width
& 0xFF;
679 *(pos
+ 563) = (cam
->sensor
.pix_format
.width
>> 8) & 0xFF;
680 *(pos
+ 562) = cam
->sensor
.pix_format
.height
& 0xFF;
681 *(pos
+ 561) = (cam
->sensor
.pix_format
.height
>> 8) & 0xFF;
684 f
->buf
.bytesused
+= sizeof(jpeg_header
);
688 static void sn9c102_urb_complete(struct urb
*urb
)
690 struct sn9c102_device
* cam
= urb
->context
;
691 struct sn9c102_frame_t
** f
;
692 size_t imagesize
, soflen
;
696 if (urb
->status
== -ENOENT
)
699 f
= &cam
->frame_current
;
701 if (cam
->stream
== STREAM_INTERRUPT
) {
702 cam
->stream
= STREAM_OFF
;
704 (*f
)->state
= F_QUEUED
;
705 cam
->sof
.bytesread
= 0;
706 DBG(3, "Stream interrupted by application");
707 wake_up(&cam
->wait_stream
);
710 if (cam
->state
& DEV_DISCONNECTED
)
713 if (cam
->state
& DEV_MISCONFIGURED
) {
714 wake_up_interruptible(&cam
->wait_frame
);
718 if (cam
->stream
== STREAM_OFF
|| list_empty(&cam
->inqueue
))
722 (*f
) = list_entry(cam
->inqueue
.next
, struct sn9c102_frame_t
,
725 imagesize
= (cam
->sensor
.pix_format
.width
*
726 cam
->sensor
.pix_format
.height
*
727 cam
->sensor
.pix_format
.priv
) / 8;
728 if (cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
729 imagesize
+= 589; /* length of jpeg header */
730 soflen
= sn9c102_sof_length(cam
);
732 for (i
= 0; i
< urb
->number_of_packets
; i
++) {
733 unsigned int img
, len
, status
;
734 void *pos
, *sof
, *eof
;
736 len
= urb
->iso_frame_desc
[i
].actual_length
;
737 status
= urb
->iso_frame_desc
[i
].status
;
738 pos
= urb
->iso_frame_desc
[i
].offset
+ urb
->transfer_buffer
;
741 DBG(3, "Error in isochronous frame");
742 (*f
)->state
= F_ERROR
;
743 cam
->sof
.bytesread
= 0;
747 PDBGG("Isochrnous frame: length %u, #%u i", len
, i
);
750 sof
= sn9c102_find_sof_header(cam
, pos
, len
);
752 eof
= sn9c102_find_eof_header(cam
, pos
, len
);
753 if ((*f
)->state
== F_GRABBING
) {
758 img
= (eof
> pos
) ? eof
- pos
- 1 : 0;
760 if ((*f
)->buf
.bytesused
+ img
> imagesize
) {
762 b
= (*f
)->buf
.bytesused
+ img
-
764 img
= imagesize
- (*f
)->buf
.bytesused
;
765 PDBGG("Expected EOF not found: video "
768 DBG(3, "Exceeded limit: +%u "
769 "bytes", (unsigned)(b
));
772 memcpy((*f
)->bufmem
+ (*f
)->buf
.bytesused
, pos
,
775 if ((*f
)->buf
.bytesused
== 0)
776 do_gettimeofday(&(*f
)->buf
.timestamp
);
778 (*f
)->buf
.bytesused
+= img
;
780 if ((*f
)->buf
.bytesused
== imagesize
||
781 ((cam
->sensor
.pix_format
.pixelformat
==
782 V4L2_PIX_FMT_SN9C10X
||
783 cam
->sensor
.pix_format
.pixelformat
==
784 V4L2_PIX_FMT_JPEG
) && eof
)) {
787 b
= (*f
)->buf
.bytesused
;
788 (*f
)->state
= F_DONE
;
789 (*f
)->buf
.sequence
= ++cam
->frame_count
;
791 spin_lock(&cam
->queue_lock
);
792 list_move_tail(&(*f
)->frame
,
794 if (!list_empty(&cam
->inqueue
))
797 struct sn9c102_frame_t
,
801 spin_unlock(&cam
->queue_lock
);
803 memcpy(cam
->sysfs
.frame_header
,
804 cam
->sof
.header
, soflen
);
806 DBG(3, "Video frame captured: %lu "
807 "bytes", (unsigned long)(b
));
813 (*f
)->state
= F_ERROR
;
814 DBG(3, "Not expected EOF after %lu "
815 "bytes of image data",
817 ((*f
)->buf
.bytesused
));
824 DBG(3, "EOF without SOF");
828 PDBGG("Ignoring pointless isochronous frame");
832 } else if ((*f
)->state
== F_QUEUED
|| (*f
)->state
== F_ERROR
) {
834 (*f
)->state
= F_GRABBING
;
835 (*f
)->buf
.bytesused
= 0;
838 if (cam
->sensor
.pix_format
.pixelformat
==
840 sn9c102_write_jpegheader(cam
, (*f
));
841 DBG(3, "SOF detected: new video frame");
845 } else if ((*f
)->state
== F_GRABBING
) {
846 eof
= sn9c102_find_eof_header(cam
, pos
, len
);
847 if (eof
&& eof
< sof
)
848 goto end_of_frame
; /* (1) */
850 if (cam
->sensor
.pix_format
.pixelformat
==
851 V4L2_PIX_FMT_SN9C10X
||
852 cam
->sensor
.pix_format
.pixelformat
==
854 if (sof
- pos
>= soflen
) {
856 } else { /* remove header */
858 (*f
)->buf
.bytesused
-=
859 (soflen
- (sof
- pos
));
863 DBG(3, "SOF before expected EOF after "
864 "%lu bytes of image data",
866 ((*f
)->buf
.bytesused
));
874 urb
->dev
= cam
->usbdev
;
875 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
876 if (err
< 0 && err
!= -EPERM
) {
877 cam
->state
|= DEV_MISCONFIGURED
;
878 DBG(1, "usb_submit_urb() failed");
881 wake_up_interruptible(&cam
->wait_frame
);
885 static int sn9c102_start_transfer(struct sn9c102_device
* cam
)
887 struct usb_device
*udev
= cam
->usbdev
;
889 struct usb_host_interface
* altsetting
= usb_altnum_to_altsetting(
890 usb_ifnum_to_if(udev
, 0),
891 SN9C102_ALTERNATE_SETTING
);
892 const unsigned int psz
= le16_to_cpu(altsetting
->
893 endpoint
[0].desc
.wMaxPacketSize
);
897 for (i
= 0; i
< SN9C102_URBS
; i
++) {
898 cam
->transfer_buffer
[i
] = kzalloc(SN9C102_ISO_PACKETS
* psz
,
900 if (!cam
->transfer_buffer
[i
]) {
902 DBG(1, "Not enough memory");
907 for (i
= 0; i
< SN9C102_URBS
; i
++) {
908 urb
= usb_alloc_urb(SN9C102_ISO_PACKETS
, GFP_KERNEL
);
912 DBG(1, "usb_alloc_urb() failed");
917 urb
->pipe
= usb_rcvisocpipe(udev
, 1);
918 urb
->transfer_flags
= URB_ISO_ASAP
;
919 urb
->number_of_packets
= SN9C102_ISO_PACKETS
;
920 urb
->complete
= sn9c102_urb_complete
;
921 urb
->transfer_buffer
= cam
->transfer_buffer
[i
];
922 urb
->transfer_buffer_length
= psz
* SN9C102_ISO_PACKETS
;
924 for (j
= 0; j
< SN9C102_ISO_PACKETS
; j
++) {
925 urb
->iso_frame_desc
[j
].offset
= psz
* j
;
926 urb
->iso_frame_desc
[j
].length
= psz
;
931 if (!(cam
->reg
[0x01] & 0x04)) {
932 err
= sn9c102_write_reg(cam
, cam
->reg
[0x01] | 0x04, 0x01);
935 DBG(1, "I/O hardware error");
940 err
= usb_set_interface(udev
, 0, SN9C102_ALTERNATE_SETTING
);
942 DBG(1, "usb_set_interface() failed");
946 cam
->frame_current
= NULL
;
947 cam
->sof
.bytesread
= 0;
949 for (i
= 0; i
< SN9C102_URBS
; i
++) {
950 err
= usb_submit_urb(cam
->urb
[i
], GFP_KERNEL
);
952 for (j
= i
-1; j
>= 0; j
--)
953 usb_kill_urb(cam
->urb
[j
]);
954 DBG(1, "usb_submit_urb() failed, error %d", err
);
962 for (i
= 0; (i
< SN9C102_URBS
) && cam
->urb
[i
]; i
++)
963 usb_free_urb(cam
->urb
[i
]);
966 for (i
= 0; (i
< SN9C102_URBS
) && cam
->transfer_buffer
[i
]; i
++)
967 kfree(cam
->transfer_buffer
[i
]);
973 static int sn9c102_stop_transfer(struct sn9c102_device
* cam
)
975 struct usb_device
*udev
= cam
->usbdev
;
979 if (cam
->state
& DEV_DISCONNECTED
)
982 for (i
= SN9C102_URBS
-1; i
>= 0; i
--) {
983 usb_kill_urb(cam
->urb
[i
]);
984 usb_free_urb(cam
->urb
[i
]);
985 kfree(cam
->transfer_buffer
[i
]);
988 err
= usb_set_interface(udev
, 0, 0); /* 0 Mb/s */
990 DBG(3, "usb_set_interface() failed");
996 static int sn9c102_stream_interrupt(struct sn9c102_device
* cam
)
1000 cam
->stream
= STREAM_INTERRUPT
;
1001 timeout
= wait_event_timeout(cam
->wait_stream
,
1002 (cam
->stream
== STREAM_OFF
) ||
1003 (cam
->state
& DEV_DISCONNECTED
),
1004 SN9C102_URB_TIMEOUT
);
1005 if (cam
->state
& DEV_DISCONNECTED
)
1007 else if (cam
->stream
!= STREAM_OFF
) {
1008 cam
->state
|= DEV_MISCONFIGURED
;
1009 DBG(1, "URB timeout reached. The camera is misconfigured. "
1010 "To use it, close and open %s again.",
1011 video_device_node_name(cam
->v4ldev
));
1018 /*****************************************************************************/
1020 #ifdef CONFIG_VIDEO_ADV_DEBUG
1021 static u16
sn9c102_strtou16(const char* buff
, size_t len
, ssize_t
* count
)
1028 strncpy(str
, buff
, len
);
1031 strncpy(str
, buff
, 6);
1035 val
= simple_strtoul(str
, &endp
, 0);
1039 *count
= (ssize_t
)(endp
- str
);
1040 if ((*count
) && (len
== *count
+1) && (buff
[*count
] == '\n'))
1047 NOTE 1: being inside one of the following methods implies that the v4l
1048 device exists for sure (see kobjects and reference counters)
1049 NOTE 2: buffers are PAGE_SIZE long
1052 static ssize_t
sn9c102_show_reg(struct device
* cd
,
1053 struct device_attribute
*attr
, char* buf
)
1055 struct sn9c102_device
* cam
;
1058 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1059 return -ERESTARTSYS
;
1061 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1063 mutex_unlock(&sn9c102_sysfs_lock
);
1067 count
= sprintf(buf
, "%u\n", cam
->sysfs
.reg
);
1069 mutex_unlock(&sn9c102_sysfs_lock
);
1076 sn9c102_store_reg(struct device
* cd
, struct device_attribute
*attr
,
1077 const char* buf
, size_t len
)
1079 struct sn9c102_device
* cam
;
1083 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1084 return -ERESTARTSYS
;
1086 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1088 mutex_unlock(&sn9c102_sysfs_lock
);
1092 index
= sn9c102_strtou16(buf
, len
, &count
);
1093 if (index
>= ARRAY_SIZE(cam
->reg
) || !count
) {
1094 mutex_unlock(&sn9c102_sysfs_lock
);
1098 cam
->sysfs
.reg
= index
;
1100 DBG(2, "Moved SN9C1XX register index to 0x%02X", cam
->sysfs
.reg
);
1101 DBG(3, "Written bytes: %zd", count
);
1103 mutex_unlock(&sn9c102_sysfs_lock
);
1109 static ssize_t
sn9c102_show_val(struct device
* cd
,
1110 struct device_attribute
*attr
, char* buf
)
1112 struct sn9c102_device
* cam
;
1116 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1117 return -ERESTARTSYS
;
1119 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1121 mutex_unlock(&sn9c102_sysfs_lock
);
1125 if ((val
= sn9c102_read_reg(cam
, cam
->sysfs
.reg
)) < 0) {
1126 mutex_unlock(&sn9c102_sysfs_lock
);
1130 count
= sprintf(buf
, "%d\n", val
);
1132 DBG(3, "Read bytes: %zd, value: %d", count
, val
);
1134 mutex_unlock(&sn9c102_sysfs_lock
);
1141 sn9c102_store_val(struct device
* cd
, struct device_attribute
*attr
,
1142 const char* buf
, size_t len
)
1144 struct sn9c102_device
* cam
;
1149 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1150 return -ERESTARTSYS
;
1152 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1154 mutex_unlock(&sn9c102_sysfs_lock
);
1158 value
= sn9c102_strtou16(buf
, len
, &count
);
1160 mutex_unlock(&sn9c102_sysfs_lock
);
1164 err
= sn9c102_write_reg(cam
, value
, cam
->sysfs
.reg
);
1166 mutex_unlock(&sn9c102_sysfs_lock
);
1170 DBG(2, "Written SN9C1XX reg. 0x%02X, val. 0x%02X",
1171 cam
->sysfs
.reg
, value
);
1172 DBG(3, "Written bytes: %zd", count
);
1174 mutex_unlock(&sn9c102_sysfs_lock
);
1180 static ssize_t
sn9c102_show_i2c_reg(struct device
* cd
,
1181 struct device_attribute
*attr
, char* buf
)
1183 struct sn9c102_device
* cam
;
1186 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1187 return -ERESTARTSYS
;
1189 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1191 mutex_unlock(&sn9c102_sysfs_lock
);
1195 count
= sprintf(buf
, "%u\n", cam
->sysfs
.i2c_reg
);
1197 DBG(3, "Read bytes: %zd", count
);
1199 mutex_unlock(&sn9c102_sysfs_lock
);
1206 sn9c102_store_i2c_reg(struct device
* cd
, struct device_attribute
*attr
,
1207 const char* buf
, size_t len
)
1209 struct sn9c102_device
* cam
;
1213 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1214 return -ERESTARTSYS
;
1216 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1218 mutex_unlock(&sn9c102_sysfs_lock
);
1222 index
= sn9c102_strtou16(buf
, len
, &count
);
1224 mutex_unlock(&sn9c102_sysfs_lock
);
1228 cam
->sysfs
.i2c_reg
= index
;
1230 DBG(2, "Moved sensor register index to 0x%02X", cam
->sysfs
.i2c_reg
);
1231 DBG(3, "Written bytes: %zd", count
);
1233 mutex_unlock(&sn9c102_sysfs_lock
);
1239 static ssize_t
sn9c102_show_i2c_val(struct device
* cd
,
1240 struct device_attribute
*attr
, char* buf
)
1242 struct sn9c102_device
* cam
;
1246 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1247 return -ERESTARTSYS
;
1249 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1251 mutex_unlock(&sn9c102_sysfs_lock
);
1255 if (!(cam
->sensor
.sysfs_ops
& SN9C102_I2C_READ
)) {
1256 mutex_unlock(&sn9c102_sysfs_lock
);
1260 if ((val
= sn9c102_i2c_read(cam
, cam
->sysfs
.i2c_reg
)) < 0) {
1261 mutex_unlock(&sn9c102_sysfs_lock
);
1265 count
= sprintf(buf
, "%d\n", val
);
1267 DBG(3, "Read bytes: %zd, value: %d", count
, val
);
1269 mutex_unlock(&sn9c102_sysfs_lock
);
1276 sn9c102_store_i2c_val(struct device
* cd
, struct device_attribute
*attr
,
1277 const char* buf
, size_t len
)
1279 struct sn9c102_device
* cam
;
1284 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1285 return -ERESTARTSYS
;
1287 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1289 mutex_unlock(&sn9c102_sysfs_lock
);
1293 if (!(cam
->sensor
.sysfs_ops
& SN9C102_I2C_WRITE
)) {
1294 mutex_unlock(&sn9c102_sysfs_lock
);
1298 value
= sn9c102_strtou16(buf
, len
, &count
);
1300 mutex_unlock(&sn9c102_sysfs_lock
);
1304 err
= sn9c102_i2c_write(cam
, cam
->sysfs
.i2c_reg
, value
);
1306 mutex_unlock(&sn9c102_sysfs_lock
);
1310 DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1311 cam
->sysfs
.i2c_reg
, value
);
1312 DBG(3, "Written bytes: %zd", count
);
1314 mutex_unlock(&sn9c102_sysfs_lock
);
1321 sn9c102_store_green(struct device
* cd
, struct device_attribute
*attr
,
1322 const char* buf
, size_t len
)
1324 struct sn9c102_device
* cam
;
1325 enum sn9c102_bridge bridge
;
1330 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1331 return -ERESTARTSYS
;
1333 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1335 mutex_unlock(&sn9c102_sysfs_lock
);
1339 bridge
= cam
->bridge
;
1341 mutex_unlock(&sn9c102_sysfs_lock
);
1343 value
= sn9c102_strtou16(buf
, len
, &count
);
1348 case BRIDGE_SN9C101
:
1349 case BRIDGE_SN9C102
:
1352 if ((res
= sn9c102_store_reg(cd
, attr
, "0x11", 4)) >= 0)
1353 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1355 case BRIDGE_SN9C103
:
1356 case BRIDGE_SN9C105
:
1357 case BRIDGE_SN9C120
:
1360 if ((res
= sn9c102_store_reg(cd
, attr
, "0x07", 4)) >= 0)
1361 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1370 sn9c102_store_blue(struct device
* cd
, struct device_attribute
*attr
,
1371 const char* buf
, size_t len
)
1377 value
= sn9c102_strtou16(buf
, len
, &count
);
1378 if (!count
|| value
> 0x7f)
1381 if ((res
= sn9c102_store_reg(cd
, attr
, "0x06", 4)) >= 0)
1382 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1389 sn9c102_store_red(struct device
* cd
, struct device_attribute
*attr
,
1390 const char* buf
, size_t len
)
1396 value
= sn9c102_strtou16(buf
, len
, &count
);
1397 if (!count
|| value
> 0x7f)
1400 if ((res
= sn9c102_store_reg(cd
, attr
, "0x05", 4)) >= 0)
1401 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1407 static ssize_t
sn9c102_show_frame_header(struct device
* cd
,
1408 struct device_attribute
*attr
,
1411 struct sn9c102_device
* cam
;
1414 cam
= video_get_drvdata(container_of(cd
, struct video_device
, dev
));
1418 count
= sizeof(cam
->sysfs
.frame_header
);
1419 memcpy(buf
, cam
->sysfs
.frame_header
, count
);
1421 DBG(3, "Frame header, read bytes: %zd", count
);
1427 static DEVICE_ATTR(reg
, S_IRUGO
| S_IWUSR
, sn9c102_show_reg
, sn9c102_store_reg
);
1428 static DEVICE_ATTR(val
, S_IRUGO
| S_IWUSR
, sn9c102_show_val
, sn9c102_store_val
);
1429 static DEVICE_ATTR(i2c_reg
, S_IRUGO
| S_IWUSR
,
1430 sn9c102_show_i2c_reg
, sn9c102_store_i2c_reg
);
1431 static DEVICE_ATTR(i2c_val
, S_IRUGO
| S_IWUSR
,
1432 sn9c102_show_i2c_val
, sn9c102_store_i2c_val
);
1433 static DEVICE_ATTR(green
, S_IWUSR
, NULL
, sn9c102_store_green
);
1434 static DEVICE_ATTR(blue
, S_IWUSR
, NULL
, sn9c102_store_blue
);
1435 static DEVICE_ATTR(red
, S_IWUSR
, NULL
, sn9c102_store_red
);
1436 static DEVICE_ATTR(frame_header
, S_IRUGO
, sn9c102_show_frame_header
, NULL
);
1439 static int sn9c102_create_sysfs(struct sn9c102_device
* cam
)
1441 struct device
*dev
= &(cam
->v4ldev
->dev
);
1444 if ((err
= device_create_file(dev
, &dev_attr_reg
)))
1446 if ((err
= device_create_file(dev
, &dev_attr_val
)))
1448 if ((err
= device_create_file(dev
, &dev_attr_frame_header
)))
1451 if (cam
->sensor
.sysfs_ops
) {
1452 if ((err
= device_create_file(dev
, &dev_attr_i2c_reg
)))
1453 goto err_frame_header
;
1454 if ((err
= device_create_file(dev
, &dev_attr_i2c_val
)))
1458 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
) {
1459 if ((err
= device_create_file(dev
, &dev_attr_green
)))
1462 if ((err
= device_create_file(dev
, &dev_attr_blue
)))
1464 if ((err
= device_create_file(dev
, &dev_attr_red
)))
1471 device_remove_file(dev
, &dev_attr_blue
);
1473 if (cam
->sensor
.sysfs_ops
)
1474 device_remove_file(dev
, &dev_attr_i2c_val
);
1476 if (cam
->sensor
.sysfs_ops
)
1477 device_remove_file(dev
, &dev_attr_i2c_reg
);
1479 device_remove_file(dev
, &dev_attr_frame_header
);
1481 device_remove_file(dev
, &dev_attr_val
);
1483 device_remove_file(dev
, &dev_attr_reg
);
1487 #endif /* CONFIG_VIDEO_ADV_DEBUG */
1489 /*****************************************************************************/
1492 sn9c102_set_pix_format(struct sn9c102_device
* cam
, struct v4l2_pix_format
* pix
)
1496 if (pix
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
1497 pix
->pixelformat
== V4L2_PIX_FMT_JPEG
) {
1498 switch (cam
->bridge
) {
1499 case BRIDGE_SN9C101
:
1500 case BRIDGE_SN9C102
:
1501 case BRIDGE_SN9C103
:
1502 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x80,
1505 case BRIDGE_SN9C105
:
1506 case BRIDGE_SN9C120
:
1507 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0x7f,
1512 switch (cam
->bridge
) {
1513 case BRIDGE_SN9C101
:
1514 case BRIDGE_SN9C102
:
1515 case BRIDGE_SN9C103
:
1516 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0x7f,
1519 case BRIDGE_SN9C105
:
1520 case BRIDGE_SN9C120
:
1521 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x80,
1527 return err
? -EIO
: 0;
1532 sn9c102_set_compression(struct sn9c102_device
* cam
,
1533 struct v4l2_jpegcompression
* compression
)
1537 switch (cam
->bridge
) {
1538 case BRIDGE_SN9C101
:
1539 case BRIDGE_SN9C102
:
1540 case BRIDGE_SN9C103
:
1541 if (compression
->quality
== 0)
1542 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x17] | 0x01,
1544 else if (compression
->quality
== 1)
1545 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x17] & 0xfe,
1548 case BRIDGE_SN9C105
:
1549 case BRIDGE_SN9C120
:
1550 if (compression
->quality
== 0) {
1551 for (i
= 0; i
<= 63; i
++) {
1552 err
+= sn9c102_write_reg(cam
,
1553 SN9C102_Y_QTABLE1
[i
],
1555 err
+= sn9c102_write_reg(cam
,
1556 SN9C102_UV_QTABLE1
[i
],
1559 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0xbf,
1561 } else if (compression
->quality
== 1) {
1562 for (i
= 0; i
<= 63; i
++) {
1563 err
+= sn9c102_write_reg(cam
,
1564 SN9C102_Y_QTABLE1
[i
],
1566 err
+= sn9c102_write_reg(cam
,
1567 SN9C102_UV_QTABLE1
[i
],
1570 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x40,
1576 return err
? -EIO
: 0;
1580 static int sn9c102_set_scale(struct sn9c102_device
* cam
, u8 scale
)
1586 r
= cam
->reg
[0x18] & 0xcf;
1587 else if (scale
== 2) {
1588 r
= cam
->reg
[0x18] & 0xcf;
1590 } else if (scale
== 4)
1591 r
= cam
->reg
[0x18] | 0x20;
1593 err
+= sn9c102_write_reg(cam
, r
, 0x18);
1597 PDBGG("Scaling factor: %u", scale
);
1603 static int sn9c102_set_crop(struct sn9c102_device
* cam
, struct v4l2_rect
* rect
)
1605 struct sn9c102_sensor
* s
= &cam
->sensor
;
1606 u8 h_start
= (u8
)(rect
->left
- s
->cropcap
.bounds
.left
),
1607 v_start
= (u8
)(rect
->top
- s
->cropcap
.bounds
.top
),
1608 h_size
= (u8
)(rect
->width
/ 16),
1609 v_size
= (u8
)(rect
->height
/ 16);
1612 err
+= sn9c102_write_reg(cam
, h_start
, 0x12);
1613 err
+= sn9c102_write_reg(cam
, v_start
, 0x13);
1614 err
+= sn9c102_write_reg(cam
, h_size
, 0x15);
1615 err
+= sn9c102_write_reg(cam
, v_size
, 0x16);
1619 PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
1620 "%u %u %u %u", h_start
, v_start
, h_size
, v_size
);
1626 static int sn9c102_init(struct sn9c102_device
* cam
)
1628 struct sn9c102_sensor
* s
= &cam
->sensor
;
1629 struct v4l2_control ctrl
;
1630 struct v4l2_queryctrl
*qctrl
;
1631 struct v4l2_rect
* rect
;
1635 if (!(cam
->state
& DEV_INITIALIZED
)) {
1636 mutex_init(&cam
->open_mutex
);
1637 init_waitqueue_head(&cam
->wait_open
);
1639 rect
= &(s
->cropcap
.defrect
);
1640 } else { /* use current values */
1645 err
+= sn9c102_set_scale(cam
, rect
->width
/ s
->pix_format
.width
);
1646 err
+= sn9c102_set_crop(cam
, rect
);
1653 DBG(3, "Sensor initialization failed");
1658 if (!(cam
->state
& DEV_INITIALIZED
))
1659 if (cam
->bridge
== BRIDGE_SN9C101
||
1660 cam
->bridge
== BRIDGE_SN9C102
||
1661 cam
->bridge
== BRIDGE_SN9C103
) {
1662 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
1663 s
->pix_format
.pixelformat
= V4L2_PIX_FMT_SBGGR8
;
1664 cam
->compression
.quality
= cam
->reg
[0x17] & 0x01 ?
1667 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
)
1668 s
->pix_format
.pixelformat
= V4L2_PIX_FMT_JPEG
;
1669 cam
->compression
.quality
= cam
->reg
[0x18] & 0x40 ?
1671 err
+= sn9c102_set_compression(cam
, &cam
->compression
);
1674 err
+= sn9c102_set_compression(cam
, &cam
->compression
);
1675 err
+= sn9c102_set_pix_format(cam
, &s
->pix_format
);
1676 if (s
->set_pix_format
)
1677 err
+= s
->set_pix_format(cam
, &s
->pix_format
);
1681 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
||
1682 s
->pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
1683 DBG(3, "Compressed video format is active, quality %d",
1684 cam
->compression
.quality
);
1686 DBG(3, "Uncompressed video format is active");
1689 if ((err
= s
->set_crop(cam
, rect
))) {
1690 DBG(3, "set_crop() failed");
1695 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
1696 if (s
->qctrl
[i
].id
!= 0 &&
1697 !(s
->qctrl
[i
].flags
& V4L2_CTRL_FLAG_DISABLED
)) {
1698 ctrl
.id
= s
->qctrl
[i
].id
;
1699 ctrl
.value
= qctrl
[i
].default_value
;
1700 err
= s
->set_ctrl(cam
, &ctrl
);
1702 DBG(3, "Set %s control failed",
1706 DBG(3, "Image sensor supports '%s' control",
1711 if (!(cam
->state
& DEV_INITIALIZED
)) {
1712 mutex_init(&cam
->fileop_mutex
);
1713 spin_lock_init(&cam
->queue_lock
);
1714 init_waitqueue_head(&cam
->wait_frame
);
1715 init_waitqueue_head(&cam
->wait_stream
);
1716 cam
->nreadbuffers
= 2;
1717 memcpy(s
->_qctrl
, s
->qctrl
, sizeof(s
->qctrl
));
1718 memcpy(&(s
->_rect
), &(s
->cropcap
.defrect
),
1719 sizeof(struct v4l2_rect
));
1720 cam
->state
|= DEV_INITIALIZED
;
1723 DBG(2, "Initialization succeeded");
1727 /*****************************************************************************/
1729 static void sn9c102_release_resources(struct kref
*kref
)
1731 struct sn9c102_device
*cam
;
1733 mutex_lock(&sn9c102_sysfs_lock
);
1735 cam
= container_of(kref
, struct sn9c102_device
, kref
);
1737 DBG(2, "V4L2 device %s deregistered",
1738 video_device_node_name(cam
->v4ldev
));
1739 video_set_drvdata(cam
->v4ldev
, NULL
);
1740 video_unregister_device(cam
->v4ldev
);
1741 usb_put_dev(cam
->usbdev
);
1742 kfree(cam
->control_buffer
);
1745 mutex_unlock(&sn9c102_sysfs_lock
);
1750 static int sn9c102_open(struct file
*filp
)
1752 struct sn9c102_device
* cam
;
1756 A read_trylock() in open() is the only safe way to prevent race
1757 conditions with disconnect(), one close() and multiple (not
1758 necessarily simultaneous) attempts to open(). For example, it
1759 prevents from waiting for a second access, while the device
1760 structure is being deallocated, after a possible disconnect() and
1761 during a following close() holding the write lock: given that, after
1762 this deallocation, no access will be possible anymore, using the
1763 non-trylock version would have let open() gain the access to the
1764 device structure improperly.
1765 For this reason the lock must also not be per-device.
1767 if (!down_read_trylock(&sn9c102_dev_lock
))
1768 return -ERESTARTSYS
;
1770 cam
= video_drvdata(filp
);
1772 if (wait_for_completion_interruptible(&cam
->probe
)) {
1773 up_read(&sn9c102_dev_lock
);
1774 return -ERESTARTSYS
;
1777 kref_get(&cam
->kref
);
1780 Make sure to isolate all the simultaneous opens.
1782 if (mutex_lock_interruptible(&cam
->open_mutex
)) {
1783 kref_put(&cam
->kref
, sn9c102_release_resources
);
1784 up_read(&sn9c102_dev_lock
);
1785 return -ERESTARTSYS
;
1788 if (cam
->state
& DEV_DISCONNECTED
) {
1789 DBG(1, "Device not present");
1795 DBG(2, "Device %s is already in use",
1796 video_device_node_name(cam
->v4ldev
));
1797 DBG(3, "Simultaneous opens are not supported");
1799 open() must follow the open flags and should block
1800 eventually while the device is in use.
1802 if ((filp
->f_flags
& O_NONBLOCK
) ||
1803 (filp
->f_flags
& O_NDELAY
)) {
1807 DBG(2, "A blocking open() has been requested. Wait for the "
1808 "device to be released...");
1809 up_read(&sn9c102_dev_lock
);
1811 We will not release the "open_mutex" lock, so that only one
1812 process can be in the wait queue below. This way the process
1813 will be sleeping while holding the lock, without losing its
1814 priority after any wake_up().
1816 err
= wait_event_interruptible_exclusive(cam
->wait_open
,
1817 (cam
->state
& DEV_DISCONNECTED
)
1819 down_read(&sn9c102_dev_lock
);
1822 if (cam
->state
& DEV_DISCONNECTED
) {
1828 if (cam
->state
& DEV_MISCONFIGURED
) {
1829 err
= sn9c102_init(cam
);
1831 DBG(1, "Initialization failed again. "
1832 "I will retry on next open().");
1835 cam
->state
&= ~DEV_MISCONFIGURED
;
1838 if ((err
= sn9c102_start_transfer(cam
)))
1841 filp
->private_data
= cam
;
1844 cam
->stream
= STREAM_OFF
;
1846 cam
->frame_count
= 0;
1847 sn9c102_empty_framequeues(cam
);
1849 DBG(3, "Video device %s is open", video_device_node_name(cam
->v4ldev
));
1852 mutex_unlock(&cam
->open_mutex
);
1854 kref_put(&cam
->kref
, sn9c102_release_resources
);
1856 up_read(&sn9c102_dev_lock
);
1861 static int sn9c102_release(struct file
*filp
)
1863 struct sn9c102_device
* cam
;
1865 down_write(&sn9c102_dev_lock
);
1867 cam
= video_drvdata(filp
);
1869 sn9c102_stop_transfer(cam
);
1870 sn9c102_release_buffers(cam
);
1872 wake_up_interruptible_nr(&cam
->wait_open
, 1);
1874 DBG(3, "Video device %s closed", video_device_node_name(cam
->v4ldev
));
1876 kref_put(&cam
->kref
, sn9c102_release_resources
);
1878 up_write(&sn9c102_dev_lock
);
1885 sn9c102_read(struct file
* filp
, char __user
* buf
, size_t count
, loff_t
* f_pos
)
1887 struct sn9c102_device
*cam
= video_drvdata(filp
);
1888 struct sn9c102_frame_t
* f
, * i
;
1889 unsigned long lock_flags
;
1893 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
1894 return -ERESTARTSYS
;
1896 if (cam
->state
& DEV_DISCONNECTED
) {
1897 DBG(1, "Device not present");
1898 mutex_unlock(&cam
->fileop_mutex
);
1902 if (cam
->state
& DEV_MISCONFIGURED
) {
1903 DBG(1, "The camera is misconfigured. Close and open it "
1905 mutex_unlock(&cam
->fileop_mutex
);
1909 if (cam
->io
== IO_MMAP
) {
1910 DBG(3, "Close and open the device again to choose "
1912 mutex_unlock(&cam
->fileop_mutex
);
1916 if (cam
->io
== IO_NONE
) {
1917 if (!sn9c102_request_buffers(cam
,cam
->nreadbuffers
, IO_READ
)) {
1918 DBG(1, "read() failed, not enough memory");
1919 mutex_unlock(&cam
->fileop_mutex
);
1923 cam
->stream
= STREAM_ON
;
1926 if (list_empty(&cam
->inqueue
)) {
1927 if (!list_empty(&cam
->outqueue
))
1928 sn9c102_empty_framequeues(cam
);
1929 sn9c102_queue_unusedframes(cam
);
1933 mutex_unlock(&cam
->fileop_mutex
);
1937 if (list_empty(&cam
->outqueue
)) {
1938 if (filp
->f_flags
& O_NONBLOCK
) {
1939 mutex_unlock(&cam
->fileop_mutex
);
1942 if (!cam
->module_param
.frame_timeout
) {
1943 err
= wait_event_interruptible
1945 (!list_empty(&cam
->outqueue
)) ||
1946 (cam
->state
& DEV_DISCONNECTED
) ||
1947 (cam
->state
& DEV_MISCONFIGURED
) );
1949 mutex_unlock(&cam
->fileop_mutex
);
1953 timeout
= wait_event_interruptible_timeout
1955 (!list_empty(&cam
->outqueue
)) ||
1956 (cam
->state
& DEV_DISCONNECTED
) ||
1957 (cam
->state
& DEV_MISCONFIGURED
),
1959 cam
->module_param
.frame_timeout
* 1000
1963 mutex_unlock(&cam
->fileop_mutex
);
1965 } else if (timeout
== 0 &&
1966 !(cam
->state
& DEV_DISCONNECTED
)) {
1967 DBG(1, "Video frame timeout elapsed");
1968 mutex_unlock(&cam
->fileop_mutex
);
1972 if (cam
->state
& DEV_DISCONNECTED
) {
1973 mutex_unlock(&cam
->fileop_mutex
);
1976 if (cam
->state
& DEV_MISCONFIGURED
) {
1977 mutex_unlock(&cam
->fileop_mutex
);
1982 f
= list_entry(cam
->outqueue
.prev
, struct sn9c102_frame_t
, frame
);
1984 if (count
> f
->buf
.bytesused
)
1985 count
= f
->buf
.bytesused
;
1987 if (copy_to_user(buf
, f
->bufmem
, count
)) {
1994 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
1995 list_for_each_entry(i
, &cam
->outqueue
, frame
)
1996 i
->state
= F_UNUSED
;
1997 INIT_LIST_HEAD(&cam
->outqueue
);
1998 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2000 sn9c102_queue_unusedframes(cam
);
2002 PDBGG("Frame #%lu, bytes read: %zu",
2003 (unsigned long)f
->buf
.index
, count
);
2005 mutex_unlock(&cam
->fileop_mutex
);
2011 static unsigned int sn9c102_poll(struct file
*filp
, poll_table
*wait
)
2013 struct sn9c102_device
*cam
= video_drvdata(filp
);
2014 struct sn9c102_frame_t
* f
;
2015 unsigned long lock_flags
;
2016 unsigned int mask
= 0;
2018 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
2021 if (cam
->state
& DEV_DISCONNECTED
) {
2022 DBG(1, "Device not present");
2026 if (cam
->state
& DEV_MISCONFIGURED
) {
2027 DBG(1, "The camera is misconfigured. Close and open it "
2032 if (cam
->io
== IO_NONE
) {
2033 if (!sn9c102_request_buffers(cam
, cam
->nreadbuffers
,
2035 DBG(1, "poll() failed, not enough memory");
2039 cam
->stream
= STREAM_ON
;
2042 if (cam
->io
== IO_READ
) {
2043 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2044 list_for_each_entry(f
, &cam
->outqueue
, frame
)
2045 f
->state
= F_UNUSED
;
2046 INIT_LIST_HEAD(&cam
->outqueue
);
2047 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2048 sn9c102_queue_unusedframes(cam
);
2051 poll_wait(filp
, &cam
->wait_frame
, wait
);
2053 if (!list_empty(&cam
->outqueue
))
2054 mask
|= POLLIN
| POLLRDNORM
;
2056 mutex_unlock(&cam
->fileop_mutex
);
2061 mutex_unlock(&cam
->fileop_mutex
);
2066 static void sn9c102_vm_open(struct vm_area_struct
* vma
)
2068 struct sn9c102_frame_t
* f
= vma
->vm_private_data
;
2073 static void sn9c102_vm_close(struct vm_area_struct
* vma
)
2075 /* NOTE: buffers are not freed here */
2076 struct sn9c102_frame_t
* f
= vma
->vm_private_data
;
2081 static const struct vm_operations_struct sn9c102_vm_ops
= {
2082 .open
= sn9c102_vm_open
,
2083 .close
= sn9c102_vm_close
,
2087 static int sn9c102_mmap(struct file
* filp
, struct vm_area_struct
*vma
)
2089 struct sn9c102_device
*cam
= video_drvdata(filp
);
2090 unsigned long size
= vma
->vm_end
- vma
->vm_start
,
2091 start
= vma
->vm_start
;
2095 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
2096 return -ERESTARTSYS
;
2098 if (cam
->state
& DEV_DISCONNECTED
) {
2099 DBG(1, "Device not present");
2100 mutex_unlock(&cam
->fileop_mutex
);
2104 if (cam
->state
& DEV_MISCONFIGURED
) {
2105 DBG(1, "The camera is misconfigured. Close and open it "
2107 mutex_unlock(&cam
->fileop_mutex
);
2111 if (!(vma
->vm_flags
& (VM_WRITE
| VM_READ
))) {
2112 mutex_unlock(&cam
->fileop_mutex
);
2116 if (cam
->io
!= IO_MMAP
||
2117 size
!= PAGE_ALIGN(cam
->frame
[0].buf
.length
)) {
2118 mutex_unlock(&cam
->fileop_mutex
);
2122 for (i
= 0; i
< cam
->nbuffers
; i
++) {
2123 if ((cam
->frame
[i
].buf
.m
.offset
>>PAGE_SHIFT
) == vma
->vm_pgoff
)
2126 if (i
== cam
->nbuffers
) {
2127 mutex_unlock(&cam
->fileop_mutex
);
2131 vma
->vm_flags
|= VM_IO
;
2132 vma
->vm_flags
|= VM_RESERVED
;
2134 pos
= cam
->frame
[i
].bufmem
;
2135 while (size
> 0) { /* size is page-aligned */
2136 if (vm_insert_page(vma
, start
, vmalloc_to_page(pos
))) {
2137 mutex_unlock(&cam
->fileop_mutex
);
2145 vma
->vm_ops
= &sn9c102_vm_ops
;
2146 vma
->vm_private_data
= &cam
->frame
[i
];
2147 sn9c102_vm_open(vma
);
2149 mutex_unlock(&cam
->fileop_mutex
);
2154 /*****************************************************************************/
2157 sn9c102_vidioc_querycap(struct sn9c102_device
* cam
, void __user
* arg
)
2159 struct v4l2_capability cap
= {
2160 .driver
= "sn9c102",
2161 .version
= LINUX_VERSION_CODE
,
2162 .capabilities
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_READWRITE
|
2166 strlcpy(cap
.card
, cam
->v4ldev
->name
, sizeof(cap
.card
));
2167 if (usb_make_path(cam
->usbdev
, cap
.bus_info
, sizeof(cap
.bus_info
)) < 0)
2168 strlcpy(cap
.bus_info
, dev_name(&cam
->usbdev
->dev
),
2169 sizeof(cap
.bus_info
));
2171 if (copy_to_user(arg
, &cap
, sizeof(cap
)))
2179 sn9c102_vidioc_enuminput(struct sn9c102_device
* cam
, void __user
* arg
)
2181 struct v4l2_input i
;
2183 if (copy_from_user(&i
, arg
, sizeof(i
)))
2189 memset(&i
, 0, sizeof(i
));
2190 strcpy(i
.name
, "Camera");
2191 i
.type
= V4L2_INPUT_TYPE_CAMERA
;
2192 i
.capabilities
= V4L2_IN_CAP_STD
;
2194 if (copy_to_user(arg
, &i
, sizeof(i
)))
2202 sn9c102_vidioc_g_input(struct sn9c102_device
* cam
, void __user
* arg
)
2206 if (copy_to_user(arg
, &index
, sizeof(index
)))
2214 sn9c102_vidioc_s_input(struct sn9c102_device
* cam
, void __user
* arg
)
2218 if (copy_from_user(&index
, arg
, sizeof(index
)))
2229 sn9c102_vidioc_query_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2231 struct sn9c102_sensor
* s
= &cam
->sensor
;
2232 struct v4l2_queryctrl qc
;
2235 if (copy_from_user(&qc
, arg
, sizeof(qc
)))
2238 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
2239 if (qc
.id
&& qc
.id
== s
->qctrl
[i
].id
) {
2240 memcpy(&qc
, &(s
->qctrl
[i
]), sizeof(qc
));
2241 if (copy_to_user(arg
, &qc
, sizeof(qc
)))
2251 sn9c102_vidioc_g_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2253 struct sn9c102_sensor
* s
= &cam
->sensor
;
2254 struct v4l2_control ctrl
;
2258 if (!s
->get_ctrl
&& !s
->set_ctrl
)
2261 if (copy_from_user(&ctrl
, arg
, sizeof(ctrl
)))
2265 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
2266 if (ctrl
.id
&& ctrl
.id
== s
->qctrl
[i
].id
) {
2267 ctrl
.value
= s
->_qctrl
[i
].default_value
;
2272 err
= s
->get_ctrl(cam
, &ctrl
);
2275 if (copy_to_user(arg
, &ctrl
, sizeof(ctrl
)))
2278 PDBGG("VIDIOC_G_CTRL: id %lu, value %lu",
2279 (unsigned long)ctrl
.id
, (unsigned long)ctrl
.value
);
2286 sn9c102_vidioc_s_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2288 struct sn9c102_sensor
* s
= &cam
->sensor
;
2289 struct v4l2_control ctrl
;
2296 if (copy_from_user(&ctrl
, arg
, sizeof(ctrl
)))
2299 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++) {
2300 if (ctrl
.id
== s
->qctrl
[i
].id
) {
2301 if (s
->qctrl
[i
].flags
& V4L2_CTRL_FLAG_DISABLED
)
2303 if (ctrl
.value
< s
->qctrl
[i
].minimum
||
2304 ctrl
.value
> s
->qctrl
[i
].maximum
)
2306 ctrl
.value
-= ctrl
.value
% s
->qctrl
[i
].step
;
2310 if (i
== ARRAY_SIZE(s
->qctrl
))
2312 if ((err
= s
->set_ctrl(cam
, &ctrl
)))
2315 s
->_qctrl
[i
].default_value
= ctrl
.value
;
2317 PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
2318 (unsigned long)ctrl
.id
, (unsigned long)ctrl
.value
);
2325 sn9c102_vidioc_cropcap(struct sn9c102_device
* cam
, void __user
* arg
)
2327 struct v4l2_cropcap
* cc
= &(cam
->sensor
.cropcap
);
2329 cc
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
2330 cc
->pixelaspect
.numerator
= 1;
2331 cc
->pixelaspect
.denominator
= 1;
2333 if (copy_to_user(arg
, cc
, sizeof(*cc
)))
2341 sn9c102_vidioc_g_crop(struct sn9c102_device
* cam
, void __user
* arg
)
2343 struct sn9c102_sensor
* s
= &cam
->sensor
;
2344 struct v4l2_crop crop
= {
2345 .type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
,
2348 memcpy(&(crop
.c
), &(s
->_rect
), sizeof(struct v4l2_rect
));
2350 if (copy_to_user(arg
, &crop
, sizeof(crop
)))
2358 sn9c102_vidioc_s_crop(struct sn9c102_device
* cam
, void __user
* arg
)
2360 struct sn9c102_sensor
* s
= &cam
->sensor
;
2361 struct v4l2_crop crop
;
2362 struct v4l2_rect
* rect
;
2363 struct v4l2_rect
* bounds
= &(s
->cropcap
.bounds
);
2364 struct v4l2_pix_format
* pix_format
= &(s
->pix_format
);
2366 const enum sn9c102_stream_state stream
= cam
->stream
;
2367 const u32 nbuffers
= cam
->nbuffers
;
2371 if (copy_from_user(&crop
, arg
, sizeof(crop
)))
2376 if (crop
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2379 if (cam
->module_param
.force_munmap
)
2380 for (i
= 0; i
< cam
->nbuffers
; i
++)
2381 if (cam
->frame
[i
].vma_use_count
) {
2382 DBG(3, "VIDIOC_S_CROP failed. "
2383 "Unmap the buffers first.");
2387 /* Preserve R,G or B origin */
2388 rect
->left
= (s
->_rect
.left
& 1L) ? rect
->left
| 1L : rect
->left
& ~1L;
2389 rect
->top
= (s
->_rect
.top
& 1L) ? rect
->top
| 1L : rect
->top
& ~1L;
2391 if (rect
->width
< 16)
2393 if (rect
->height
< 16)
2395 if (rect
->width
> bounds
->width
)
2396 rect
->width
= bounds
->width
;
2397 if (rect
->height
> bounds
->height
)
2398 rect
->height
= bounds
->height
;
2399 if (rect
->left
< bounds
->left
)
2400 rect
->left
= bounds
->left
;
2401 if (rect
->top
< bounds
->top
)
2402 rect
->top
= bounds
->top
;
2403 if (rect
->left
+ rect
->width
> bounds
->left
+ bounds
->width
)
2404 rect
->left
= bounds
->left
+bounds
->width
- rect
->width
;
2405 if (rect
->top
+ rect
->height
> bounds
->top
+ bounds
->height
)
2406 rect
->top
= bounds
->top
+bounds
->height
- rect
->height
;
2408 rect
->width
&= ~15L;
2409 rect
->height
&= ~15L;
2411 if (SN9C102_PRESERVE_IMGSCALE
) {
2412 /* Calculate the actual scaling factor */
2414 a
= rect
->width
* rect
->height
;
2415 b
= pix_format
->width
* pix_format
->height
;
2416 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2420 if (cam
->stream
== STREAM_ON
)
2421 if ((err
= sn9c102_stream_interrupt(cam
)))
2424 if (copy_to_user(arg
, &crop
, sizeof(crop
))) {
2425 cam
->stream
= stream
;
2429 if (cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
)
2430 sn9c102_release_buffers(cam
);
2432 err
= sn9c102_set_crop(cam
, rect
);
2434 err
+= s
->set_crop(cam
, rect
);
2435 err
+= sn9c102_set_scale(cam
, scale
);
2437 if (err
) { /* atomic, no rollback in ioctl() */
2438 cam
->state
|= DEV_MISCONFIGURED
;
2439 DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
2440 "use the camera, close and open %s again.",
2441 video_device_node_name(cam
->v4ldev
));
2445 s
->pix_format
.width
= rect
->width
/scale
;
2446 s
->pix_format
.height
= rect
->height
/scale
;
2447 memcpy(&(s
->_rect
), rect
, sizeof(*rect
));
2449 if ((cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
) &&
2450 nbuffers
!= sn9c102_request_buffers(cam
, nbuffers
, cam
->io
)) {
2451 cam
->state
|= DEV_MISCONFIGURED
;
2452 DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
2453 "use the camera, close and open %s again.",
2454 video_device_node_name(cam
->v4ldev
));
2458 if (cam
->io
== IO_READ
)
2459 sn9c102_empty_framequeues(cam
);
2460 else if (cam
->module_param
.force_munmap
)
2461 sn9c102_requeue_outqueue(cam
);
2463 cam
->stream
= stream
;
2470 sn9c102_vidioc_enum_framesizes(struct sn9c102_device
* cam
, void __user
* arg
)
2472 struct v4l2_frmsizeenum frmsize
;
2474 if (copy_from_user(&frmsize
, arg
, sizeof(frmsize
)))
2477 if (frmsize
.index
!= 0)
2480 switch (cam
->bridge
) {
2481 case BRIDGE_SN9C101
:
2482 case BRIDGE_SN9C102
:
2483 case BRIDGE_SN9C103
:
2484 if (frmsize
.pixel_format
!= V4L2_PIX_FMT_SN9C10X
&&
2485 frmsize
.pixel_format
!= V4L2_PIX_FMT_SBGGR8
)
2487 case BRIDGE_SN9C105
:
2488 case BRIDGE_SN9C120
:
2489 if (frmsize
.pixel_format
!= V4L2_PIX_FMT_JPEG
&&
2490 frmsize
.pixel_format
!= V4L2_PIX_FMT_SBGGR8
)
2494 frmsize
.type
= V4L2_FRMSIZE_TYPE_STEPWISE
;
2495 frmsize
.stepwise
.min_width
= frmsize
.stepwise
.step_width
= 16;
2496 frmsize
.stepwise
.min_height
= frmsize
.stepwise
.step_height
= 16;
2497 frmsize
.stepwise
.max_width
= cam
->sensor
.cropcap
.bounds
.width
;
2498 frmsize
.stepwise
.max_height
= cam
->sensor
.cropcap
.bounds
.height
;
2499 memset(&frmsize
.reserved
, 0, sizeof(frmsize
.reserved
));
2501 if (copy_to_user(arg
, &frmsize
, sizeof(frmsize
)))
2509 sn9c102_vidioc_enum_fmt(struct sn9c102_device
* cam
, void __user
* arg
)
2511 struct v4l2_fmtdesc fmtd
;
2513 if (copy_from_user(&fmtd
, arg
, sizeof(fmtd
)))
2516 if (fmtd
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2519 if (fmtd
.index
== 0) {
2520 strcpy(fmtd
.description
, "bayer rgb");
2521 fmtd
.pixelformat
= V4L2_PIX_FMT_SBGGR8
;
2522 } else if (fmtd
.index
== 1) {
2523 switch (cam
->bridge
) {
2524 case BRIDGE_SN9C101
:
2525 case BRIDGE_SN9C102
:
2526 case BRIDGE_SN9C103
:
2527 strcpy(fmtd
.description
, "compressed");
2528 fmtd
.pixelformat
= V4L2_PIX_FMT_SN9C10X
;
2530 case BRIDGE_SN9C105
:
2531 case BRIDGE_SN9C120
:
2532 strcpy(fmtd
.description
, "JPEG");
2533 fmtd
.pixelformat
= V4L2_PIX_FMT_JPEG
;
2536 fmtd
.flags
= V4L2_FMT_FLAG_COMPRESSED
;
2540 fmtd
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
2541 memset(&fmtd
.reserved
, 0, sizeof(fmtd
.reserved
));
2543 if (copy_to_user(arg
, &fmtd
, sizeof(fmtd
)))
2551 sn9c102_vidioc_g_fmt(struct sn9c102_device
* cam
, void __user
* arg
)
2553 struct v4l2_format format
;
2554 struct v4l2_pix_format
* pfmt
= &(cam
->sensor
.pix_format
);
2556 if (copy_from_user(&format
, arg
, sizeof(format
)))
2559 if (format
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2562 pfmt
->colorspace
= (pfmt
->pixelformat
== V4L2_PIX_FMT_JPEG
) ?
2563 V4L2_COLORSPACE_JPEG
: V4L2_COLORSPACE_SRGB
;
2564 pfmt
->bytesperline
= (pfmt
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
2565 pfmt
->pixelformat
== V4L2_PIX_FMT_JPEG
)
2566 ? 0 : (pfmt
->width
* pfmt
->priv
) / 8;
2567 pfmt
->sizeimage
= pfmt
->height
* ((pfmt
->width
*pfmt
->priv
)/8);
2568 pfmt
->field
= V4L2_FIELD_NONE
;
2569 memcpy(&(format
.fmt
.pix
), pfmt
, sizeof(*pfmt
));
2571 if (copy_to_user(arg
, &format
, sizeof(format
)))
2579 sn9c102_vidioc_try_s_fmt(struct sn9c102_device
* cam
, unsigned int cmd
,
2582 struct sn9c102_sensor
* s
= &cam
->sensor
;
2583 struct v4l2_format format
;
2584 struct v4l2_pix_format
* pix
;
2585 struct v4l2_pix_format
* pfmt
= &(s
->pix_format
);
2586 struct v4l2_rect
* bounds
= &(s
->cropcap
.bounds
);
2587 struct v4l2_rect rect
;
2589 const enum sn9c102_stream_state stream
= cam
->stream
;
2590 const u32 nbuffers
= cam
->nbuffers
;
2594 if (copy_from_user(&format
, arg
, sizeof(format
)))
2597 pix
= &(format
.fmt
.pix
);
2599 if (format
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2602 memcpy(&rect
, &(s
->_rect
), sizeof(rect
));
2604 { /* calculate the actual scaling factor */
2606 a
= rect
.width
* rect
.height
;
2607 b
= pix
->width
* pix
->height
;
2608 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2611 rect
.width
= scale
* pix
->width
;
2612 rect
.height
= scale
* pix
->height
;
2614 if (rect
.width
< 16)
2616 if (rect
.height
< 16)
2618 if (rect
.width
> bounds
->left
+ bounds
->width
- rect
.left
)
2619 rect
.width
= bounds
->left
+ bounds
->width
- rect
.left
;
2620 if (rect
.height
> bounds
->top
+ bounds
->height
- rect
.top
)
2621 rect
.height
= bounds
->top
+ bounds
->height
- rect
.top
;
2624 rect
.height
&= ~15L;
2626 { /* adjust the scaling factor */
2628 a
= rect
.width
* rect
.height
;
2629 b
= pix
->width
* pix
->height
;
2630 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2633 pix
->width
= rect
.width
/ scale
;
2634 pix
->height
= rect
.height
/ scale
;
2636 switch (cam
->bridge
) {
2637 case BRIDGE_SN9C101
:
2638 case BRIDGE_SN9C102
:
2639 case BRIDGE_SN9C103
:
2640 if (pix
->pixelformat
!= V4L2_PIX_FMT_SN9C10X
&&
2641 pix
->pixelformat
!= V4L2_PIX_FMT_SBGGR8
)
2642 pix
->pixelformat
= pfmt
->pixelformat
;
2644 case BRIDGE_SN9C105
:
2645 case BRIDGE_SN9C120
:
2646 if (pix
->pixelformat
!= V4L2_PIX_FMT_JPEG
&&
2647 pix
->pixelformat
!= V4L2_PIX_FMT_SBGGR8
)
2648 pix
->pixelformat
= pfmt
->pixelformat
;
2651 pix
->priv
= pfmt
->priv
; /* bpp */
2652 pix
->colorspace
= (pix
->pixelformat
== V4L2_PIX_FMT_JPEG
) ?
2653 V4L2_COLORSPACE_JPEG
: V4L2_COLORSPACE_SRGB
;
2654 pix
->bytesperline
= (pix
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
2655 pix
->pixelformat
== V4L2_PIX_FMT_JPEG
)
2656 ? 0 : (pix
->width
* pix
->priv
) / 8;
2657 pix
->sizeimage
= pix
->height
* ((pix
->width
* pix
->priv
) / 8);
2658 pix
->field
= V4L2_FIELD_NONE
;
2660 if (cmd
== VIDIOC_TRY_FMT
) {
2661 if (copy_to_user(arg
, &format
, sizeof(format
)))
2666 if (cam
->module_param
.force_munmap
)
2667 for (i
= 0; i
< cam
->nbuffers
; i
++)
2668 if (cam
->frame
[i
].vma_use_count
) {
2669 DBG(3, "VIDIOC_S_FMT failed. Unmap the "
2674 if (cam
->stream
== STREAM_ON
)
2675 if ((err
= sn9c102_stream_interrupt(cam
)))
2678 if (copy_to_user(arg
, &format
, sizeof(format
))) {
2679 cam
->stream
= stream
;
2683 if (cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
)
2684 sn9c102_release_buffers(cam
);
2686 err
+= sn9c102_set_pix_format(cam
, pix
);
2687 err
+= sn9c102_set_crop(cam
, &rect
);
2688 if (s
->set_pix_format
)
2689 err
+= s
->set_pix_format(cam
, pix
);
2691 err
+= s
->set_crop(cam
, &rect
);
2692 err
+= sn9c102_set_scale(cam
, scale
);
2694 if (err
) { /* atomic, no rollback in ioctl() */
2695 cam
->state
|= DEV_MISCONFIGURED
;
2696 DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
2697 "use the camera, close and open %s again.",
2698 video_device_node_name(cam
->v4ldev
));
2702 memcpy(pfmt
, pix
, sizeof(*pix
));
2703 memcpy(&(s
->_rect
), &rect
, sizeof(rect
));
2705 if ((cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
) &&
2706 nbuffers
!= sn9c102_request_buffers(cam
, nbuffers
, cam
->io
)) {
2707 cam
->state
|= DEV_MISCONFIGURED
;
2708 DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
2709 "use the camera, close and open %s again.",
2710 video_device_node_name(cam
->v4ldev
));
2714 if (cam
->io
== IO_READ
)
2715 sn9c102_empty_framequeues(cam
);
2716 else if (cam
->module_param
.force_munmap
)
2717 sn9c102_requeue_outqueue(cam
);
2719 cam
->stream
= stream
;
2726 sn9c102_vidioc_g_jpegcomp(struct sn9c102_device
* cam
, void __user
* arg
)
2728 if (copy_to_user(arg
, &cam
->compression
, sizeof(cam
->compression
)))
2736 sn9c102_vidioc_s_jpegcomp(struct sn9c102_device
* cam
, void __user
* arg
)
2738 struct v4l2_jpegcompression jc
;
2739 const enum sn9c102_stream_state stream
= cam
->stream
;
2742 if (copy_from_user(&jc
, arg
, sizeof(jc
)))
2745 if (jc
.quality
!= 0 && jc
.quality
!= 1)
2748 if (cam
->stream
== STREAM_ON
)
2749 if ((err
= sn9c102_stream_interrupt(cam
)))
2752 err
+= sn9c102_set_compression(cam
, &jc
);
2753 if (err
) { /* atomic, no rollback in ioctl() */
2754 cam
->state
|= DEV_MISCONFIGURED
;
2755 DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware problems. "
2756 "To use the camera, close and open %s again.",
2757 video_device_node_name(cam
->v4ldev
));
2761 cam
->compression
.quality
= jc
.quality
;
2763 cam
->stream
= stream
;
2770 sn9c102_vidioc_reqbufs(struct sn9c102_device
* cam
, void __user
* arg
)
2772 struct v4l2_requestbuffers rb
;
2776 if (copy_from_user(&rb
, arg
, sizeof(rb
)))
2779 if (rb
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2780 rb
.memory
!= V4L2_MEMORY_MMAP
)
2783 if (cam
->io
== IO_READ
) {
2784 DBG(3, "Close and open the device again to choose the mmap "
2789 for (i
= 0; i
< cam
->nbuffers
; i
++)
2790 if (cam
->frame
[i
].vma_use_count
) {
2791 DBG(3, "VIDIOC_REQBUFS failed. Previous buffers are "
2796 if (cam
->stream
== STREAM_ON
)
2797 if ((err
= sn9c102_stream_interrupt(cam
)))
2800 sn9c102_empty_framequeues(cam
);
2802 sn9c102_release_buffers(cam
);
2804 rb
.count
= sn9c102_request_buffers(cam
, rb
.count
, IO_MMAP
);
2806 if (copy_to_user(arg
, &rb
, sizeof(rb
))) {
2807 sn9c102_release_buffers(cam
);
2812 cam
->io
= rb
.count
? IO_MMAP
: IO_NONE
;
2819 sn9c102_vidioc_querybuf(struct sn9c102_device
* cam
, void __user
* arg
)
2821 struct v4l2_buffer b
;
2823 if (copy_from_user(&b
, arg
, sizeof(b
)))
2826 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2827 b
.index
>= cam
->nbuffers
|| cam
->io
!= IO_MMAP
)
2830 memcpy(&b
, &cam
->frame
[b
.index
].buf
, sizeof(b
));
2832 if (cam
->frame
[b
.index
].vma_use_count
)
2833 b
.flags
|= V4L2_BUF_FLAG_MAPPED
;
2835 if (cam
->frame
[b
.index
].state
== F_DONE
)
2836 b
.flags
|= V4L2_BUF_FLAG_DONE
;
2837 else if (cam
->frame
[b
.index
].state
!= F_UNUSED
)
2838 b
.flags
|= V4L2_BUF_FLAG_QUEUED
;
2840 if (copy_to_user(arg
, &b
, sizeof(b
)))
2848 sn9c102_vidioc_qbuf(struct sn9c102_device
* cam
, void __user
* arg
)
2850 struct v4l2_buffer b
;
2851 unsigned long lock_flags
;
2853 if (copy_from_user(&b
, arg
, sizeof(b
)))
2856 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2857 b
.index
>= cam
->nbuffers
|| cam
->io
!= IO_MMAP
)
2860 if (cam
->frame
[b
.index
].state
!= F_UNUSED
)
2863 cam
->frame
[b
.index
].state
= F_QUEUED
;
2865 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2866 list_add_tail(&cam
->frame
[b
.index
].frame
, &cam
->inqueue
);
2867 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2869 PDBGG("Frame #%lu queued", (unsigned long)b
.index
);
2876 sn9c102_vidioc_dqbuf(struct sn9c102_device
* cam
, struct file
* filp
,
2879 struct v4l2_buffer b
;
2880 struct sn9c102_frame_t
*f
;
2881 unsigned long lock_flags
;
2885 if (copy_from_user(&b
, arg
, sizeof(b
)))
2888 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
|| cam
->io
!= IO_MMAP
)
2891 if (list_empty(&cam
->outqueue
)) {
2892 if (cam
->stream
== STREAM_OFF
)
2894 if (filp
->f_flags
& O_NONBLOCK
)
2896 if (!cam
->module_param
.frame_timeout
) {
2897 err
= wait_event_interruptible
2899 (!list_empty(&cam
->outqueue
)) ||
2900 (cam
->state
& DEV_DISCONNECTED
) ||
2901 (cam
->state
& DEV_MISCONFIGURED
) );
2905 timeout
= wait_event_interruptible_timeout
2907 (!list_empty(&cam
->outqueue
)) ||
2908 (cam
->state
& DEV_DISCONNECTED
) ||
2909 (cam
->state
& DEV_MISCONFIGURED
),
2910 cam
->module_param
.frame_timeout
*
2911 1000 * msecs_to_jiffies(1) );
2914 else if (timeout
== 0 &&
2915 !(cam
->state
& DEV_DISCONNECTED
)) {
2916 DBG(1, "Video frame timeout elapsed");
2920 if (cam
->state
& DEV_DISCONNECTED
)
2922 if (cam
->state
& DEV_MISCONFIGURED
)
2926 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2927 f
= list_entry(cam
->outqueue
.next
, struct sn9c102_frame_t
, frame
);
2928 list_del(cam
->outqueue
.next
);
2929 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2931 f
->state
= F_UNUSED
;
2933 memcpy(&b
, &f
->buf
, sizeof(b
));
2934 if (f
->vma_use_count
)
2935 b
.flags
|= V4L2_BUF_FLAG_MAPPED
;
2937 if (copy_to_user(arg
, &b
, sizeof(b
)))
2940 PDBGG("Frame #%lu dequeued", (unsigned long)f
->buf
.index
);
2947 sn9c102_vidioc_streamon(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 cam
->stream
= STREAM_ON
;
2959 DBG(3, "Stream on");
2966 sn9c102_vidioc_streamoff(struct sn9c102_device
* cam
, void __user
* arg
)
2970 if (copy_from_user(&type
, arg
, sizeof(type
)))
2973 if (type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
|| cam
->io
!= IO_MMAP
)
2976 if (cam
->stream
== STREAM_ON
)
2977 if ((err
= sn9c102_stream_interrupt(cam
)))
2980 sn9c102_empty_framequeues(cam
);
2982 DBG(3, "Stream off");
2989 sn9c102_vidioc_g_parm(struct sn9c102_device
* cam
, void __user
* arg
)
2991 struct v4l2_streamparm sp
;
2993 if (copy_from_user(&sp
, arg
, sizeof(sp
)))
2996 if (sp
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2999 sp
.parm
.capture
.extendedmode
= 0;
3000 sp
.parm
.capture
.readbuffers
= cam
->nreadbuffers
;
3002 if (copy_to_user(arg
, &sp
, sizeof(sp
)))
3010 sn9c102_vidioc_s_parm(struct sn9c102_device
* cam
, void __user
* arg
)
3012 struct v4l2_streamparm sp
;
3014 if (copy_from_user(&sp
, arg
, sizeof(sp
)))
3017 if (sp
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
3020 sp
.parm
.capture
.extendedmode
= 0;
3022 if (sp
.parm
.capture
.readbuffers
== 0)
3023 sp
.parm
.capture
.readbuffers
= cam
->nreadbuffers
;
3025 if (sp
.parm
.capture
.readbuffers
> SN9C102_MAX_FRAMES
)
3026 sp
.parm
.capture
.readbuffers
= SN9C102_MAX_FRAMES
;
3028 if (copy_to_user(arg
, &sp
, sizeof(sp
)))
3031 cam
->nreadbuffers
= sp
.parm
.capture
.readbuffers
;
3038 sn9c102_vidioc_enumaudio(struct sn9c102_device
* cam
, void __user
* arg
)
3040 struct v4l2_audio audio
;
3042 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3045 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3048 if (audio
.index
!= 0)
3051 strcpy(audio
.name
, "Microphone");
3052 audio
.capability
= 0;
3055 if (copy_to_user(arg
, &audio
, sizeof(audio
)))
3063 sn9c102_vidioc_g_audio(struct sn9c102_device
* cam
, void __user
* arg
)
3065 struct v4l2_audio audio
;
3067 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3070 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3073 memset(&audio
, 0, sizeof(audio
));
3074 strcpy(audio
.name
, "Microphone");
3076 if (copy_to_user(arg
, &audio
, sizeof(audio
)))
3084 sn9c102_vidioc_s_audio(struct sn9c102_device
* cam
, void __user
* arg
)
3086 struct v4l2_audio audio
;
3088 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3091 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3094 if (audio
.index
!= 0)
3101 static long sn9c102_ioctl_v4l2(struct file
*filp
,
3102 unsigned int cmd
, void __user
*arg
)
3104 struct sn9c102_device
*cam
= video_drvdata(filp
);
3108 case VIDIOC_QUERYCAP
:
3109 return sn9c102_vidioc_querycap(cam
, arg
);
3111 case VIDIOC_ENUMINPUT
:
3112 return sn9c102_vidioc_enuminput(cam
, arg
);
3114 case VIDIOC_G_INPUT
:
3115 return sn9c102_vidioc_g_input(cam
, arg
);
3117 case VIDIOC_S_INPUT
:
3118 return sn9c102_vidioc_s_input(cam
, arg
);
3120 case VIDIOC_QUERYCTRL
:
3121 return sn9c102_vidioc_query_ctrl(cam
, arg
);
3124 return sn9c102_vidioc_g_ctrl(cam
, arg
);
3127 return sn9c102_vidioc_s_ctrl(cam
, arg
);
3129 case VIDIOC_CROPCAP
:
3130 return sn9c102_vidioc_cropcap(cam
, arg
);
3133 return sn9c102_vidioc_g_crop(cam
, arg
);
3136 return sn9c102_vidioc_s_crop(cam
, arg
);
3138 case VIDIOC_ENUM_FRAMESIZES
:
3139 return sn9c102_vidioc_enum_framesizes(cam
, arg
);
3141 case VIDIOC_ENUM_FMT
:
3142 return sn9c102_vidioc_enum_fmt(cam
, arg
);
3145 return sn9c102_vidioc_g_fmt(cam
, arg
);
3147 case VIDIOC_TRY_FMT
:
3149 return sn9c102_vidioc_try_s_fmt(cam
, cmd
, arg
);
3151 case VIDIOC_G_JPEGCOMP
:
3152 return sn9c102_vidioc_g_jpegcomp(cam
, arg
);
3154 case VIDIOC_S_JPEGCOMP
:
3155 return sn9c102_vidioc_s_jpegcomp(cam
, arg
);
3157 case VIDIOC_REQBUFS
:
3158 return sn9c102_vidioc_reqbufs(cam
, arg
);
3160 case VIDIOC_QUERYBUF
:
3161 return sn9c102_vidioc_querybuf(cam
, arg
);
3164 return sn9c102_vidioc_qbuf(cam
, arg
);
3167 return sn9c102_vidioc_dqbuf(cam
, filp
, arg
);
3169 case VIDIOC_STREAMON
:
3170 return sn9c102_vidioc_streamon(cam
, arg
);
3172 case VIDIOC_STREAMOFF
:
3173 return sn9c102_vidioc_streamoff(cam
, arg
);
3176 return sn9c102_vidioc_g_parm(cam
, arg
);
3179 return sn9c102_vidioc_s_parm(cam
, arg
);
3181 case VIDIOC_ENUMAUDIO
:
3182 return sn9c102_vidioc_enumaudio(cam
, arg
);
3184 case VIDIOC_G_AUDIO
:
3185 return sn9c102_vidioc_g_audio(cam
, arg
);
3187 case VIDIOC_S_AUDIO
:
3188 return sn9c102_vidioc_s_audio(cam
, arg
);
3197 static long sn9c102_ioctl(struct file
*filp
,
3198 unsigned int cmd
, unsigned long arg
)
3200 struct sn9c102_device
*cam
= video_drvdata(filp
);
3203 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
3204 return -ERESTARTSYS
;
3206 if (cam
->state
& DEV_DISCONNECTED
) {
3207 DBG(1, "Device not present");
3208 mutex_unlock(&cam
->fileop_mutex
);
3212 if (cam
->state
& DEV_MISCONFIGURED
) {
3213 DBG(1, "The camera is misconfigured. Close and open it "
3215 mutex_unlock(&cam
->fileop_mutex
);
3219 V4LDBG(3, "sn9c102", cmd
);
3221 err
= sn9c102_ioctl_v4l2(filp
, cmd
, (void __user
*)arg
);
3223 mutex_unlock(&cam
->fileop_mutex
);
3228 /*****************************************************************************/
3230 static const struct v4l2_file_operations sn9c102_fops
= {
3231 .owner
= THIS_MODULE
,
3232 .open
= sn9c102_open
,
3233 .release
= sn9c102_release
,
3234 .unlocked_ioctl
= sn9c102_ioctl
,
3235 .read
= sn9c102_read
,
3236 .poll
= sn9c102_poll
,
3237 .mmap
= sn9c102_mmap
,
3240 /*****************************************************************************/
3242 /* It exists a single interface only. We do not need to validate anything. */
3244 sn9c102_usb_probe(struct usb_interface
* intf
, const struct usb_device_id
* id
)
3246 struct usb_device
*udev
= interface_to_usbdev(intf
);
3247 struct sn9c102_device
* cam
;
3248 static unsigned int dev_nr
;
3252 if (!(cam
= kzalloc(sizeof(struct sn9c102_device
), GFP_KERNEL
)))
3257 if (!(cam
->control_buffer
= kzalloc(8, GFP_KERNEL
))) {
3258 DBG(1, "kzalloc() failed");
3263 if (!(cam
->v4ldev
= video_device_alloc())) {
3264 DBG(1, "video_device_alloc() failed");
3269 r
= sn9c102_read_reg(cam
, 0x00);
3270 if (r
< 0 || (r
!= 0x10 && r
!= 0x11 && r
!= 0x12)) {
3271 DBG(1, "Sorry, this is not a SN9C1xx-based camera "
3272 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3277 cam
->bridge
= id
->driver_info
;
3278 switch (cam
->bridge
) {
3279 case BRIDGE_SN9C101
:
3280 case BRIDGE_SN9C102
:
3281 DBG(2, "SN9C10[12] PC Camera Controller detected "
3282 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3284 case BRIDGE_SN9C103
:
3285 DBG(2, "SN9C103 PC Camera Controller detected "
3286 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3288 case BRIDGE_SN9C105
:
3289 DBG(2, "SN9C105 PC Camera Controller detected "
3290 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3292 case BRIDGE_SN9C120
:
3293 DBG(2, "SN9C120 PC Camera Controller detected "
3294 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3298 for (i
= 0; i
< ARRAY_SIZE(sn9c102_sensor_table
); i
++) {
3299 err
= sn9c102_sensor_table
[i
](cam
);
3305 DBG(2, "%s image sensor detected", cam
->sensor
.name
);
3306 DBG(3, "Support for %s maintained by %s",
3307 cam
->sensor
.name
, cam
->sensor
.maintainer
);
3309 DBG(1, "No supported image sensor detected for this bridge");
3314 if (!(cam
->bridge
& cam
->sensor
.supported_bridge
)) {
3315 DBG(1, "Bridge not supported");
3320 if (sn9c102_init(cam
)) {
3321 DBG(1, "Initialization failed. I will retry on open().");
3322 cam
->state
|= DEV_MISCONFIGURED
;
3325 strcpy(cam
->v4ldev
->name
, "SN9C1xx PC Camera");
3326 cam
->v4ldev
->fops
= &sn9c102_fops
;
3327 cam
->v4ldev
->release
= video_device_release
;
3328 cam
->v4ldev
->parent
= &udev
->dev
;
3330 init_completion(&cam
->probe
);
3332 err
= video_register_device(cam
->v4ldev
, VFL_TYPE_GRABBER
,
3335 DBG(1, "V4L2 device registration failed");
3336 if (err
== -ENFILE
&& video_nr
[dev_nr
] == -1)
3337 DBG(1, "Free /dev/videoX node not found");
3338 video_nr
[dev_nr
] = -1;
3339 dev_nr
= (dev_nr
< SN9C102_MAX_DEVICES
-1) ? dev_nr
+1 : 0;
3340 complete_all(&cam
->probe
);
3344 DBG(2, "V4L2 device registered as %s",
3345 video_device_node_name(cam
->v4ldev
));
3347 video_set_drvdata(cam
->v4ldev
, cam
);
3348 cam
->module_param
.force_munmap
= force_munmap
[dev_nr
];
3349 cam
->module_param
.frame_timeout
= frame_timeout
[dev_nr
];
3351 dev_nr
= (dev_nr
< SN9C102_MAX_DEVICES
-1) ? dev_nr
+1 : 0;
3353 #ifdef CONFIG_VIDEO_ADV_DEBUG
3354 err
= sn9c102_create_sysfs(cam
);
3356 DBG(2, "Optional device control through 'sysfs' "
3359 DBG(2, "Failed to create optional 'sysfs' interface for "
3360 "device controlling. Error #%d", err
);
3362 DBG(2, "Optional device control through 'sysfs' interface disabled");
3363 DBG(3, "Compile the kernel with the 'CONFIG_VIDEO_ADV_DEBUG' "
3364 "configuration option to enable it.");
3367 usb_set_intfdata(intf
, cam
);
3368 kref_init(&cam
->kref
);
3369 usb_get_dev(cam
->usbdev
);
3371 complete_all(&cam
->probe
);
3377 kfree(cam
->control_buffer
);
3379 video_device_release(cam
->v4ldev
);
3386 static void sn9c102_usb_disconnect(struct usb_interface
* intf
)
3388 struct sn9c102_device
* cam
;
3390 down_write(&sn9c102_dev_lock
);
3392 cam
= usb_get_intfdata(intf
);
3394 DBG(2, "Disconnecting %s...", cam
->v4ldev
->name
);
3397 DBG(2, "Device %s is open! Deregistration and memory "
3398 "deallocation are deferred.",
3399 video_device_node_name(cam
->v4ldev
));
3400 cam
->state
|= DEV_MISCONFIGURED
;
3401 sn9c102_stop_transfer(cam
);
3402 cam
->state
|= DEV_DISCONNECTED
;
3403 wake_up_interruptible(&cam
->wait_frame
);
3404 wake_up(&cam
->wait_stream
);
3406 cam
->state
|= DEV_DISCONNECTED
;
3408 wake_up_interruptible_all(&cam
->wait_open
);
3410 kref_put(&cam
->kref
, sn9c102_release_resources
);
3412 up_write(&sn9c102_dev_lock
);
3416 static struct usb_driver sn9c102_usb_driver
= {
3418 .id_table
= sn9c102_id_table
,
3419 .probe
= sn9c102_usb_probe
,
3420 .disconnect
= sn9c102_usb_disconnect
,
3423 /*****************************************************************************/
3425 static int __init
sn9c102_module_init(void)
3429 KDBG(2, SN9C102_MODULE_NAME
" v" SN9C102_MODULE_VERSION
);
3430 KDBG(3, SN9C102_MODULE_AUTHOR
);
3432 if ((err
= usb_register(&sn9c102_usb_driver
)))
3433 KDBG(1, "usb_register() failed");
3439 static void __exit
sn9c102_module_exit(void)
3441 usb_deregister(&sn9c102_usb_driver
);
3445 module_init(sn9c102_module_init
);
3446 module_exit(sn9c102_module_exit
);