1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /* Linux driver for Philips webcam
3 USB and Video4Linux interface part.
4 (C) 1999-2004 Nemosoft Unv.
5 (C) 2004-2006 Luc Saillard (luc@saillard.org)
6 (C) 2011 Hans de Goede <hdegoede@redhat.com>
8 NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
9 driver and thus may have bugs that are not present in the original version.
10 Please send bug reports and support requests to <luc@saillard.org>.
11 The decompression routines have been implemented by reverse-engineering the
12 Nemosoft binary pwcx module. Caveat emptor.
18 This code forms the interface between the USB layers and the Philips
19 specific stuff. Some adanved stuff of the driver falls under an
20 NDA, signed between me and Philips B.V., Eindhoven, the Netherlands, and
21 is thus not distributed in source form. The binary pwcx.o module
22 contains the code that falls under the NDA.
24 In case you're wondering: 'pwc' stands for "Philips WebCam", but
25 I really didn't want to type 'philips_web_cam' every time (I'm lazy as
26 any Linux kernel hacker, but I don't like uncomprehensible abbreviations
29 Oh yes, convention: to disctinguish between all the various pointers to
30 device-structures, I use these names for the pointer variables:
31 udev: struct usb_device *
32 vdev: struct video_device (member of pwc_dev)
33 pdev: struct pwc_devive *
37 - Alvarado: adding whitebalance code
38 - Alistar Moire: QuickCam 3000 Pro device/product ID
39 - Tony Hoyle: Creative Labs Webcam 5 device/product ID
40 - Mark Burazin: solving hang in VIDIOCSYNC when camera gets unplugged
41 - Jk Fang: Sotec Afina Eye ID
42 - Xavier Roche: QuickCam Pro 4000 ID
43 - Jens Knudsen: QuickCam Zoom ID
44 - J. Debert: QuickCam for Notebooks ID
45 - Pham Thanh Nam: webcam snapshot button as an event input device
48 #include <linux/errno.h>
49 #include <linux/init.h>
51 #include <linux/module.h>
52 #include <linux/poll.h>
53 #include <linux/slab.h>
54 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
55 #include <linux/usb/input.h>
57 #include <linux/vmalloc.h>
59 #include <linux/kernel.h> /* simple_strtol() */
62 #include "pwc-kiara.h"
63 #include "pwc-timon.h"
64 #include "pwc-dec23.h"
67 #define CREATE_TRACE_POINTS
68 #include <trace/events/pwc.h>
70 /* Function prototypes and driver templates */
72 /* hotplug device table support */
73 static const struct usb_device_id pwc_device_table
[] = {
74 { USB_DEVICE(0x0471, 0x0302) }, /* Philips models */
75 { USB_DEVICE(0x0471, 0x0303) },
76 { USB_DEVICE(0x0471, 0x0304) },
77 { USB_DEVICE(0x0471, 0x0307) },
78 { USB_DEVICE(0x0471, 0x0308) },
79 { USB_DEVICE(0x0471, 0x030C) },
80 { USB_DEVICE(0x0471, 0x0310) },
81 { USB_DEVICE(0x0471, 0x0311) }, /* Philips ToUcam PRO II */
82 { USB_DEVICE(0x0471, 0x0312) },
83 { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */
84 { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */
85 { USB_DEVICE(0x0471, 0x032C) }, /* Philips SPC 880NC PC Camera */
86 { USB_DEVICE(0x069A, 0x0001) }, /* Askey */
87 { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
88 { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
89 { USB_DEVICE(0x046D, 0x08B2) }, /* Logitech QuickCam Pro 4000 */
90 { USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom (old model) */
91 { USB_DEVICE(0x046D, 0x08B4) }, /* Logitech QuickCam Zoom (new model) */
92 { USB_DEVICE(0x046D, 0x08B5) }, /* Logitech QuickCam Orbit/Sphere */
93 { USB_DEVICE(0x046D, 0x08B6) }, /* Cisco VT Camera */
94 { USB_DEVICE(0x046D, 0x08B7) }, /* Logitech ViewPort AV 100 */
95 { USB_DEVICE(0x046D, 0x08B8) }, /* Logitech (reserved) */
96 { USB_DEVICE(0x055D, 0x9000) }, /* Samsung MPC-C10 */
97 { USB_DEVICE(0x055D, 0x9001) }, /* Samsung MPC-C30 */
98 { USB_DEVICE(0x055D, 0x9002) }, /* Samsung SNC-35E (Ver3.0) */
99 { USB_DEVICE(0x041E, 0x400C) }, /* Creative Webcam 5 */
100 { USB_DEVICE(0x041E, 0x4011) }, /* Creative Webcam Pro Ex */
101 { USB_DEVICE(0x04CC, 0x8116) }, /* Afina Eye */
102 { USB_DEVICE(0x06BE, 0x8116) }, /* new Afina Eye */
103 { USB_DEVICE(0x0d81, 0x1910) }, /* Visionite */
104 { USB_DEVICE(0x0d81, 0x1900) },
107 MODULE_DEVICE_TABLE(usb
, pwc_device_table
);
109 static int usb_pwc_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
);
110 static void usb_pwc_disconnect(struct usb_interface
*intf
);
111 static void pwc_isoc_cleanup(struct pwc_device
*pdev
);
113 static struct usb_driver pwc_driver
= {
114 .name
= "Philips webcam", /* name */
115 .id_table
= pwc_device_table
,
116 .probe
= usb_pwc_probe
, /* probe() */
117 .disconnect
= usb_pwc_disconnect
, /* disconnect() */
120 #define MAX_DEV_HINTS 20
121 #define MAX_ISOC_ERRORS 20
123 #ifdef CONFIG_USB_PWC_DEBUG
124 int pwc_trace
= PWC_DEBUG_LEVEL
;
126 static int power_save
= -1;
127 static int leds
[2] = { 100, 0 };
131 static const struct v4l2_file_operations pwc_fops
= {
132 .owner
= THIS_MODULE
,
133 .open
= v4l2_fh_open
,
134 .release
= vb2_fop_release
,
135 .read
= vb2_fop_read
,
136 .poll
= vb2_fop_poll
,
137 .mmap
= vb2_fop_mmap
,
138 .unlocked_ioctl
= video_ioctl2
,
140 static const struct video_device pwc_template
= {
141 .name
= "Philips Webcam", /* Filled in later */
142 .release
= video_device_release_empty
,
144 .ioctl_ops
= &pwc_ioctl_ops
,
147 /***************************************************************************/
148 /* Private functions */
150 static void *pwc_alloc_urb_buffer(struct device
*dev
,
151 size_t size
, dma_addr_t
*dma_handle
)
153 void *buffer
= kmalloc(size
, GFP_KERNEL
);
158 *dma_handle
= dma_map_single(dev
, buffer
, size
, DMA_FROM_DEVICE
);
159 if (dma_mapping_error(dev
, *dma_handle
)) {
167 static void pwc_free_urb_buffer(struct device
*dev
,
170 dma_addr_t dma_handle
)
172 dma_unmap_single(dev
, dma_handle
, size
, DMA_FROM_DEVICE
);
176 static struct pwc_frame_buf
*pwc_get_next_fill_buf(struct pwc_device
*pdev
)
178 unsigned long flags
= 0;
179 struct pwc_frame_buf
*buf
= NULL
;
181 spin_lock_irqsave(&pdev
->queued_bufs_lock
, flags
);
182 if (list_empty(&pdev
->queued_bufs
))
185 buf
= list_entry(pdev
->queued_bufs
.next
, struct pwc_frame_buf
, list
);
186 list_del(&buf
->list
);
188 spin_unlock_irqrestore(&pdev
->queued_bufs_lock
, flags
);
192 static void pwc_snapshot_button(struct pwc_device
*pdev
, int down
)
195 PWC_TRACE("Snapshot button pressed.\n");
197 PWC_TRACE("Snapshot button released.\n");
200 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
201 if (pdev
->button_dev
) {
202 input_report_key(pdev
->button_dev
, KEY_CAMERA
, down
);
203 input_sync(pdev
->button_dev
);
208 static void pwc_frame_complete(struct pwc_device
*pdev
)
210 struct pwc_frame_buf
*fbuf
= pdev
->fill_buf
;
212 /* The ToUCam Fun CMOS sensor causes the firmware to send 2 or 3 bogus
213 frames on the USB wire after an exposure change. This conditition is
214 however detected in the cam and a bit is set in the header.
216 if (pdev
->type
== 730) {
217 unsigned char *ptr
= (unsigned char *)fbuf
->data
;
219 if (ptr
[1] == 1 && ptr
[0] & 0x10) {
220 PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
221 pdev
->drop_frames
+= 2;
223 if ((ptr
[0] ^ pdev
->vmirror
) & 0x01) {
224 pwc_snapshot_button(pdev
, ptr
[0] & 0x01);
226 if ((ptr
[0] ^ pdev
->vmirror
) & 0x02) {
228 PWC_TRACE("Image is mirrored.\n");
230 PWC_TRACE("Image is normal.\n");
232 pdev
->vmirror
= ptr
[0] & 0x03;
233 /* Sometimes the trailer of the 730 is still sent as a 4 byte packet
234 after a short frame; this condition is filtered out specifically. A 4 byte
235 frame doesn't make sense anyway.
236 So we get either this sequence:
237 drop_bit set -> 4 byte frame -> short frame -> good frame
239 drop_bit set -> short frame -> good frame
240 So we drop either 3 or 2 frames in all!
242 if (fbuf
->filled
== 4)
244 } else if (pdev
->type
== 740 || pdev
->type
== 720) {
245 unsigned char *ptr
= (unsigned char *)fbuf
->data
;
246 if ((ptr
[0] ^ pdev
->vmirror
) & 0x01) {
247 pwc_snapshot_button(pdev
, ptr
[0] & 0x01);
249 pdev
->vmirror
= ptr
[0] & 0x03;
252 /* In case we were instructed to drop the frame, do so silently. */
253 if (pdev
->drop_frames
> 0) {
256 /* Check for underflow first */
257 if (fbuf
->filled
< pdev
->frame_total_size
) {
258 PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes); discarded.\n",
261 fbuf
->vb
.field
= V4L2_FIELD_NONE
;
262 fbuf
->vb
.sequence
= pdev
->vframe_count
;
263 vb2_buffer_done(&fbuf
->vb
.vb2_buf
, VB2_BUF_STATE_DONE
);
264 pdev
->fill_buf
= NULL
;
268 pdev
->vframe_count
++;
271 /* This gets called for the Isochronous pipe (video). This is done in
272 * interrupt time, so it has to be fast, not crash, and not stall. Neat.
274 static void pwc_isoc_handler(struct urb
*urb
)
276 struct pwc_device
*pdev
= (struct pwc_device
*)urb
->context
;
278 unsigned char *iso_buf
= NULL
;
280 trace_pwc_handler_enter(urb
, pdev
);
282 if (urb
->status
== -ENOENT
|| urb
->status
== -ECONNRESET
||
283 urb
->status
== -ESHUTDOWN
) {
284 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronously.\n",
285 urb
, urb
->status
== -ENOENT
? "" : "a");
289 if (pdev
->fill_buf
== NULL
)
290 pdev
->fill_buf
= pwc_get_next_fill_buf(pdev
);
292 if (urb
->status
!= 0) {
296 switch(urb
->status
) {
297 case -ENOSR
: errmsg
= "Buffer error (overrun)"; break;
298 case -EPIPE
: errmsg
= "Stalled (device not responding)"; break;
299 case -EOVERFLOW
: errmsg
= "Babble (bad cable?)"; break;
300 case -EPROTO
: errmsg
= "Bit-stuff error (bad cable?)"; break;
301 case -EILSEQ
: errmsg
= "CRC/Timeout (could be anything)"; break;
302 case -ETIME
: errmsg
= "Device does not respond"; break;
304 PWC_ERROR("pwc_isoc_handler() called with status %d [%s].\n",
305 urb
->status
, errmsg
);
306 /* Give up after a number of contiguous errors */
307 if (++pdev
->visoc_errors
> MAX_ISOC_ERRORS
)
309 PWC_ERROR("Too many ISOC errors, bailing out.\n");
310 if (pdev
->fill_buf
) {
311 vb2_buffer_done(&pdev
->fill_buf
->vb
.vb2_buf
,
312 VB2_BUF_STATE_ERROR
);
313 pdev
->fill_buf
= NULL
;
316 pdev
->vsync
= 0; /* Drop the current frame */
320 /* Reset ISOC error counter. We did get here, after all. */
321 pdev
->visoc_errors
= 0;
323 dma_sync_single_for_cpu(&urb
->dev
->dev
,
325 urb
->transfer_buffer_length
,
328 /* vsync: 0 = don't copy data
333 for (i
= 0; i
< urb
->number_of_packets
; i
++) {
334 fst
= urb
->iso_frame_desc
[i
].status
;
335 flen
= urb
->iso_frame_desc
[i
].actual_length
;
336 iso_buf
= urb
->transfer_buffer
+ urb
->iso_frame_desc
[i
].offset
;
338 PWC_ERROR("Iso frame %d has error %d\n", i
, fst
);
341 if (flen
> 0 && pdev
->vsync
) {
342 struct pwc_frame_buf
*fbuf
= pdev
->fill_buf
;
344 if (pdev
->vsync
== 1) {
345 fbuf
->vb
.vb2_buf
.timestamp
= ktime_get_ns();
349 if (flen
+ fbuf
->filled
> pdev
->frame_total_size
) {
350 PWC_ERROR("Frame overflow (%d > %d)\n",
352 pdev
->frame_total_size
);
353 pdev
->vsync
= 0; /* Let's wait for an EOF */
355 memcpy(fbuf
->data
+ fbuf
->filled
, iso_buf
,
357 fbuf
->filled
+= flen
;
360 if (flen
< pdev
->vlast_packet_size
) {
361 /* Shorter packet... end of frame */
362 if (pdev
->vsync
== 2)
363 pwc_frame_complete(pdev
);
364 if (pdev
->fill_buf
== NULL
)
365 pdev
->fill_buf
= pwc_get_next_fill_buf(pdev
);
366 if (pdev
->fill_buf
) {
367 pdev
->fill_buf
->filled
= 0;
371 pdev
->vlast_packet_size
= flen
;
374 dma_sync_single_for_device(&urb
->dev
->dev
,
376 urb
->transfer_buffer_length
,
380 trace_pwc_handler_exit(urb
, pdev
);
382 i
= usb_submit_urb(urb
, GFP_ATOMIC
);
384 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i
);
387 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
388 static int pwc_isoc_init(struct pwc_device
*pdev
)
390 struct usb_device
*udev
;
393 struct usb_interface
*intf
;
394 struct usb_host_interface
*idesc
= NULL
;
395 int compression
= 0; /* 0..3 = uncompressed..high */
398 pdev
->vlast_packet_size
= 0;
399 pdev
->fill_buf
= NULL
;
400 pdev
->vframe_count
= 0;
401 pdev
->visoc_errors
= 0;
405 /* We first try with low compression and then retry with a higher
406 compression setting if there is not enough bandwidth. */
407 ret
= pwc_set_video_mode(pdev
, pdev
->width
, pdev
->height
, pdev
->pixfmt
,
408 pdev
->vframes
, &compression
, 1);
410 /* Get the current alternate interface, adjust packet size */
411 intf
= usb_ifnum_to_if(udev
, 0);
413 idesc
= usb_altnum_to_altsetting(intf
, pdev
->valternate
);
417 /* Search video endpoint */
418 pdev
->vmax_packet_size
= -1;
419 for (i
= 0; i
< idesc
->desc
.bNumEndpoints
; i
++) {
420 if ((idesc
->endpoint
[i
].desc
.bEndpointAddress
& 0xF) == pdev
->vendpoint
) {
421 pdev
->vmax_packet_size
= le16_to_cpu(idesc
->endpoint
[i
].desc
.wMaxPacketSize
);
426 if (pdev
->vmax_packet_size
< 0 || pdev
->vmax_packet_size
> ISO_MAX_FRAME_SIZE
) {
427 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
428 return -ENFILE
; /* Odd error, that should be noticeable */
431 /* Set alternate interface */
432 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev
->valternate
);
433 ret
= usb_set_interface(pdev
->udev
, 0, pdev
->valternate
);
434 if (ret
== -ENOSPC
&& compression
< 3) {
441 /* Allocate and init Isochronuous urbs */
442 for (i
= 0; i
< MAX_ISO_BUFS
; i
++) {
443 urb
= usb_alloc_urb(ISO_FRAMES_PER_DESC
, GFP_KERNEL
);
445 pwc_isoc_cleanup(pdev
);
449 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb
);
451 urb
->interval
= 1; // devik
453 urb
->pipe
= usb_rcvisocpipe(udev
, pdev
->vendpoint
);
454 urb
->transfer_flags
= URB_ISO_ASAP
| URB_NO_TRANSFER_DMA_MAP
;
455 urb
->transfer_buffer_length
= ISO_BUFFER_SIZE
;
456 urb
->transfer_buffer
= pwc_alloc_urb_buffer(&udev
->dev
,
457 urb
->transfer_buffer_length
,
459 if (urb
->transfer_buffer
== NULL
) {
460 PWC_ERROR("Failed to allocate urb buffer %d\n", i
);
461 pwc_isoc_cleanup(pdev
);
464 urb
->complete
= pwc_isoc_handler
;
466 urb
->start_frame
= 0;
467 urb
->number_of_packets
= ISO_FRAMES_PER_DESC
;
468 for (j
= 0; j
< ISO_FRAMES_PER_DESC
; j
++) {
469 urb
->iso_frame_desc
[j
].offset
= j
* ISO_MAX_FRAME_SIZE
;
470 urb
->iso_frame_desc
[j
].length
= pdev
->vmax_packet_size
;
475 for (i
= 0; i
< MAX_ISO_BUFS
; i
++) {
476 ret
= usb_submit_urb(pdev
->urbs
[i
], GFP_KERNEL
);
477 if (ret
== -ENOSPC
&& compression
< 3) {
479 pwc_isoc_cleanup(pdev
);
483 PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i
, ret
);
484 pwc_isoc_cleanup(pdev
);
487 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev
->urbs
[i
]);
491 PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
495 static void pwc_iso_stop(struct pwc_device
*pdev
)
499 /* Unlinking ISOC buffers one by one */
500 for (i
= 0; i
< MAX_ISO_BUFS
; i
++) {
502 PWC_DEBUG_MEMORY("Unlinking URB %p\n", pdev
->urbs
[i
]);
503 usb_kill_urb(pdev
->urbs
[i
]);
508 static void pwc_iso_free(struct pwc_device
*pdev
)
512 /* Freeing ISOC buffers one by one */
513 for (i
= 0; i
< MAX_ISO_BUFS
; i
++) {
514 struct urb
*urb
= pdev
->urbs
[i
];
517 PWC_DEBUG_MEMORY("Freeing URB\n");
518 if (urb
->transfer_buffer
)
519 pwc_free_urb_buffer(&urb
->dev
->dev
,
520 urb
->transfer_buffer_length
,
521 urb
->transfer_buffer
,
524 pdev
->urbs
[i
] = NULL
;
529 /* Both v4l2_lock and vb_queue_lock should be locked when calling this */
530 static void pwc_isoc_cleanup(struct pwc_device
*pdev
)
532 PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
536 usb_set_interface(pdev
->udev
, 0, 0);
538 PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
541 /* Must be called with vb_queue_lock hold */
542 static void pwc_cleanup_queued_bufs(struct pwc_device
*pdev
,
543 enum vb2_buffer_state state
)
545 unsigned long flags
= 0;
547 spin_lock_irqsave(&pdev
->queued_bufs_lock
, flags
);
548 while (!list_empty(&pdev
->queued_bufs
)) {
549 struct pwc_frame_buf
*buf
;
551 buf
= list_entry(pdev
->queued_bufs
.next
, struct pwc_frame_buf
,
553 list_del(&buf
->list
);
554 vb2_buffer_done(&buf
->vb
.vb2_buf
, state
);
556 spin_unlock_irqrestore(&pdev
->queued_bufs_lock
, flags
);
559 #ifdef CONFIG_USB_PWC_DEBUG
560 static const char *pwc_sensor_type_to_string(unsigned int sensor_type
)
562 switch(sensor_type
) {
564 return "Hyundai CMOS sensor";
566 return "Sony CCD sensor + TDA8787";
568 return "Sony CCD sensor + Exas 98L59";
570 return "Sony CCD sensor + ADI 9804";
572 return "Sharp CCD sensor + TDA8787";
574 return "Sharp CCD sensor + Exas 98L59";
576 return "Sharp CCD sensor + ADI 9804";
578 return "UPA 1021 sensor";
582 return "PAL MR sensor";
584 return "unknown type of sensor";
589 /***************************************************************************/
590 /* Video4Linux functions */
592 static void pwc_video_release(struct v4l2_device
*v
)
594 struct pwc_device
*pdev
= container_of(v
, struct pwc_device
, v4l2_dev
);
596 v4l2_ctrl_handler_free(&pdev
->ctrl_handler
);
597 v4l2_device_unregister(&pdev
->v4l2_dev
);
598 kfree(pdev
->ctrl_buf
);
602 /***************************************************************************/
603 /* Videobuf2 operations */
605 static int queue_setup(struct vb2_queue
*vq
,
606 unsigned int *nbuffers
, unsigned int *nplanes
,
607 unsigned int sizes
[], struct device
*alloc_devs
[])
609 struct pwc_device
*pdev
= vb2_get_drv_priv(vq
);
612 if (*nbuffers
< MIN_FRAMES
)
613 *nbuffers
= MIN_FRAMES
;
614 else if (*nbuffers
> MAX_FRAMES
)
615 *nbuffers
= MAX_FRAMES
;
619 size
= pwc_get_size(pdev
, MAX_WIDTH
, MAX_HEIGHT
);
620 sizes
[0] = PAGE_ALIGN(pwc_image_sizes
[size
][0] *
621 pwc_image_sizes
[size
][1] * 3 / 2);
626 static int buffer_init(struct vb2_buffer
*vb
)
628 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
629 struct pwc_frame_buf
*buf
=
630 container_of(vbuf
, struct pwc_frame_buf
, vb
);
632 /* need vmalloc since frame buffer > 128K */
633 buf
->data
= vzalloc(PWC_FRAME_SIZE
);
634 if (buf
->data
== NULL
)
640 static int buffer_prepare(struct vb2_buffer
*vb
)
642 struct pwc_device
*pdev
= vb2_get_drv_priv(vb
->vb2_queue
);
644 /* Don't allow queueing new buffers after device disconnection */
651 static void buffer_finish(struct vb2_buffer
*vb
)
653 struct pwc_device
*pdev
= vb2_get_drv_priv(vb
->vb2_queue
);
654 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
655 struct pwc_frame_buf
*buf
=
656 container_of(vbuf
, struct pwc_frame_buf
, vb
);
658 if (vb
->state
== VB2_BUF_STATE_DONE
) {
660 * Application has called dqbuf and is getting back a buffer
661 * we've filled, take the pwc data we've stored in buf->data
662 * and decompress it into a usable format, storing the result
665 pwc_decompress(pdev
, buf
);
669 static void buffer_cleanup(struct vb2_buffer
*vb
)
671 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
672 struct pwc_frame_buf
*buf
=
673 container_of(vbuf
, struct pwc_frame_buf
, vb
);
678 static void buffer_queue(struct vb2_buffer
*vb
)
680 struct pwc_device
*pdev
= vb2_get_drv_priv(vb
->vb2_queue
);
681 struct vb2_v4l2_buffer
*vbuf
= to_vb2_v4l2_buffer(vb
);
682 struct pwc_frame_buf
*buf
=
683 container_of(vbuf
, struct pwc_frame_buf
, vb
);
684 unsigned long flags
= 0;
686 /* Check the device has not disconnected between prep and queuing */
688 vb2_buffer_done(vb
, VB2_BUF_STATE_ERROR
);
692 spin_lock_irqsave(&pdev
->queued_bufs_lock
, flags
);
693 list_add_tail(&buf
->list
, &pdev
->queued_bufs
);
694 spin_unlock_irqrestore(&pdev
->queued_bufs_lock
, flags
);
697 static int start_streaming(struct vb2_queue
*vq
, unsigned int count
)
699 struct pwc_device
*pdev
= vb2_get_drv_priv(vq
);
705 if (mutex_lock_interruptible(&pdev
->v4l2_lock
))
707 /* Turn on camera and set LEDS on */
708 pwc_camera_power(pdev
, 1);
709 pwc_set_leds(pdev
, leds
[0], leds
[1]);
711 r
= pwc_isoc_init(pdev
);
713 /* If we failed turn camera and LEDS back off */
714 pwc_set_leds(pdev
, 0, 0);
715 pwc_camera_power(pdev
, 0);
716 /* And cleanup any queued bufs!! */
717 pwc_cleanup_queued_bufs(pdev
, VB2_BUF_STATE_QUEUED
);
719 mutex_unlock(&pdev
->v4l2_lock
);
724 static void stop_streaming(struct vb2_queue
*vq
)
726 struct pwc_device
*pdev
= vb2_get_drv_priv(vq
);
728 mutex_lock(&pdev
->v4l2_lock
);
730 pwc_set_leds(pdev
, 0, 0);
731 pwc_camera_power(pdev
, 0);
732 pwc_isoc_cleanup(pdev
);
735 pwc_cleanup_queued_bufs(pdev
, VB2_BUF_STATE_ERROR
);
737 vb2_buffer_done(&pdev
->fill_buf
->vb
.vb2_buf
,
738 VB2_BUF_STATE_ERROR
);
739 mutex_unlock(&pdev
->v4l2_lock
);
742 static const struct vb2_ops pwc_vb_queue_ops
= {
743 .queue_setup
= queue_setup
,
744 .buf_init
= buffer_init
,
745 .buf_prepare
= buffer_prepare
,
746 .buf_finish
= buffer_finish
,
747 .buf_cleanup
= buffer_cleanup
,
748 .buf_queue
= buffer_queue
,
749 .start_streaming
= start_streaming
,
750 .stop_streaming
= stop_streaming
,
751 .wait_prepare
= vb2_ops_wait_prepare
,
752 .wait_finish
= vb2_ops_wait_finish
,
755 /***************************************************************************/
758 /* This function gets called when a new device is plugged in or the usb core
762 static int usb_pwc_probe(struct usb_interface
*intf
, const struct usb_device_id
*id
)
764 struct usb_device
*udev
= interface_to_usbdev(intf
);
765 struct pwc_device
*pdev
= NULL
;
766 int vendor_id
, product_id
, type_id
;
770 int my_power_save
= power_save
;
771 char serial_number
[30], *name
;
773 vendor_id
= le16_to_cpu(udev
->descriptor
.idVendor
);
774 product_id
= le16_to_cpu(udev
->descriptor
.idProduct
);
776 /* Check if we can handle this device */
777 PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
778 vendor_id
, product_id
,
779 intf
->altsetting
->desc
.bInterfaceNumber
);
781 /* the interfaces are probed one by one. We are only interested in the
782 video interface (0) now.
783 Interface 1 is the Audio Control, and interface 2 Audio itself.
785 if (intf
->altsetting
->desc
.bInterfaceNumber
> 0)
788 if (vendor_id
== 0x0471) {
789 switch (product_id
) {
791 PWC_INFO("Philips PCA645VC USB webcam detected.\n");
792 name
= "Philips 645 webcam";
796 PWC_INFO("Philips PCA646VC USB webcam detected.\n");
797 name
= "Philips 646 webcam";
801 PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
802 name
= "Askey VC010 webcam";
806 PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
807 name
= "Philips 675 webcam";
811 PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
812 name
= "Philips 680 webcam";
816 PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
817 name
= "Philips 690 webcam";
821 PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
822 name
= "Philips 730 webcam";
826 PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
827 name
= "Philips 740 webcam";
831 PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
832 name
= "Philips 750 webcam";
836 PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
837 name
= "Philips 720K/40 webcam";
841 PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
842 name
= "Philips SPC 900NC webcam";
846 PWC_INFO("Philips SPC 880NC USB webcam detected.\n");
847 name
= "Philips SPC 880NC webcam";
855 else if (vendor_id
== 0x069A) {
858 PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
859 name
= "Askey VC010 webcam";
867 else if (vendor_id
== 0x046d) {
870 PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
871 name
= "Logitech QuickCam Pro 3000";
872 type_id
= 740; /* CCD sensor */
875 PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
876 name
= "Logitech QuickCam Notebook Pro";
877 type_id
= 740; /* CCD sensor */
880 PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
881 name
= "Logitech QuickCam Pro 4000";
882 type_id
= 740; /* CCD sensor */
883 if (my_power_save
== -1)
887 PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
888 name
= "Logitech QuickCam Zoom";
889 type_id
= 740; /* CCD sensor */
892 PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
893 name
= "Logitech QuickCam Zoom";
894 type_id
= 740; /* CCD sensor */
895 if (my_power_save
== -1)
899 PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
900 name
= "Logitech QuickCam Orbit";
901 type_id
= 740; /* CCD sensor */
902 if (my_power_save
== -1)
904 features
|= FEATURE_MOTOR_PANTILT
;
907 PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
908 name
= "Cisco VT Camera";
909 type_id
= 740; /* CCD sensor */
912 PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
913 name
= "Logitech ViewPort AV 100";
914 type_id
= 740; /* CCD sensor */
916 case 0x08b8: /* Where this released? */
917 PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
918 name
= "Logitech QuickCam (res.)";
919 type_id
= 730; /* Assuming CMOS */
926 else if (vendor_id
== 0x055d) {
927 /* I don't know the difference between the C10 and the C30;
928 I suppose the difference is the sensor, but both cameras
929 work equally well with a type_id of 675
933 PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
934 name
= "Samsung MPC-C10";
938 PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
939 name
= "Samsung MPC-C30";
943 PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
944 name
= "Samsung MPC-C30";
952 else if (vendor_id
== 0x041e) {
955 PWC_INFO("Creative Labs Webcam 5 detected.\n");
956 name
= "Creative Labs Webcam 5";
958 if (my_power_save
== -1)
962 PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
963 name
= "Creative Labs Webcam Pro Ex";
971 else if (vendor_id
== 0x04cc) {
974 PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
975 name
= "Sotec Afina Eye";
983 else if (vendor_id
== 0x06be) {
986 /* This is essentially the same cam as the Sotec Afina Eye */
987 PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
988 name
= "AME Co. Afina Eye";
997 else if (vendor_id
== 0x0d81) {
1000 PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1001 name
= "Visionite VCS-UC300";
1002 type_id
= 740; /* CCD sensor */
1005 PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1006 name
= "Visionite VCS-UM100";
1007 type_id
= 730; /* CMOS sensor */
1015 return -ENODEV
; /* Not any of the know types; but the list keeps growing. */
1017 if (my_power_save
== -1)
1020 memset(serial_number
, 0, 30);
1021 usb_string(udev
, udev
->descriptor
.iSerialNumber
, serial_number
, 29);
1022 PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number
);
1024 if (udev
->descriptor
.bNumConfigurations
> 1)
1025 PWC_WARNING("Warning: more than 1 configuration available.\n");
1027 /* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
1028 pdev
= kzalloc(sizeof(struct pwc_device
), GFP_KERNEL
);
1030 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1033 pdev
->type
= type_id
;
1034 pdev
->features
= features
;
1035 pwc_construct(pdev
); /* set min/max sizes correct */
1037 mutex_init(&pdev
->v4l2_lock
);
1038 mutex_init(&pdev
->vb_queue_lock
);
1039 spin_lock_init(&pdev
->queued_bufs_lock
);
1040 INIT_LIST_HEAD(&pdev
->queued_bufs
);
1043 pdev
->power_save
= my_power_save
;
1045 /* Init videobuf2 queue structure */
1046 pdev
->vb_queue
.type
= V4L2_BUF_TYPE_VIDEO_CAPTURE
;
1047 pdev
->vb_queue
.io_modes
= VB2_MMAP
| VB2_USERPTR
| VB2_READ
;
1048 pdev
->vb_queue
.drv_priv
= pdev
;
1049 pdev
->vb_queue
.buf_struct_size
= sizeof(struct pwc_frame_buf
);
1050 pdev
->vb_queue
.ops
= &pwc_vb_queue_ops
;
1051 pdev
->vb_queue
.mem_ops
= &vb2_vmalloc_memops
;
1052 pdev
->vb_queue
.timestamp_flags
= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC
;
1053 rc
= vb2_queue_init(&pdev
->vb_queue
);
1055 PWC_ERROR("Oops, could not initialize vb2 queue.\n");
1059 /* Init video_device structure */
1060 pdev
->vdev
= pwc_template
;
1061 strscpy(pdev
->vdev
.name
, name
, sizeof(pdev
->vdev
.name
));
1062 pdev
->vdev
.queue
= &pdev
->vb_queue
;
1063 pdev
->vdev
.queue
->lock
= &pdev
->vb_queue_lock
;
1064 video_set_drvdata(&pdev
->vdev
, pdev
);
1066 pdev
->release
= le16_to_cpu(udev
->descriptor
.bcdDevice
);
1067 PWC_DEBUG_PROBE("Release: %04x\n", pdev
->release
);
1069 /* Allocate USB command buffers */
1070 pdev
->ctrl_buf
= kmalloc(sizeof(pdev
->cmd_buf
), GFP_KERNEL
);
1071 if (!pdev
->ctrl_buf
) {
1072 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1077 #ifdef CONFIG_USB_PWC_DEBUG
1078 /* Query sensor type */
1079 if (pwc_get_cmos_sensor(pdev
, &rc
) >= 0) {
1080 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1082 pwc_sensor_type_to_string(rc
), rc
);
1086 /* Set the leds off */
1087 pwc_set_leds(pdev
, 0, 0);
1089 /* Setup initial videomode */
1090 rc
= pwc_set_video_mode(pdev
, MAX_WIDTH
, MAX_HEIGHT
,
1091 V4L2_PIX_FMT_YUV420
, 30, &compression
, 1);
1095 /* Register controls (and read default values from camera */
1096 rc
= pwc_init_controls(pdev
);
1098 PWC_ERROR("Failed to register v4l2 controls (%d).\n", rc
);
1102 /* And powerdown the camera until streaming starts */
1103 pwc_camera_power(pdev
, 0);
1105 /* Register the v4l2_device structure */
1106 pdev
->v4l2_dev
.release
= pwc_video_release
;
1107 rc
= v4l2_device_register(&intf
->dev
, &pdev
->v4l2_dev
);
1109 PWC_ERROR("Failed to register v4l2-device (%d).\n", rc
);
1110 goto err_free_controls
;
1113 pdev
->v4l2_dev
.ctrl_handler
= &pdev
->ctrl_handler
;
1114 pdev
->vdev
.v4l2_dev
= &pdev
->v4l2_dev
;
1115 pdev
->vdev
.lock
= &pdev
->v4l2_lock
;
1116 pdev
->vdev
.device_caps
= V4L2_CAP_VIDEO_CAPTURE
| V4L2_CAP_STREAMING
|
1119 rc
= video_register_device(&pdev
->vdev
, VFL_TYPE_GRABBER
, -1);
1121 PWC_ERROR("Failed to register as video device (%d).\n", rc
);
1122 goto err_unregister_v4l2_dev
;
1124 PWC_INFO("Registered as %s.\n", video_device_node_name(&pdev
->vdev
));
1126 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1127 /* register webcam snapshot button input device */
1128 pdev
->button_dev
= input_allocate_device();
1129 if (!pdev
->button_dev
) {
1131 goto err_video_unreg
;
1134 usb_make_path(udev
, pdev
->button_phys
, sizeof(pdev
->button_phys
));
1135 strlcat(pdev
->button_phys
, "/input0", sizeof(pdev
->button_phys
));
1137 pdev
->button_dev
->name
= "PWC snapshot button";
1138 pdev
->button_dev
->phys
= pdev
->button_phys
;
1139 usb_to_input_id(pdev
->udev
, &pdev
->button_dev
->id
);
1140 pdev
->button_dev
->dev
.parent
= &pdev
->udev
->dev
;
1141 pdev
->button_dev
->evbit
[0] = BIT_MASK(EV_KEY
);
1142 pdev
->button_dev
->keybit
[BIT_WORD(KEY_CAMERA
)] = BIT_MASK(KEY_CAMERA
);
1144 rc
= input_register_device(pdev
->button_dev
);
1146 input_free_device(pdev
->button_dev
);
1147 pdev
->button_dev
= NULL
;
1148 goto err_video_unreg
;
1154 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1156 video_unregister_device(&pdev
->vdev
);
1158 err_unregister_v4l2_dev
:
1159 v4l2_device_unregister(&pdev
->v4l2_dev
);
1161 v4l2_ctrl_handler_free(&pdev
->ctrl_handler
);
1163 kfree(pdev
->ctrl_buf
);
1168 /* The user yanked out the cable... */
1169 static void usb_pwc_disconnect(struct usb_interface
*intf
)
1171 struct v4l2_device
*v
= usb_get_intfdata(intf
);
1172 struct pwc_device
*pdev
= container_of(v
, struct pwc_device
, v4l2_dev
);
1174 mutex_lock(&pdev
->vb_queue_lock
);
1175 mutex_lock(&pdev
->v4l2_lock
);
1176 /* No need to keep the urbs around after disconnection */
1177 if (pdev
->vb_queue
.streaming
)
1178 pwc_isoc_cleanup(pdev
);
1181 v4l2_device_disconnect(&pdev
->v4l2_dev
);
1182 video_unregister_device(&pdev
->vdev
);
1183 mutex_unlock(&pdev
->v4l2_lock
);
1184 mutex_unlock(&pdev
->vb_queue_lock
);
1186 #ifdef CONFIG_USB_PWC_INPUT_EVDEV
1187 if (pdev
->button_dev
)
1188 input_unregister_device(pdev
->button_dev
);
1191 v4l2_device_put(&pdev
->v4l2_dev
);
1196 * Initialization code & module stuff
1199 static unsigned int leds_nargs
;
1201 #ifdef CONFIG_USB_PWC_DEBUG
1202 module_param_named(trace
, pwc_trace
, int, 0644);
1204 module_param(power_save
, int, 0644);
1205 module_param_array(leds
, int, &leds_nargs
, 0444);
1207 #ifdef CONFIG_USB_PWC_DEBUG
1208 MODULE_PARM_DESC(trace
, "For debugging purposes");
1210 MODULE_PARM_DESC(power_save
, "Turn power saving for new cameras on or off");
1211 MODULE_PARM_DESC(leds
, "LED on,off time in milliseconds");
1213 MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1214 MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1215 MODULE_LICENSE("GPL");
1216 MODULE_ALIAS("pwcx");
1217 MODULE_VERSION( PWC_VERSION
);
1219 module_usb_driver(pwc_driver
);