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/page-flags.h>
37 #include <linux/byteorder/generic.h>
39 #include <asm/uaccess.h>
43 /*****************************************************************************/
45 #define SN9C102_MODULE_NAME "V4L2 driver for SN9C1xx PC Camera Controllers"
46 #define SN9C102_MODULE_ALIAS "sn9c1xx"
47 #define SN9C102_MODULE_AUTHOR "(C) 2004-2007 Luca Risolia"
48 #define SN9C102_AUTHOR_EMAIL "<luca.risolia@studio.unibo.it>"
49 #define SN9C102_MODULE_LICENSE "GPL"
50 #define SN9C102_MODULE_VERSION "1:1.47pre49"
51 #define SN9C102_MODULE_VERSION_CODE KERNEL_VERSION(1, 1, 47)
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
)"."
119 /*****************************************************************************/
122 sn9c102_request_buffers(struct sn9c102_device
* cam
, u32 count
,
123 enum sn9c102_io_method io
)
125 struct v4l2_pix_format
* p
= &(cam
->sensor
.pix_format
);
126 struct v4l2_rect
* r
= &(cam
->sensor
.cropcap
.bounds
);
127 size_t imagesize
= cam
->module_param
.force_munmap
|| io
== IO_READ
?
128 (p
->width
* p
->height
* p
->priv
) / 8 :
129 (r
->width
* r
->height
* p
->priv
) / 8;
133 if (count
> SN9C102_MAX_FRAMES
)
134 count
= SN9C102_MAX_FRAMES
;
136 if (cam
->bridge
== BRIDGE_SN9C105
|| cam
->bridge
== BRIDGE_SN9C120
)
137 imagesize
+= 589 + 2; /* length of JPEG header + EOI marker */
139 cam
->nbuffers
= count
;
140 while (cam
->nbuffers
> 0) {
141 if ((buff
= vmalloc_32_user(cam
->nbuffers
*
142 PAGE_ALIGN(imagesize
))))
147 for (i
= 0; i
< cam
->nbuffers
; i
++) {
148 cam
->frame
[i
].bufmem
= buff
+ i
*PAGE_ALIGN(imagesize
);
149 cam
->frame
[i
].buf
.index
= i
;
150 cam
->frame
[i
].buf
.m
.offset
= i
*PAGE_ALIGN(imagesize
);
151 cam
->frame
[i
].buf
.length
= imagesize
;
152 cam
->frame
[i
].buf
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
153 cam
->frame
[i
].buf
.sequence
= 0;
154 cam
->frame
[i
].buf
.field
= V4L2_FIELD_NONE
;
155 cam
->frame
[i
].buf
.memory
= V4L2_MEMORY_MMAP
;
156 cam
->frame
[i
].buf
.flags
= 0;
159 return cam
->nbuffers
;
163 static void sn9c102_release_buffers(struct sn9c102_device
* cam
)
166 vfree(cam
->frame
[0].bufmem
);
169 cam
->frame_current
= NULL
;
173 static void sn9c102_empty_framequeues(struct sn9c102_device
* cam
)
177 INIT_LIST_HEAD(&cam
->inqueue
);
178 INIT_LIST_HEAD(&cam
->outqueue
);
180 for (i
= 0; i
< SN9C102_MAX_FRAMES
; i
++) {
181 cam
->frame
[i
].state
= F_UNUSED
;
182 cam
->frame
[i
].buf
.bytesused
= 0;
187 static void sn9c102_requeue_outqueue(struct sn9c102_device
* cam
)
189 struct sn9c102_frame_t
*i
;
191 list_for_each_entry(i
, &cam
->outqueue
, frame
) {
193 list_add(&i
->frame
, &cam
->inqueue
);
196 INIT_LIST_HEAD(&cam
->outqueue
);
200 static void sn9c102_queue_unusedframes(struct sn9c102_device
* cam
)
202 unsigned long lock_flags
;
205 for (i
= 0; i
< cam
->nbuffers
; i
++)
206 if (cam
->frame
[i
].state
== F_UNUSED
) {
207 cam
->frame
[i
].state
= F_QUEUED
;
208 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
209 list_add_tail(&cam
->frame
[i
].frame
, &cam
->inqueue
);
210 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
214 /*****************************************************************************/
217 Write a sequence of count value/register pairs. Returns -1 after the first
218 failed write, or 0 for no errors.
220 int sn9c102_write_regs(struct sn9c102_device
* cam
, const u8 valreg
[][2],
223 struct usb_device
* udev
= cam
->usbdev
;
224 u8
* buff
= cam
->control_buffer
;
227 for (i
= 0; i
< count
; i
++) {
228 u8 index
= valreg
[i
][1];
231 index is a u8, so it must be <256 and can't be out of range.
232 If we put in a check anyway, gcc annoys us with a warning
233 hat our check is useless. People get all uppity when they
234 see warnings in the kernel compile.
237 *buff
= valreg
[i
][0];
239 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08,
240 0x41, index
, 0, buff
, 1,
241 SN9C102_CTRL_TIMEOUT
);
244 DBG(3, "Failed to write a register (value 0x%02X, "
245 "index 0x%02X, error %d)", *buff
, index
, res
);
249 cam
->reg
[index
] = *buff
;
256 int sn9c102_write_reg(struct sn9c102_device
* cam
, u8 value
, u16 index
)
258 struct usb_device
* udev
= cam
->usbdev
;
259 u8
* buff
= cam
->control_buffer
;
262 if (index
>= ARRAY_SIZE(cam
->reg
))
267 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
268 index
, 0, buff
, 1, SN9C102_CTRL_TIMEOUT
);
270 DBG(3, "Failed to write a register (value 0x%02X, index "
271 "0x%02X, error %d)", value
, index
, res
);
275 cam
->reg
[index
] = value
;
281 /* NOTE: with the SN9C10[123] reading some registers always returns 0 */
282 int sn9c102_read_reg(struct sn9c102_device
* cam
, u16 index
)
284 struct usb_device
* udev
= cam
->usbdev
;
285 u8
* buff
= cam
->control_buffer
;
288 res
= usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0), 0x00, 0xc1,
289 index
, 0, buff
, 1, SN9C102_CTRL_TIMEOUT
);
291 DBG(3, "Failed to read a register (index 0x%02X, error %d)",
294 return (res
>= 0) ? (int)(*buff
) : -1;
298 int sn9c102_pread_reg(struct sn9c102_device
* cam
, u16 index
)
300 if (index
>= ARRAY_SIZE(cam
->reg
))
303 return cam
->reg
[index
];
308 sn9c102_i2c_wait(struct sn9c102_device
* cam
,
309 const struct sn9c102_sensor
* sensor
)
313 for (i
= 1; i
<= 5; i
++) {
314 r
= sn9c102_read_reg(cam
, 0x08);
319 if (sensor
->frequency
& SN9C102_I2C_400KHZ
)
329 sn9c102_i2c_detect_read_error(struct sn9c102_device
* cam
,
330 const struct sn9c102_sensor
* sensor
)
334 r
= sn9c102_read_reg(cam
, 0x08);
338 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
) {
346 return err
? -EIO
: 0;
351 sn9c102_i2c_detect_write_error(struct sn9c102_device
* cam
,
352 const struct sn9c102_sensor
* sensor
)
355 r
= sn9c102_read_reg(cam
, 0x08);
356 return (r
< 0 || (r
>= 0 && (r
& 0x08))) ? -EIO
: 0;
361 sn9c102_i2c_try_raw_read(struct sn9c102_device
* cam
,
362 const struct sn9c102_sensor
* sensor
, u8 data0
,
363 u8 data1
, u8 n
, u8 buffer
[])
365 struct usb_device
* udev
= cam
->usbdev
;
366 u8
* data
= cam
->control_buffer
;
367 int i
= 0, err
= 0, res
;
370 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
371 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0) | 0x10;
372 data
[1] = data0
; /* I2C slave id */
373 data
[2] = data1
; /* address */
375 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
376 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
380 err
+= sn9c102_i2c_wait(cam
, sensor
);
382 /* Read cycle - n bytes */
383 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
384 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0) |
388 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
389 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
393 err
+= sn9c102_i2c_wait(cam
, sensor
);
395 /* The first read byte will be placed in data[4] */
396 res
= usb_control_msg(udev
, usb_rcvctrlpipe(udev
, 0), 0x00, 0xc1,
397 0x0a, 0, data
, 5, SN9C102_CTRL_TIMEOUT
);
401 err
+= sn9c102_i2c_detect_read_error(cam
, sensor
);
403 PDBGG("I2C read: address 0x%02X, first read byte: 0x%02X", data1
,
407 DBG(3, "I2C read failed for %s image sensor", sensor
->name
);
412 for (i
= 0; i
< n
&& i
< 5; i
++)
413 buffer
[n
-i
-1] = data
[4-i
];
420 sn9c102_i2c_try_raw_write(struct sn9c102_device
* cam
,
421 const struct sn9c102_sensor
* sensor
, u8 n
, u8 data0
,
422 u8 data1
, u8 data2
, u8 data3
, u8 data4
, u8 data5
)
424 struct usb_device
* udev
= cam
->usbdev
;
425 u8
* data
= cam
->control_buffer
;
428 /* Write cycle. It usually is address + value */
429 data
[0] = ((sensor
->interface
== SN9C102_I2C_2WIRES
) ? 0x80 : 0) |
430 ((sensor
->frequency
& SN9C102_I2C_400KHZ
) ? 0x01 : 0)
439 res
= usb_control_msg(udev
, usb_sndctrlpipe(udev
, 0), 0x08, 0x41,
440 0x08, 0, data
, 8, SN9C102_CTRL_TIMEOUT
);
444 err
+= sn9c102_i2c_wait(cam
, sensor
);
445 err
+= sn9c102_i2c_detect_write_error(cam
, sensor
);
448 DBG(3, "I2C write failed for %s image sensor", sensor
->name
);
450 PDBGG("I2C raw write: %u bytes, data0 = 0x%02X, data1 = 0x%02X, "
451 "data2 = 0x%02X, data3 = 0x%02X, data4 = 0x%02X, data5 = 0x%02X",
452 n
, data0
, data1
, data2
, data3
, data4
, data5
);
459 sn9c102_i2c_try_read(struct sn9c102_device
* cam
,
460 const struct sn9c102_sensor
* sensor
, u8 address
)
462 return sn9c102_i2c_try_raw_read(cam
, sensor
, sensor
->i2c_slave_id
,
468 sn9c102_i2c_try_write(struct sn9c102_device
* cam
,
469 const struct sn9c102_sensor
* sensor
, u8 address
, u8 value
)
471 return sn9c102_i2c_try_raw_write(cam
, sensor
, 3,
472 sensor
->i2c_slave_id
, address
,
477 int sn9c102_i2c_read(struct sn9c102_device
* cam
, u8 address
)
479 return sn9c102_i2c_try_read(cam
, &cam
->sensor
, address
);
483 int sn9c102_i2c_write(struct sn9c102_device
* cam
, u8 address
, u8 value
)
485 return sn9c102_i2c_try_write(cam
, &cam
->sensor
, address
, value
);
488 /*****************************************************************************/
490 static size_t sn9c102_sof_length(struct sn9c102_device
* cam
)
492 switch (cam
->bridge
) {
508 sn9c102_find_sof_header(struct sn9c102_device
* cam
, void* mem
, size_t len
)
510 static const char marker
[6] = {0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96};
512 size_t soflen
= 0, i
, j
;
514 soflen
= sn9c102_sof_length(cam
);
516 for (i
= 0; i
< len
; i
++) {
519 /* Read the variable part of the header */
520 if (unlikely(cam
->sof
.bytesread
>= sizeof(marker
))) {
521 cam
->sof
.header
[cam
->sof
.bytesread
] = *(m
+i
);
522 if (++cam
->sof
.bytesread
== soflen
) {
523 cam
->sof
.bytesread
= 0;
529 /* Search for the SOF marker (fixed part) in the header */
530 for (j
= 0, b
=cam
->sof
.bytesread
; j
+b
< sizeof(marker
); j
++) {
531 if (unlikely(i
+j
) == len
)
533 if (*(m
+i
+j
) == marker
[cam
->sof
.bytesread
]) {
534 cam
->sof
.header
[cam
->sof
.bytesread
] = *(m
+i
+j
);
535 if (++cam
->sof
.bytesread
== sizeof(marker
)) {
536 PDBGG("Bytes to analyze: %zd. SOF "
537 "starts at byte #%zd", len
, i
);
542 cam
->sof
.bytesread
= 0;
553 sn9c102_find_eof_header(struct sn9c102_device
* cam
, void* mem
, size_t len
)
555 static const u8 eof_header
[4][4] = {
556 {0x00, 0x00, 0x00, 0x00},
557 {0x40, 0x00, 0x00, 0x00},
558 {0x80, 0x00, 0x00, 0x00},
559 {0xc0, 0x00, 0x00, 0x00},
563 /* The EOF header does not exist in compressed data */
564 if (cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
||
565 cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
569 The EOF header might cross the packet boundary, but this is not a
570 problem, since the end of a frame is determined by checking its size
573 for (i
= 0; (len
>= 4) && (i
<= len
- 4); i
++)
574 for (j
= 0; j
< ARRAY_SIZE(eof_header
); j
++)
575 if (!memcmp(mem
+ i
, eof_header
[j
], 4))
583 sn9c102_write_jpegheader(struct sn9c102_device
* cam
, struct sn9c102_frame_t
* f
)
585 static const u8 jpeg_header
[589] = {
586 0xff, 0xd8, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x06, 0x04, 0x05,
587 0x06, 0x05, 0x04, 0x06, 0x06, 0x05, 0x06, 0x07, 0x07, 0x06,
588 0x08, 0x0a, 0x10, 0x0a, 0x0a, 0x09, 0x09, 0x0a, 0x14, 0x0e,
589 0x0f, 0x0c, 0x10, 0x17, 0x14, 0x18, 0x18, 0x17, 0x14, 0x16,
590 0x16, 0x1a, 0x1d, 0x25, 0x1f, 0x1a, 0x1b, 0x23, 0x1c, 0x16,
591 0x16, 0x20, 0x2c, 0x20, 0x23, 0x26, 0x27, 0x29, 0x2a, 0x29,
592 0x19, 0x1f, 0x2d, 0x30, 0x2d, 0x28, 0x30, 0x25, 0x28, 0x29,
593 0x28, 0x01, 0x07, 0x07, 0x07, 0x0a, 0x08, 0x0a, 0x13, 0x0a,
594 0x0a, 0x13, 0x28, 0x1a, 0x16, 0x1a, 0x28, 0x28, 0x28, 0x28,
595 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 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, 0xff, 0xc4, 0x01, 0xa2,
600 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02,
602 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01,
603 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
604 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03,
605 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00,
606 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04,
607 0x04, 0x00, 0x00, 0x01, 0x7d, 0x01, 0x02, 0x03, 0x00, 0x04,
608 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61,
609 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23,
610 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62,
611 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25,
612 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38,
613 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
614 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
615 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
616 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
617 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
618 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa,
619 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2,
620 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3,
621 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3,
622 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3,
623 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0x11, 0x00, 0x02,
624 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04,
625 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04,
626 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
627 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1,
628 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1,
629 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19,
630 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
631 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a,
632 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64,
633 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76,
634 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
635 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
636 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9,
637 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
638 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
639 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3,
640 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4,
641 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xff, 0xc0, 0x00, 0x11,
642 0x08, 0x01, 0xe0, 0x02, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02,
643 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xda, 0x00, 0x0c, 0x03,
644 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00
648 memcpy(pos
, jpeg_header
, sizeof(jpeg_header
));
650 *(pos
+ 7 + 64) = 0x01;
651 if (cam
->compression
.quality
== 0) {
652 memcpy(pos
+ 7, SN9C102_Y_QTABLE0
, 64);
653 memcpy(pos
+ 8 + 64, SN9C102_UV_QTABLE0
, 64);
654 } else if (cam
->compression
.quality
== 1) {
655 memcpy(pos
+ 7, SN9C102_Y_QTABLE1
, 64);
656 memcpy(pos
+ 8 + 64, SN9C102_UV_QTABLE1
, 64);
658 *(pos
+ 564) = cam
->sensor
.pix_format
.width
& 0xFF;
659 *(pos
+ 563) = (cam
->sensor
.pix_format
.width
>> 8) & 0xFF;
660 *(pos
+ 562) = cam
->sensor
.pix_format
.height
& 0xFF;
661 *(pos
+ 561) = (cam
->sensor
.pix_format
.height
>> 8) & 0xFF;
664 f
->buf
.bytesused
+= sizeof(jpeg_header
);
668 static void sn9c102_urb_complete(struct urb
*urb
)
670 struct sn9c102_device
* cam
= urb
->context
;
671 struct sn9c102_frame_t
** f
;
672 size_t imagesize
, soflen
;
676 if (urb
->status
== -ENOENT
)
679 f
= &cam
->frame_current
;
681 if (cam
->stream
== STREAM_INTERRUPT
) {
682 cam
->stream
= STREAM_OFF
;
684 (*f
)->state
= F_QUEUED
;
685 cam
->sof
.bytesread
= 0;
686 DBG(3, "Stream interrupted by application");
687 wake_up(&cam
->wait_stream
);
690 if (cam
->state
& DEV_DISCONNECTED
)
693 if (cam
->state
& DEV_MISCONFIGURED
) {
694 wake_up_interruptible(&cam
->wait_frame
);
698 if (cam
->stream
== STREAM_OFF
|| list_empty(&cam
->inqueue
))
702 (*f
) = list_entry(cam
->inqueue
.next
, struct sn9c102_frame_t
,
705 imagesize
= (cam
->sensor
.pix_format
.width
*
706 cam
->sensor
.pix_format
.height
*
707 cam
->sensor
.pix_format
.priv
) / 8;
708 if (cam
->sensor
.pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
709 imagesize
+= 589; /* length of jpeg header */
710 soflen
= sn9c102_sof_length(cam
);
712 for (i
= 0; i
< urb
->number_of_packets
; i
++) {
713 unsigned int img
, len
, status
;
714 void *pos
, *sof
, *eof
;
716 len
= urb
->iso_frame_desc
[i
].actual_length
;
717 status
= urb
->iso_frame_desc
[i
].status
;
718 pos
= urb
->iso_frame_desc
[i
].offset
+ urb
->transfer_buffer
;
721 DBG(3, "Error in isochronous frame");
722 (*f
)->state
= F_ERROR
;
723 cam
->sof
.bytesread
= 0;
727 PDBGG("Isochrnous frame: length %u, #%u i", len
, i
);
730 sof
= sn9c102_find_sof_header(cam
, pos
, len
);
732 eof
= sn9c102_find_eof_header(cam
, pos
, len
);
733 if ((*f
)->state
== F_GRABBING
) {
738 img
= (eof
> pos
) ? eof
- pos
- 1 : 0;
740 if ((*f
)->buf
.bytesused
+ img
> imagesize
) {
742 b
= (*f
)->buf
.bytesused
+ img
-
744 img
= imagesize
- (*f
)->buf
.bytesused
;
745 PDBGG("Expected EOF not found: video "
748 DBG(3, "Exceeded limit: +%u "
749 "bytes", (unsigned)(b
));
752 memcpy((*f
)->bufmem
+ (*f
)->buf
.bytesused
, pos
,
755 if ((*f
)->buf
.bytesused
== 0)
756 do_gettimeofday(&(*f
)->buf
.timestamp
);
758 (*f
)->buf
.bytesused
+= img
;
760 if ((*f
)->buf
.bytesused
== imagesize
||
761 ((cam
->sensor
.pix_format
.pixelformat
==
762 V4L2_PIX_FMT_SN9C10X
||
763 cam
->sensor
.pix_format
.pixelformat
==
764 V4L2_PIX_FMT_JPEG
) && eof
)) {
767 b
= (*f
)->buf
.bytesused
;
768 (*f
)->state
= F_DONE
;
769 (*f
)->buf
.sequence
= ++cam
->frame_count
;
771 spin_lock(&cam
->queue_lock
);
772 list_move_tail(&(*f
)->frame
,
774 if (!list_empty(&cam
->inqueue
))
777 struct sn9c102_frame_t
,
781 spin_unlock(&cam
->queue_lock
);
783 memcpy(cam
->sysfs
.frame_header
,
784 cam
->sof
.header
, soflen
);
786 DBG(3, "Video frame captured: %lu "
787 "bytes", (unsigned long)(b
));
793 (*f
)->state
= F_ERROR
;
794 DBG(3, "Not expected EOF after %lu "
795 "bytes of image data",
797 ((*f
)->buf
.bytesused
));
804 DBG(3, "EOF without SOF");
808 PDBGG("Ignoring pointless isochronous frame");
812 } else if ((*f
)->state
== F_QUEUED
|| (*f
)->state
== F_ERROR
) {
814 (*f
)->state
= F_GRABBING
;
815 (*f
)->buf
.bytesused
= 0;
818 if (cam
->sensor
.pix_format
.pixelformat
==
820 sn9c102_write_jpegheader(cam
, (*f
));
821 DBG(3, "SOF detected: new video frame");
825 } else if ((*f
)->state
== F_GRABBING
) {
826 eof
= sn9c102_find_eof_header(cam
, pos
, len
);
827 if (eof
&& eof
< sof
)
828 goto end_of_frame
; /* (1) */
830 if (cam
->sensor
.pix_format
.pixelformat
==
831 V4L2_PIX_FMT_SN9C10X
||
832 cam
->sensor
.pix_format
.pixelformat
==
834 if (sof
- pos
>= soflen
) {
836 } else { /* remove header */
838 (*f
)->buf
.bytesused
-=
839 (soflen
- (sof
- pos
));
843 DBG(3, "SOF before expected EOF after "
844 "%lu bytes of image data",
846 ((*f
)->buf
.bytesused
));
854 urb
->dev
= cam
->usbdev
;
855 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
856 if (err
< 0 && err
!= -EPERM
) {
857 cam
->state
|= DEV_MISCONFIGURED
;
858 DBG(1, "usb_submit_urb() failed");
861 wake_up_interruptible(&cam
->wait_frame
);
865 static int sn9c102_start_transfer(struct sn9c102_device
* cam
)
867 struct usb_device
*udev
= cam
->usbdev
;
869 struct usb_host_interface
* altsetting
= usb_altnum_to_altsetting(
870 usb_ifnum_to_if(udev
, 0),
871 SN9C102_ALTERNATE_SETTING
);
872 const unsigned int psz
= le16_to_cpu(altsetting
->
873 endpoint
[0].desc
.wMaxPacketSize
);
877 for (i
= 0; i
< SN9C102_URBS
; i
++) {
878 cam
->transfer_buffer
[i
] = kzalloc(SN9C102_ISO_PACKETS
* psz
,
880 if (!cam
->transfer_buffer
[i
]) {
882 DBG(1, "Not enough memory");
887 for (i
= 0; i
< SN9C102_URBS
; i
++) {
888 urb
= usb_alloc_urb(SN9C102_ISO_PACKETS
, GFP_KERNEL
);
892 DBG(1, "usb_alloc_urb() failed");
897 urb
->pipe
= usb_rcvisocpipe(udev
, 1);
898 urb
->transfer_flags
= URB_ISO_ASAP
;
899 urb
->number_of_packets
= SN9C102_ISO_PACKETS
;
900 urb
->complete
= sn9c102_urb_complete
;
901 urb
->transfer_buffer
= cam
->transfer_buffer
[i
];
902 urb
->transfer_buffer_length
= psz
* SN9C102_ISO_PACKETS
;
904 for (j
= 0; j
< SN9C102_ISO_PACKETS
; j
++) {
905 urb
->iso_frame_desc
[j
].offset
= psz
* j
;
906 urb
->iso_frame_desc
[j
].length
= psz
;
911 if (!(cam
->reg
[0x01] & 0x04)) {
912 err
= sn9c102_write_reg(cam
, cam
->reg
[0x01] | 0x04, 0x01);
915 DBG(1, "I/O hardware error");
920 err
= usb_set_interface(udev
, 0, SN9C102_ALTERNATE_SETTING
);
922 DBG(1, "usb_set_interface() failed");
926 cam
->frame_current
= NULL
;
927 cam
->sof
.bytesread
= 0;
929 for (i
= 0; i
< SN9C102_URBS
; i
++) {
930 err
= usb_submit_urb(cam
->urb
[i
], GFP_KERNEL
);
932 for (j
= i
-1; j
>= 0; j
--)
933 usb_kill_urb(cam
->urb
[j
]);
934 DBG(1, "usb_submit_urb() failed, error %d", err
);
942 for (i
= 0; (i
< SN9C102_URBS
) && cam
->urb
[i
]; i
++)
943 usb_free_urb(cam
->urb
[i
]);
946 for (i
= 0; (i
< SN9C102_URBS
) && cam
->transfer_buffer
[i
]; i
++)
947 kfree(cam
->transfer_buffer
[i
]);
953 static int sn9c102_stop_transfer(struct sn9c102_device
* cam
)
955 struct usb_device
*udev
= cam
->usbdev
;
959 if (cam
->state
& DEV_DISCONNECTED
)
962 for (i
= SN9C102_URBS
-1; i
>= 0; i
--) {
963 usb_kill_urb(cam
->urb
[i
]);
964 usb_free_urb(cam
->urb
[i
]);
965 kfree(cam
->transfer_buffer
[i
]);
968 err
= usb_set_interface(udev
, 0, 0); /* 0 Mb/s */
970 DBG(3, "usb_set_interface() failed");
976 static int sn9c102_stream_interrupt(struct sn9c102_device
* cam
)
980 cam
->stream
= STREAM_INTERRUPT
;
981 timeout
= wait_event_timeout(cam
->wait_stream
,
982 (cam
->stream
== STREAM_OFF
) ||
983 (cam
->state
& DEV_DISCONNECTED
),
984 SN9C102_URB_TIMEOUT
);
985 if (cam
->state
& DEV_DISCONNECTED
)
987 else if (cam
->stream
!= STREAM_OFF
) {
988 cam
->state
|= DEV_MISCONFIGURED
;
989 DBG(1, "URB timeout reached. The camera is misconfigured. "
990 "To use it, close and open /dev/video%d again.",
998 /*****************************************************************************/
1000 #ifdef CONFIG_VIDEO_ADV_DEBUG
1001 static u16
sn9c102_strtou16(const char* buff
, size_t len
, ssize_t
* count
)
1008 strncpy(str
, buff
, len
);
1011 strncpy(str
, buff
, 6);
1015 val
= simple_strtoul(str
, &endp
, 0);
1019 *count
= (ssize_t
)(endp
- str
);
1020 if ((*count
) && (len
== *count
+1) && (buff
[*count
] == '\n'))
1027 NOTE 1: being inside one of the following methods implies that the v4l
1028 device exists for sure (see kobjects and reference counters)
1029 NOTE 2: buffers are PAGE_SIZE long
1032 static ssize_t
sn9c102_show_reg(struct device
* cd
,
1033 struct device_attribute
*attr
, 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 device
* cd
, struct device_attribute
*attr
,
1058 const char* buf
, size_t len
)
1060 struct sn9c102_device
* cam
;
1064 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1065 return -ERESTARTSYS
;
1067 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1070 mutex_unlock(&sn9c102_sysfs_lock
);
1074 index
= sn9c102_strtou16(buf
, len
, &count
);
1075 if (index
>= ARRAY_SIZE(cam
->reg
) || !count
) {
1076 mutex_unlock(&sn9c102_sysfs_lock
);
1080 cam
->sysfs
.reg
= index
;
1082 DBG(2, "Moved SN9C1XX register index to 0x%02X", cam
->sysfs
.reg
);
1083 DBG(3, "Written bytes: %zd", count
);
1085 mutex_unlock(&sn9c102_sysfs_lock
);
1091 static ssize_t
sn9c102_show_val(struct device
* cd
,
1092 struct device_attribute
*attr
, char* buf
)
1094 struct sn9c102_device
* cam
;
1098 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1099 return -ERESTARTSYS
;
1101 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1104 mutex_unlock(&sn9c102_sysfs_lock
);
1108 if ((val
= sn9c102_read_reg(cam
, cam
->sysfs
.reg
)) < 0) {
1109 mutex_unlock(&sn9c102_sysfs_lock
);
1113 count
= sprintf(buf
, "%d\n", val
);
1115 DBG(3, "Read bytes: %zd, value: %d", count
, val
);
1117 mutex_unlock(&sn9c102_sysfs_lock
);
1124 sn9c102_store_val(struct device
* cd
, struct device_attribute
*attr
,
1125 const char* buf
, size_t len
)
1127 struct sn9c102_device
* cam
;
1132 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1133 return -ERESTARTSYS
;
1135 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1138 mutex_unlock(&sn9c102_sysfs_lock
);
1142 value
= sn9c102_strtou16(buf
, len
, &count
);
1144 mutex_unlock(&sn9c102_sysfs_lock
);
1148 err
= sn9c102_write_reg(cam
, value
, cam
->sysfs
.reg
);
1150 mutex_unlock(&sn9c102_sysfs_lock
);
1154 DBG(2, "Written SN9C1XX reg. 0x%02X, val. 0x%02X",
1155 cam
->sysfs
.reg
, value
);
1156 DBG(3, "Written bytes: %zd", count
);
1158 mutex_unlock(&sn9c102_sysfs_lock
);
1164 static ssize_t
sn9c102_show_i2c_reg(struct device
* cd
,
1165 struct device_attribute
*attr
, char* buf
)
1167 struct sn9c102_device
* cam
;
1170 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1171 return -ERESTARTSYS
;
1173 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1176 mutex_unlock(&sn9c102_sysfs_lock
);
1180 count
= sprintf(buf
, "%u\n", cam
->sysfs
.i2c_reg
);
1182 DBG(3, "Read bytes: %zd", count
);
1184 mutex_unlock(&sn9c102_sysfs_lock
);
1191 sn9c102_store_i2c_reg(struct device
* cd
, struct device_attribute
*attr
,
1192 const char* buf
, size_t len
)
1194 struct sn9c102_device
* cam
;
1198 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1199 return -ERESTARTSYS
;
1201 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1204 mutex_unlock(&sn9c102_sysfs_lock
);
1208 index
= sn9c102_strtou16(buf
, len
, &count
);
1210 mutex_unlock(&sn9c102_sysfs_lock
);
1214 cam
->sysfs
.i2c_reg
= index
;
1216 DBG(2, "Moved sensor register index to 0x%02X", cam
->sysfs
.i2c_reg
);
1217 DBG(3, "Written bytes: %zd", count
);
1219 mutex_unlock(&sn9c102_sysfs_lock
);
1225 static ssize_t
sn9c102_show_i2c_val(struct device
* cd
,
1226 struct device_attribute
*attr
, char* buf
)
1228 struct sn9c102_device
* cam
;
1232 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1233 return -ERESTARTSYS
;
1235 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1238 mutex_unlock(&sn9c102_sysfs_lock
);
1242 if (!(cam
->sensor
.sysfs_ops
& SN9C102_I2C_READ
)) {
1243 mutex_unlock(&sn9c102_sysfs_lock
);
1247 if ((val
= sn9c102_i2c_read(cam
, cam
->sysfs
.i2c_reg
)) < 0) {
1248 mutex_unlock(&sn9c102_sysfs_lock
);
1252 count
= sprintf(buf
, "%d\n", val
);
1254 DBG(3, "Read bytes: %zd, value: %d", count
, val
);
1256 mutex_unlock(&sn9c102_sysfs_lock
);
1263 sn9c102_store_i2c_val(struct device
* cd
, struct device_attribute
*attr
,
1264 const char* buf
, size_t len
)
1266 struct sn9c102_device
* cam
;
1271 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1272 return -ERESTARTSYS
;
1274 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1277 mutex_unlock(&sn9c102_sysfs_lock
);
1281 if (!(cam
->sensor
.sysfs_ops
& SN9C102_I2C_WRITE
)) {
1282 mutex_unlock(&sn9c102_sysfs_lock
);
1286 value
= sn9c102_strtou16(buf
, len
, &count
);
1288 mutex_unlock(&sn9c102_sysfs_lock
);
1292 err
= sn9c102_i2c_write(cam
, cam
->sysfs
.i2c_reg
, value
);
1294 mutex_unlock(&sn9c102_sysfs_lock
);
1298 DBG(2, "Written sensor reg. 0x%02X, val. 0x%02X",
1299 cam
->sysfs
.i2c_reg
, value
);
1300 DBG(3, "Written bytes: %zd", count
);
1302 mutex_unlock(&sn9c102_sysfs_lock
);
1309 sn9c102_store_green(struct device
* cd
, struct device_attribute
*attr
,
1310 const char* buf
, size_t len
)
1312 struct sn9c102_device
* cam
;
1313 enum sn9c102_bridge bridge
;
1318 if (mutex_lock_interruptible(&sn9c102_sysfs_lock
))
1319 return -ERESTARTSYS
;
1321 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1324 mutex_unlock(&sn9c102_sysfs_lock
);
1328 bridge
= cam
->bridge
;
1330 mutex_unlock(&sn9c102_sysfs_lock
);
1332 value
= sn9c102_strtou16(buf
, len
, &count
);
1337 case BRIDGE_SN9C101
:
1338 case BRIDGE_SN9C102
:
1341 if ((res
= sn9c102_store_reg(cd
, attr
, "0x11", 4)) >= 0)
1342 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1344 case BRIDGE_SN9C103
:
1345 case BRIDGE_SN9C105
:
1346 case BRIDGE_SN9C120
:
1349 if ((res
= sn9c102_store_reg(cd
, attr
, "0x07", 4)) >= 0)
1350 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1359 sn9c102_store_blue(struct device
* cd
, struct device_attribute
*attr
,
1360 const char* buf
, size_t len
)
1366 value
= sn9c102_strtou16(buf
, len
, &count
);
1367 if (!count
|| value
> 0x7f)
1370 if ((res
= sn9c102_store_reg(cd
, attr
, "0x06", 4)) >= 0)
1371 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1378 sn9c102_store_red(struct device
* cd
, struct device_attribute
*attr
,
1379 const char* buf
, size_t len
)
1385 value
= sn9c102_strtou16(buf
, len
, &count
);
1386 if (!count
|| value
> 0x7f)
1389 if ((res
= sn9c102_store_reg(cd
, attr
, "0x05", 4)) >= 0)
1390 res
= sn9c102_store_val(cd
, attr
, buf
, len
);
1396 static ssize_t
sn9c102_show_frame_header(struct device
* cd
,
1397 struct device_attribute
*attr
,
1400 struct sn9c102_device
* cam
;
1403 cam
= video_get_drvdata(container_of(cd
, struct video_device
,
1408 count
= sizeof(cam
->sysfs
.frame_header
);
1409 memcpy(buf
, cam
->sysfs
.frame_header
, count
);
1411 DBG(3, "Frame header, read bytes: %zd", count
);
1417 static DEVICE_ATTR(reg
, S_IRUGO
| S_IWUSR
, sn9c102_show_reg
, sn9c102_store_reg
);
1418 static DEVICE_ATTR(val
, S_IRUGO
| S_IWUSR
, sn9c102_show_val
, sn9c102_store_val
);
1419 static DEVICE_ATTR(i2c_reg
, S_IRUGO
| S_IWUSR
,
1420 sn9c102_show_i2c_reg
, sn9c102_store_i2c_reg
);
1421 static DEVICE_ATTR(i2c_val
, S_IRUGO
| S_IWUSR
,
1422 sn9c102_show_i2c_val
, sn9c102_store_i2c_val
);
1423 static DEVICE_ATTR(green
, S_IWUGO
, NULL
, sn9c102_store_green
);
1424 static DEVICE_ATTR(blue
, S_IWUGO
, NULL
, sn9c102_store_blue
);
1425 static DEVICE_ATTR(red
, S_IWUGO
, NULL
, sn9c102_store_red
);
1426 static DEVICE_ATTR(frame_header
, S_IRUGO
, sn9c102_show_frame_header
, NULL
);
1429 static int sn9c102_create_sysfs(struct sn9c102_device
* cam
)
1431 struct device
*classdev
= &(cam
->v4ldev
->class_dev
);
1434 if ((err
= device_create_file(classdev
, &dev_attr_reg
)))
1436 if ((err
= device_create_file(classdev
, &dev_attr_val
)))
1438 if ((err
= device_create_file(classdev
, &dev_attr_frame_header
)))
1441 if (cam
->sensor
.sysfs_ops
) {
1442 if ((err
= device_create_file(classdev
, &dev_attr_i2c_reg
)))
1443 goto err_frame_header
;
1444 if ((err
= device_create_file(classdev
, &dev_attr_i2c_val
)))
1448 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
) {
1449 if ((err
= device_create_file(classdev
, &dev_attr_green
)))
1452 if ((err
= device_create_file(classdev
, &dev_attr_blue
)))
1454 if ((err
= device_create_file(classdev
, &dev_attr_red
)))
1461 device_remove_file(classdev
, &dev_attr_blue
);
1463 if (cam
->sensor
.sysfs_ops
)
1464 device_remove_file(classdev
, &dev_attr_i2c_val
);
1466 if (cam
->sensor
.sysfs_ops
)
1467 device_remove_file(classdev
, &dev_attr_i2c_reg
);
1469 device_remove_file(classdev
, &dev_attr_frame_header
);
1471 device_remove_file(classdev
, &dev_attr_val
);
1473 device_remove_file(classdev
, &dev_attr_reg
);
1477 #endif /* CONFIG_VIDEO_ADV_DEBUG */
1479 /*****************************************************************************/
1482 sn9c102_set_pix_format(struct sn9c102_device
* cam
, struct v4l2_pix_format
* pix
)
1486 if (pix
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
1487 pix
->pixelformat
== V4L2_PIX_FMT_JPEG
) {
1488 switch (cam
->bridge
) {
1489 case BRIDGE_SN9C101
:
1490 case BRIDGE_SN9C102
:
1491 case BRIDGE_SN9C103
:
1492 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x80,
1495 case BRIDGE_SN9C105
:
1496 case BRIDGE_SN9C120
:
1497 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0x7f,
1502 switch (cam
->bridge
) {
1503 case BRIDGE_SN9C101
:
1504 case BRIDGE_SN9C102
:
1505 case BRIDGE_SN9C103
:
1506 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0x7f,
1509 case BRIDGE_SN9C105
:
1510 case BRIDGE_SN9C120
:
1511 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x80,
1517 return err
? -EIO
: 0;
1522 sn9c102_set_compression(struct sn9c102_device
* cam
,
1523 struct v4l2_jpegcompression
* compression
)
1527 switch (cam
->bridge
) {
1528 case BRIDGE_SN9C101
:
1529 case BRIDGE_SN9C102
:
1530 case BRIDGE_SN9C103
:
1531 if (compression
->quality
== 0)
1532 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x17] | 0x01,
1534 else if (compression
->quality
== 1)
1535 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x17] & 0xfe,
1538 case BRIDGE_SN9C105
:
1539 case BRIDGE_SN9C120
:
1540 if (compression
->quality
== 0) {
1541 for (i
= 0; i
<= 63; i
++) {
1542 err
+= sn9c102_write_reg(cam
,
1543 SN9C102_Y_QTABLE1
[i
],
1545 err
+= sn9c102_write_reg(cam
,
1546 SN9C102_UV_QTABLE1
[i
],
1549 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] & 0xbf,
1551 } else if (compression
->quality
== 1) {
1552 for (i
= 0; i
<= 63; i
++) {
1553 err
+= sn9c102_write_reg(cam
,
1554 SN9C102_Y_QTABLE1
[i
],
1556 err
+= sn9c102_write_reg(cam
,
1557 SN9C102_UV_QTABLE1
[i
],
1560 err
+= sn9c102_write_reg(cam
, cam
->reg
[0x18] | 0x40,
1566 return err
? -EIO
: 0;
1570 static int sn9c102_set_scale(struct sn9c102_device
* cam
, u8 scale
)
1576 r
= cam
->reg
[0x18] & 0xcf;
1577 else if (scale
== 2) {
1578 r
= cam
->reg
[0x18] & 0xcf;
1580 } else if (scale
== 4)
1581 r
= cam
->reg
[0x18] | 0x20;
1583 err
+= sn9c102_write_reg(cam
, r
, 0x18);
1587 PDBGG("Scaling factor: %u", scale
);
1593 static int sn9c102_set_crop(struct sn9c102_device
* cam
, struct v4l2_rect
* rect
)
1595 struct sn9c102_sensor
* s
= &cam
->sensor
;
1596 u8 h_start
= (u8
)(rect
->left
- s
->cropcap
.bounds
.left
),
1597 v_start
= (u8
)(rect
->top
- s
->cropcap
.bounds
.top
),
1598 h_size
= (u8
)(rect
->width
/ 16),
1599 v_size
= (u8
)(rect
->height
/ 16);
1602 err
+= sn9c102_write_reg(cam
, h_start
, 0x12);
1603 err
+= sn9c102_write_reg(cam
, v_start
, 0x13);
1604 err
+= sn9c102_write_reg(cam
, h_size
, 0x15);
1605 err
+= sn9c102_write_reg(cam
, v_size
, 0x16);
1609 PDBGG("h_start, v_start, h_size, v_size, ho_size, vo_size "
1610 "%u %u %u %u", h_start
, v_start
, h_size
, v_size
);
1616 static int sn9c102_init(struct sn9c102_device
* cam
)
1618 struct sn9c102_sensor
* s
= &cam
->sensor
;
1619 struct v4l2_control ctrl
;
1620 struct v4l2_queryctrl
*qctrl
;
1621 struct v4l2_rect
* rect
;
1625 if (!(cam
->state
& DEV_INITIALIZED
)) {
1626 mutex_init(&cam
->open_mutex
);
1627 init_waitqueue_head(&cam
->wait_open
);
1629 rect
= &(s
->cropcap
.defrect
);
1630 } else { /* use current values */
1635 err
+= sn9c102_set_scale(cam
, rect
->width
/ s
->pix_format
.width
);
1636 err
+= sn9c102_set_crop(cam
, rect
);
1643 DBG(3, "Sensor initialization failed");
1648 if (!(cam
->state
& DEV_INITIALIZED
))
1649 if (cam
->bridge
== BRIDGE_SN9C101
||
1650 cam
->bridge
== BRIDGE_SN9C102
||
1651 cam
->bridge
== BRIDGE_SN9C103
) {
1652 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
1653 s
->pix_format
.pixelformat
= V4L2_PIX_FMT_SBGGR8
;
1654 cam
->compression
.quality
= cam
->reg
[0x17] & 0x01 ?
1657 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
)
1658 s
->pix_format
.pixelformat
= V4L2_PIX_FMT_JPEG
;
1659 cam
->compression
.quality
= cam
->reg
[0x18] & 0x40 ?
1661 err
+= sn9c102_set_compression(cam
, &cam
->compression
);
1664 err
+= sn9c102_set_compression(cam
, &cam
->compression
);
1665 err
+= sn9c102_set_pix_format(cam
, &s
->pix_format
);
1666 if (s
->set_pix_format
)
1667 err
+= s
->set_pix_format(cam
, &s
->pix_format
);
1671 if (s
->pix_format
.pixelformat
== V4L2_PIX_FMT_SN9C10X
||
1672 s
->pix_format
.pixelformat
== V4L2_PIX_FMT_JPEG
)
1673 DBG(3, "Compressed video format is active, quality %d",
1674 cam
->compression
.quality
);
1676 DBG(3, "Uncompressed video format is active");
1679 if ((err
= s
->set_crop(cam
, rect
))) {
1680 DBG(3, "set_crop() failed");
1685 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
1686 if (s
->qctrl
[i
].id
!= 0 &&
1687 !(s
->qctrl
[i
].flags
& V4L2_CTRL_FLAG_DISABLED
)) {
1688 ctrl
.id
= s
->qctrl
[i
].id
;
1689 ctrl
.value
= qctrl
[i
].default_value
;
1690 err
= s
->set_ctrl(cam
, &ctrl
);
1692 DBG(3, "Set %s control failed",
1696 DBG(3, "Image sensor supports '%s' control",
1701 if (!(cam
->state
& DEV_INITIALIZED
)) {
1702 mutex_init(&cam
->fileop_mutex
);
1703 spin_lock_init(&cam
->queue_lock
);
1704 init_waitqueue_head(&cam
->wait_frame
);
1705 init_waitqueue_head(&cam
->wait_stream
);
1706 cam
->nreadbuffers
= 2;
1707 memcpy(s
->_qctrl
, s
->qctrl
, sizeof(s
->qctrl
));
1708 memcpy(&(s
->_rect
), &(s
->cropcap
.defrect
),
1709 sizeof(struct v4l2_rect
));
1710 cam
->state
|= DEV_INITIALIZED
;
1713 DBG(2, "Initialization succeeded");
1717 /*****************************************************************************/
1719 static void sn9c102_release_resources(struct kref
*kref
)
1721 struct sn9c102_device
*cam
;
1723 mutex_lock(&sn9c102_sysfs_lock
);
1725 cam
= container_of(kref
, struct sn9c102_device
, kref
);
1727 DBG(2, "V4L2 device /dev/video%d deregistered", cam
->v4ldev
->minor
);
1728 video_set_drvdata(cam
->v4ldev
, NULL
);
1729 video_unregister_device(cam
->v4ldev
);
1730 usb_put_dev(cam
->usbdev
);
1731 kfree(cam
->control_buffer
);
1734 mutex_unlock(&sn9c102_sysfs_lock
);
1739 static int sn9c102_open(struct inode
* inode
, struct file
* filp
)
1741 struct sn9c102_device
* cam
;
1745 A read_trylock() in open() is the only safe way to prevent race
1746 conditions with disconnect(), one close() and multiple (not
1747 necessarily simultaneous) attempts to open(). For example, it
1748 prevents from waiting for a second access, while the device
1749 structure is being deallocated, after a possible disconnect() and
1750 during a following close() holding the write lock: given that, after
1751 this deallocation, no access will be possible anymore, using the
1752 non-trylock version would have let open() gain the access to the
1753 device structure improperly.
1754 For this reason the lock must also not be per-device.
1756 if (!down_read_trylock(&sn9c102_dev_lock
))
1757 return -ERESTARTSYS
;
1759 cam
= video_get_drvdata(video_devdata(filp
));
1761 if (wait_for_completion_interruptible(&cam
->probe
)) {
1762 up_read(&sn9c102_dev_lock
);
1763 return -ERESTARTSYS
;
1766 kref_get(&cam
->kref
);
1769 Make sure to isolate all the simultaneous opens.
1771 if (mutex_lock_interruptible(&cam
->open_mutex
)) {
1772 kref_put(&cam
->kref
, sn9c102_release_resources
);
1773 up_read(&sn9c102_dev_lock
);
1774 return -ERESTARTSYS
;
1777 if (cam
->state
& DEV_DISCONNECTED
) {
1778 DBG(1, "Device not present");
1784 DBG(2, "Device /dev/video%d is already in use",
1785 cam
->v4ldev
->minor
);
1786 DBG(3, "Simultaneous opens are not supported");
1788 open() must follow the open flags and should block
1789 eventually while the device is in use.
1791 if ((filp
->f_flags
& O_NONBLOCK
) ||
1792 (filp
->f_flags
& O_NDELAY
)) {
1796 DBG(2, "A blocking open() has been requested. Wait for the "
1797 "device to be released...");
1798 up_read(&sn9c102_dev_lock
);
1800 We will not release the "open_mutex" lock, so that only one
1801 process can be in the wait queue below. This way the process
1802 will be sleeping while holding the lock, without loosing its
1803 priority after any wake_up().
1805 err
= wait_event_interruptible_exclusive(cam
->wait_open
,
1806 (cam
->state
& DEV_DISCONNECTED
)
1808 down_read(&sn9c102_dev_lock
);
1811 if (cam
->state
& DEV_DISCONNECTED
) {
1817 if (cam
->state
& DEV_MISCONFIGURED
) {
1818 err
= sn9c102_init(cam
);
1820 DBG(1, "Initialization failed again. "
1821 "I will retry on next open().");
1824 cam
->state
&= ~DEV_MISCONFIGURED
;
1827 if ((err
= sn9c102_start_transfer(cam
)))
1830 filp
->private_data
= cam
;
1833 cam
->stream
= STREAM_OFF
;
1835 cam
->frame_count
= 0;
1836 sn9c102_empty_framequeues(cam
);
1838 DBG(3, "Video device /dev/video%d is open", cam
->v4ldev
->minor
);
1841 mutex_unlock(&cam
->open_mutex
);
1843 kref_put(&cam
->kref
, sn9c102_release_resources
);
1845 up_read(&sn9c102_dev_lock
);
1850 static int sn9c102_release(struct inode
* inode
, struct file
* filp
)
1852 struct sn9c102_device
* cam
;
1854 down_write(&sn9c102_dev_lock
);
1856 cam
= video_get_drvdata(video_devdata(filp
));
1858 sn9c102_stop_transfer(cam
);
1859 sn9c102_release_buffers(cam
);
1861 wake_up_interruptible_nr(&cam
->wait_open
, 1);
1863 DBG(3, "Video device /dev/video%d closed", cam
->v4ldev
->minor
);
1865 kref_put(&cam
->kref
, sn9c102_release_resources
);
1867 up_write(&sn9c102_dev_lock
);
1874 sn9c102_read(struct file
* filp
, char __user
* buf
, size_t count
, loff_t
* f_pos
)
1876 struct sn9c102_device
* cam
= video_get_drvdata(video_devdata(filp
));
1877 struct sn9c102_frame_t
* f
, * i
;
1878 unsigned long lock_flags
;
1882 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
1883 return -ERESTARTSYS
;
1885 if (cam
->state
& DEV_DISCONNECTED
) {
1886 DBG(1, "Device not present");
1887 mutex_unlock(&cam
->fileop_mutex
);
1891 if (cam
->state
& DEV_MISCONFIGURED
) {
1892 DBG(1, "The camera is misconfigured. Close and open it "
1894 mutex_unlock(&cam
->fileop_mutex
);
1898 if (cam
->io
== IO_MMAP
) {
1899 DBG(3, "Close and open the device again to choose "
1901 mutex_unlock(&cam
->fileop_mutex
);
1905 if (cam
->io
== IO_NONE
) {
1906 if (!sn9c102_request_buffers(cam
,cam
->nreadbuffers
, IO_READ
)) {
1907 DBG(1, "read() failed, not enough memory");
1908 mutex_unlock(&cam
->fileop_mutex
);
1912 cam
->stream
= STREAM_ON
;
1915 if (list_empty(&cam
->inqueue
)) {
1916 if (!list_empty(&cam
->outqueue
))
1917 sn9c102_empty_framequeues(cam
);
1918 sn9c102_queue_unusedframes(cam
);
1922 mutex_unlock(&cam
->fileop_mutex
);
1926 if (list_empty(&cam
->outqueue
)) {
1927 if (filp
->f_flags
& O_NONBLOCK
) {
1928 mutex_unlock(&cam
->fileop_mutex
);
1931 if (!cam
->module_param
.frame_timeout
) {
1932 err
= wait_event_interruptible
1934 (!list_empty(&cam
->outqueue
)) ||
1935 (cam
->state
& DEV_DISCONNECTED
) ||
1936 (cam
->state
& DEV_MISCONFIGURED
) );
1938 mutex_unlock(&cam
->fileop_mutex
);
1942 timeout
= wait_event_interruptible_timeout
1944 (!list_empty(&cam
->outqueue
)) ||
1945 (cam
->state
& DEV_DISCONNECTED
) ||
1946 (cam
->state
& DEV_MISCONFIGURED
),
1947 cam
->module_param
.frame_timeout
*
1948 1000 * msecs_to_jiffies(1) );
1950 mutex_unlock(&cam
->fileop_mutex
);
1952 } else if (timeout
== 0 &&
1953 !(cam
->state
& DEV_DISCONNECTED
)) {
1954 DBG(1, "Video frame timeout elapsed");
1955 mutex_unlock(&cam
->fileop_mutex
);
1959 if (cam
->state
& DEV_DISCONNECTED
) {
1960 mutex_unlock(&cam
->fileop_mutex
);
1963 if (cam
->state
& DEV_MISCONFIGURED
) {
1964 mutex_unlock(&cam
->fileop_mutex
);
1969 f
= list_entry(cam
->outqueue
.prev
, struct sn9c102_frame_t
, frame
);
1971 if (count
> f
->buf
.bytesused
)
1972 count
= f
->buf
.bytesused
;
1974 if (copy_to_user(buf
, f
->bufmem
, count
)) {
1981 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
1982 list_for_each_entry(i
, &cam
->outqueue
, frame
)
1983 i
->state
= F_UNUSED
;
1984 INIT_LIST_HEAD(&cam
->outqueue
);
1985 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
1987 sn9c102_queue_unusedframes(cam
);
1989 PDBGG("Frame #%lu, bytes read: %zu",
1990 (unsigned long)f
->buf
.index
, count
);
1992 mutex_unlock(&cam
->fileop_mutex
);
1998 static unsigned int sn9c102_poll(struct file
*filp
, poll_table
*wait
)
2000 struct sn9c102_device
* cam
= video_get_drvdata(video_devdata(filp
));
2001 struct sn9c102_frame_t
* f
;
2002 unsigned long lock_flags
;
2003 unsigned int mask
= 0;
2005 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
2008 if (cam
->state
& DEV_DISCONNECTED
) {
2009 DBG(1, "Device not present");
2013 if (cam
->state
& DEV_MISCONFIGURED
) {
2014 DBG(1, "The camera is misconfigured. Close and open it "
2019 if (cam
->io
== IO_NONE
) {
2020 if (!sn9c102_request_buffers(cam
, cam
->nreadbuffers
,
2022 DBG(1, "poll() failed, not enough memory");
2026 cam
->stream
= STREAM_ON
;
2029 if (cam
->io
== IO_READ
) {
2030 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2031 list_for_each_entry(f
, &cam
->outqueue
, frame
)
2032 f
->state
= F_UNUSED
;
2033 INIT_LIST_HEAD(&cam
->outqueue
);
2034 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2035 sn9c102_queue_unusedframes(cam
);
2038 poll_wait(filp
, &cam
->wait_frame
, wait
);
2040 if (!list_empty(&cam
->outqueue
))
2041 mask
|= POLLIN
| POLLRDNORM
;
2043 mutex_unlock(&cam
->fileop_mutex
);
2048 mutex_unlock(&cam
->fileop_mutex
);
2053 static void sn9c102_vm_open(struct vm_area_struct
* vma
)
2055 struct sn9c102_frame_t
* f
= vma
->vm_private_data
;
2060 static void sn9c102_vm_close(struct vm_area_struct
* vma
)
2062 /* NOTE: buffers are not freed here */
2063 struct sn9c102_frame_t
* f
= vma
->vm_private_data
;
2068 static struct vm_operations_struct sn9c102_vm_ops
= {
2069 .open
= sn9c102_vm_open
,
2070 .close
= sn9c102_vm_close
,
2074 static int sn9c102_mmap(struct file
* filp
, struct vm_area_struct
*vma
)
2076 struct sn9c102_device
* cam
= video_get_drvdata(video_devdata(filp
));
2077 unsigned long size
= vma
->vm_end
- vma
->vm_start
,
2078 start
= vma
->vm_start
;
2082 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
2083 return -ERESTARTSYS
;
2085 if (cam
->state
& DEV_DISCONNECTED
) {
2086 DBG(1, "Device not present");
2087 mutex_unlock(&cam
->fileop_mutex
);
2091 if (cam
->state
& DEV_MISCONFIGURED
) {
2092 DBG(1, "The camera is misconfigured. Close and open it "
2094 mutex_unlock(&cam
->fileop_mutex
);
2098 if (!(vma
->vm_flags
& (VM_WRITE
| VM_READ
))) {
2099 mutex_unlock(&cam
->fileop_mutex
);
2103 if (cam
->io
!= IO_MMAP
||
2104 size
!= PAGE_ALIGN(cam
->frame
[0].buf
.length
)) {
2105 mutex_unlock(&cam
->fileop_mutex
);
2109 for (i
= 0; i
< cam
->nbuffers
; i
++) {
2110 if ((cam
->frame
[i
].buf
.m
.offset
>>PAGE_SHIFT
) == vma
->vm_pgoff
)
2113 if (i
== cam
->nbuffers
) {
2114 mutex_unlock(&cam
->fileop_mutex
);
2118 vma
->vm_flags
|= VM_IO
;
2119 vma
->vm_flags
|= VM_RESERVED
;
2121 pos
= cam
->frame
[i
].bufmem
;
2122 while (size
> 0) { /* size is page-aligned */
2123 if (vm_insert_page(vma
, start
, vmalloc_to_page(pos
))) {
2124 mutex_unlock(&cam
->fileop_mutex
);
2132 vma
->vm_ops
= &sn9c102_vm_ops
;
2133 vma
->vm_private_data
= &cam
->frame
[i
];
2134 sn9c102_vm_open(vma
);
2136 mutex_unlock(&cam
->fileop_mutex
);
2141 /*****************************************************************************/
2144 sn9c102_vidioc_querycap(struct sn9c102_device
* cam
, void __user
* arg
)
2146 struct v4l2_capability cap
= {
2147 .driver
= "sn9c102",
2148 .version
= SN9C102_MODULE_VERSION_CODE
,
2149 .capabilities
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_READWRITE
|
2153 strlcpy(cap
.card
, cam
->v4ldev
->name
, sizeof(cap
.card
));
2154 if (usb_make_path(cam
->usbdev
, cap
.bus_info
, sizeof(cap
.bus_info
)) < 0)
2155 strlcpy(cap
.bus_info
, cam
->usbdev
->dev
.bus_id
,
2156 sizeof(cap
.bus_info
));
2158 if (copy_to_user(arg
, &cap
, sizeof(cap
)))
2166 sn9c102_vidioc_enuminput(struct sn9c102_device
* cam
, void __user
* arg
)
2168 struct v4l2_input i
;
2170 if (copy_from_user(&i
, arg
, sizeof(i
)))
2176 memset(&i
, 0, sizeof(i
));
2177 strcpy(i
.name
, "Camera");
2178 i
.type
= V4L2_INPUT_TYPE_CAMERA
;
2180 if (copy_to_user(arg
, &i
, sizeof(i
)))
2188 sn9c102_vidioc_g_input(struct sn9c102_device
* cam
, void __user
* arg
)
2192 if (copy_to_user(arg
, &index
, sizeof(index
)))
2200 sn9c102_vidioc_s_input(struct sn9c102_device
* cam
, void __user
* arg
)
2204 if (copy_from_user(&index
, arg
, sizeof(index
)))
2215 sn9c102_vidioc_query_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2217 struct sn9c102_sensor
* s
= &cam
->sensor
;
2218 struct v4l2_queryctrl qc
;
2221 if (copy_from_user(&qc
, arg
, sizeof(qc
)))
2224 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
2225 if (qc
.id
&& qc
.id
== s
->qctrl
[i
].id
) {
2226 memcpy(&qc
, &(s
->qctrl
[i
]), sizeof(qc
));
2227 if (copy_to_user(arg
, &qc
, sizeof(qc
)))
2237 sn9c102_vidioc_g_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2239 struct sn9c102_sensor
* s
= &cam
->sensor
;
2240 struct v4l2_control ctrl
;
2244 if (!s
->get_ctrl
&& !s
->set_ctrl
)
2247 if (copy_from_user(&ctrl
, arg
, sizeof(ctrl
)))
2251 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
2252 if (ctrl
.id
&& ctrl
.id
== s
->qctrl
[i
].id
) {
2253 ctrl
.value
= s
->_qctrl
[i
].default_value
;
2258 err
= s
->get_ctrl(cam
, &ctrl
);
2261 if (copy_to_user(arg
, &ctrl
, sizeof(ctrl
)))
2264 PDBGG("VIDIOC_G_CTRL: id %lu, value %lu",
2265 (unsigned long)ctrl
.id
, (unsigned long)ctrl
.value
);
2272 sn9c102_vidioc_s_ctrl(struct sn9c102_device
* cam
, void __user
* arg
)
2274 struct sn9c102_sensor
* s
= &cam
->sensor
;
2275 struct v4l2_control ctrl
;
2282 if (copy_from_user(&ctrl
, arg
, sizeof(ctrl
)))
2285 for (i
= 0; i
< ARRAY_SIZE(s
->qctrl
); i
++)
2286 if (ctrl
.id
== s
->qctrl
[i
].id
) {
2287 if (s
->qctrl
[i
].flags
& V4L2_CTRL_FLAG_DISABLED
)
2289 if (ctrl
.value
< s
->qctrl
[i
].minimum
||
2290 ctrl
.value
> s
->qctrl
[i
].maximum
)
2292 ctrl
.value
-= ctrl
.value
% s
->qctrl
[i
].step
;
2296 if ((err
= s
->set_ctrl(cam
, &ctrl
)))
2299 s
->_qctrl
[i
].default_value
= ctrl
.value
;
2301 PDBGG("VIDIOC_S_CTRL: id %lu, value %lu",
2302 (unsigned long)ctrl
.id
, (unsigned long)ctrl
.value
);
2309 sn9c102_vidioc_cropcap(struct sn9c102_device
* cam
, void __user
* arg
)
2311 struct v4l2_cropcap
* cc
= &(cam
->sensor
.cropcap
);
2313 cc
->type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
2314 cc
->pixelaspect
.numerator
= 1;
2315 cc
->pixelaspect
.denominator
= 1;
2317 if (copy_to_user(arg
, cc
, sizeof(*cc
)))
2325 sn9c102_vidioc_g_crop(struct sn9c102_device
* cam
, void __user
* arg
)
2327 struct sn9c102_sensor
* s
= &cam
->sensor
;
2328 struct v4l2_crop crop
= {
2329 .type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
,
2332 memcpy(&(crop
.c
), &(s
->_rect
), sizeof(struct v4l2_rect
));
2334 if (copy_to_user(arg
, &crop
, sizeof(crop
)))
2342 sn9c102_vidioc_s_crop(struct sn9c102_device
* cam
, void __user
* arg
)
2344 struct sn9c102_sensor
* s
= &cam
->sensor
;
2345 struct v4l2_crop crop
;
2346 struct v4l2_rect
* rect
;
2347 struct v4l2_rect
* bounds
= &(s
->cropcap
.bounds
);
2348 struct v4l2_pix_format
* pix_format
= &(s
->pix_format
);
2350 const enum sn9c102_stream_state stream
= cam
->stream
;
2351 const u32 nbuffers
= cam
->nbuffers
;
2355 if (copy_from_user(&crop
, arg
, sizeof(crop
)))
2360 if (crop
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2363 if (cam
->module_param
.force_munmap
)
2364 for (i
= 0; i
< cam
->nbuffers
; i
++)
2365 if (cam
->frame
[i
].vma_use_count
) {
2366 DBG(3, "VIDIOC_S_CROP failed. "
2367 "Unmap the buffers first.");
2371 /* Preserve R,G or B origin */
2372 rect
->left
= (s
->_rect
.left
& 1L) ? rect
->left
| 1L : rect
->left
& ~1L;
2373 rect
->top
= (s
->_rect
.top
& 1L) ? rect
->top
| 1L : rect
->top
& ~1L;
2375 if (rect
->width
< 16)
2377 if (rect
->height
< 16)
2379 if (rect
->width
> bounds
->width
)
2380 rect
->width
= bounds
->width
;
2381 if (rect
->height
> bounds
->height
)
2382 rect
->height
= bounds
->height
;
2383 if (rect
->left
< bounds
->left
)
2384 rect
->left
= bounds
->left
;
2385 if (rect
->top
< bounds
->top
)
2386 rect
->top
= bounds
->top
;
2387 if (rect
->left
+ rect
->width
> bounds
->left
+ bounds
->width
)
2388 rect
->left
= bounds
->left
+bounds
->width
- rect
->width
;
2389 if (rect
->top
+ rect
->height
> bounds
->top
+ bounds
->height
)
2390 rect
->top
= bounds
->top
+bounds
->height
- rect
->height
;
2392 rect
->width
&= ~15L;
2393 rect
->height
&= ~15L;
2395 if (SN9C102_PRESERVE_IMGSCALE
) {
2396 /* Calculate the actual scaling factor */
2398 a
= rect
->width
* rect
->height
;
2399 b
= pix_format
->width
* pix_format
->height
;
2400 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2404 if (cam
->stream
== STREAM_ON
)
2405 if ((err
= sn9c102_stream_interrupt(cam
)))
2408 if (copy_to_user(arg
, &crop
, sizeof(crop
))) {
2409 cam
->stream
= stream
;
2413 if (cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
)
2414 sn9c102_release_buffers(cam
);
2416 err
= sn9c102_set_crop(cam
, rect
);
2418 err
+= s
->set_crop(cam
, rect
);
2419 err
+= sn9c102_set_scale(cam
, scale
);
2421 if (err
) { /* atomic, no rollback in ioctl() */
2422 cam
->state
|= DEV_MISCONFIGURED
;
2423 DBG(1, "VIDIOC_S_CROP failed because of hardware problems. To "
2424 "use the camera, close and open /dev/video%d again.",
2425 cam
->v4ldev
->minor
);
2429 s
->pix_format
.width
= rect
->width
/scale
;
2430 s
->pix_format
.height
= rect
->height
/scale
;
2431 memcpy(&(s
->_rect
), rect
, sizeof(*rect
));
2433 if ((cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
) &&
2434 nbuffers
!= sn9c102_request_buffers(cam
, nbuffers
, cam
->io
)) {
2435 cam
->state
|= DEV_MISCONFIGURED
;
2436 DBG(1, "VIDIOC_S_CROP failed because of not enough memory. To "
2437 "use the camera, close and open /dev/video%d again.",
2438 cam
->v4ldev
->minor
);
2442 if (cam
->io
== IO_READ
)
2443 sn9c102_empty_framequeues(cam
);
2444 else if (cam
->module_param
.force_munmap
)
2445 sn9c102_requeue_outqueue(cam
);
2447 cam
->stream
= stream
;
2454 sn9c102_vidioc_enum_framesizes(struct sn9c102_device
* cam
, void __user
* arg
)
2456 struct v4l2_frmsizeenum frmsize
;
2458 if (copy_from_user(&frmsize
, arg
, sizeof(frmsize
)))
2461 if (frmsize
.index
!= 0)
2464 switch (cam
->bridge
) {
2465 case BRIDGE_SN9C101
:
2466 case BRIDGE_SN9C102
:
2467 case BRIDGE_SN9C103
:
2468 if (frmsize
.pixel_format
!= V4L2_PIX_FMT_SN9C10X
&&
2469 frmsize
.pixel_format
!= V4L2_PIX_FMT_SBGGR8
)
2471 case BRIDGE_SN9C105
:
2472 case BRIDGE_SN9C120
:
2473 if (frmsize
.pixel_format
!= V4L2_PIX_FMT_JPEG
&&
2474 frmsize
.pixel_format
!= V4L2_PIX_FMT_SBGGR8
)
2478 frmsize
.type
= V4L2_FRMSIZE_TYPE_STEPWISE
;
2479 frmsize
.stepwise
.min_width
= frmsize
.stepwise
.step_width
= 16;
2480 frmsize
.stepwise
.min_height
= frmsize
.stepwise
.step_height
= 16;
2481 frmsize
.stepwise
.max_width
= cam
->sensor
.cropcap
.bounds
.width
;
2482 frmsize
.stepwise
.max_height
= cam
->sensor
.cropcap
.bounds
.height
;
2483 memset(&frmsize
.reserved
, 0, sizeof(frmsize
.reserved
));
2485 if (copy_to_user(arg
, &frmsize
, sizeof(frmsize
)))
2493 sn9c102_vidioc_enum_fmt(struct sn9c102_device
* cam
, void __user
* arg
)
2495 struct v4l2_fmtdesc fmtd
;
2497 if (copy_from_user(&fmtd
, arg
, sizeof(fmtd
)))
2500 if (fmtd
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2503 if (fmtd
.index
== 0) {
2504 strcpy(fmtd
.description
, "bayer rgb");
2505 fmtd
.pixelformat
= V4L2_PIX_FMT_SBGGR8
;
2506 } else if (fmtd
.index
== 1) {
2507 switch (cam
->bridge
) {
2508 case BRIDGE_SN9C101
:
2509 case BRIDGE_SN9C102
:
2510 case BRIDGE_SN9C103
:
2511 strcpy(fmtd
.description
, "compressed");
2512 fmtd
.pixelformat
= V4L2_PIX_FMT_SN9C10X
;
2514 case BRIDGE_SN9C105
:
2515 case BRIDGE_SN9C120
:
2516 strcpy(fmtd
.description
, "JPEG");
2517 fmtd
.pixelformat
= V4L2_PIX_FMT_JPEG
;
2520 fmtd
.flags
= V4L2_FMT_FLAG_COMPRESSED
;
2524 fmtd
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
2525 memset(&fmtd
.reserved
, 0, sizeof(fmtd
.reserved
));
2527 if (copy_to_user(arg
, &fmtd
, sizeof(fmtd
)))
2535 sn9c102_vidioc_g_fmt(struct sn9c102_device
* cam
, void __user
* arg
)
2537 struct v4l2_format format
;
2538 struct v4l2_pix_format
* pfmt
= &(cam
->sensor
.pix_format
);
2540 if (copy_from_user(&format
, arg
, sizeof(format
)))
2543 if (format
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2546 pfmt
->colorspace
= (pfmt
->pixelformat
== V4L2_PIX_FMT_JPEG
) ?
2547 V4L2_COLORSPACE_JPEG
: V4L2_COLORSPACE_SRGB
;
2548 pfmt
->bytesperline
= (pfmt
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
2549 pfmt
->pixelformat
== V4L2_PIX_FMT_JPEG
)
2550 ? 0 : (pfmt
->width
* pfmt
->priv
) / 8;
2551 pfmt
->sizeimage
= pfmt
->height
* ((pfmt
->width
*pfmt
->priv
)/8);
2552 pfmt
->field
= V4L2_FIELD_NONE
;
2553 memcpy(&(format
.fmt
.pix
), pfmt
, sizeof(*pfmt
));
2555 if (copy_to_user(arg
, &format
, sizeof(format
)))
2563 sn9c102_vidioc_try_s_fmt(struct sn9c102_device
* cam
, unsigned int cmd
,
2566 struct sn9c102_sensor
* s
= &cam
->sensor
;
2567 struct v4l2_format format
;
2568 struct v4l2_pix_format
* pix
;
2569 struct v4l2_pix_format
* pfmt
= &(s
->pix_format
);
2570 struct v4l2_rect
* bounds
= &(s
->cropcap
.bounds
);
2571 struct v4l2_rect rect
;
2573 const enum sn9c102_stream_state stream
= cam
->stream
;
2574 const u32 nbuffers
= cam
->nbuffers
;
2578 if (copy_from_user(&format
, arg
, sizeof(format
)))
2581 pix
= &(format
.fmt
.pix
);
2583 if (format
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2586 memcpy(&rect
, &(s
->_rect
), sizeof(rect
));
2588 { /* calculate the actual scaling factor */
2590 a
= rect
.width
* rect
.height
;
2591 b
= pix
->width
* pix
->height
;
2592 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2595 rect
.width
= scale
* pix
->width
;
2596 rect
.height
= scale
* pix
->height
;
2598 if (rect
.width
< 16)
2600 if (rect
.height
< 16)
2602 if (rect
.width
> bounds
->left
+ bounds
->width
- rect
.left
)
2603 rect
.width
= bounds
->left
+ bounds
->width
- rect
.left
;
2604 if (rect
.height
> bounds
->top
+ bounds
->height
- rect
.top
)
2605 rect
.height
= bounds
->top
+ bounds
->height
- rect
.top
;
2608 rect
.height
&= ~15L;
2610 { /* adjust the scaling factor */
2612 a
= rect
.width
* rect
.height
;
2613 b
= pix
->width
* pix
->height
;
2614 scale
= b
? (u8
)((a
/ b
) < 4 ? 1 : ((a
/ b
) < 16 ? 2 : 4)) : 1;
2617 pix
->width
= rect
.width
/ scale
;
2618 pix
->height
= rect
.height
/ scale
;
2620 switch (cam
->bridge
) {
2621 case BRIDGE_SN9C101
:
2622 case BRIDGE_SN9C102
:
2623 case BRIDGE_SN9C103
:
2624 if (pix
->pixelformat
!= V4L2_PIX_FMT_SN9C10X
&&
2625 pix
->pixelformat
!= V4L2_PIX_FMT_SBGGR8
)
2626 pix
->pixelformat
= pfmt
->pixelformat
;
2628 case BRIDGE_SN9C105
:
2629 case BRIDGE_SN9C120
:
2630 if (pix
->pixelformat
!= V4L2_PIX_FMT_JPEG
&&
2631 pix
->pixelformat
!= V4L2_PIX_FMT_SBGGR8
)
2632 pix
->pixelformat
= pfmt
->pixelformat
;
2635 pix
->priv
= pfmt
->priv
; /* bpp */
2636 pix
->colorspace
= (pix
->pixelformat
== V4L2_PIX_FMT_JPEG
) ?
2637 V4L2_COLORSPACE_JPEG
: V4L2_COLORSPACE_SRGB
;
2638 pix
->bytesperline
= (pix
->pixelformat
== V4L2_PIX_FMT_SN9C10X
||
2639 pix
->pixelformat
== V4L2_PIX_FMT_JPEG
)
2640 ? 0 : (pix
->width
* pix
->priv
) / 8;
2641 pix
->sizeimage
= pix
->height
* ((pix
->width
* pix
->priv
) / 8);
2642 pix
->field
= V4L2_FIELD_NONE
;
2644 if (cmd
== VIDIOC_TRY_FMT
) {
2645 if (copy_to_user(arg
, &format
, sizeof(format
)))
2650 if (cam
->module_param
.force_munmap
)
2651 for (i
= 0; i
< cam
->nbuffers
; i
++)
2652 if (cam
->frame
[i
].vma_use_count
) {
2653 DBG(3, "VIDIOC_S_FMT failed. Unmap the "
2658 if (cam
->stream
== STREAM_ON
)
2659 if ((err
= sn9c102_stream_interrupt(cam
)))
2662 if (copy_to_user(arg
, &format
, sizeof(format
))) {
2663 cam
->stream
= stream
;
2667 if (cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
)
2668 sn9c102_release_buffers(cam
);
2670 err
+= sn9c102_set_pix_format(cam
, pix
);
2671 err
+= sn9c102_set_crop(cam
, &rect
);
2672 if (s
->set_pix_format
)
2673 err
+= s
->set_pix_format(cam
, pix
);
2675 err
+= s
->set_crop(cam
, &rect
);
2676 err
+= sn9c102_set_scale(cam
, scale
);
2678 if (err
) { /* atomic, no rollback in ioctl() */
2679 cam
->state
|= DEV_MISCONFIGURED
;
2680 DBG(1, "VIDIOC_S_FMT failed because of hardware problems. To "
2681 "use the camera, close and open /dev/video%d again.",
2682 cam
->v4ldev
->minor
);
2686 memcpy(pfmt
, pix
, sizeof(*pix
));
2687 memcpy(&(s
->_rect
), &rect
, sizeof(rect
));
2689 if ((cam
->module_param
.force_munmap
|| cam
->io
== IO_READ
) &&
2690 nbuffers
!= sn9c102_request_buffers(cam
, nbuffers
, cam
->io
)) {
2691 cam
->state
|= DEV_MISCONFIGURED
;
2692 DBG(1, "VIDIOC_S_FMT failed because of not enough memory. To "
2693 "use the camera, close and open /dev/video%d again.",
2694 cam
->v4ldev
->minor
);
2698 if (cam
->io
== IO_READ
)
2699 sn9c102_empty_framequeues(cam
);
2700 else if (cam
->module_param
.force_munmap
)
2701 sn9c102_requeue_outqueue(cam
);
2703 cam
->stream
= stream
;
2710 sn9c102_vidioc_g_jpegcomp(struct sn9c102_device
* cam
, void __user
* arg
)
2712 if (copy_to_user(arg
, &cam
->compression
, sizeof(cam
->compression
)))
2720 sn9c102_vidioc_s_jpegcomp(struct sn9c102_device
* cam
, void __user
* arg
)
2722 struct v4l2_jpegcompression jc
;
2723 const enum sn9c102_stream_state stream
= cam
->stream
;
2726 if (copy_from_user(&jc
, arg
, sizeof(jc
)))
2729 if (jc
.quality
!= 0 && jc
.quality
!= 1)
2732 if (cam
->stream
== STREAM_ON
)
2733 if ((err
= sn9c102_stream_interrupt(cam
)))
2736 err
+= sn9c102_set_compression(cam
, &jc
);
2737 if (err
) { /* atomic, no rollback in ioctl() */
2738 cam
->state
|= DEV_MISCONFIGURED
;
2739 DBG(1, "VIDIOC_S_JPEGCOMP failed because of hardware "
2740 "problems. To use the camera, close and open "
2741 "/dev/video%d again.", cam
->v4ldev
->minor
);
2745 cam
->compression
.quality
= jc
.quality
;
2747 cam
->stream
= stream
;
2754 sn9c102_vidioc_reqbufs(struct sn9c102_device
* cam
, void __user
* arg
)
2756 struct v4l2_requestbuffers rb
;
2760 if (copy_from_user(&rb
, arg
, sizeof(rb
)))
2763 if (rb
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2764 rb
.memory
!= V4L2_MEMORY_MMAP
)
2767 if (cam
->io
== IO_READ
) {
2768 DBG(3, "Close and open the device again to choose the mmap "
2773 for (i
= 0; i
< cam
->nbuffers
; i
++)
2774 if (cam
->frame
[i
].vma_use_count
) {
2775 DBG(3, "VIDIOC_REQBUFS failed. Previous buffers are "
2780 if (cam
->stream
== STREAM_ON
)
2781 if ((err
= sn9c102_stream_interrupt(cam
)))
2784 sn9c102_empty_framequeues(cam
);
2786 sn9c102_release_buffers(cam
);
2788 rb
.count
= sn9c102_request_buffers(cam
, rb
.count
, IO_MMAP
);
2790 if (copy_to_user(arg
, &rb
, sizeof(rb
))) {
2791 sn9c102_release_buffers(cam
);
2796 cam
->io
= rb
.count
? IO_MMAP
: IO_NONE
;
2803 sn9c102_vidioc_querybuf(struct sn9c102_device
* cam
, void __user
* arg
)
2805 struct v4l2_buffer b
;
2807 if (copy_from_user(&b
, arg
, sizeof(b
)))
2810 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2811 b
.index
>= cam
->nbuffers
|| cam
->io
!= IO_MMAP
)
2814 memcpy(&b
, &cam
->frame
[b
.index
].buf
, sizeof(b
));
2816 if (cam
->frame
[b
.index
].vma_use_count
)
2817 b
.flags
|= V4L2_BUF_FLAG_MAPPED
;
2819 if (cam
->frame
[b
.index
].state
== F_DONE
)
2820 b
.flags
|= V4L2_BUF_FLAG_DONE
;
2821 else if (cam
->frame
[b
.index
].state
!= F_UNUSED
)
2822 b
.flags
|= V4L2_BUF_FLAG_QUEUED
;
2824 if (copy_to_user(arg
, &b
, sizeof(b
)))
2832 sn9c102_vidioc_qbuf(struct sn9c102_device
* cam
, void __user
* arg
)
2834 struct v4l2_buffer b
;
2835 unsigned long lock_flags
;
2837 if (copy_from_user(&b
, arg
, sizeof(b
)))
2840 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
||
2841 b
.index
>= cam
->nbuffers
|| cam
->io
!= IO_MMAP
)
2844 if (cam
->frame
[b
.index
].state
!= F_UNUSED
)
2847 cam
->frame
[b
.index
].state
= F_QUEUED
;
2849 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2850 list_add_tail(&cam
->frame
[b
.index
].frame
, &cam
->inqueue
);
2851 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2853 PDBGG("Frame #%lu queued", (unsigned long)b
.index
);
2860 sn9c102_vidioc_dqbuf(struct sn9c102_device
* cam
, struct file
* filp
,
2863 struct v4l2_buffer b
;
2864 struct sn9c102_frame_t
*f
;
2865 unsigned long lock_flags
;
2869 if (copy_from_user(&b
, arg
, sizeof(b
)))
2872 if (b
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
|| cam
->io
!= IO_MMAP
)
2875 if (list_empty(&cam
->outqueue
)) {
2876 if (cam
->stream
== STREAM_OFF
)
2878 if (filp
->f_flags
& O_NONBLOCK
)
2880 if (!cam
->module_param
.frame_timeout
) {
2881 err
= wait_event_interruptible
2883 (!list_empty(&cam
->outqueue
)) ||
2884 (cam
->state
& DEV_DISCONNECTED
) ||
2885 (cam
->state
& DEV_MISCONFIGURED
) );
2889 timeout
= wait_event_interruptible_timeout
2891 (!list_empty(&cam
->outqueue
)) ||
2892 (cam
->state
& DEV_DISCONNECTED
) ||
2893 (cam
->state
& DEV_MISCONFIGURED
),
2894 cam
->module_param
.frame_timeout
*
2895 1000 * msecs_to_jiffies(1) );
2898 else if (timeout
== 0 &&
2899 !(cam
->state
& DEV_DISCONNECTED
)) {
2900 DBG(1, "Video frame timeout elapsed");
2904 if (cam
->state
& DEV_DISCONNECTED
)
2906 if (cam
->state
& DEV_MISCONFIGURED
)
2910 spin_lock_irqsave(&cam
->queue_lock
, lock_flags
);
2911 f
= list_entry(cam
->outqueue
.next
, struct sn9c102_frame_t
, frame
);
2912 list_del(cam
->outqueue
.next
);
2913 spin_unlock_irqrestore(&cam
->queue_lock
, lock_flags
);
2915 f
->state
= F_UNUSED
;
2917 memcpy(&b
, &f
->buf
, sizeof(b
));
2918 if (f
->vma_use_count
)
2919 b
.flags
|= V4L2_BUF_FLAG_MAPPED
;
2921 if (copy_to_user(arg
, &b
, sizeof(b
)))
2924 PDBGG("Frame #%lu dequeued", (unsigned long)f
->buf
.index
);
2931 sn9c102_vidioc_streamon(struct sn9c102_device
* cam
, void __user
* arg
)
2935 if (copy_from_user(&type
, arg
, sizeof(type
)))
2938 if (type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
|| cam
->io
!= IO_MMAP
)
2941 cam
->stream
= STREAM_ON
;
2943 DBG(3, "Stream on");
2950 sn9c102_vidioc_streamoff(struct sn9c102_device
* cam
, void __user
* arg
)
2954 if (copy_from_user(&type
, arg
, sizeof(type
)))
2957 if (type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
|| cam
->io
!= IO_MMAP
)
2960 if (cam
->stream
== STREAM_ON
)
2961 if ((err
= sn9c102_stream_interrupt(cam
)))
2964 sn9c102_empty_framequeues(cam
);
2966 DBG(3, "Stream off");
2973 sn9c102_vidioc_g_parm(struct sn9c102_device
* cam
, void __user
* arg
)
2975 struct v4l2_streamparm sp
;
2977 if (copy_from_user(&sp
, arg
, sizeof(sp
)))
2980 if (sp
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
2983 sp
.parm
.capture
.extendedmode
= 0;
2984 sp
.parm
.capture
.readbuffers
= cam
->nreadbuffers
;
2986 if (copy_to_user(arg
, &sp
, sizeof(sp
)))
2994 sn9c102_vidioc_s_parm(struct sn9c102_device
* cam
, void __user
* arg
)
2996 struct v4l2_streamparm sp
;
2998 if (copy_from_user(&sp
, arg
, sizeof(sp
)))
3001 if (sp
.type
!= V4L2_BUF_TYPE_VIDEO_CAPTURE
)
3004 sp
.parm
.capture
.extendedmode
= 0;
3006 if (sp
.parm
.capture
.readbuffers
== 0)
3007 sp
.parm
.capture
.readbuffers
= cam
->nreadbuffers
;
3009 if (sp
.parm
.capture
.readbuffers
> SN9C102_MAX_FRAMES
)
3010 sp
.parm
.capture
.readbuffers
= SN9C102_MAX_FRAMES
;
3012 if (copy_to_user(arg
, &sp
, sizeof(sp
)))
3015 cam
->nreadbuffers
= sp
.parm
.capture
.readbuffers
;
3022 sn9c102_vidioc_enumaudio(struct sn9c102_device
* cam
, void __user
* arg
)
3024 struct v4l2_audio audio
;
3026 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3029 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3032 if (audio
.index
!= 0)
3035 strcpy(audio
.name
, "Microphone");
3036 audio
.capability
= 0;
3039 if (copy_to_user(arg
, &audio
, sizeof(audio
)))
3047 sn9c102_vidioc_g_audio(struct sn9c102_device
* cam
, void __user
* arg
)
3049 struct v4l2_audio audio
;
3051 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3054 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3057 memset(&audio
, 0, sizeof(audio
));
3058 strcpy(audio
.name
, "Microphone");
3060 if (copy_to_user(arg
, &audio
, sizeof(audio
)))
3068 sn9c102_vidioc_s_audio(struct sn9c102_device
* cam
, void __user
* arg
)
3070 struct v4l2_audio audio
;
3072 if (cam
->bridge
== BRIDGE_SN9C101
|| cam
->bridge
== BRIDGE_SN9C102
)
3075 if (copy_from_user(&audio
, arg
, sizeof(audio
)))
3078 if (audio
.index
!= 0)
3085 static int sn9c102_ioctl_v4l2(struct inode
* inode
, struct file
* filp
,
3086 unsigned int cmd
, void __user
* arg
)
3088 struct sn9c102_device
* cam
= video_get_drvdata(video_devdata(filp
));
3092 case VIDIOC_QUERYCAP
:
3093 return sn9c102_vidioc_querycap(cam
, arg
);
3095 case VIDIOC_ENUMINPUT
:
3096 return sn9c102_vidioc_enuminput(cam
, arg
);
3098 case VIDIOC_G_INPUT
:
3099 return sn9c102_vidioc_g_input(cam
, arg
);
3101 case VIDIOC_S_INPUT
:
3102 return sn9c102_vidioc_s_input(cam
, arg
);
3104 case VIDIOC_QUERYCTRL
:
3105 return sn9c102_vidioc_query_ctrl(cam
, arg
);
3108 return sn9c102_vidioc_g_ctrl(cam
, arg
);
3111 return sn9c102_vidioc_s_ctrl(cam
, arg
);
3113 case VIDIOC_CROPCAP
:
3114 return sn9c102_vidioc_cropcap(cam
, arg
);
3117 return sn9c102_vidioc_g_crop(cam
, arg
);
3120 return sn9c102_vidioc_s_crop(cam
, arg
);
3122 case VIDIOC_ENUM_FRAMESIZES
:
3123 return sn9c102_vidioc_enum_framesizes(cam
, arg
);
3125 case VIDIOC_ENUM_FMT
:
3126 return sn9c102_vidioc_enum_fmt(cam
, arg
);
3129 return sn9c102_vidioc_g_fmt(cam
, arg
);
3131 case VIDIOC_TRY_FMT
:
3133 return sn9c102_vidioc_try_s_fmt(cam
, cmd
, arg
);
3135 case VIDIOC_G_JPEGCOMP
:
3136 return sn9c102_vidioc_g_jpegcomp(cam
, arg
);
3138 case VIDIOC_S_JPEGCOMP
:
3139 return sn9c102_vidioc_s_jpegcomp(cam
, arg
);
3141 case VIDIOC_REQBUFS
:
3142 return sn9c102_vidioc_reqbufs(cam
, arg
);
3144 case VIDIOC_QUERYBUF
:
3145 return sn9c102_vidioc_querybuf(cam
, arg
);
3148 return sn9c102_vidioc_qbuf(cam
, arg
);
3151 return sn9c102_vidioc_dqbuf(cam
, filp
, arg
);
3153 case VIDIOC_STREAMON
:
3154 return sn9c102_vidioc_streamon(cam
, arg
);
3156 case VIDIOC_STREAMOFF
:
3157 return sn9c102_vidioc_streamoff(cam
, arg
);
3160 return sn9c102_vidioc_g_parm(cam
, arg
);
3163 return sn9c102_vidioc_s_parm(cam
, arg
);
3165 case VIDIOC_ENUMAUDIO
:
3166 return sn9c102_vidioc_enumaudio(cam
, arg
);
3168 case VIDIOC_G_AUDIO
:
3169 return sn9c102_vidioc_g_audio(cam
, arg
);
3171 case VIDIOC_S_AUDIO
:
3172 return sn9c102_vidioc_s_audio(cam
, arg
);
3176 case VIDIOC_QUERYSTD
:
3177 case VIDIOC_ENUMSTD
:
3178 case VIDIOC_QUERYMENU
:
3179 case VIDIOC_ENUM_FRAMEINTERVALS
:
3189 static int sn9c102_ioctl(struct inode
* inode
, struct file
* filp
,
3190 unsigned int cmd
, unsigned long arg
)
3192 struct sn9c102_device
* cam
= video_get_drvdata(video_devdata(filp
));
3195 if (mutex_lock_interruptible(&cam
->fileop_mutex
))
3196 return -ERESTARTSYS
;
3198 if (cam
->state
& DEV_DISCONNECTED
) {
3199 DBG(1, "Device not present");
3200 mutex_unlock(&cam
->fileop_mutex
);
3204 if (cam
->state
& DEV_MISCONFIGURED
) {
3205 DBG(1, "The camera is misconfigured. Close and open it "
3207 mutex_unlock(&cam
->fileop_mutex
);
3211 V4LDBG(3, "sn9c102", cmd
);
3213 err
= sn9c102_ioctl_v4l2(inode
, filp
, cmd
, (void __user
*)arg
);
3215 mutex_unlock(&cam
->fileop_mutex
);
3220 /*****************************************************************************/
3222 static const struct file_operations sn9c102_fops
= {
3223 .owner
= THIS_MODULE
,
3224 .open
= sn9c102_open
,
3225 .release
= sn9c102_release
,
3226 .ioctl
= sn9c102_ioctl
,
3227 .compat_ioctl
= v4l_compat_ioctl32
,
3228 .read
= sn9c102_read
,
3229 .poll
= sn9c102_poll
,
3230 .mmap
= sn9c102_mmap
,
3231 .llseek
= no_llseek
,
3234 /*****************************************************************************/
3236 /* It exists a single interface only. We do not need to validate anything. */
3238 sn9c102_usb_probe(struct usb_interface
* intf
, const struct usb_device_id
* id
)
3240 struct usb_device
*udev
= interface_to_usbdev(intf
);
3241 struct sn9c102_device
* cam
;
3242 static unsigned int dev_nr
= 0;
3246 if (!(cam
= kzalloc(sizeof(struct sn9c102_device
), GFP_KERNEL
)))
3251 if (!(cam
->control_buffer
= kzalloc(8, GFP_KERNEL
))) {
3252 DBG(1, "kzalloc() failed");
3257 if (!(cam
->v4ldev
= video_device_alloc())) {
3258 DBG(1, "video_device_alloc() failed");
3263 r
= sn9c102_read_reg(cam
, 0x00);
3264 if (r
< 0 || (r
!= 0x10 && r
!= 0x11 && r
!= 0x12)) {
3265 DBG(1, "Sorry, this is not a SN9C1xx-based camera "
3266 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3271 cam
->bridge
= id
->driver_info
;
3272 switch (cam
->bridge
) {
3273 case BRIDGE_SN9C101
:
3274 case BRIDGE_SN9C102
:
3275 DBG(2, "SN9C10[12] PC Camera Controller detected "
3276 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3278 case BRIDGE_SN9C103
:
3279 DBG(2, "SN9C103 PC Camera Controller detected "
3280 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3282 case BRIDGE_SN9C105
:
3283 DBG(2, "SN9C105 PC Camera Controller detected "
3284 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3286 case BRIDGE_SN9C120
:
3287 DBG(2, "SN9C120 PC Camera Controller detected "
3288 "(vid:pid 0x%04X:0x%04X)", id
->idVendor
, id
->idProduct
);
3292 for (i
= 0; i
< ARRAY_SIZE(sn9c102_sensor_table
); i
++) {
3293 err
= sn9c102_sensor_table
[i
](cam
);
3299 DBG(2, "%s image sensor detected", cam
->sensor
.name
);
3300 DBG(3, "Support for %s maintained by %s",
3301 cam
->sensor
.name
, cam
->sensor
.maintainer
);
3303 DBG(1, "No supported image sensor detected for this bridge");
3308 if (!(cam
->bridge
& cam
->sensor
.supported_bridge
)) {
3309 DBG(1, "Bridge not supported");
3314 if (sn9c102_init(cam
)) {
3315 DBG(1, "Initialization failed. I will retry on open().");
3316 cam
->state
|= DEV_MISCONFIGURED
;
3319 strcpy(cam
->v4ldev
->name
, "SN9C1xx PC Camera");
3320 cam
->v4ldev
->owner
= THIS_MODULE
;
3321 cam
->v4ldev
->type
= VID_TYPE_CAPTURE
| VID_TYPE_SCALES
;
3322 cam
->v4ldev
->fops
= &sn9c102_fops
;
3323 cam
->v4ldev
->minor
= video_nr
[dev_nr
];
3324 cam
->v4ldev
->release
= video_device_release
;
3326 init_completion(&cam
->probe
);
3328 err
= video_register_device(cam
->v4ldev
, VFL_TYPE_GRABBER
,
3331 DBG(1, "V4L2 device registration failed");
3332 if (err
== -ENFILE
&& video_nr
[dev_nr
] == -1)
3333 DBG(1, "Free /dev/videoX node not found");
3334 video_nr
[dev_nr
] = -1;
3335 dev_nr
= (dev_nr
< SN9C102_MAX_DEVICES
-1) ? dev_nr
+1 : 0;
3336 complete_all(&cam
->probe
);
3340 DBG(2, "V4L2 device registered as /dev/video%d", cam
->v4ldev
->minor
);
3342 video_set_drvdata(cam
->v4ldev
, cam
);
3343 cam
->module_param
.force_munmap
= force_munmap
[dev_nr
];
3344 cam
->module_param
.frame_timeout
= frame_timeout
[dev_nr
];
3346 dev_nr
= (dev_nr
< SN9C102_MAX_DEVICES
-1) ? dev_nr
+1 : 0;
3348 #ifdef CONFIG_VIDEO_ADV_DEBUG
3349 err
= sn9c102_create_sysfs(cam
);
3351 DBG(2, "Optional device control through 'sysfs' "
3354 DBG(2, "Failed to create optional 'sysfs' interface for "
3355 "device controlling. Error #%d", err
);
3357 DBG(2, "Optional device control through 'sysfs' interface disabled");
3358 DBG(3, "Compile the kernel with the 'CONFIG_VIDEO_ADV_DEBUG' "
3359 "configuration option to enable it.");
3362 usb_set_intfdata(intf
, cam
);
3363 kref_init(&cam
->kref
);
3364 usb_get_dev(cam
->usbdev
);
3366 complete_all(&cam
->probe
);
3372 kfree(cam
->control_buffer
);
3374 video_device_release(cam
->v4ldev
);
3381 static void sn9c102_usb_disconnect(struct usb_interface
* intf
)
3383 struct sn9c102_device
* cam
;
3385 down_write(&sn9c102_dev_lock
);
3387 cam
= usb_get_intfdata(intf
);
3389 DBG(2, "Disconnecting %s...", cam
->v4ldev
->name
);
3392 DBG(2, "Device /dev/video%d is open! Deregistration and "
3393 "memory deallocation are deferred.",
3394 cam
->v4ldev
->minor
);
3395 cam
->state
|= DEV_MISCONFIGURED
;
3396 sn9c102_stop_transfer(cam
);
3397 cam
->state
|= DEV_DISCONNECTED
;
3398 wake_up_interruptible(&cam
->wait_frame
);
3399 wake_up(&cam
->wait_stream
);
3401 cam
->state
|= DEV_DISCONNECTED
;
3403 wake_up_interruptible_all(&cam
->wait_open
);
3405 kref_put(&cam
->kref
, sn9c102_release_resources
);
3407 up_write(&sn9c102_dev_lock
);
3411 static struct usb_driver sn9c102_usb_driver
= {
3413 .id_table
= sn9c102_id_table
,
3414 .probe
= sn9c102_usb_probe
,
3415 .disconnect
= sn9c102_usb_disconnect
,
3418 /*****************************************************************************/
3420 static int __init
sn9c102_module_init(void)
3424 KDBG(2, SN9C102_MODULE_NAME
" v" SN9C102_MODULE_VERSION
);
3425 KDBG(3, SN9C102_MODULE_AUTHOR
);
3427 if ((err
= usb_register(&sn9c102_usb_driver
)))
3428 KDBG(1, "usb_register() failed");
3434 static void __exit
sn9c102_module_exit(void)
3436 usb_deregister(&sn9c102_usb_driver
);
3440 module_init(sn9c102_module_init
);
3441 module_exit(sn9c102_module_exit
);