1 /* Linux driver for Philips webcam
2 USB and Video4Linux interface part.
3 (C) 1999-2004 Nemosoft Unv.
4 (C) 2004-2006 Luc Saillard (luc@saillard.org)
6 NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx
7 driver and thus may have bugs that are not present in the original version.
8 Please send bug reports and support requests to <luc@saillard.org>.
9 The decompression routines have been implemented by reverse-engineering the
10 Nemosoft binary pwcx module. Caveat emptor.
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 This code forms the interface between the USB layers and the Philips
30 specific stuff. Some adanved stuff of the driver falls under an
31 NDA, signed between me and Philips B.V., Eindhoven, the Netherlands, and
32 is thus not distributed in source form. The binary pwcx.o module
33 contains the code that falls under the NDA.
35 In case you're wondering: 'pwc' stands for "Philips WebCam", but
36 I really didn't want to type 'philips_web_cam' every time (I'm lazy as
37 any Linux kernel hacker, but I don't like uncomprehensible abbreviations
40 Oh yes, convention: to disctinguish between all the various pointers to
41 device-structures, I use these names for the pointer variables:
42 udev: struct usb_device *
43 vdev: struct video_device *
44 pdev: struct pwc_devive *
48 - Alvarado: adding whitebalance code
49 - Alistar Moire: QuickCam 3000 Pro device/product ID
50 - Tony Hoyle: Creative Labs Webcam 5 device/product ID
51 - Mark Burazin: solving hang in VIDIOCSYNC when camera gets unplugged
52 - Jk Fang: Sotec Afina Eye ID
53 - Xavier Roche: QuickCam Pro 4000 ID
54 - Jens Knudsen: QuickCam Zoom ID
55 - J. Debert: QuickCam for Notebooks ID
58 #include <linux/errno.h>
59 #include <linux/init.h>
61 #include <linux/module.h>
62 #include <linux/poll.h>
63 #include <linux/slab.h>
64 #include <linux/vmalloc.h>
65 #include <linux/version.h>
69 #include "pwc-kiara.h"
70 #include "pwc-timon.h"
71 #include "pwc-dec23.h"
73 #include "pwc-uncompress.h"
75 /* Function prototypes and driver templates */
77 /* hotplug device table support */
78 static const struct usb_device_id pwc_device_table [] = {
79 { USB_DEVICE(0x0471, 0x0302) }, /* Philips models */
80 { USB_DEVICE(0x0471, 0x0303) },
81 { USB_DEVICE(0x0471, 0x0304) },
82 { USB_DEVICE(0x0471, 0x0307) },
83 { USB_DEVICE(0x0471, 0x0308) },
84 { USB_DEVICE(0x0471, 0x030C) },
85 { USB_DEVICE(0x0471, 0x0310) },
86 { USB_DEVICE(0x0471, 0x0311) }, /* Philips ToUcam PRO II */
87 { USB_DEVICE(0x0471, 0x0312) },
88 { USB_DEVICE(0x0471, 0x0313) }, /* the 'new' 720K */
89 { USB_DEVICE(0x0471, 0x0329) }, /* Philips SPC 900NC PC Camera */
90 { USB_DEVICE(0x069A, 0x0001) }, /* Askey */
91 { USB_DEVICE(0x046D, 0x08B0) }, /* Logitech QuickCam Pro 3000 */
92 { USB_DEVICE(0x046D, 0x08B1) }, /* Logitech QuickCam Notebook Pro */
93 { USB_DEVICE(0x046D, 0x08B2) }, /* Logitech QuickCam Pro 4000 */
94 { USB_DEVICE(0x046D, 0x08B3) }, /* Logitech QuickCam Zoom (old model) */
95 { USB_DEVICE(0x046D, 0x08B4) }, /* Logitech QuickCam Zoom (new model) */
96 { USB_DEVICE(0x046D, 0x08B5) }, /* Logitech QuickCam Orbit/Sphere */
97 { USB_DEVICE(0x046D, 0x08B6) }, /* Cisco VT Camera */
98 { USB_DEVICE(0x046D, 0x08B7) }, /* Logitech ViewPort AV 100 */
99 { USB_DEVICE(0x046D, 0x08B8) }, /* Logitech (reserved) */
100 { USB_DEVICE(0x055D, 0x9000) }, /* Samsung MPC-C10 */
101 { USB_DEVICE(0x055D, 0x9001) }, /* Samsung MPC-C30 */
102 { USB_DEVICE(0x055D, 0x9002) }, /* Samsung SNC-35E (Ver3.0) */
103 { USB_DEVICE(0x041E, 0x400C) }, /* Creative Webcam 5 */
104 { USB_DEVICE(0x041E, 0x4011) }, /* Creative Webcam Pro Ex */
105 { USB_DEVICE(0x04CC, 0x8116) }, /* Afina Eye */
106 { USB_DEVICE(0x06BE, 0x8116) }, /* new Afina Eye */
107 { USB_DEVICE(0x0d81, 0x1910) }, /* Visionite */
108 { USB_DEVICE(0x0d81, 0x1900) },
111 MODULE_DEVICE_TABLE(usb, pwc_device_table);
113 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id);
114 static void usb_pwc_disconnect(struct usb_interface *intf);
116 static struct usb_driver pwc_driver = {
117 .name = "Philips webcam", /* name */
118 .id_table = pwc_device_table,
119 .probe = usb_pwc_probe, /* probe() */
120 .disconnect = usb_pwc_disconnect, /* disconnect() */
123 #define MAX_DEV_HINTS 20
124 #define MAX_ISOC_ERRORS 20
126 static int default_size = PSZ_QCIF;
127 static int default_fps = 10;
128 static int default_fbufs = 3; /* Default number of frame buffers */
129 int pwc_mbufs = 2; /* Default number of mmap() buffers */
130 #ifdef CONFIG_USB_PWC_DEBUG
131 int pwc_trace = PWC_DEBUG_LEVEL;
133 static int power_save;
134 static int led_on = 100, led_off; /* defaults to LED that is on while in use */
135 static int pwc_preferred_compression = 1; /* 0..3 = uncompressed..high */
138 char serial_number[30];
140 struct pwc_device *pdev;
141 } device_hint[MAX_DEV_HINTS];
145 static int pwc_video_open(struct file *file);
146 static int pwc_video_close(struct file *file);
147 static ssize_t pwc_video_read(struct file *file, char __user *buf,
148 size_t count, loff_t *ppos);
149 static unsigned int pwc_video_poll(struct file *file, poll_table *wait);
150 static long pwc_video_ioctl(struct file *file,
151 unsigned int ioctlnr, unsigned long arg);
152 static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma);
154 static const struct v4l2_file_operations pwc_fops = {
155 .owner = THIS_MODULE,
156 .open = pwc_video_open,
157 .release = pwc_video_close,
158 .read = pwc_video_read,
159 .poll = pwc_video_poll,
160 .mmap = pwc_video_mmap,
161 .ioctl = pwc_video_ioctl,
163 static struct video_device pwc_template = {
164 .name = "Philips Webcam", /* Filled in later */
165 .release = video_device_release,
170 /***************************************************************************/
172 /* Okay, this is some magic that I worked out and the reasoning behind it...
174 The biggest problem with any USB device is of course: "what to do
175 when the user unplugs the device while it is in use by an application?"
176 We have several options:
177 1) Curse them with the 7 plagues when they do (requires divine intervention)
178 2) Tell them not to (won't work: they'll do it anyway)
179 3) Oops the kernel (this will have a negative effect on a user's uptime)
180 4) Do something sensible.
182 Of course, we go for option 4.
184 It happens that this device will be linked to two times, once from
185 usb_device and once from the video_device in their respective 'private'
186 pointers. This is done when the device is probed() and all initialization
187 succeeded. The pwc_device struct links back to both structures.
189 When a device is unplugged while in use it will be removed from the
190 list of known USB devices; I also de-register it as a V4L device, but
191 unfortunately I can't free the memory since the struct is still in use
192 by the file descriptor. This free-ing is then deferend until the first
193 opportunity. Crude, but it works.
195 A small 'advantage' is that if a user unplugs the cam and plugs it back
196 in, it should get assigned the same video device minor, but unfortunately
197 it's non-trivial to re-link the cam back to the video device... (that
198 would surely be magic! :))
201 /***************************************************************************/
202 /* Private functions */
204 /* Here we want the physical address of the memory.
205 * This is used when initializing the contents of the area.
210 static void *pwc_rvmalloc(unsigned long size)
215 mem=vmalloc_32(size);
219 memset(mem, 0, size); /* Clear the ram out, no junk to the user */
220 adr=(unsigned long) mem;
223 SetPageReserved(vmalloc_to_page((void *)adr));
230 static void pwc_rvfree(void * mem, unsigned long size)
237 adr=(unsigned long) mem;
238 while ((long) size > 0)
240 ClearPageReserved(vmalloc_to_page((void *)adr));
250 static int pwc_allocate_buffers(struct pwc_device *pdev)
255 PWC_DEBUG_MEMORY(">> pwc_allocate_buffers(pdev = 0x%p)\n", pdev);
260 /* Allocate Isochronuous pipe buffers */
261 for (i = 0; i < MAX_ISO_BUFS; i++) {
262 if (pdev->sbuf[i].data == NULL) {
263 kbuf = kzalloc(ISO_BUFFER_SIZE, GFP_KERNEL);
265 PWC_ERROR("Failed to allocate iso buffer %d.\n", i);
268 PWC_DEBUG_MEMORY("Allocated iso buffer at %p.\n", kbuf);
269 pdev->sbuf[i].data = kbuf;
273 /* Allocate frame buffer structure */
274 if (pdev->fbuf == NULL) {
275 kbuf = kzalloc(default_fbufs * sizeof(struct pwc_frame_buf), GFP_KERNEL);
277 PWC_ERROR("Failed to allocate frame buffer structure.\n");
280 PWC_DEBUG_MEMORY("Allocated frame buffer structure at %p.\n", kbuf);
284 /* create frame buffers, and make circular ring */
285 for (i = 0; i < default_fbufs; i++) {
286 if (pdev->fbuf[i].data == NULL) {
287 kbuf = vmalloc(PWC_FRAME_SIZE); /* need vmalloc since frame buffer > 128K */
289 PWC_ERROR("Failed to allocate frame buffer %d.\n", i);
292 PWC_DEBUG_MEMORY("Allocated frame buffer %d at %p.\n", i, kbuf);
293 pdev->fbuf[i].data = kbuf;
294 memset(kbuf, 0, PWC_FRAME_SIZE);
298 /* Allocate decompressor table space */
299 if (DEVICE_USE_CODEC1(pdev->type))
300 err = pwc_dec1_alloc(pdev);
302 err = pwc_dec23_alloc(pdev);
305 PWC_ERROR("Failed to allocate decompress table.\n");
309 /* Allocate image buffer; double buffer for mmap() */
310 kbuf = pwc_rvmalloc(pwc_mbufs * pdev->len_per_image);
312 PWC_ERROR("Failed to allocate image buffer(s). needed (%d)\n",
313 pwc_mbufs * pdev->len_per_image);
316 PWC_DEBUG_MEMORY("Allocated image buffer at %p.\n", kbuf);
317 pdev->image_data = kbuf;
318 for (i = 0; i < pwc_mbufs; i++) {
319 pdev->images[i].offset = i * pdev->len_per_image;
320 pdev->images[i].vma_use_count = 0;
322 for (; i < MAX_IMAGES; i++) {
323 pdev->images[i].offset = 0;
328 PWC_DEBUG_MEMORY("<< pwc_allocate_buffers()\n");
332 static void pwc_free_buffers(struct pwc_device *pdev)
336 PWC_DEBUG_MEMORY("Entering free_buffers(%p).\n", pdev);
340 /* Release Iso-pipe buffers */
341 for (i = 0; i < MAX_ISO_BUFS; i++)
342 if (pdev->sbuf[i].data != NULL) {
343 PWC_DEBUG_MEMORY("Freeing ISO buffer at %p.\n", pdev->sbuf[i].data);
344 kfree(pdev->sbuf[i].data);
345 pdev->sbuf[i].data = NULL;
348 /* The same for frame buffers */
349 if (pdev->fbuf != NULL) {
350 for (i = 0; i < default_fbufs; i++) {
351 if (pdev->fbuf[i].data != NULL) {
352 PWC_DEBUG_MEMORY("Freeing frame buffer %d at %p.\n", i, pdev->fbuf[i].data);
353 vfree(pdev->fbuf[i].data);
354 pdev->fbuf[i].data = NULL;
361 /* Intermediate decompression buffer & tables */
362 if (pdev->decompress_data != NULL) {
363 PWC_DEBUG_MEMORY("Freeing decompression buffer at %p.\n", pdev->decompress_data);
364 kfree(pdev->decompress_data);
365 pdev->decompress_data = NULL;
368 /* Release image buffers */
369 if (pdev->image_data != NULL) {
370 PWC_DEBUG_MEMORY("Freeing image buffer at %p.\n", pdev->image_data);
371 pwc_rvfree(pdev->image_data, pwc_mbufs * pdev->len_per_image);
373 pdev->image_data = NULL;
375 PWC_DEBUG_MEMORY("Leaving free_buffers().\n");
378 /* The frame & image buffer mess.
380 Yes, this is a mess. Well, it used to be simple, but alas... In this
381 module, 3 buffers schemes are used to get the data from the USB bus to
382 the user program. The first scheme involves the ISO buffers (called thus
383 since they transport ISO data from the USB controller), and not really
384 interesting. Suffices to say the data from this buffer is quickly
385 gathered in an interrupt handler (pwc_isoc_handler) and placed into the
388 The frame buffer is the second scheme, and is the central element here.
389 It collects the data from a single frame from the camera (hence, the
390 name). Frames are delimited by the USB camera with a short USB packet,
391 so that's easy to detect. The frame buffers form a list that is filled
392 by the camera+USB controller and drained by the user process through
393 either read() or mmap().
395 The image buffer is the third scheme, in which frames are decompressed
396 and converted into planar format. For mmap() there is more than
397 one image buffer available.
399 The frame buffers provide the image buffering. In case the user process
400 is a bit slow, this introduces lag and some undesired side-effects.
401 The problem arises when the frame buffer is full. I used to drop the last
402 frame, which makes the data in the queue stale very quickly. But dropping
403 the frame at the head of the queue proved to be a litte bit more difficult.
404 I tried a circular linked scheme, but this introduced more problems than
407 Because filling and draining are completely asynchronous processes, this
408 requires some fiddling with pointers and mutexes.
410 Eventually, I came up with a system with 2 lists: an 'empty' frame list
411 and a 'full' frame list:
412 * Initially, all frame buffers but one are on the 'empty' list; the one
413 remaining buffer is our initial fill frame.
414 * If a frame is needed for filling, we try to take it from the 'empty'
415 list, unless that list is empty, in which case we take the buffer at
416 the head of the 'full' list.
417 * When our fill buffer has been filled, it is appended to the 'full'
419 * If a frame is needed by read() or mmap(), it is taken from the head of
420 the 'full' list, handled, and then appended to the 'empty' list. If no
421 buffer is present on the 'full' list, we wait.
422 The advantage is that the buffer that is currently being decompressed/
423 converted, is on neither list, and thus not in our way (any other scheme
424 I tried had the problem of old data lingering in the queue).
426 Whatever strategy you choose, it always remains a tradeoff: with more
427 frame buffers the chances of a missed frame are reduced. On the other
428 hand, on slower machines it introduces lag because the queue will
433 \brief Find next frame buffer to fill. Take from empty or full list, whichever comes first.
435 static int pwc_next_fill_frame(struct pwc_device *pdev)
441 spin_lock_irqsave(&pdev->ptrlock, flags);
442 if (pdev->fill_frame != NULL) {
443 /* append to 'full' list */
444 if (pdev->full_frames == NULL) {
445 pdev->full_frames = pdev->fill_frame;
446 pdev->full_frames_tail = pdev->full_frames;
449 pdev->full_frames_tail->next = pdev->fill_frame;
450 pdev->full_frames_tail = pdev->fill_frame;
453 if (pdev->empty_frames != NULL) {
454 /* We have empty frames available. That's easy */
455 pdev->fill_frame = pdev->empty_frames;
456 pdev->empty_frames = pdev->empty_frames->next;
459 /* Hmm. Take it from the full list */
461 if (pdev->full_frames == NULL) {
462 PWC_ERROR("Neither empty or full frames available!\n");
463 spin_unlock_irqrestore(&pdev->ptrlock, flags);
466 pdev->fill_frame = pdev->full_frames;
467 pdev->full_frames = pdev->full_frames->next;
470 pdev->fill_frame->next = NULL;
471 spin_unlock_irqrestore(&pdev->ptrlock, flags);
477 \brief Reset all buffers, pointers and lists, except for the image_used[] buffer.
479 If the image_used[] buffer is cleared too, mmap()/VIDIOCSYNC will run into trouble.
481 static void pwc_reset_buffers(struct pwc_device *pdev)
486 PWC_DEBUG_MEMORY(">> %s __enter__\n", __func__);
488 spin_lock_irqsave(&pdev->ptrlock, flags);
489 pdev->full_frames = NULL;
490 pdev->full_frames_tail = NULL;
491 for (i = 0; i < default_fbufs; i++) {
492 pdev->fbuf[i].filled = 0;
494 pdev->fbuf[i].next = &pdev->fbuf[i - 1];
496 pdev->fbuf->next = NULL;
498 pdev->empty_frames = &pdev->fbuf[default_fbufs - 1];
499 pdev->empty_frames_tail = pdev->fbuf;
500 pdev->read_frame = NULL;
501 pdev->fill_frame = pdev->empty_frames;
502 pdev->empty_frames = pdev->empty_frames->next;
504 pdev->image_read_pos = 0;
505 pdev->fill_image = 0;
506 spin_unlock_irqrestore(&pdev->ptrlock, flags);
508 PWC_DEBUG_MEMORY("<< %s __leaving__\n", __func__);
513 \brief Do all the handling for getting one frame: get pointer, decompress, advance pointers.
515 int pwc_handle_frame(struct pwc_device *pdev)
520 spin_lock_irqsave(&pdev->ptrlock, flags);
521 /* First grab our read_frame; this is removed from all lists, so
522 we can release the lock after this without problems */
523 if (pdev->read_frame != NULL) {
524 /* This can't theoretically happen */
525 PWC_ERROR("Huh? Read frame still in use?\n");
526 spin_unlock_irqrestore(&pdev->ptrlock, flags);
531 if (pdev->full_frames == NULL) {
532 PWC_ERROR("Woops. No frames ready.\n");
535 pdev->read_frame = pdev->full_frames;
536 pdev->full_frames = pdev->full_frames->next;
537 pdev->read_frame->next = NULL;
540 if (pdev->read_frame != NULL) {
541 /* Decompression is a lengthy process, so it's outside of the lock.
542 This gives the isoc_handler the opportunity to fill more frames
545 spin_unlock_irqrestore(&pdev->ptrlock, flags);
546 ret = pwc_decompress(pdev);
547 spin_lock_irqsave(&pdev->ptrlock, flags);
549 /* We're done with read_buffer, tack it to the end of the empty buffer list */
550 if (pdev->empty_frames == NULL) {
551 pdev->empty_frames = pdev->read_frame;
552 pdev->empty_frames_tail = pdev->empty_frames;
555 pdev->empty_frames_tail->next = pdev->read_frame;
556 pdev->empty_frames_tail = pdev->read_frame;
558 pdev->read_frame = NULL;
560 spin_unlock_irqrestore(&pdev->ptrlock, flags);
565 \brief Advance pointers of image buffer (after each user request)
567 void pwc_next_image(struct pwc_device *pdev)
569 pdev->image_used[pdev->fill_image] = 0;
570 pdev->fill_image = (pdev->fill_image + 1) % pwc_mbufs;
574 * Print debug information when a frame is discarded because all of our buffer
577 static void pwc_frame_dumped(struct pwc_device *pdev)
579 pdev->vframes_dumped++;
580 if (pdev->vframe_count < FRAME_LOWMARK)
583 if (pdev->vframes_dumped < 20)
584 PWC_DEBUG_FLOW("Dumping frame %d\n", pdev->vframe_count);
585 else if (pdev->vframes_dumped == 20)
586 PWC_DEBUG_FLOW("Dumping frame %d (last message)\n",
590 static int pwc_rcv_short_packet(struct pwc_device *pdev, const struct pwc_frame_buf *fbuf)
594 /* The ToUCam Fun CMOS sensor causes the firmware to send 2 or 3 bogus
595 frames on the USB wire after an exposure change. This conditition is
596 however detected in the cam and a bit is set in the header.
598 if (pdev->type == 730) {
599 unsigned char *ptr = (unsigned char *)fbuf->data;
601 if (ptr[1] == 1 && ptr[0] & 0x10) {
602 PWC_TRACE("Hyundai CMOS sensor bug. Dropping frame.\n");
603 pdev->drop_frames += 2;
604 pdev->vframes_error++;
606 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
608 pdev->snapshot_button_status = 1;
609 PWC_TRACE("Snapshot button pressed.\n");
612 PWC_TRACE("Snapshot button released.\n");
615 if ((ptr[0] ^ pdev->vmirror) & 0x02) {
617 PWC_TRACE("Image is mirrored.\n");
619 PWC_TRACE("Image is normal.\n");
621 pdev->vmirror = ptr[0] & 0x03;
622 /* Sometimes the trailer of the 730 is still sent as a 4 byte packet
623 after a short frame; this condition is filtered out specifically. A 4 byte
624 frame doesn't make sense anyway.
625 So we get either this sequence:
626 drop_bit set -> 4 byte frame -> short frame -> good frame
628 drop_bit set -> short frame -> good frame
629 So we drop either 3 or 2 frames in all!
631 if (fbuf->filled == 4)
634 else if (pdev->type == 740 || pdev->type == 720) {
635 unsigned char *ptr = (unsigned char *)fbuf->data;
636 if ((ptr[0] ^ pdev->vmirror) & 0x01) {
638 pdev->snapshot_button_status = 1;
639 PWC_TRACE("Snapshot button pressed.\n");
642 PWC_TRACE("Snapshot button released.\n");
644 pdev->vmirror = ptr[0] & 0x03;
647 /* In case we were instructed to drop the frame, do so silently.
648 The buffer pointers are not updated either (but the counters are reset below).
650 if (pdev->drop_frames > 0)
653 /* Check for underflow first */
654 if (fbuf->filled < pdev->frame_total_size) {
655 PWC_DEBUG_FLOW("Frame buffer underflow (%d bytes);"
656 " discarded.\n", fbuf->filled);
657 pdev->vframes_error++;
660 /* Send only once per EOF */
661 awake = 1; /* delay wake_ups */
663 /* Find our next frame to fill. This will always succeed, since we
664 * nick a frame from either empty or full list, but if we had to
665 * take it from the full list, it means a frame got dropped.
667 if (pwc_next_fill_frame(pdev))
668 pwc_frame_dumped(pdev);
672 pdev->vframe_count++;
676 /* This gets called for the Isochronous pipe (video). This is done in
677 * interrupt time, so it has to be fast, not crash, and not stall. Neat.
679 static void pwc_isoc_handler(struct urb *urb)
681 struct pwc_device *pdev;
684 struct pwc_frame_buf *fbuf;
685 unsigned char *fillptr = NULL, *iso_buf = NULL;
688 pdev = (struct pwc_device *)urb->context;
690 PWC_ERROR("isoc_handler() called with NULL device?!\n");
694 if (urb->status == -ENOENT || urb->status == -ECONNRESET) {
695 PWC_DEBUG_OPEN("URB (%p) unlinked %ssynchronuously.\n", urb, urb->status == -ENOENT ? "" : "a");
698 if (urb->status != -EINPROGRESS && urb->status != 0) {
702 switch(urb->status) {
703 case -ENOSR: errmsg = "Buffer error (overrun)"; break;
704 case -EPIPE: errmsg = "Stalled (device not responding)"; break;
705 case -EOVERFLOW: errmsg = "Babble (bad cable?)"; break;
706 case -EPROTO: errmsg = "Bit-stuff error (bad cable?)"; break;
707 case -EILSEQ: errmsg = "CRC/Timeout (could be anything)"; break;
708 case -ETIME: errmsg = "Device does not respond"; break;
710 PWC_DEBUG_FLOW("pwc_isoc_handler() called with status %d [%s].\n", urb->status, errmsg);
711 /* Give up after a number of contiguous errors on the USB bus.
712 Appearantly something is wrong so we simulate an unplug event.
714 if (++pdev->visoc_errors > MAX_ISOC_ERRORS)
716 PWC_INFO("Too many ISOC errors, bailing out.\n");
717 pdev->error_status = EIO;
719 wake_up_interruptible(&pdev->frameq);
721 goto handler_end; // ugly, but practical
724 fbuf = pdev->fill_frame;
726 PWC_ERROR("pwc_isoc_handler without valid fill frame.\n");
731 fillptr = fbuf->data + fbuf->filled;
734 /* Reset ISOC error counter. We did get here, after all. */
735 pdev->visoc_errors = 0;
737 /* vsync: 0 = don't copy data
742 for (i = 0; i < urb->number_of_packets; i++) {
743 fst = urb->iso_frame_desc[i].status;
744 flen = urb->iso_frame_desc[i].actual_length;
745 iso_buf = urb->transfer_buffer + urb->iso_frame_desc[i].offset;
747 if (flen > 0) { /* if valid data... */
748 if (pdev->vsync > 0) { /* ...and we are not sync-hunting... */
751 /* ...copy data to frame buffer, if possible */
752 if (flen + fbuf->filled > pdev->frame_total_size) {
753 PWC_DEBUG_FLOW("Frame buffer overflow (flen = %d, frame_total_size = %d).\n", flen, pdev->frame_total_size);
754 pdev->vsync = 0; /* Hmm, let's wait for an EOF (end-of-frame) */
755 pdev->vframes_error++;
758 memmove(fillptr, iso_buf, flen);
762 fbuf->filled += flen;
765 if (flen < pdev->vlast_packet_size) {
766 /* Shorter packet... We probably have the end of an image-frame;
767 wake up read() process and let select()/poll() do something.
768 Decompression is done in user time over there.
770 if (pdev->vsync == 2) {
771 if (pwc_rcv_short_packet(pdev, fbuf)) {
773 fbuf = pdev->fill_frame;
777 fillptr = fbuf->data;
781 pdev->vlast_packet_size = flen;
782 } /* ..status == 0 */
784 /* This is normally not interesting to the user, unless
785 * you are really debugging something, default = 0 */
786 static int iso_error;
789 PWC_DEBUG_FLOW("Iso frame %d of USB has error %d\n", i, fst);
795 wake_up_interruptible(&pdev->frameq);
797 urb->dev = pdev->udev;
798 i = usb_submit_urb(urb, GFP_ATOMIC);
800 PWC_ERROR("Error (%d) re-submitting urb in pwc_isoc_handler.\n", i);
804 int pwc_isoc_init(struct pwc_device *pdev)
806 struct usb_device *udev;
810 struct usb_interface *intf;
811 struct usb_host_interface *idesc = NULL;
820 /* Get the current alternate interface, adjust packet size */
821 if (!udev->actconfig)
823 intf = usb_ifnum_to_if(udev, 0);
825 idesc = usb_altnum_to_altsetting(intf, pdev->valternate);
830 /* Search video endpoint */
831 pdev->vmax_packet_size = -1;
832 for (i = 0; i < idesc->desc.bNumEndpoints; i++) {
833 if ((idesc->endpoint[i].desc.bEndpointAddress & 0xF) == pdev->vendpoint) {
834 pdev->vmax_packet_size = le16_to_cpu(idesc->endpoint[i].desc.wMaxPacketSize);
839 if (pdev->vmax_packet_size < 0 || pdev->vmax_packet_size > ISO_MAX_FRAME_SIZE) {
840 PWC_ERROR("Failed to find packet size for video endpoint in current alternate setting.\n");
841 return -ENFILE; /* Odd error, that should be noticeable */
844 /* Set alternate interface */
846 PWC_DEBUG_OPEN("Setting alternate interface %d\n", pdev->valternate);
847 ret = usb_set_interface(pdev->udev, 0, pdev->valternate);
851 for (i = 0; i < MAX_ISO_BUFS; i++) {
852 urb = usb_alloc_urb(ISO_FRAMES_PER_DESC, GFP_KERNEL);
854 PWC_ERROR("Failed to allocate urb %d\n", i);
858 pdev->sbuf[i].urb = urb;
859 PWC_DEBUG_MEMORY("Allocated URB at 0x%p\n", urb);
862 /* De-allocate in reverse order */
864 usb_free_urb(pdev->sbuf[i].urb);
865 pdev->sbuf[i].urb = NULL;
870 /* init URB structure */
871 for (i = 0; i < MAX_ISO_BUFS; i++) {
872 urb = pdev->sbuf[i].urb;
874 urb->interval = 1; // devik
876 urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
877 urb->transfer_flags = URB_ISO_ASAP;
878 urb->transfer_buffer = pdev->sbuf[i].data;
879 urb->transfer_buffer_length = ISO_BUFFER_SIZE;
880 urb->complete = pwc_isoc_handler;
882 urb->start_frame = 0;
883 urb->number_of_packets = ISO_FRAMES_PER_DESC;
884 for (j = 0; j < ISO_FRAMES_PER_DESC; j++) {
885 urb->iso_frame_desc[j].offset = j * ISO_MAX_FRAME_SIZE;
886 urb->iso_frame_desc[j].length = pdev->vmax_packet_size;
891 for (i = 0; i < MAX_ISO_BUFS; i++) {
892 ret = usb_submit_urb(pdev->sbuf[i].urb, GFP_KERNEL);
894 PWC_ERROR("isoc_init() submit_urb %d failed with error %d\n", i, ret);
896 PWC_DEBUG_MEMORY("URB 0x%p submitted.\n", pdev->sbuf[i].urb);
901 PWC_DEBUG_OPEN("<< pwc_isoc_init()\n");
905 static void pwc_iso_stop(struct pwc_device *pdev)
909 /* Unlinking ISOC buffers one by one */
910 for (i = 0; i < MAX_ISO_BUFS; i++) {
913 urb = pdev->sbuf[i].urb;
915 PWC_DEBUG_MEMORY("Unlinking URB %p\n", urb);
921 static void pwc_iso_free(struct pwc_device *pdev)
925 /* Freeing ISOC buffers one by one */
926 for (i = 0; i < MAX_ISO_BUFS; i++) {
929 urb = pdev->sbuf[i].urb;
931 PWC_DEBUG_MEMORY("Freeing URB\n");
933 pdev->sbuf[i].urb = NULL;
938 void pwc_isoc_cleanup(struct pwc_device *pdev)
940 PWC_DEBUG_OPEN(">> pwc_isoc_cleanup()\n");
943 if (pdev->iso_init == 0)
949 /* Stop camera, but only if we are sure the camera is still there (unplug
950 is signalled by EPIPE)
952 if (pdev->error_status && pdev->error_status != EPIPE) {
953 PWC_DEBUG_OPEN("Setting alternate interface 0.\n");
954 usb_set_interface(pdev->udev, 0, 0);
958 PWC_DEBUG_OPEN("<< pwc_isoc_cleanup()\n");
961 int pwc_try_video_mode(struct pwc_device *pdev, int width, int height, int new_fps, int new_compression, int new_snapshot)
965 /* Stop isoc stuff */
966 pwc_isoc_cleanup(pdev);
967 /* Reset parameters */
968 pwc_reset_buffers(pdev);
969 /* Try to set video mode... */
970 start = ret = pwc_set_video_mode(pdev, width, height, new_fps, new_compression, new_snapshot);
972 PWC_DEBUG_FLOW("pwc_set_video_mode attempt 1 failed.\n");
973 /* That failed... restore old mode (we know that worked) */
974 start = pwc_set_video_mode(pdev, pdev->view.x, pdev->view.y, pdev->vframes, pdev->vcompression, pdev->vsnapshot);
976 PWC_DEBUG_FLOW("pwc_set_video_mode attempt 2 failed.\n");
981 if (pwc_isoc_init(pdev) < 0)
983 PWC_WARNING("Failed to restart ISOC transfers in pwc_try_video_mode.\n");
984 ret = -EAGAIN; /* let's try again, who knows if it works a second time */
987 pdev->drop_frames++; /* try to avoid garbage during switch */
988 return ret; /* Return original error code */
994 static struct pwc_device *cd_to_pwc(struct device *cd)
996 struct video_device *vdev = to_video_device(cd);
997 return video_get_drvdata(vdev);
1000 static ssize_t show_pan_tilt(struct device *class_dev,
1001 struct device_attribute *attr, char *buf)
1003 struct pwc_device *pdev = cd_to_pwc(class_dev);
1004 return sprintf(buf, "%d %d\n", pdev->pan_angle, pdev->tilt_angle);
1007 static ssize_t store_pan_tilt(struct device *class_dev,
1008 struct device_attribute *attr,
1009 const char *buf, size_t count)
1011 struct pwc_device *pdev = cd_to_pwc(class_dev);
1015 if (strncmp(buf, "reset", 5) == 0)
1016 ret = pwc_mpt_reset(pdev, 0x3);
1018 else if (sscanf(buf, "%d %d", &pan, &tilt) > 0)
1019 ret = pwc_mpt_set_angle(pdev, pan, tilt);
1025 static DEVICE_ATTR(pan_tilt, S_IRUGO | S_IWUSR, show_pan_tilt,
1028 static ssize_t show_snapshot_button_status(struct device *class_dev,
1029 struct device_attribute *attr, char *buf)
1031 struct pwc_device *pdev = cd_to_pwc(class_dev);
1032 int status = pdev->snapshot_button_status;
1033 pdev->snapshot_button_status = 0;
1034 return sprintf(buf, "%d\n", status);
1037 static DEVICE_ATTR(button, S_IRUGO | S_IWUSR, show_snapshot_button_status,
1040 static int pwc_create_sysfs_files(struct video_device *vdev)
1042 struct pwc_device *pdev = video_get_drvdata(vdev);
1045 rc = device_create_file(&vdev->dev, &dev_attr_button);
1048 if (pdev->features & FEATURE_MOTOR_PANTILT) {
1049 rc = device_create_file(&vdev->dev, &dev_attr_pan_tilt);
1050 if (rc) goto err_button;
1056 device_remove_file(&vdev->dev, &dev_attr_button);
1058 PWC_ERROR("Could not create sysfs files.\n");
1062 static void pwc_remove_sysfs_files(struct video_device *vdev)
1064 struct pwc_device *pdev = video_get_drvdata(vdev);
1065 if (pdev->features & FEATURE_MOTOR_PANTILT)
1066 device_remove_file(&vdev->dev, &dev_attr_pan_tilt);
1067 device_remove_file(&vdev->dev, &dev_attr_button);
1070 #ifdef CONFIG_USB_PWC_DEBUG
1071 static const char *pwc_sensor_type_to_string(unsigned int sensor_type)
1073 switch(sensor_type) {
1075 return "Hyundai CMOS sensor";
1077 return "Sony CCD sensor + TDA8787";
1079 return "Sony CCD sensor + Exas 98L59";
1081 return "Sony CCD sensor + ADI 9804";
1083 return "Sharp CCD sensor + TDA8787";
1085 return "Sharp CCD sensor + Exas 98L59";
1087 return "Sharp CCD sensor + ADI 9804";
1089 return "UPA 1021 sensor";
1091 return "VGA sensor";
1093 return "PAL MR sensor";
1095 return "unknown type of sensor";
1100 /***************************************************************************/
1101 /* Video4Linux functions */
1103 static int pwc_video_open(struct file *file)
1106 struct video_device *vdev = video_devdata(file);
1107 struct pwc_device *pdev;
1109 PWC_DEBUG_OPEN(">> video_open called(vdev = 0x%p).\n", vdev);
1111 pdev = video_get_drvdata(vdev);
1114 PWC_DEBUG_OPEN("I'm busy, someone is using the device.\n");
1118 mutex_lock(&pdev->modlock);
1119 if (!pdev->usb_init) {
1120 PWC_DEBUG_OPEN("Doing first time initialization.\n");
1123 /* Query sensor type */
1124 ret = pwc_get_cmos_sensor(pdev, &i);
1127 PWC_DEBUG_OPEN("This %s camera is equipped with a %s (%d).\n",
1129 pwc_sensor_type_to_string(i), i);
1133 /* Turn on camera */
1135 i = pwc_camera_power(pdev, 1);
1137 PWC_DEBUG_OPEN("Failed to restore power to the camera! (%d)\n", i);
1139 /* Set LED on/off time */
1140 if (pwc_set_leds(pdev, led_on, led_off) < 0)
1141 PWC_DEBUG_OPEN("Failed to set LED on/off time.\n");
1143 pwc_construct(pdev); /* set min/max sizes correct */
1145 /* So far, so good. Allocate memory. */
1146 i = pwc_allocate_buffers(pdev);
1148 PWC_DEBUG_OPEN("Failed to allocate buffers memory.\n");
1149 pwc_free_buffers(pdev);
1150 mutex_unlock(&pdev->modlock);
1154 /* Reset buffers & parameters */
1155 pwc_reset_buffers(pdev);
1156 for (i = 0; i < pwc_mbufs; i++)
1157 pdev->image_used[i] = 0;
1158 pdev->vframe_count = 0;
1159 pdev->vframes_dumped = 0;
1160 pdev->vframes_error = 0;
1161 pdev->visoc_errors = 0;
1162 pdev->error_status = 0;
1163 pwc_construct(pdev); /* set min/max sizes correct */
1165 /* Set some defaults */
1166 pdev->vsnapshot = 0;
1168 /* Start iso pipe for video; first try the last used video size
1169 (or the default one); if that fails try QCIF/10 or QSIF/10;
1170 it that fails too, give up.
1172 i = pwc_set_video_mode(pdev, pwc_image_sizes[pdev->vsize].x, pwc_image_sizes[pdev->vsize].y, pdev->vframes, pdev->vcompression, 0);
1174 unsigned int default_resolution;
1175 PWC_DEBUG_OPEN("First attempt at set_video_mode failed.\n");
1176 if (pdev->type>= 730)
1177 default_resolution = PSZ_QSIF;
1179 default_resolution = PSZ_QCIF;
1181 i = pwc_set_video_mode(pdev,
1182 pwc_image_sizes[default_resolution].x,
1183 pwc_image_sizes[default_resolution].y,
1189 PWC_DEBUG_OPEN("Second attempt at set_video_mode failed.\n");
1190 pwc_free_buffers(pdev);
1191 mutex_unlock(&pdev->modlock);
1195 i = pwc_isoc_init(pdev);
1197 PWC_DEBUG_OPEN("Failed to init ISOC stuff = %d.\n", i);
1198 pwc_isoc_cleanup(pdev);
1199 pwc_free_buffers(pdev);
1200 mutex_unlock(&pdev->modlock);
1204 /* Initialize the webcam to sane value */
1205 pwc_set_brightness(pdev, 0x7fff);
1206 pwc_set_agc(pdev, 1, 0);
1209 file->private_data = vdev;
1210 mutex_unlock(&pdev->modlock);
1211 PWC_DEBUG_OPEN("<< video_open() returns 0.\n");
1216 static void pwc_cleanup(struct pwc_device *pdev)
1218 pwc_remove_sysfs_files(pdev->vdev);
1219 video_unregister_device(pdev->vdev);
1222 /* Note that all cleanup is done in the reverse order as in _open */
1223 static int pwc_video_close(struct file *file)
1225 struct video_device *vdev = file->private_data;
1226 struct pwc_device *pdev;
1229 PWC_DEBUG_OPEN(">> video_close called(vdev = 0x%p).\n", vdev);
1232 pdev = video_get_drvdata(vdev);
1233 if (pdev->vopen == 0)
1234 PWC_DEBUG_MODULE("video_close() called on closed device?\n");
1236 /* Dump statistics, but only if a reasonable amount of frames were
1237 processed (to prevent endless log-entries in case of snap-shot
1240 if (pdev->vframe_count > 20)
1241 PWC_DEBUG_MODULE("Closing video device: %d frames received, dumped %d frames, %d frames with errors.\n", pdev->vframe_count, pdev->vframes_dumped, pdev->vframes_error);
1243 if (DEVICE_USE_CODEC1(pdev->type))
1248 pwc_isoc_cleanup(pdev);
1249 pwc_free_buffers(pdev);
1251 /* Turn off LEDS and power down camera, but only when not unplugged */
1252 if (!pdev->unplugged) {
1254 if (pwc_set_leds(pdev, 0, 0) < 0)
1255 PWC_DEBUG_MODULE("Failed to set LED on/off time.\n");
1257 i = pwc_camera_power(pdev, 0);
1259 PWC_ERROR("Failed to power down camera (%d)\n", i);
1262 PWC_DEBUG_OPEN("<< video_close() vopen=%d\n", pdev->vopen);
1265 /* Free memory (don't set pdev to 0 just yet) */
1267 /* search device_hint[] table if we occupy a slot, by any chance */
1268 for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1269 if (device_hint[hint].pdev == pdev)
1270 device_hint[hint].pdev = NULL;
1278 * FIXME: what about two parallel reads ????
1279 * ANSWER: Not supported. You can't open the device more than once,
1280 despite what the V4L1 interface says. First, I don't see
1281 the need, second there's no mechanism of alerting the
1282 2nd/3rd/... process of events like changing image size.
1283 And I don't see the point of blocking that for the
1284 2nd/3rd/... process.
1285 In multi-threaded environments reading parallel from any
1286 device is tricky anyhow.
1289 static ssize_t pwc_video_read(struct file *file, char __user *buf,
1290 size_t count, loff_t *ppos)
1292 struct video_device *vdev = file->private_data;
1293 struct pwc_device *pdev;
1294 int noblock = file->f_flags & O_NONBLOCK;
1295 DECLARE_WAITQUEUE(wait, current);
1296 int bytes_to_read, rv = 0;
1297 void *image_buffer_addr;
1299 PWC_DEBUG_READ("pwc_video_read(vdev=0x%p, buf=%p, count=%zd) called.\n",
1303 pdev = video_get_drvdata(vdev);
1307 mutex_lock(&pdev->modlock);
1308 if (pdev->error_status) {
1309 rv = -pdev->error_status; /* Something happened, report what. */
1313 /* In case we're doing partial reads, we don't have to wait for a frame */
1314 if (pdev->image_read_pos == 0) {
1315 /* Do wait queueing according to the (doc)book */
1316 add_wait_queue(&pdev->frameq, &wait);
1317 while (pdev->full_frames == NULL) {
1318 /* Check for unplugged/etc. here */
1319 if (pdev->error_status) {
1320 remove_wait_queue(&pdev->frameq, &wait);
1321 set_current_state(TASK_RUNNING);
1322 rv = -pdev->error_status ;
1326 remove_wait_queue(&pdev->frameq, &wait);
1327 set_current_state(TASK_RUNNING);
1331 if (signal_pending(current)) {
1332 remove_wait_queue(&pdev->frameq, &wait);
1333 set_current_state(TASK_RUNNING);
1338 set_current_state(TASK_INTERRUPTIBLE);
1340 remove_wait_queue(&pdev->frameq, &wait);
1341 set_current_state(TASK_RUNNING);
1343 /* Decompress and release frame */
1344 if (pwc_handle_frame(pdev)) {
1350 PWC_DEBUG_READ("Copying data to user space.\n");
1351 if (pdev->vpalette == VIDEO_PALETTE_RAW)
1352 bytes_to_read = pdev->frame_size + sizeof(struct pwc_raw_frame);
1354 bytes_to_read = pdev->view.size;
1356 /* copy bytes to user space; we allow for partial reads */
1357 if (count + pdev->image_read_pos > bytes_to_read)
1358 count = bytes_to_read - pdev->image_read_pos;
1359 image_buffer_addr = pdev->image_data;
1360 image_buffer_addr += pdev->images[pdev->fill_image].offset;
1361 image_buffer_addr += pdev->image_read_pos;
1362 if (copy_to_user(buf, image_buffer_addr, count)) {
1366 pdev->image_read_pos += count;
1367 if (pdev->image_read_pos >= bytes_to_read) { /* All data has been read */
1368 pdev->image_read_pos = 0;
1369 pwc_next_image(pdev);
1371 mutex_unlock(&pdev->modlock);
1374 mutex_unlock(&pdev->modlock);
1378 static unsigned int pwc_video_poll(struct file *file, poll_table *wait)
1380 struct video_device *vdev = file->private_data;
1381 struct pwc_device *pdev;
1385 pdev = video_get_drvdata(vdev);
1389 poll_wait(file, &pdev->frameq, wait);
1390 if (pdev->error_status)
1392 if (pdev->full_frames != NULL) /* we have frames waiting */
1393 return (POLLIN | POLLRDNORM);
1398 static long pwc_video_ioctl(struct file *file,
1399 unsigned int cmd, unsigned long arg)
1401 struct video_device *vdev = file->private_data;
1402 struct pwc_device *pdev;
1407 pdev = video_get_drvdata(vdev);
1409 mutex_lock(&pdev->modlock);
1410 if (!pdev->unplugged)
1411 r = video_usercopy(file, cmd, arg, pwc_video_do_ioctl);
1412 mutex_unlock(&pdev->modlock);
1417 static int pwc_video_mmap(struct file *file, struct vm_area_struct *vma)
1419 struct video_device *vdev = file->private_data;
1420 struct pwc_device *pdev;
1421 unsigned long start;
1423 unsigned long page, pos = 0;
1426 PWC_DEBUG_MEMORY(">> %s\n", __func__);
1427 pdev = video_get_drvdata(vdev);
1428 size = vma->vm_end - vma->vm_start;
1429 start = vma->vm_start;
1431 /* Find the idx buffer for this mapping */
1432 for (index = 0; index < pwc_mbufs; index++) {
1433 pos = pdev->images[index].offset;
1434 if ((pos>>PAGE_SHIFT) == vma->vm_pgoff)
1437 if (index == MAX_IMAGES)
1441 * Special case for v4l1. In v4l1, we map only one big buffer,
1442 * but in v4l2 each buffer is mapped
1444 unsigned long total_size;
1445 total_size = pwc_mbufs * pdev->len_per_image;
1446 if (size != pdev->len_per_image && size != total_size) {
1447 PWC_ERROR("Wrong size (%lu) needed to be len_per_image=%d or total_size=%lu\n",
1448 size, pdev->len_per_image, total_size);
1451 } else if (size > pdev->len_per_image)
1454 vma->vm_flags |= VM_IO; /* from 2.6.9-acX */
1456 pos += (unsigned long)pdev->image_data;
1458 page = vmalloc_to_pfn((void *)pos);
1459 if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED))
1463 if (size > PAGE_SIZE)
1471 /***************************************************************************/
1474 /* This function gets called when a new device is plugged in or the usb core
1478 static int usb_pwc_probe(struct usb_interface *intf, const struct usb_device_id *id)
1480 struct usb_device *udev = interface_to_usbdev(intf);
1481 struct pwc_device *pdev = NULL;
1482 int vendor_id, product_id, type_id;
1485 int video_nr = -1; /* default: use next available device */
1486 char serial_number[30], *name;
1488 vendor_id = le16_to_cpu(udev->descriptor.idVendor);
1489 product_id = le16_to_cpu(udev->descriptor.idProduct);
1491 /* Check if we can handle this device */
1492 PWC_DEBUG_PROBE("probe() called [%04X %04X], if %d\n",
1493 vendor_id, product_id,
1494 intf->altsetting->desc.bInterfaceNumber);
1496 /* the interfaces are probed one by one. We are only interested in the
1497 video interface (0) now.
1498 Interface 1 is the Audio Control, and interface 2 Audio itself.
1500 if (intf->altsetting->desc.bInterfaceNumber > 0)
1503 if (vendor_id == 0x0471) {
1504 switch (product_id) {
1506 PWC_INFO("Philips PCA645VC USB webcam detected.\n");
1507 name = "Philips 645 webcam";
1511 PWC_INFO("Philips PCA646VC USB webcam detected.\n");
1512 name = "Philips 646 webcam";
1516 PWC_INFO("Askey VC010 type 2 USB webcam detected.\n");
1517 name = "Askey VC010 webcam";
1521 PWC_INFO("Philips PCVC675K (Vesta) USB webcam detected.\n");
1522 name = "Philips 675 webcam";
1526 PWC_INFO("Philips PCVC680K (Vesta Pro) USB webcam detected.\n");
1527 name = "Philips 680 webcam";
1531 PWC_INFO("Philips PCVC690K (Vesta Pro Scan) USB webcam detected.\n");
1532 name = "Philips 690 webcam";
1536 PWC_INFO("Philips PCVC730K (ToUCam Fun)/PCVC830 (ToUCam II) USB webcam detected.\n");
1537 name = "Philips 730 webcam";
1541 PWC_INFO("Philips PCVC740K (ToUCam Pro)/PCVC840 (ToUCam II) USB webcam detected.\n");
1542 name = "Philips 740 webcam";
1546 PWC_INFO("Philips PCVC750K (ToUCam Pro Scan) USB webcam detected.\n");
1547 name = "Philips 750 webcam";
1551 PWC_INFO("Philips PCVC720K/40 (ToUCam XS) USB webcam detected.\n");
1552 name = "Philips 720K/40 webcam";
1556 PWC_INFO("Philips SPC 900NC USB webcam detected.\n");
1557 name = "Philips SPC 900NC webcam";
1565 else if (vendor_id == 0x069A) {
1566 switch(product_id) {
1568 PWC_INFO("Askey VC010 type 1 USB webcam detected.\n");
1569 name = "Askey VC010 webcam";
1577 else if (vendor_id == 0x046d) {
1578 switch(product_id) {
1580 PWC_INFO("Logitech QuickCam Pro 3000 USB webcam detected.\n");
1581 name = "Logitech QuickCam Pro 3000";
1582 type_id = 740; /* CCD sensor */
1585 PWC_INFO("Logitech QuickCam Notebook Pro USB webcam detected.\n");
1586 name = "Logitech QuickCam Notebook Pro";
1587 type_id = 740; /* CCD sensor */
1590 PWC_INFO("Logitech QuickCam 4000 Pro USB webcam detected.\n");
1591 name = "Logitech QuickCam Pro 4000";
1592 type_id = 740; /* CCD sensor */
1595 PWC_INFO("Logitech QuickCam Zoom USB webcam detected.\n");
1596 name = "Logitech QuickCam Zoom";
1597 type_id = 740; /* CCD sensor */
1600 PWC_INFO("Logitech QuickCam Zoom (new model) USB webcam detected.\n");
1601 name = "Logitech QuickCam Zoom";
1602 type_id = 740; /* CCD sensor */
1606 PWC_INFO("Logitech QuickCam Orbit/Sphere USB webcam detected.\n");
1607 name = "Logitech QuickCam Orbit";
1608 type_id = 740; /* CCD sensor */
1609 features |= FEATURE_MOTOR_PANTILT;
1612 PWC_INFO("Logitech/Cisco VT Camera webcam detected.\n");
1613 name = "Cisco VT Camera";
1614 type_id = 740; /* CCD sensor */
1617 PWC_INFO("Logitech ViewPort AV 100 webcam detected.\n");
1618 name = "Logitech ViewPort AV 100";
1619 type_id = 740; /* CCD sensor */
1621 case 0x08b8: /* Where this released? */
1622 PWC_INFO("Logitech QuickCam detected (reserved ID).\n");
1623 name = "Logitech QuickCam (res.)";
1624 type_id = 730; /* Assuming CMOS */
1631 else if (vendor_id == 0x055d) {
1632 /* I don't know the difference between the C10 and the C30;
1633 I suppose the difference is the sensor, but both cameras
1634 work equally well with a type_id of 675
1636 switch(product_id) {
1638 PWC_INFO("Samsung MPC-C10 USB webcam detected.\n");
1639 name = "Samsung MPC-C10";
1643 PWC_INFO("Samsung MPC-C30 USB webcam detected.\n");
1644 name = "Samsung MPC-C30";
1648 PWC_INFO("Samsung SNC-35E (v3.0) USB webcam detected.\n");
1649 name = "Samsung MPC-C30";
1657 else if (vendor_id == 0x041e) {
1658 switch(product_id) {
1660 PWC_INFO("Creative Labs Webcam 5 detected.\n");
1661 name = "Creative Labs Webcam 5";
1665 PWC_INFO("Creative Labs Webcam Pro Ex detected.\n");
1666 name = "Creative Labs Webcam Pro Ex";
1674 else if (vendor_id == 0x04cc) {
1675 switch(product_id) {
1677 PWC_INFO("Sotec Afina Eye USB webcam detected.\n");
1678 name = "Sotec Afina Eye";
1686 else if (vendor_id == 0x06be) {
1687 switch(product_id) {
1689 /* This is essentially the same cam as the Sotec Afina Eye */
1690 PWC_INFO("AME Co. Afina Eye USB webcam detected.\n");
1691 name = "AME Co. Afina Eye";
1700 else if (vendor_id == 0x0d81) {
1701 switch(product_id) {
1703 PWC_INFO("Visionite VCS-UC300 USB webcam detected.\n");
1704 name = "Visionite VCS-UC300";
1705 type_id = 740; /* CCD sensor */
1708 PWC_INFO("Visionite VCS-UM100 USB webcam detected.\n");
1709 name = "Visionite VCS-UM100";
1710 type_id = 730; /* CMOS sensor */
1718 return -ENODEV; /* Not any of the know types; but the list keeps growing. */
1720 memset(serial_number, 0, 30);
1721 usb_string(udev, udev->descriptor.iSerialNumber, serial_number, 29);
1722 PWC_DEBUG_PROBE("Device serial number is %s\n", serial_number);
1724 if (udev->descriptor.bNumConfigurations > 1)
1725 PWC_WARNING("Warning: more than 1 configuration available.\n");
1727 /* Allocate structure, initialize pointers, mutexes, etc. and link it to the usb_device */
1728 pdev = kzalloc(sizeof(struct pwc_device), GFP_KERNEL);
1730 PWC_ERROR("Oops, could not allocate memory for pwc_device.\n");
1733 pdev->type = type_id;
1734 pdev->vsize = default_size;
1735 pdev->vframes = default_fps;
1736 strcpy(pdev->serial, serial_number);
1737 pdev->features = features;
1738 if (vendor_id == 0x046D && product_id == 0x08B5)
1740 /* Logitech QuickCam Orbit
1741 The ranges have been determined experimentally; they may differ from cam to cam.
1742 Also, the exact ranges left-right and up-down are different for my cam
1744 pdev->angle_range.pan_min = -7000;
1745 pdev->angle_range.pan_max = 7000;
1746 pdev->angle_range.tilt_min = -3000;
1747 pdev->angle_range.tilt_max = 2500;
1750 mutex_init(&pdev->modlock);
1751 spin_lock_init(&pdev->ptrlock);
1754 init_waitqueue_head(&pdev->frameq);
1755 pdev->vcompression = pwc_preferred_compression;
1757 /* Allocate video_device structure */
1758 pdev->vdev = video_device_alloc();
1760 PWC_ERROR("Err, cannot allocate video_device struture. Failing probe.");
1764 memcpy(pdev->vdev, &pwc_template, sizeof(pwc_template));
1765 pdev->vdev->parent = &(udev->dev);
1766 strcpy(pdev->vdev->name, name);
1767 video_set_drvdata(pdev->vdev, pdev);
1769 pdev->release = le16_to_cpu(udev->descriptor.bcdDevice);
1770 PWC_DEBUG_PROBE("Release: %04x\n", pdev->release);
1772 /* Now search device_hint[] table for a match, so we can hint a node number. */
1773 for (hint = 0; hint < MAX_DEV_HINTS; hint++) {
1774 if (((device_hint[hint].type == -1) || (device_hint[hint].type == pdev->type)) &&
1775 (device_hint[hint].pdev == NULL)) {
1776 /* so far, so good... try serial number */
1777 if ((device_hint[hint].serial_number[0] == '*') || !strcmp(device_hint[hint].serial_number, serial_number)) {
1779 video_nr = device_hint[hint].device_node;
1780 PWC_DEBUG_PROBE("Found hint, will try to register as /dev/video%d\n", video_nr);
1786 pdev->vdev->release = video_device_release;
1787 i = video_register_device(pdev->vdev, VFL_TYPE_GRABBER, video_nr);
1789 PWC_ERROR("Failed to register as video device (%d).\n", i);
1794 PWC_INFO("Registered as /dev/video%d.\n", pdev->vdev->num);
1798 if (hint < MAX_DEV_HINTS)
1799 device_hint[hint].pdev = pdev;
1801 PWC_DEBUG_PROBE("probe() function returning struct at 0x%p.\n", pdev);
1802 usb_set_intfdata (intf, pdev);
1803 rc = pwc_create_sysfs_files(pdev->vdev);
1807 /* Set the leds off */
1808 pwc_set_leds(pdev, 0, 0);
1809 pwc_camera_power(pdev, 0);
1814 if (hint < MAX_DEV_HINTS)
1815 device_hint[hint].pdev = NULL;
1816 video_unregister_device(pdev->vdev);
1818 video_device_release(pdev->vdev); /* Drip... drip... drip... */
1819 kfree(pdev); /* Oops, no memory leaks please */
1823 /* The user janked out the cable... */
1824 static void usb_pwc_disconnect(struct usb_interface *intf)
1826 struct pwc_device *pdev;
1830 pdev = usb_get_intfdata (intf);
1831 usb_set_intfdata (intf, NULL);
1833 PWC_ERROR("pwc_disconnect() Called without private pointer.\n");
1834 goto disconnect_out;
1836 if (pdev->udev == NULL) {
1837 PWC_ERROR("pwc_disconnect() already called for %p\n", pdev);
1838 goto disconnect_out;
1840 if (pdev->udev != interface_to_usbdev(intf)) {
1841 PWC_ERROR("pwc_disconnect() Woops: pointer mismatch udev/pdev.\n");
1842 goto disconnect_out;
1845 /* We got unplugged; this is signalled by an EPIPE error code */
1847 PWC_INFO("Disconnected while webcam is in use!\n");
1848 pdev->error_status = EPIPE;
1851 /* Alert waiting processes */
1852 wake_up_interruptible(&pdev->frameq);
1853 /* Wait until device is closed */
1855 mutex_lock(&pdev->modlock);
1856 pdev->unplugged = 1;
1857 mutex_unlock(&pdev->modlock);
1860 /* Device is closed, so we can safely unregister it */
1861 PWC_DEBUG_PROBE("Unregistering video device in disconnect().\n");
1863 /* Free memory (don't set pdev to 0 just yet) */
1867 /* search device_hint[] table if we occupy a slot, by any chance */
1868 for (hint = 0; hint < MAX_DEV_HINTS; hint++)
1869 if (device_hint[hint].pdev == pdev)
1870 device_hint[hint].pdev = NULL;
1876 /* *grunt* We have to do atoi ourselves :-( */
1877 static int pwc_atoi(const char *s)
1882 while (*s != '\0' && *s >= '0' && *s <= '9') {
1883 k = 10 * k + (*s - '0');
1891 * Initialization code & module stuff
1898 static int compression = -1;
1899 static int leds[2] = { -1, -1 };
1900 static unsigned int leds_nargs;
1901 static char *dev_hint[MAX_DEV_HINTS];
1902 static unsigned int dev_hint_nargs;
1904 module_param(size, charp, 0444);
1905 module_param(fps, int, 0444);
1906 module_param(fbufs, int, 0444);
1907 module_param(mbufs, int, 0444);
1908 #ifdef CONFIG_USB_PWC_DEBUG
1909 module_param_named(trace, pwc_trace, int, 0644);
1911 module_param(power_save, int, 0444);
1912 module_param(compression, int, 0444);
1913 module_param_array(leds, int, &leds_nargs, 0444);
1914 module_param_array(dev_hint, charp, &dev_hint_nargs, 0444);
1916 MODULE_PARM_DESC(size, "Initial image size. One of sqcif, qsif, qcif, sif, cif, vga");
1917 MODULE_PARM_DESC(fps, "Initial frames per second. Varies with model, useful range 5-30");
1918 MODULE_PARM_DESC(fbufs, "Number of internal frame buffers to reserve");
1919 MODULE_PARM_DESC(mbufs, "Number of external (mmap()ed) image buffers");
1920 MODULE_PARM_DESC(trace, "For debugging purposes");
1921 MODULE_PARM_DESC(power_save, "Turn power save feature in camera on or off");
1922 MODULE_PARM_DESC(compression, "Preferred compression quality. Range 0 (uncompressed) to 3 (high compression)");
1923 MODULE_PARM_DESC(leds, "LED on,off time in milliseconds");
1924 MODULE_PARM_DESC(dev_hint, "Device node hints");
1926 MODULE_DESCRIPTION("Philips & OEM USB webcam driver");
1927 MODULE_AUTHOR("Luc Saillard <luc@saillard.org>");
1928 MODULE_LICENSE("GPL");
1929 MODULE_ALIAS("pwcx");
1930 MODULE_VERSION( PWC_VERSION );
1932 static int __init usb_pwc_init(void)
1935 char *sizenames[PSZ_MAX] = { "sqcif", "qsif", "qcif", "sif", "cif", "vga" };
1937 PWC_INFO("Philips webcam module version " PWC_VERSION " loaded.\n");
1938 PWC_INFO("Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.\n");
1939 PWC_INFO("Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,\n");
1940 PWC_INFO("the Creative WebCam 5 & Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.\n");
1943 if (fps < 4 || fps > 30) {
1944 PWC_ERROR("Framerate out of bounds (4-30).\n");
1948 PWC_DEBUG_MODULE("Default framerate set to %d.\n", default_fps);
1952 /* string; try matching with array */
1953 for (sz = 0; sz < PSZ_MAX; sz++) {
1954 if (!strcmp(sizenames[sz], size)) { /* Found! */
1959 if (sz == PSZ_MAX) {
1960 PWC_ERROR("Size not recognized; try size=[sqcif | qsif | qcif | sif | cif | vga].\n");
1963 PWC_DEBUG_MODULE("Default image size set to %s [%dx%d].\n", sizenames[default_size], pwc_image_sizes[default_size].x, pwc_image_sizes[default_size].y);
1966 if (mbufs < 1 || mbufs > MAX_IMAGES) {
1967 PWC_ERROR("Illegal number of mmap() buffers; use a number between 1 and %d.\n", MAX_IMAGES);
1971 PWC_DEBUG_MODULE("Number of image buffers set to %d.\n", pwc_mbufs);
1974 if (fbufs < 2 || fbufs > MAX_FRAMES) {
1975 PWC_ERROR("Illegal number of frame buffers; use a number between 2 and %d.\n", MAX_FRAMES);
1978 default_fbufs = fbufs;
1979 PWC_DEBUG_MODULE("Number of frame buffers set to %d.\n", default_fbufs);
1981 #ifdef CONFIG_USB_PWC_DEBUG
1982 if (pwc_trace >= 0) {
1983 PWC_DEBUG_MODULE("Trace options: 0x%04x\n", pwc_trace);
1986 if (compression >= 0) {
1987 if (compression > 3) {
1988 PWC_ERROR("Invalid compression setting; use a number between 0 (uncompressed) and 3 (high).\n");
1991 pwc_preferred_compression = compression;
1992 PWC_DEBUG_MODULE("Preferred compression set to %d.\n", pwc_preferred_compression);
1995 PWC_DEBUG_MODULE("Enabling power save on open/close.\n");
2001 /* Big device node whoopla. Basically, it allows you to assign a
2002 device node (/dev/videoX) to a camera, based on its type
2003 & serial number. The format is [type[.serialnumber]:]node.
2005 Any camera that isn't matched by these rules gets the next
2006 available free device node.
2008 for (i = 0; i < MAX_DEV_HINTS; i++) {
2009 char *s, *colon, *dot;
2011 /* This loop also initializes the array */
2012 device_hint[i].pdev = NULL;
2014 if (s != NULL && *s != '\0') {
2015 device_hint[i].type = -1; /* wildcard */
2016 strcpy(device_hint[i].serial_number, "*");
2018 /* parse string: chop at ':' & '/' */
2020 while (*colon != '\0' && *colon != ':')
2022 while (*dot != '\0' && *dot != '.')
2024 /* Few sanity checks */
2025 if (*dot != '\0' && dot > colon) {
2026 PWC_ERROR("Malformed camera hint: the colon must be after the dot.\n");
2030 if (*colon == '\0') {
2033 PWC_ERROR("Malformed camera hint: no colon + device node given.\n");
2037 /* No type or serial number specified, just a number. */
2038 device_hint[i].device_node = pwc_atoi(s);
2042 /* There's a colon, so we have at least a type and a device node */
2043 device_hint[i].type = pwc_atoi(s);
2044 device_hint[i].device_node = pwc_atoi(colon + 1);
2046 /* There's a serial number as well */
2051 while (*dot != ':' && k < 29) {
2052 device_hint[i].serial_number[k++] = *dot;
2055 device_hint[i].serial_number[k] = '\0';
2058 PWC_TRACE("device_hint[%d]:\n", i);
2059 PWC_TRACE(" type : %d\n", device_hint[i].type);
2060 PWC_TRACE(" serial# : %s\n", device_hint[i].serial_number);
2061 PWC_TRACE(" node : %d\n", device_hint[i].device_node);
2064 device_hint[i].type = 0; /* not filled */
2065 } /* ..for MAX_DEV_HINTS */
2067 PWC_DEBUG_PROBE("Registering driver at address 0x%p.\n", &pwc_driver);
2068 return usb_register(&pwc_driver);
2071 static void __exit usb_pwc_exit(void)
2073 PWC_DEBUG_MODULE("Deregistering driver.\n");
2074 usb_deregister(&pwc_driver);
2075 PWC_INFO("Philips webcam module removed.\n");
2078 module_init(usb_pwc_init);
2079 module_exit(usb_pwc_exit);
2081 /* vim: set cino= formatoptions=croql cindent shiftwidth=8 tabstop=8: */