2 * Zoran 364xx based USB webcam module version 0.73
4 * Allows you to use your USB webcam with V4L2 applications
5 * This is still in heavy developpement !
7 * Copyright (C) 2004 Antoine Jacquet <royale@zerezo.com>
8 * http://royale.zerezo.com/zr364xx/
10 * Heavily inspired by usb-skeleton.c, vicam.c, cpia.c and spca50x.c drivers
11 * V4L2 version inspired by meye.c driver
13 * Some video buffer code by Lamarque based on s2255drv.c and vivi.c drivers.
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/usb.h>
34 #include <linux/vmalloc.h>
35 #include <linux/slab.h>
36 #include <linux/proc_fs.h>
37 #include <linux/highmem.h>
38 #include <media/v4l2-common.h>
39 #include <media/v4l2-ioctl.h>
40 #include <media/v4l2-device.h>
41 #include <media/v4l2-ctrls.h>
42 #include <media/v4l2-fh.h>
43 #include <media/v4l2-event.h>
44 #include <media/videobuf-vmalloc.h>
47 /* Version Information */
48 #define DRIVER_VERSION "0.7.4"
49 #define DRIVER_AUTHOR "Antoine Jacquet, http://royale.zerezo.com/"
50 #define DRIVER_DESC "Zoran 364xx"
55 #define MAX_FRAME_SIZE 200000
56 #define BUFFER_SIZE 0x1000
57 #define CTRL_TIMEOUT 500
59 #define ZR364XX_DEF_BUFS 4
60 #define ZR364XX_READ_IDLE 0
61 #define ZR364XX_READ_FRAME 1
64 #define DBG(fmt, args...) \
67 printk(KERN_INFO KBUILD_MODNAME " " fmt, ##args); \
71 /*#define FULL_DEBUG 1*/
75 #define _DBG(fmt, args...)
78 /* Init methods, need to find nicer names for these
79 * the exact names of the chipsets would be the best if someone finds it */
86 /* Module parameters */
91 /* Module parameters interface */
92 module_param(debug, int, 0644);
93 MODULE_PARM_DESC(debug, "Debug level");
94 module_param(mode, int, 0644);
95 MODULE_PARM_DESC(mode, "0 = 320x240, 1 = 160x120, 2 = 640x480");
98 /* Devices supported by this driver
99 * .driver_info contains the init method used by the camera */
100 static struct usb_device_id device_table[] = {
101 {USB_DEVICE(0x08ca, 0x0109), .driver_info = METHOD0 },
102 {USB_DEVICE(0x041e, 0x4024), .driver_info = METHOD0 },
103 {USB_DEVICE(0x0d64, 0x0108), .driver_info = METHOD0 },
104 {USB_DEVICE(0x0546, 0x3187), .driver_info = METHOD0 },
105 {USB_DEVICE(0x0d64, 0x3108), .driver_info = METHOD0 },
106 {USB_DEVICE(0x0595, 0x4343), .driver_info = METHOD0 },
107 {USB_DEVICE(0x0bb0, 0x500d), .driver_info = METHOD0 },
108 {USB_DEVICE(0x0feb, 0x2004), .driver_info = METHOD0 },
109 {USB_DEVICE(0x055f, 0xb500), .driver_info = METHOD0 },
110 {USB_DEVICE(0x08ca, 0x2062), .driver_info = METHOD2 },
111 {USB_DEVICE(0x052b, 0x1a18), .driver_info = METHOD1 },
112 {USB_DEVICE(0x04c8, 0x0729), .driver_info = METHOD0 },
113 {USB_DEVICE(0x04f2, 0xa208), .driver_info = METHOD0 },
114 {USB_DEVICE(0x0784, 0x0040), .driver_info = METHOD1 },
115 {USB_DEVICE(0x06d6, 0x0034), .driver_info = METHOD0 },
116 {USB_DEVICE(0x0a17, 0x0062), .driver_info = METHOD2 },
117 {USB_DEVICE(0x06d6, 0x003b), .driver_info = METHOD0 },
118 {USB_DEVICE(0x0a17, 0x004e), .driver_info = METHOD2 },
119 {USB_DEVICE(0x041e, 0x405d), .driver_info = METHOD2 },
120 {USB_DEVICE(0x08ca, 0x2102), .driver_info = METHOD3 },
121 {USB_DEVICE(0x06d6, 0x003d), .driver_info = METHOD0 },
122 {} /* Terminating entry */
125 MODULE_DEVICE_TABLE(usb, device_table);
127 /* frame structure */
128 struct zr364xx_framei {
129 unsigned long ulState; /* ulState:ZR364XX_READ_IDLE,
130 ZR364XX_READ_FRAME */
131 void *lpvbits; /* image data */
132 unsigned long cur_size; /* current data copied to it */
135 /* image buffer structure */
136 struct zr364xx_bufferi {
137 unsigned long dwFrames; /* number of frames in buffer */
138 struct zr364xx_framei frame[FRAMES]; /* array of FRAME structures */
141 struct zr364xx_dmaqueue {
142 struct list_head active;
143 struct zr364xx_camera *cam;
146 struct zr364xx_pipeinfo {
151 void *cam; /* back pointer to zr364xx_camera struct */
163 static const struct zr364xx_fmt formats[] = {
166 .fourcc = V4L2_PIX_FMT_JPEG,
172 struct zr364xx_camera {
173 struct usb_device *udev; /* save off the usb device pointer */
174 struct usb_interface *interface;/* the interface for this device */
175 struct v4l2_device v4l2_dev;
176 struct v4l2_ctrl_handler ctrl_handler;
177 struct video_device vdev; /* v4l video device */
178 struct v4l2_fh *owner; /* owns the streaming */
180 struct zr364xx_bufferi buffer;
188 struct zr364xx_dmaqueue vidq;
191 unsigned long frame_count;
193 struct zr364xx_pipeinfo pipe[1];
197 const struct zr364xx_fmt *fmt;
198 struct videobuf_queue vb_vidq;
201 /* buffer for one video frame */
202 struct zr364xx_buffer {
203 /* common v4l buffer stuff -- must be first */
204 struct videobuf_buffer vb;
205 const struct zr364xx_fmt *fmt;
208 /* function used to send initialisation commands to the camera */
209 static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
210 u16 index, unsigned char *cp, u16 size)
214 unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL);
215 if (!transfer_buffer) {
216 dev_err(&udev->dev, "kmalloc(%d) failed\n", size);
220 memcpy(transfer_buffer, cp, size);
222 status = usb_control_msg(udev,
223 usb_sndctrlpipe(udev, 0),
225 USB_DIR_OUT | USB_TYPE_VENDOR |
226 USB_RECIP_DEVICE, value, index,
227 transfer_buffer, size, CTRL_TIMEOUT);
229 kfree(transfer_buffer);
234 /* Control messages sent to the camera to initialize it
235 * and launch the capture */
239 unsigned char *bytes;
243 static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
244 static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
245 static unsigned char m0d3[] = { 0, 0 };
246 static message m0[] = {
249 {0x3370, sizeof(m0d1), m0d1},
252 {0x2610, sizeof(m0d2), m0d2},
257 {0x9a01, sizeof(m0d3), m0d3},
262 static unsigned char m1d1[] = { 0xff, 0xff };
263 static unsigned char m1d2[] = { 0x00, 0x00 };
264 static message m1[] = {
272 {0x2502, sizeof(m1d1), m1d1},
277 {0x9a01, sizeof(m1d2), m1d2},
282 static unsigned char m2d1[] = { 0xff, 0xff };
283 static message m2[] = {
290 {0x2502, sizeof(m2d1), m2d1},
296 static message *init[4] = { m0, m1, m2, m2 };
299 /* JPEG static data in header (Huffman table, etc) */
300 static unsigned char header1[] = {
303 0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
304 0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
306 0xFF, 0xDB, 0x00, 0x84
308 static unsigned char header2[] = {
309 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
310 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
311 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
312 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
313 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
314 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
315 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
316 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
317 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
318 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
319 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
320 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
321 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
322 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
323 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
324 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
325 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
326 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
327 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
328 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
329 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
330 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
331 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
332 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
333 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
334 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
335 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
336 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
337 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
338 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
339 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
340 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
341 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
342 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
343 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
344 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
345 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
346 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
347 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
348 0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
349 0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
350 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
353 static unsigned char header3;
355 /* ------------------------------------------------------------------
357 ------------------------------------------------------------------*/
359 static int buffer_setup(struct videobuf_queue *vq, unsigned int *count,
362 struct zr364xx_camera *cam = vq->priv_data;
364 *size = cam->width * cam->height * (cam->fmt->depth >> 3);
367 *count = ZR364XX_DEF_BUFS;
369 if (*size * *count > ZR364XX_DEF_BUFS * 1024 * 1024)
370 *count = (ZR364XX_DEF_BUFS * 1024 * 1024) / *size;
375 static void free_buffer(struct videobuf_queue *vq, struct zr364xx_buffer *buf)
377 _DBG("%s\n", __func__);
382 videobuf_vmalloc_free(&buf->vb);
383 buf->vb.state = VIDEOBUF_NEEDS_INIT;
386 static int buffer_prepare(struct videobuf_queue *vq, struct videobuf_buffer *vb,
387 enum v4l2_field field)
389 struct zr364xx_camera *cam = vq->priv_data;
390 struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
394 DBG("%s, field=%d, fmt name = %s\n", __func__, field, cam->fmt != NULL ?
395 cam->fmt->name : "");
396 if (cam->fmt == NULL)
399 buf->vb.size = cam->width * cam->height * (cam->fmt->depth >> 3);
401 if (buf->vb.baddr != 0 && buf->vb.bsize < buf->vb.size) {
402 DBG("invalid buffer prepare\n");
407 buf->vb.width = cam->width;
408 buf->vb.height = cam->height;
409 buf->vb.field = field;
411 if (buf->vb.state == VIDEOBUF_NEEDS_INIT) {
412 rc = videobuf_iolock(vq, &buf->vb, NULL);
417 buf->vb.state = VIDEOBUF_PREPARED;
420 free_buffer(vq, buf);
424 static void buffer_queue(struct videobuf_queue *vq, struct videobuf_buffer *vb)
426 struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
428 struct zr364xx_camera *cam = vq->priv_data;
430 _DBG("%s\n", __func__);
432 buf->vb.state = VIDEOBUF_QUEUED;
433 list_add_tail(&buf->vb.queue, &cam->vidq.active);
436 static void buffer_release(struct videobuf_queue *vq,
437 struct videobuf_buffer *vb)
439 struct zr364xx_buffer *buf = container_of(vb, struct zr364xx_buffer,
442 _DBG("%s\n", __func__);
443 free_buffer(vq, buf);
446 static struct videobuf_queue_ops zr364xx_video_qops = {
447 .buf_setup = buffer_setup,
448 .buf_prepare = buffer_prepare,
449 .buf_queue = buffer_queue,
450 .buf_release = buffer_release,
453 /********************/
454 /* V4L2 integration */
455 /********************/
456 static int zr364xx_vidioc_streamon(struct file *file, void *priv,
457 enum v4l2_buf_type type);
459 static ssize_t zr364xx_read(struct file *file, char __user *buf, size_t count,
462 struct zr364xx_camera *cam = video_drvdata(file);
465 _DBG("%s\n", __func__);
473 if (mutex_lock_interruptible(&cam->lock))
476 err = zr364xx_vidioc_streamon(file, file->private_data,
477 V4L2_BUF_TYPE_VIDEO_CAPTURE);
479 DBG("%s: reading %d bytes at pos %d.\n", __func__,
480 (int) count, (int) *ppos);
483 err = videobuf_read_one(&cam->vb_vidq, buf, count, ppos,
484 file->f_flags & O_NONBLOCK);
486 mutex_unlock(&cam->lock);
490 /* video buffer vmalloc implementation based partly on VIVI driver which is
491 * Copyright (c) 2006 by
492 * Mauro Carvalho Chehab <mchehab--a.t--infradead.org>
493 * Ted Walther <ted--a.t--enumera.com>
494 * John Sokol <sokol--a.t--videotechnology.com>
495 * http://v4l.videotechnology.com/
498 static void zr364xx_fillbuff(struct zr364xx_camera *cam,
499 struct zr364xx_buffer *buf,
505 char *vbuf = videobuf_to_vmalloc(&buf->vb);
506 unsigned long last_frame;
511 last_frame = cam->last_frame;
512 if (last_frame != -1) {
513 tmpbuf = (const char *)cam->buffer.frame[last_frame].lpvbits;
514 switch (buf->fmt->fourcc) {
515 case V4L2_PIX_FMT_JPEG:
516 buf->vb.size = jpgsize;
517 memcpy(vbuf, tmpbuf, buf->vb.size);
520 printk(KERN_DEBUG KBUILD_MODNAME ": unknown format?\n");
522 cam->last_frame = -1;
524 printk(KERN_ERR KBUILD_MODNAME ": =======no frame\n");
527 DBG("%s: Buffer 0x%08lx size= %d\n", __func__,
528 (unsigned long)vbuf, pos);
529 /* tell v4l buffer was filled */
531 buf->vb.field_count = cam->frame_count * 2;
532 do_gettimeofday(&ts);
534 buf->vb.state = VIDEOBUF_DONE;
537 static int zr364xx_got_frame(struct zr364xx_camera *cam, int jpgsize)
539 struct zr364xx_dmaqueue *dma_q = &cam->vidq;
540 struct zr364xx_buffer *buf;
541 unsigned long flags = 0;
544 DBG("wakeup: %p\n", &dma_q);
545 spin_lock_irqsave(&cam->slock, flags);
547 if (list_empty(&dma_q->active)) {
548 DBG("No active queue to serve\n");
552 buf = list_entry(dma_q->active.next,
553 struct zr364xx_buffer, vb.queue);
555 if (!waitqueue_active(&buf->vb.done)) {
560 list_del(&buf->vb.queue);
561 do_gettimeofday(&buf->vb.ts);
562 DBG("[%p/%d] wakeup\n", buf, buf->vb.i);
563 zr364xx_fillbuff(cam, buf, jpgsize);
564 wake_up(&buf->vb.done);
565 DBG("wakeup [buf/i] [%p/%d]\n", buf, buf->vb.i);
567 spin_unlock_irqrestore(&cam->slock, flags);
571 /* this function moves the usb stream read pipe data
572 * into the system buffers.
573 * returns 0 on success, EAGAIN if more data to process (call this
576 static int zr364xx_read_video_callback(struct zr364xx_camera *cam,
577 struct zr364xx_pipeinfo *pipe_info,
580 unsigned char *pdest;
583 struct zr364xx_framei *frm;
585 unsigned char *ptr = NULL;
587 _DBG("buffer to user\n");
588 idx = cam->cur_frame;
589 frm = &cam->buffer.frame[idx];
591 /* swap bytes if camera needs it */
592 if (cam->method == METHOD0) {
593 u16 *buf = (u16 *)pipe_info->transfer_buffer;
594 for (i = 0; i < purb->actual_length/2; i++)
598 /* search done. now find out if should be acquiring */
599 if (!cam->b_acquire) {
600 /* we found a frame, but this channel is turned off */
601 frm->ulState = ZR364XX_READ_IDLE;
605 psrc = (u8 *)pipe_info->transfer_buffer;
606 ptr = pdest = frm->lpvbits;
608 if (frm->ulState == ZR364XX_READ_IDLE) {
609 frm->ulState = ZR364XX_READ_FRAME;
612 _DBG("jpeg header, ");
613 memcpy(ptr, header1, sizeof(header1));
614 ptr += sizeof(header1);
616 memcpy(ptr, &header3, 1);
618 memcpy(ptr, psrc, 64);
621 memcpy(ptr, &header3, 1);
623 memcpy(ptr, psrc + 64, 64);
625 memcpy(ptr, header2, sizeof(header2));
626 ptr += sizeof(header2);
627 memcpy(ptr, psrc + 128,
628 purb->actual_length - 128);
629 ptr += purb->actual_length - 128;
630 _DBG("header : %d %d %d %d %d %d %d %d %d\n",
631 psrc[0], psrc[1], psrc[2],
632 psrc[3], psrc[4], psrc[5],
633 psrc[6], psrc[7], psrc[8]);
634 frm->cur_size = ptr - pdest;
636 if (frm->cur_size + purb->actual_length > MAX_FRAME_SIZE) {
637 dev_info(&cam->udev->dev,
638 "%s: buffer (%d bytes) too small to hold "
639 "frame data. Discarding frame data.\n",
640 __func__, MAX_FRAME_SIZE);
642 pdest += frm->cur_size;
643 memcpy(pdest, psrc, purb->actual_length);
644 frm->cur_size += purb->actual_length;
647 /*_DBG("cur_size %lu urb size %d\n", frm->cur_size,
648 purb->actual_length);*/
650 if (purb->actual_length < pipe_info->transfer_size) {
651 _DBG("****************Buffer[%d]full*************\n", idx);
652 cam->last_frame = cam->cur_frame;
654 /* end of system frame ring buffer, start at zero */
655 if (cam->cur_frame == cam->buffer.dwFrames)
659 /* go back to find the JPEG EOI marker */
660 ptr = pdest = frm->lpvbits;
661 ptr += frm->cur_size - 2;
662 while (ptr > pdest) {
663 if (*ptr == 0xFF && *(ptr + 1) == 0xD9
664 && *(ptr + 2) == 0xFF)
669 DBG("No EOI marker\n");
671 /* Sometimes there is junk data in the middle of the picture,
672 * we want to skip this bogus frames */
673 while (ptr > pdest) {
674 if (*ptr == 0xFF && *(ptr + 1) == 0xFF
675 && *(ptr + 2) == 0xFF)
680 DBG("Bogus frame ? %d\n", ++(cam->nb));
681 } else if (cam->b_acquire) {
682 /* we skip the 2 first frames which are usually buggy */
686 _DBG("jpeg(%lu): %d %d %d %d %d %d %d %d\n",
688 pdest[0], pdest[1], pdest[2], pdest[3],
689 pdest[4], pdest[5], pdest[6], pdest[7]);
691 zr364xx_got_frame(cam, frm->cur_size);
695 frm->ulState = ZR364XX_READ_IDLE;
698 /* done successfully */
702 static int zr364xx_vidioc_querycap(struct file *file, void *priv,
703 struct v4l2_capability *cap)
705 struct zr364xx_camera *cam = video_drvdata(file);
707 strlcpy(cap->driver, DRIVER_DESC, sizeof(cap->driver));
708 strlcpy(cap->card, cam->udev->product, sizeof(cap->card));
709 strlcpy(cap->bus_info, dev_name(&cam->udev->dev),
710 sizeof(cap->bus_info));
711 cap->device_caps = V4L2_CAP_VIDEO_CAPTURE |
714 cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
719 static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
720 struct v4l2_input *i)
724 strcpy(i->name, DRIVER_DESC " Camera");
725 i->type = V4L2_INPUT_TYPE_CAMERA;
729 static int zr364xx_vidioc_g_input(struct file *file, void *priv,
736 static int zr364xx_vidioc_s_input(struct file *file, void *priv,
744 static int zr364xx_s_ctrl(struct v4l2_ctrl *ctrl)
746 struct zr364xx_camera *cam =
747 container_of(ctrl->handler, struct zr364xx_camera, ctrl_handler);
751 case V4L2_CID_BRIGHTNESS:
752 /* hardware brightness */
753 send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
754 temp = (0x60 << 8) + 127 - ctrl->val;
755 send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
764 static int zr364xx_vidioc_enum_fmt_vid_cap(struct file *file,
765 void *priv, struct v4l2_fmtdesc *f)
769 f->flags = V4L2_FMT_FLAG_COMPRESSED;
770 strcpy(f->description, formats[0].name);
771 f->pixelformat = formats[0].fourcc;
775 static char *decode_fourcc(__u32 pixelformat, char *buf)
777 buf[0] = pixelformat & 0xff;
778 buf[1] = (pixelformat >> 8) & 0xff;
779 buf[2] = (pixelformat >> 16) & 0xff;
780 buf[3] = (pixelformat >> 24) & 0xff;
785 static int zr364xx_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
786 struct v4l2_format *f)
788 struct zr364xx_camera *cam = video_drvdata(file);
789 char pixelformat_name[5];
794 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG) {
795 DBG("%s: unsupported pixelformat V4L2_PIX_FMT_%s\n", __func__,
796 decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name));
800 if (!(f->fmt.pix.width == 160 && f->fmt.pix.height == 120) &&
801 !(f->fmt.pix.width == 640 && f->fmt.pix.height == 480)) {
802 f->fmt.pix.width = 320;
803 f->fmt.pix.height = 240;
806 f->fmt.pix.field = V4L2_FIELD_NONE;
807 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
808 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
809 f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
811 DBG("%s: V4L2_PIX_FMT_%s (%d) ok!\n", __func__,
812 decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name),
817 static int zr364xx_vidioc_g_fmt_vid_cap(struct file *file, void *priv,
818 struct v4l2_format *f)
820 struct zr364xx_camera *cam;
824 cam = video_drvdata(file);
826 f->fmt.pix.pixelformat = formats[0].fourcc;
827 f->fmt.pix.field = V4L2_FIELD_NONE;
828 f->fmt.pix.width = cam->width;
829 f->fmt.pix.height = cam->height;
830 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
831 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
832 f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
837 static int zr364xx_vidioc_s_fmt_vid_cap(struct file *file, void *priv,
838 struct v4l2_format *f)
840 struct zr364xx_camera *cam = video_drvdata(file);
841 struct videobuf_queue *q = &cam->vb_vidq;
842 char pixelformat_name[5];
843 int ret = zr364xx_vidioc_try_fmt_vid_cap(file, cam, f);
849 mutex_lock(&q->vb_lock);
851 if (videobuf_queue_is_busy(&cam->vb_vidq)) {
852 DBG("%s queue busy\n", __func__);
858 DBG("%s can't change format after started\n", __func__);
863 cam->width = f->fmt.pix.width;
864 cam->height = f->fmt.pix.height;
865 DBG("%s: %dx%d mode selected\n", __func__,
866 cam->width, cam->height);
867 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
868 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
869 f->fmt.pix.colorspace = V4L2_COLORSPACE_JPEG;
871 cam->vb_vidq.field = f->fmt.pix.field;
873 if (f->fmt.pix.width == 160 && f->fmt.pix.height == 120)
875 else if (f->fmt.pix.width == 640 && f->fmt.pix.height == 480)
881 m1[2].value = 0xf000 + mode;
882 m2[1].value = 0xf000 + mode;
884 /* special case for METHOD3, the modes are different */
885 if (cam->method == METHOD3) {
888 m2[1].value = 0xf000 + 4;
891 m2[1].value = 0xf000 + 0;
894 m2[1].value = 0xf000 + 1;
899 header2[437] = cam->height / 256;
900 header2[438] = cam->height % 256;
901 header2[439] = cam->width / 256;
902 header2[440] = cam->width % 256;
904 for (i = 0; init[cam->method][i].size != -1; i++) {
906 send_control_msg(cam->udev, 1, init[cam->method][i].value,
907 0, init[cam->method][i].bytes,
908 init[cam->method][i].size);
910 dev_err(&cam->udev->dev,
911 "error during resolution change sequence: %d\n", i);
916 /* Added some delay here, since opening/closing the camera quickly,
917 * like Ekiga does during its startup, can crash the webcam
924 mutex_unlock(&q->vb_lock);
926 DBG("%s: V4L2_PIX_FMT_%s (%d) ok!\n", __func__,
927 decode_fourcc(f->fmt.pix.pixelformat, pixelformat_name),
932 static int zr364xx_vidioc_reqbufs(struct file *file, void *priv,
933 struct v4l2_requestbuffers *p)
935 struct zr364xx_camera *cam = video_drvdata(file);
937 if (cam->owner && cam->owner != priv)
939 return videobuf_reqbufs(&cam->vb_vidq, p);
942 static int zr364xx_vidioc_querybuf(struct file *file,
944 struct v4l2_buffer *p)
947 struct zr364xx_camera *cam = video_drvdata(file);
948 rc = videobuf_querybuf(&cam->vb_vidq, p);
952 static int zr364xx_vidioc_qbuf(struct file *file,
954 struct v4l2_buffer *p)
957 struct zr364xx_camera *cam = video_drvdata(file);
958 _DBG("%s\n", __func__);
959 if (cam->owner && cam->owner != priv)
961 rc = videobuf_qbuf(&cam->vb_vidq, p);
965 static int zr364xx_vidioc_dqbuf(struct file *file,
967 struct v4l2_buffer *p)
970 struct zr364xx_camera *cam = video_drvdata(file);
971 _DBG("%s\n", __func__);
972 if (cam->owner && cam->owner != priv)
974 rc = videobuf_dqbuf(&cam->vb_vidq, p, file->f_flags & O_NONBLOCK);
978 static void read_pipe_completion(struct urb *purb)
980 struct zr364xx_pipeinfo *pipe_info;
981 struct zr364xx_camera *cam;
984 pipe_info = purb->context;
985 _DBG("%s %p, status %d\n", __func__, purb, purb->status);
986 if (pipe_info == NULL) {
987 printk(KERN_ERR KBUILD_MODNAME ": no context!\n");
991 cam = pipe_info->cam;
993 printk(KERN_ERR KBUILD_MODNAME ": no context!\n");
997 /* if shutting down, do not resubmit, exit immediately */
998 if (purb->status == -ESHUTDOWN) {
999 DBG("%s, err shutdown\n", __func__);
1000 pipe_info->err_count++;
1004 if (pipe_info->state == 0) {
1005 DBG("exiting USB pipe\n");
1009 if (purb->actual_length < 0 ||
1010 purb->actual_length > pipe_info->transfer_size) {
1011 dev_err(&cam->udev->dev, "wrong number of bytes\n");
1015 if (purb->status == 0)
1016 zr364xx_read_video_callback(cam, pipe_info, purb);
1018 pipe_info->err_count++;
1019 DBG("%s: failed URB %d\n", __func__, purb->status);
1022 pipe = usb_rcvbulkpipe(cam->udev, cam->read_endpoint);
1025 usb_fill_bulk_urb(pipe_info->stream_urb, cam->udev,
1027 pipe_info->transfer_buffer,
1028 pipe_info->transfer_size,
1029 read_pipe_completion, pipe_info);
1031 if (pipe_info->state != 0) {
1032 purb->status = usb_submit_urb(pipe_info->stream_urb,
1036 dev_err(&cam->udev->dev,
1037 "error submitting urb (error=%i)\n",
1040 DBG("read pipe complete state 0\n");
1043 static int zr364xx_start_readpipe(struct zr364xx_camera *cam)
1047 struct zr364xx_pipeinfo *pipe_info = cam->pipe;
1048 pipe = usb_rcvbulkpipe(cam->udev, cam->read_endpoint);
1049 DBG("%s: start pipe IN x%x\n", __func__, cam->read_endpoint);
1051 pipe_info->state = 1;
1052 pipe_info->err_count = 0;
1053 pipe_info->stream_urb = usb_alloc_urb(0, GFP_KERNEL);
1054 if (!pipe_info->stream_urb) {
1055 dev_err(&cam->udev->dev, "ReadStream: Unable to alloc URB\n");
1058 /* transfer buffer allocated in board_init */
1059 usb_fill_bulk_urb(pipe_info->stream_urb, cam->udev,
1061 pipe_info->transfer_buffer,
1062 pipe_info->transfer_size,
1063 read_pipe_completion, pipe_info);
1065 DBG("submitting URB %p\n", pipe_info->stream_urb);
1066 retval = usb_submit_urb(pipe_info->stream_urb, GFP_KERNEL);
1068 printk(KERN_ERR KBUILD_MODNAME ": start read pipe failed\n");
1075 static void zr364xx_stop_readpipe(struct zr364xx_camera *cam)
1077 struct zr364xx_pipeinfo *pipe_info;
1080 printk(KERN_ERR KBUILD_MODNAME ": invalid device\n");
1083 DBG("stop read pipe\n");
1084 pipe_info = cam->pipe;
1086 if (pipe_info->state != 0)
1087 pipe_info->state = 0;
1089 if (pipe_info->stream_urb) {
1091 usb_kill_urb(pipe_info->stream_urb);
1092 usb_free_urb(pipe_info->stream_urb);
1093 pipe_info->stream_urb = NULL;
1099 /* starts acquisition process */
1100 static int zr364xx_start_acquire(struct zr364xx_camera *cam)
1104 DBG("start acquire\n");
1106 cam->last_frame = -1;
1108 for (j = 0; j < FRAMES; j++) {
1109 cam->buffer.frame[j].ulState = ZR364XX_READ_IDLE;
1110 cam->buffer.frame[j].cur_size = 0;
1116 static inline int zr364xx_stop_acquire(struct zr364xx_camera *cam)
1122 static int zr364xx_vidioc_streamon(struct file *file, void *priv,
1123 enum v4l2_buf_type type)
1125 struct zr364xx_camera *cam = video_drvdata(file);
1129 DBG("%s\n", __func__);
1131 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1134 if (cam->owner && cam->owner != priv)
1137 for (i = 0; init[cam->method][i].size != -1; i++) {
1138 res = send_control_msg(cam->udev, 1, init[cam->method][i].value,
1139 0, init[cam->method][i].bytes,
1140 init[cam->method][i].size);
1142 dev_err(&cam->udev->dev,
1143 "error during open sequence: %d\n", i);
1149 cam->last_frame = -1;
1151 cam->frame_count = 0;
1152 for (j = 0; j < FRAMES; j++) {
1153 cam->buffer.frame[j].ulState = ZR364XX_READ_IDLE;
1154 cam->buffer.frame[j].cur_size = 0;
1156 res = videobuf_streamon(&cam->vb_vidq);
1158 zr364xx_start_acquire(cam);
1159 cam->owner = file->private_data;
1164 static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
1165 enum v4l2_buf_type type)
1167 struct zr364xx_camera *cam = video_drvdata(file);
1169 DBG("%s\n", __func__);
1170 if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
1172 if (cam->owner && cam->owner != priv)
1174 zr364xx_stop_acquire(cam);
1175 return videobuf_streamoff(&cam->vb_vidq);
1179 /* open the camera */
1180 static int zr364xx_open(struct file *file)
1182 struct zr364xx_camera *cam = video_drvdata(file);
1185 DBG("%s\n", __func__);
1187 if (mutex_lock_interruptible(&cam->lock))
1188 return -ERESTARTSYS;
1190 err = v4l2_fh_open(file);
1194 /* Added some delay here, since opening/closing the camera quickly,
1195 * like Ekiga does during its startup, can crash the webcam
1201 mutex_unlock(&cam->lock);
1202 DBG("%s: %d\n", __func__, err);
1206 static void zr364xx_release(struct v4l2_device *v4l2_dev)
1208 struct zr364xx_camera *cam =
1209 container_of(v4l2_dev, struct zr364xx_camera, v4l2_dev);
1212 v4l2_device_unregister(&cam->v4l2_dev);
1214 videobuf_mmap_free(&cam->vb_vidq);
1216 /* release sys buffers */
1217 for (i = 0; i < FRAMES; i++) {
1218 if (cam->buffer.frame[i].lpvbits) {
1219 DBG("vfree %p\n", cam->buffer.frame[i].lpvbits);
1220 vfree(cam->buffer.frame[i].lpvbits);
1222 cam->buffer.frame[i].lpvbits = NULL;
1225 v4l2_ctrl_handler_free(&cam->ctrl_handler);
1226 /* release transfer buffer */
1227 kfree(cam->pipe->transfer_buffer);
1231 /* release the camera */
1232 static int zr364xx_close(struct file *file)
1234 struct zr364xx_camera *cam;
1235 struct usb_device *udev;
1238 DBG("%s\n", __func__);
1239 cam = video_drvdata(file);
1241 mutex_lock(&cam->lock);
1244 if (file->private_data == cam->owner) {
1245 /* turn off stream */
1247 zr364xx_stop_acquire(cam);
1248 videobuf_streamoff(&cam->vb_vidq);
1250 for (i = 0; i < 2; i++) {
1251 send_control_msg(udev, 1, init[cam->method][i].value,
1252 0, init[cam->method][i].bytes,
1253 init[cam->method][i].size);
1258 /* Added some delay here, since opening/closing the camera quickly,
1259 * like Ekiga does during its startup, can crash the webcam
1262 mutex_unlock(&cam->lock);
1263 return v4l2_fh_release(file);
1267 static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
1269 struct zr364xx_camera *cam = video_drvdata(file);
1273 DBG("%s: cam == NULL\n", __func__);
1276 DBG("mmap called, vma=0x%08lx\n", (unsigned long)vma);
1278 ret = videobuf_mmap_mapper(&cam->vb_vidq, vma);
1280 DBG("vma start=0x%08lx, size=%ld, ret=%d\n",
1281 (unsigned long)vma->vm_start,
1282 (unsigned long)vma->vm_end - (unsigned long)vma->vm_start, ret);
1286 static unsigned int zr364xx_poll(struct file *file,
1287 struct poll_table_struct *wait)
1289 struct zr364xx_camera *cam = video_drvdata(file);
1290 struct videobuf_queue *q = &cam->vb_vidq;
1291 unsigned res = v4l2_ctrl_poll(file, wait);
1293 _DBG("%s\n", __func__);
1295 return res | videobuf_poll_stream(file, q, wait);
1298 static const struct v4l2_ctrl_ops zr364xx_ctrl_ops = {
1299 .s_ctrl = zr364xx_s_ctrl,
1302 static const struct v4l2_file_operations zr364xx_fops = {
1303 .owner = THIS_MODULE,
1304 .open = zr364xx_open,
1305 .release = zr364xx_close,
1306 .read = zr364xx_read,
1307 .mmap = zr364xx_mmap,
1308 .unlocked_ioctl = video_ioctl2,
1309 .poll = zr364xx_poll,
1312 static const struct v4l2_ioctl_ops zr364xx_ioctl_ops = {
1313 .vidioc_querycap = zr364xx_vidioc_querycap,
1314 .vidioc_enum_fmt_vid_cap = zr364xx_vidioc_enum_fmt_vid_cap,
1315 .vidioc_try_fmt_vid_cap = zr364xx_vidioc_try_fmt_vid_cap,
1316 .vidioc_s_fmt_vid_cap = zr364xx_vidioc_s_fmt_vid_cap,
1317 .vidioc_g_fmt_vid_cap = zr364xx_vidioc_g_fmt_vid_cap,
1318 .vidioc_enum_input = zr364xx_vidioc_enum_input,
1319 .vidioc_g_input = zr364xx_vidioc_g_input,
1320 .vidioc_s_input = zr364xx_vidioc_s_input,
1321 .vidioc_streamon = zr364xx_vidioc_streamon,
1322 .vidioc_streamoff = zr364xx_vidioc_streamoff,
1323 .vidioc_reqbufs = zr364xx_vidioc_reqbufs,
1324 .vidioc_querybuf = zr364xx_vidioc_querybuf,
1325 .vidioc_qbuf = zr364xx_vidioc_qbuf,
1326 .vidioc_dqbuf = zr364xx_vidioc_dqbuf,
1327 .vidioc_log_status = v4l2_ctrl_log_status,
1328 .vidioc_subscribe_event = v4l2_ctrl_subscribe_event,
1329 .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
1332 static struct video_device zr364xx_template = {
1333 .name = DRIVER_DESC,
1334 .fops = &zr364xx_fops,
1335 .ioctl_ops = &zr364xx_ioctl_ops,
1336 .release = video_device_release_empty,
1341 /*******************/
1342 /* USB integration */
1343 /*******************/
1344 static int zr364xx_board_init(struct zr364xx_camera *cam)
1346 struct zr364xx_pipeinfo *pipe = cam->pipe;
1349 DBG("board init: %p\n", cam);
1350 memset(pipe, 0, sizeof(*pipe));
1352 pipe->transfer_size = BUFFER_SIZE;
1354 pipe->transfer_buffer = kzalloc(pipe->transfer_size,
1356 if (pipe->transfer_buffer == NULL) {
1357 DBG("out of memory!\n");
1362 cam->frame_count = 0;
1364 /*** start create system buffers ***/
1365 for (i = 0; i < FRAMES; i++) {
1366 /* always allocate maximum size for system buffers */
1367 cam->buffer.frame[i].lpvbits = vmalloc(MAX_FRAME_SIZE);
1369 DBG("valloc %p, idx %lu, pdata %p\n",
1370 &cam->buffer.frame[i], i,
1371 cam->buffer.frame[i].lpvbits);
1372 if (cam->buffer.frame[i].lpvbits == NULL) {
1373 printk(KERN_INFO KBUILD_MODNAME ": out of memory. "
1374 "Using less frames\n");
1380 printk(KERN_INFO KBUILD_MODNAME ": out of memory. Aborting\n");
1381 kfree(cam->pipe->transfer_buffer);
1382 cam->pipe->transfer_buffer = NULL;
1385 cam->buffer.dwFrames = i;
1387 /* make sure internal states are set */
1388 for (i = 0; i < FRAMES; i++) {
1389 cam->buffer.frame[i].ulState = ZR364XX_READ_IDLE;
1390 cam->buffer.frame[i].cur_size = 0;
1394 cam->last_frame = -1;
1395 /*** end create system buffers ***/
1397 /* start read pipe */
1398 zr364xx_start_readpipe(cam);
1399 DBG(": board initialized\n");
1403 static int zr364xx_probe(struct usb_interface *intf,
1404 const struct usb_device_id *id)
1406 struct usb_device *udev = interface_to_usbdev(intf);
1407 struct zr364xx_camera *cam = NULL;
1408 struct usb_host_interface *iface_desc;
1409 struct usb_endpoint_descriptor *endpoint;
1410 struct v4l2_ctrl_handler *hdl;
1414 DBG("probing...\n");
1416 dev_info(&intf->dev, DRIVER_DESC " compatible webcam plugged\n");
1417 dev_info(&intf->dev, "model %04x:%04x detected\n",
1418 le16_to_cpu(udev->descriptor.idVendor),
1419 le16_to_cpu(udev->descriptor.idProduct));
1421 cam = kzalloc(sizeof(struct zr364xx_camera), GFP_KERNEL);
1423 dev_err(&udev->dev, "cam: out of memory !\n");
1427 cam->v4l2_dev.release = zr364xx_release;
1428 err = v4l2_device_register(&intf->dev, &cam->v4l2_dev);
1430 dev_err(&udev->dev, "couldn't register v4l2_device\n");
1434 hdl = &cam->ctrl_handler;
1435 v4l2_ctrl_handler_init(hdl, 1);
1436 v4l2_ctrl_new_std(hdl, &zr364xx_ctrl_ops,
1437 V4L2_CID_BRIGHTNESS, 0, 127, 1, 64);
1440 dev_err(&udev->dev, "couldn't register control\n");
1443 /* save the init method used by this camera */
1444 cam->method = id->driver_info;
1445 mutex_init(&cam->lock);
1446 cam->vdev = zr364xx_template;
1447 cam->vdev.lock = &cam->lock;
1448 cam->vdev.v4l2_dev = &cam->v4l2_dev;
1449 cam->vdev.ctrl_handler = &cam->ctrl_handler;
1450 set_bit(V4L2_FL_USE_FH_PRIO, &cam->vdev.flags);
1451 video_set_drvdata(&cam->vdev, cam);
1453 cam->vdev.debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
1459 dev_info(&udev->dev, "160x120 mode selected\n");
1464 dev_info(&udev->dev, "640x480 mode selected\n");
1469 dev_info(&udev->dev, "320x240 mode selected\n");
1476 m1[2].value = 0xf000 + mode;
1477 m2[1].value = 0xf000 + mode;
1479 /* special case for METHOD3, the modes are different */
1480 if (cam->method == METHOD3) {
1483 m2[1].value = 0xf000 + 4;
1486 m2[1].value = 0xf000 + 0;
1489 m2[1].value = 0xf000 + 1;
1494 header2[437] = cam->height / 256;
1495 header2[438] = cam->height % 256;
1496 header2[439] = cam->width / 256;
1497 header2[440] = cam->width % 256;
1501 DBG("dev: %p, udev %p interface %p\n", cam, cam->udev, intf);
1503 /* set up the endpoint information */
1504 iface_desc = intf->cur_altsetting;
1505 DBG("num endpoints %d\n", iface_desc->desc.bNumEndpoints);
1506 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
1507 endpoint = &iface_desc->endpoint[i].desc;
1508 if (!cam->read_endpoint && usb_endpoint_is_bulk_in(endpoint)) {
1509 /* we found the bulk in endpoint */
1510 cam->read_endpoint = endpoint->bEndpointAddress;
1514 if (!cam->read_endpoint) {
1516 dev_err(&intf->dev, "Could not find bulk-in endpoint\n");
1521 INIT_LIST_HEAD(&cam->vidq.active);
1522 cam->vidq.cam = cam;
1524 usb_set_intfdata(intf, cam);
1526 /* load zr364xx board specific */
1527 err = zr364xx_board_init(cam);
1529 err = v4l2_ctrl_handler_setup(hdl);
1533 spin_lock_init(&cam->slock);
1537 videobuf_queue_vmalloc_init(&cam->vb_vidq, &zr364xx_video_qops,
1539 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1541 sizeof(struct zr364xx_buffer), cam, &cam->lock);
1543 err = video_register_device(&cam->vdev, VFL_TYPE_GRABBER, -1);
1545 dev_err(&udev->dev, "video_register_device failed\n");
1549 dev_info(&udev->dev, DRIVER_DESC " controlling device %s\n",
1550 video_device_node_name(&cam->vdev));
1554 v4l2_ctrl_handler_free(hdl);
1555 v4l2_device_unregister(&cam->v4l2_dev);
1561 static void zr364xx_disconnect(struct usb_interface *intf)
1563 struct zr364xx_camera *cam = usb_get_intfdata(intf);
1565 mutex_lock(&cam->lock);
1566 usb_set_intfdata(intf, NULL);
1567 dev_info(&intf->dev, DRIVER_DESC " webcam unplugged\n");
1568 video_unregister_device(&cam->vdev);
1569 v4l2_device_disconnect(&cam->v4l2_dev);
1571 /* stops the read pipe if it is running */
1573 zr364xx_stop_acquire(cam);
1575 zr364xx_stop_readpipe(cam);
1576 mutex_unlock(&cam->lock);
1577 v4l2_device_put(&cam->v4l2_dev);
1582 /**********************/
1583 /* Module integration */
1584 /**********************/
1586 static struct usb_driver zr364xx_driver = {
1588 .probe = zr364xx_probe,
1589 .disconnect = zr364xx_disconnect,
1590 .id_table = device_table
1593 module_usb_driver(zr364xx_driver);
1595 MODULE_AUTHOR(DRIVER_AUTHOR);
1596 MODULE_DESCRIPTION(DRIVER_DESC);
1597 MODULE_LICENSE("GPL");
1598 MODULE_VERSION(DRIVER_VERSION);