2 * Zoran 364xx based USB webcam module version 0.72
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 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * (at your option) any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include <linux/version.h>
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/usb.h>
33 #include <linux/vmalloc.h>
34 #include <linux/slab.h>
35 #include <linux/proc_fs.h>
36 #include <linux/highmem.h>
37 #include <media/v4l2-common.h>
40 /* Version Information */
41 #define DRIVER_VERSION "v0.72"
42 #define DRIVER_AUTHOR "Antoine Jacquet, http://royale.zerezo.com/"
43 #define DRIVER_DESC "Zoran 364xx"
48 #define MAX_FRAME_SIZE 100000
49 #define BUFFER_SIZE 0x1000
50 #define CTRL_TIMEOUT 500
54 #define DBG(x...) if (debug) info(x)
57 /* Init methods, need to find nicer names for these
58 * the exact names of the chipsets would be the best if someone finds it */
64 /* Module parameters */
69 /* Module parameters interface */
70 module_param(debug, int, 0644);
71 MODULE_PARM_DESC(debug, "Debug level");
72 module_param(mode, int, 0644);
73 MODULE_PARM_DESC(mode, "0 = 320x240, 1 = 160x120, 2 = 640x480");
76 /* Devices supported by this driver
77 * .driver_info contains the init method used by the camera */
78 static struct usb_device_id device_table[] = {
79 {USB_DEVICE(0x08ca, 0x0109), .driver_info = METHOD0 },
80 {USB_DEVICE(0x041e, 0x4024), .driver_info = METHOD0 },
81 {USB_DEVICE(0x0d64, 0x0108), .driver_info = METHOD0 },
82 {USB_DEVICE(0x0546, 0x3187), .driver_info = METHOD0 },
83 {USB_DEVICE(0x0d64, 0x3108), .driver_info = METHOD0 },
84 {USB_DEVICE(0x0595, 0x4343), .driver_info = METHOD0 },
85 {USB_DEVICE(0x0bb0, 0x500d), .driver_info = METHOD0 },
86 {USB_DEVICE(0x0feb, 0x2004), .driver_info = METHOD0 },
87 {USB_DEVICE(0x055f, 0xb500), .driver_info = METHOD0 },
88 {USB_DEVICE(0x08ca, 0x2062), .driver_info = METHOD2 },
89 {USB_DEVICE(0x052b, 0x1a18), .driver_info = METHOD1 },
90 {USB_DEVICE(0x04c8, 0x0729), .driver_info = METHOD0 },
91 {USB_DEVICE(0x04f2, 0xa208), .driver_info = METHOD0 },
92 {USB_DEVICE(0x0784, 0x0040), .driver_info = METHOD1 },
93 {USB_DEVICE(0x06d6, 0x0034), .driver_info = METHOD0 },
94 {USB_DEVICE(0x0a17, 0x0062), .driver_info = METHOD2 },
95 {USB_DEVICE(0x06d6, 0x003b), .driver_info = METHOD0 },
96 {USB_DEVICE(0x0a17, 0x004e), .driver_info = METHOD2 },
97 {} /* Terminating entry */
100 MODULE_DEVICE_TABLE(usb, device_table);
104 struct zr364xx_camera {
105 struct usb_device *udev; /* save off the usb device pointer */
106 struct usb_interface *interface;/* the interface for this device */
107 struct video_device *vdev; /* v4l video device */
110 unsigned char *buffer;
120 /* function used to send initialisation commands to the camera */
121 static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
122 u16 index, unsigned char *cp, u16 size)
126 unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL);
127 if (!transfer_buffer) {
128 info("kmalloc(%d) failed", size);
132 memcpy(transfer_buffer, cp, size);
134 status = usb_control_msg(udev,
135 usb_sndctrlpipe(udev, 0),
137 USB_DIR_OUT | USB_TYPE_VENDOR |
138 USB_RECIP_DEVICE, value, index,
139 transfer_buffer, size, CTRL_TIMEOUT);
141 kfree(transfer_buffer);
144 info("Failed sending control message, error %d.", status);
150 /* Control messages sent to the camera to initialize it
151 * and launch the capture */
155 unsigned char *bytes;
159 static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
160 static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
161 static unsigned char m0d3[] = { 0, 0 };
162 static message m0[] = {
165 {0x3370, sizeof(m0d1), m0d1},
168 {0x2610, sizeof(m0d2), m0d2},
173 {0x9a01, sizeof(m0d3), m0d3},
178 static unsigned char m1d1[] = { 0xff, 0xff };
179 static unsigned char m1d2[] = { 0x00, 0x00 };
180 static message m1[] = {
188 {0x2502, sizeof(m1d1), m1d1},
193 {0x9a01, sizeof(m1d2), m1d2},
198 static unsigned char m2d1[] = { 0xff, 0xff };
199 static message m2[] = {
206 {0x2502, sizeof(m2d1), m2d1},
212 static message *init[3] = { m0, m1, m2 };
215 /* JPEG static data in header (Huffman table, etc) */
216 static unsigned char header1[] = {
219 0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
220 0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
222 0xFF, 0xDB, 0x00, 0x84
224 static unsigned char header2[] = {
225 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
226 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
227 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
228 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
229 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
230 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
231 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
232 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
233 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
234 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
235 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
236 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
237 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
238 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
239 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
240 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
241 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
242 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
243 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
244 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
245 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
246 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
247 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
248 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
249 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
250 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
251 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
252 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
253 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
254 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
255 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
256 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
257 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
258 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
259 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
260 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
261 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
262 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
263 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
264 0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
265 0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
266 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
269 static unsigned char header3;
273 /********************/
274 /* V4L2 integration */
275 /********************/
277 /* this function reads a full JPEG picture synchronously
278 * TODO: do it asynchronously... */
279 static int read_frame(struct zr364xx_camera *cam, int framenum)
281 int i, n, temp, head, size, actual_length;
282 unsigned char *ptr = NULL, *jpeg;
285 /* hardware brightness */
286 n = send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
287 temp = (0x60 << 8) + 127 - cam->brightness;
288 n = send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
290 /* during the first loop we are going to insert JPEG header */
292 /* this is the place in memory where we are going to build
294 jpeg = cam->framebuf + framenum * MAX_FRAME_SIZE;
297 n = usb_bulk_msg(cam->udev,
298 usb_rcvbulkpipe(cam->udev, 0x81),
299 cam->buffer, BUFFER_SIZE, &actual_length,
301 DBG("buffer : %d %d", cam->buffer[0], cam->buffer[1]);
302 DBG("bulk : n=%d size=%d", n, actual_length);
304 info("error reading bulk msg");
307 if (actual_length < 0 || actual_length > BUFFER_SIZE) {
308 info("wrong number of bytes");
312 /* swap bytes if camera needs it */
313 if (cam->method == METHOD0) {
314 u16 *buf = (u16*)cam->buffer;
315 for (i = 0; i < BUFFER_SIZE/2; i++)
319 /* write the JPEG header */
323 memcpy(ptr, header1, sizeof(header1));
324 ptr += sizeof(header1);
326 memcpy(ptr, &header3, 1);
328 memcpy(ptr, cam->buffer, 64);
331 memcpy(ptr, &header3, 1);
333 memcpy(ptr, cam->buffer + 64, 64);
335 memcpy(ptr, header2, sizeof(header2));
336 ptr += sizeof(header2);
337 memcpy(ptr, cam->buffer + 128,
338 actual_length - 128);
339 ptr += actual_length - 128;
341 DBG("header : %d %d %d %d %d %d %d %d %d",
342 cam->buffer[0], cam->buffer[1], cam->buffer[2],
343 cam->buffer[3], cam->buffer[4], cam->buffer[5],
344 cam->buffer[6], cam->buffer[7], cam->buffer[8]);
346 memcpy(ptr, cam->buffer, actual_length);
347 ptr += actual_length;
350 /* ... until there is no more */
351 while (actual_length == BUFFER_SIZE);
353 /* we skip the 2 first frames which are usually buggy */
359 /* go back to find the JPEG EOI marker */
363 if (*ptr == 0xFF && *(ptr + 1) == 0xD9
364 && *(ptr + 2) == 0xFF)
369 DBG("No EOI marker");
371 /* Sometimes there is junk data in the middle of the picture,
372 * we want to skip this bogus frames */
374 if (*ptr == 0xFF && *(ptr + 1) == 0xFF
375 && *(ptr + 2) == 0xFF)
380 DBG("Bogus frame ? %d", cam->nb);
384 DBG("jpeg : %d %d %d %d %d %d %d %d",
385 jpeg[0], jpeg[1], jpeg[2], jpeg[3],
386 jpeg[4], jpeg[5], jpeg[6], jpeg[7]);
392 static ssize_t zr364xx_read(struct file *file, char *buf, size_t cnt,
395 unsigned long count = cnt;
396 struct video_device *vdev = video_devdata(file);
397 struct zr364xx_camera *cam;
399 DBG("zr364xx_read: read %d bytes.", (int) count);
403 cam = video_get_drvdata(vdev);
412 count = read_frame(cam, 0);
414 if (copy_to_user(buf, cam->framebuf, count))
421 static int zr364xx_vidioc_querycap(struct file *file, void *priv,
422 struct v4l2_capability *cap)
424 memset(cap, 0, sizeof(*cap));
425 strcpy(cap->driver, DRIVER_DESC);
426 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
430 static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
431 struct v4l2_input *i)
435 memset(i, 0, sizeof(*i));
437 strcpy(i->name, DRIVER_DESC " Camera");
438 i->type = V4L2_INPUT_TYPE_CAMERA;
442 static int zr364xx_vidioc_g_input(struct file *file, void *priv,
449 static int zr364xx_vidioc_s_input(struct file *file, void *priv,
457 static int zr364xx_vidioc_queryctrl(struct file *file, void *priv,
458 struct v4l2_queryctrl *c)
460 struct video_device *vdev = video_devdata(file);
461 struct zr364xx_camera *cam;
465 cam = video_get_drvdata(vdev);
468 case V4L2_CID_BRIGHTNESS:
469 c->type = V4L2_CTRL_TYPE_INTEGER;
470 strcpy(c->name, "Brightness");
474 c->default_value = cam->brightness;
483 static int zr364xx_vidioc_s_ctrl(struct file *file, void *priv,
484 struct v4l2_control *c)
486 struct video_device *vdev = video_devdata(file);
487 struct zr364xx_camera *cam;
491 cam = video_get_drvdata(vdev);
494 case V4L2_CID_BRIGHTNESS:
495 cam->brightness = c->value;
503 static int zr364xx_vidioc_g_ctrl(struct file *file, void *priv,
504 struct v4l2_control *c)
506 struct video_device *vdev = video_devdata(file);
507 struct zr364xx_camera *cam;
511 cam = video_get_drvdata(vdev);
514 case V4L2_CID_BRIGHTNESS:
515 c->value = cam->brightness;
523 static int zr364xx_vidioc_enum_fmt_cap(struct file *file,
524 void *priv, struct v4l2_fmtdesc *f)
528 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
530 memset(f, 0, sizeof(*f));
532 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
533 f->flags = V4L2_FMT_FLAG_COMPRESSED;
534 strcpy(f->description, "JPEG");
535 f->pixelformat = V4L2_PIX_FMT_JPEG;
539 static int zr364xx_vidioc_try_fmt_cap(struct file *file, void *priv,
540 struct v4l2_format *f)
542 struct video_device *vdev = video_devdata(file);
543 struct zr364xx_camera *cam;
547 cam = video_get_drvdata(vdev);
549 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
551 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
553 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
554 f->fmt.pix.field != V4L2_FIELD_NONE)
556 f->fmt.pix.field = V4L2_FIELD_NONE;
557 f->fmt.pix.width = cam->width;
558 f->fmt.pix.height = cam->height;
559 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
560 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
561 f->fmt.pix.colorspace = 0;
566 static int zr364xx_vidioc_g_fmt_cap(struct file *file, void *priv,
567 struct v4l2_format *f)
569 struct video_device *vdev = video_devdata(file);
570 struct zr364xx_camera *cam;
574 cam = video_get_drvdata(vdev);
576 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
578 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
579 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
580 f->fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
581 f->fmt.pix.field = V4L2_FIELD_NONE;
582 f->fmt.pix.width = cam->width;
583 f->fmt.pix.height = cam->height;
584 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
585 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
586 f->fmt.pix.colorspace = 0;
591 static int zr364xx_vidioc_s_fmt_cap(struct file *file, void *priv,
592 struct v4l2_format *f)
594 struct video_device *vdev = video_devdata(file);
595 struct zr364xx_camera *cam;
599 cam = video_get_drvdata(vdev);
601 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
603 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
605 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
606 f->fmt.pix.field != V4L2_FIELD_NONE)
608 f->fmt.pix.field = V4L2_FIELD_NONE;
609 f->fmt.pix.width = cam->width;
610 f->fmt.pix.height = cam->height;
611 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
612 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
613 f->fmt.pix.colorspace = 0;
619 static int zr364xx_vidioc_streamon(struct file *file, void *priv,
620 enum v4l2_buf_type type)
625 static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
626 enum v4l2_buf_type type)
632 /* open the camera */
633 static int zr364xx_open(struct inode *inode, struct file *file)
635 struct video_device *vdev = video_devdata(file);
636 struct zr364xx_camera *cam = video_get_drvdata(vdev);
637 struct usb_device *udev = cam->udev;
644 err = video_exclusive_open(inode, file);
648 if (!cam->framebuf) {
649 cam->framebuf = vmalloc_32(MAX_FRAME_SIZE * FRAMES);
650 if (!cam->framebuf) {
651 info("vmalloc_32 failed!");
656 mutex_lock(&cam->lock);
657 for (i = 0; init[cam->method][i].size != -1; i++) {
659 send_control_msg(udev, 1, init[cam->method][i].value,
660 0, init[cam->method][i].bytes,
661 init[cam->method][i].size);
663 info("error during open sequence: %d", i);
664 mutex_unlock(&cam->lock);
669 file->private_data = vdev;
671 /* Added some delay here, since opening/closing the camera quickly,
672 * like Ekiga does during its startup, can crash the webcam
676 mutex_unlock(&cam->lock);
681 /* release the camera */
682 static int zr364xx_release(struct inode *inode, struct file *file)
684 struct video_device *vdev = video_devdata(file);
685 struct zr364xx_camera *cam;
686 struct usb_device *udev;
689 DBG("zr364xx_release");
693 cam = video_get_drvdata(vdev);
697 mutex_lock(&cam->lock);
698 for (i = 0; i < 2; i++) {
700 send_control_msg(udev, 1, init[cam->method][i].value,
701 0, init[i][cam->method].bytes,
702 init[cam->method][i].size);
704 info("error during release sequence");
705 mutex_unlock(&cam->lock);
710 file->private_data = NULL;
711 video_exclusive_release(inode, file);
713 /* Added some delay here, since opening/closing the camera quickly,
714 * like Ekiga does during its startup, can crash the webcam
718 mutex_unlock(&cam->lock);
723 static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
726 unsigned long start = vma->vm_start;
727 unsigned long size = vma->vm_end - vma->vm_start;
728 struct video_device *vdev = video_devdata(file);
729 struct zr364xx_camera *cam;
731 DBG("zr364xx_mmap: %ld\n", size);
735 cam = video_get_drvdata(vdev);
739 if (vm_insert_page(vma, start, vmalloc_to_page(pos)))
743 if (size > PAGE_SIZE)
753 static const struct file_operations zr364xx_fops = {
754 .owner = THIS_MODULE,
755 .open = zr364xx_open,
756 .release = zr364xx_release,
757 .read = zr364xx_read,
758 .mmap = zr364xx_mmap,
759 .ioctl = video_ioctl2,
763 static struct video_device zr364xx_template = {
764 .owner = THIS_MODULE,
766 .type = VID_TYPE_CAPTURE,
767 .fops = &zr364xx_fops,
768 .release = video_device_release,
771 .vidioc_querycap = zr364xx_vidioc_querycap,
772 .vidioc_enum_fmt_cap = zr364xx_vidioc_enum_fmt_cap,
773 .vidioc_try_fmt_cap = zr364xx_vidioc_try_fmt_cap,
774 .vidioc_s_fmt_cap = zr364xx_vidioc_s_fmt_cap,
775 .vidioc_g_fmt_cap = zr364xx_vidioc_g_fmt_cap,
776 .vidioc_enum_input = zr364xx_vidioc_enum_input,
777 .vidioc_g_input = zr364xx_vidioc_g_input,
778 .vidioc_s_input = zr364xx_vidioc_s_input,
779 .vidioc_streamon = zr364xx_vidioc_streamon,
780 .vidioc_streamoff = zr364xx_vidioc_streamoff,
781 .vidioc_queryctrl = zr364xx_vidioc_queryctrl,
782 .vidioc_g_ctrl = zr364xx_vidioc_g_ctrl,
783 .vidioc_s_ctrl = zr364xx_vidioc_s_ctrl,
788 /*******************/
789 /* USB integration */
790 /*******************/
792 static int zr364xx_probe(struct usb_interface *intf,
793 const struct usb_device_id *id)
795 struct usb_device *udev = interface_to_usbdev(intf);
796 struct zr364xx_camera *cam = NULL;
801 info(DRIVER_DESC " compatible webcam plugged");
802 info("model %04x:%04x detected", udev->descriptor.idVendor,
803 udev->descriptor.idProduct);
805 cam = kzalloc(sizeof(struct zr364xx_camera), GFP_KERNEL);
807 info("cam: out of memory !");
810 /* save the init method used by this camera */
811 cam->method = id->driver_info;
813 cam->vdev = video_device_alloc();
814 if (cam->vdev == NULL) {
815 info("cam->vdev: out of memory !");
819 memcpy(cam->vdev, &zr364xx_template, sizeof(zr364xx_template));
820 video_set_drvdata(cam->vdev, cam);
822 cam->vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
826 if ((cam->buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL)) == NULL) {
827 info("cam->buffer: out of memory !");
828 video_device_release(cam->vdev);
835 info("160x120 mode selected");
840 info("640x480 mode selected");
845 info("320x240 mode selected");
852 m1[2].value = 0xf000 + mode;
853 m2[1].value = 0xf000 + mode;
854 header2[437] = cam->height / 256;
855 header2[438] = cam->height % 256;
856 header2[439] = cam->width / 256;
857 header2[440] = cam->width % 256;
860 cam->brightness = 64;
861 mutex_init(&cam->lock);
863 err = video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1);
865 info("video_register_device failed");
866 video_device_release(cam->vdev);
872 usb_set_intfdata(intf, cam);
874 info(DRIVER_DESC " controlling video device %d", cam->vdev->minor);
879 static void zr364xx_disconnect(struct usb_interface *intf)
881 struct zr364xx_camera *cam = usb_get_intfdata(intf);
882 usb_set_intfdata(intf, NULL);
883 dev_set_drvdata(&intf->dev, NULL);
884 info(DRIVER_DESC " webcam unplugged");
886 video_unregister_device(cam->vdev);
890 vfree(cam->framebuf);
896 /**********************/
897 /* Module integration */
898 /**********************/
900 static struct usb_driver zr364xx_driver = {
902 .probe = zr364xx_probe,
903 .disconnect = zr364xx_disconnect,
904 .id_table = device_table
908 static int __init zr364xx_init(void)
911 retval = usb_register(&zr364xx_driver);
913 info("usb_register failed!");
915 info(DRIVER_DESC " module loaded");
920 static void __exit zr364xx_exit(void)
922 info(DRIVER_DESC " module unloaded");
923 usb_deregister(&zr364xx_driver);
927 module_init(zr364xx_init);
928 module_exit(zr364xx_exit);
930 MODULE_AUTHOR(DRIVER_AUTHOR);
931 MODULE_DESCRIPTION(DRIVER_DESC);
932 MODULE_LICENSE("GPL");