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 {USB_DEVICE(0x041e, 0x405d), .driver_info = METHOD2 },
98 {} /* Terminating entry */
101 MODULE_DEVICE_TABLE(usb, device_table);
105 struct zr364xx_camera {
106 struct usb_device *udev; /* save off the usb device pointer */
107 struct usb_interface *interface;/* the interface for this device */
108 struct video_device *vdev; /* v4l video device */
111 unsigned char *buffer;
121 /* function used to send initialisation commands to the camera */
122 static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
123 u16 index, unsigned char *cp, u16 size)
127 unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL);
128 if (!transfer_buffer) {
129 info("kmalloc(%d) failed", size);
133 memcpy(transfer_buffer, cp, size);
135 status = usb_control_msg(udev,
136 usb_sndctrlpipe(udev, 0),
138 USB_DIR_OUT | USB_TYPE_VENDOR |
139 USB_RECIP_DEVICE, value, index,
140 transfer_buffer, size, CTRL_TIMEOUT);
142 kfree(transfer_buffer);
145 info("Failed sending control message, error %d.", status);
151 /* Control messages sent to the camera to initialize it
152 * and launch the capture */
156 unsigned char *bytes;
160 static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
161 static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
162 static unsigned char m0d3[] = { 0, 0 };
163 static message m0[] = {
166 {0x3370, sizeof(m0d1), m0d1},
169 {0x2610, sizeof(m0d2), m0d2},
174 {0x9a01, sizeof(m0d3), m0d3},
179 static unsigned char m1d1[] = { 0xff, 0xff };
180 static unsigned char m1d2[] = { 0x00, 0x00 };
181 static message m1[] = {
189 {0x2502, sizeof(m1d1), m1d1},
194 {0x9a01, sizeof(m1d2), m1d2},
199 static unsigned char m2d1[] = { 0xff, 0xff };
200 static message m2[] = {
207 {0x2502, sizeof(m2d1), m2d1},
213 static message *init[3] = { m0, m1, m2 };
216 /* JPEG static data in header (Huffman table, etc) */
217 static unsigned char header1[] = {
220 0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
221 0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
223 0xFF, 0xDB, 0x00, 0x84
225 static unsigned char header2[] = {
226 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
227 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
228 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
229 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
230 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
231 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
232 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
233 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
234 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
235 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
236 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
237 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
238 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
239 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
240 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
241 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
242 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
243 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
244 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
245 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
246 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
247 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
248 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
249 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
250 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
251 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
252 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
253 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
254 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
255 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
256 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
257 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
258 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
259 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
260 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
261 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
262 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
263 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
264 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
265 0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
266 0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
267 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
270 static unsigned char header3;
274 /********************/
275 /* V4L2 integration */
276 /********************/
278 /* this function reads a full JPEG picture synchronously
279 * TODO: do it asynchronously... */
280 static int read_frame(struct zr364xx_camera *cam, int framenum)
282 int i, n, temp, head, size, actual_length;
283 unsigned char *ptr = NULL, *jpeg;
286 /* hardware brightness */
287 n = send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
288 temp = (0x60 << 8) + 127 - cam->brightness;
289 n = send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
291 /* during the first loop we are going to insert JPEG header */
293 /* this is the place in memory where we are going to build
295 jpeg = cam->framebuf + framenum * MAX_FRAME_SIZE;
298 n = usb_bulk_msg(cam->udev,
299 usb_rcvbulkpipe(cam->udev, 0x81),
300 cam->buffer, BUFFER_SIZE, &actual_length,
302 DBG("buffer : %d %d", cam->buffer[0], cam->buffer[1]);
303 DBG("bulk : n=%d size=%d", n, actual_length);
305 info("error reading bulk msg");
308 if (actual_length < 0 || actual_length > BUFFER_SIZE) {
309 info("wrong number of bytes");
313 /* swap bytes if camera needs it */
314 if (cam->method == METHOD0) {
315 u16 *buf = (u16*)cam->buffer;
316 for (i = 0; i < BUFFER_SIZE/2; i++)
320 /* write the JPEG header */
324 memcpy(ptr, header1, sizeof(header1));
325 ptr += sizeof(header1);
327 memcpy(ptr, &header3, 1);
329 memcpy(ptr, cam->buffer, 64);
332 memcpy(ptr, &header3, 1);
334 memcpy(ptr, cam->buffer + 64, 64);
336 memcpy(ptr, header2, sizeof(header2));
337 ptr += sizeof(header2);
338 memcpy(ptr, cam->buffer + 128,
339 actual_length - 128);
340 ptr += actual_length - 128;
342 DBG("header : %d %d %d %d %d %d %d %d %d",
343 cam->buffer[0], cam->buffer[1], cam->buffer[2],
344 cam->buffer[3], cam->buffer[4], cam->buffer[5],
345 cam->buffer[6], cam->buffer[7], cam->buffer[8]);
347 memcpy(ptr, cam->buffer, actual_length);
348 ptr += actual_length;
351 /* ... until there is no more */
352 while (actual_length == BUFFER_SIZE);
354 /* we skip the 2 first frames which are usually buggy */
360 /* go back to find the JPEG EOI marker */
364 if (*ptr == 0xFF && *(ptr + 1) == 0xD9
365 && *(ptr + 2) == 0xFF)
370 DBG("No EOI marker");
372 /* Sometimes there is junk data in the middle of the picture,
373 * we want to skip this bogus frames */
375 if (*ptr == 0xFF && *(ptr + 1) == 0xFF
376 && *(ptr + 2) == 0xFF)
381 DBG("Bogus frame ? %d", cam->nb);
385 DBG("jpeg : %d %d %d %d %d %d %d %d",
386 jpeg[0], jpeg[1], jpeg[2], jpeg[3],
387 jpeg[4], jpeg[5], jpeg[6], jpeg[7]);
393 static ssize_t zr364xx_read(struct file *file, char __user *buf, size_t cnt,
396 unsigned long count = cnt;
397 struct video_device *vdev = video_devdata(file);
398 struct zr364xx_camera *cam;
400 DBG("zr364xx_read: read %d bytes.", (int) count);
404 cam = video_get_drvdata(vdev);
413 count = read_frame(cam, 0);
415 if (copy_to_user(buf, cam->framebuf, count))
422 static int zr364xx_vidioc_querycap(struct file *file, void *priv,
423 struct v4l2_capability *cap)
425 memset(cap, 0, sizeof(*cap));
426 strcpy(cap->driver, DRIVER_DESC);
427 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
431 static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
432 struct v4l2_input *i)
436 memset(i, 0, sizeof(*i));
438 strcpy(i->name, DRIVER_DESC " Camera");
439 i->type = V4L2_INPUT_TYPE_CAMERA;
443 static int zr364xx_vidioc_g_input(struct file *file, void *priv,
450 static int zr364xx_vidioc_s_input(struct file *file, void *priv,
458 static int zr364xx_vidioc_queryctrl(struct file *file, void *priv,
459 struct v4l2_queryctrl *c)
461 struct video_device *vdev = video_devdata(file);
462 struct zr364xx_camera *cam;
466 cam = video_get_drvdata(vdev);
469 case V4L2_CID_BRIGHTNESS:
470 c->type = V4L2_CTRL_TYPE_INTEGER;
471 strcpy(c->name, "Brightness");
475 c->default_value = cam->brightness;
484 static int zr364xx_vidioc_s_ctrl(struct file *file, void *priv,
485 struct v4l2_control *c)
487 struct video_device *vdev = video_devdata(file);
488 struct zr364xx_camera *cam;
492 cam = video_get_drvdata(vdev);
495 case V4L2_CID_BRIGHTNESS:
496 cam->brightness = c->value;
504 static int zr364xx_vidioc_g_ctrl(struct file *file, void *priv,
505 struct v4l2_control *c)
507 struct video_device *vdev = video_devdata(file);
508 struct zr364xx_camera *cam;
512 cam = video_get_drvdata(vdev);
515 case V4L2_CID_BRIGHTNESS:
516 c->value = cam->brightness;
524 static int zr364xx_vidioc_enum_fmt_vid_cap(struct file *file,
525 void *priv, struct v4l2_fmtdesc *f)
529 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
531 memset(f, 0, sizeof(*f));
533 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
534 f->flags = V4L2_FMT_FLAG_COMPRESSED;
535 strcpy(f->description, "JPEG");
536 f->pixelformat = V4L2_PIX_FMT_JPEG;
540 static int zr364xx_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
541 struct v4l2_format *f)
543 struct video_device *vdev = video_devdata(file);
544 struct zr364xx_camera *cam;
548 cam = video_get_drvdata(vdev);
550 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
552 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
554 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
555 f->fmt.pix.field != V4L2_FIELD_NONE)
557 f->fmt.pix.field = V4L2_FIELD_NONE;
558 f->fmt.pix.width = cam->width;
559 f->fmt.pix.height = cam->height;
560 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
561 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
562 f->fmt.pix.colorspace = 0;
567 static int zr364xx_vidioc_g_fmt_vid_cap(struct file *file, void *priv,
568 struct v4l2_format *f)
570 struct video_device *vdev = video_devdata(file);
571 struct zr364xx_camera *cam;
575 cam = video_get_drvdata(vdev);
577 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
579 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
580 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
581 f->fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
582 f->fmt.pix.field = V4L2_FIELD_NONE;
583 f->fmt.pix.width = cam->width;
584 f->fmt.pix.height = cam->height;
585 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
586 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
587 f->fmt.pix.colorspace = 0;
592 static int zr364xx_vidioc_s_fmt_vid_cap(struct file *file, void *priv,
593 struct v4l2_format *f)
595 struct video_device *vdev = video_devdata(file);
596 struct zr364xx_camera *cam;
600 cam = video_get_drvdata(vdev);
602 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
604 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
606 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
607 f->fmt.pix.field != V4L2_FIELD_NONE)
609 f->fmt.pix.field = V4L2_FIELD_NONE;
610 f->fmt.pix.width = cam->width;
611 f->fmt.pix.height = cam->height;
612 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
613 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
614 f->fmt.pix.colorspace = 0;
620 static int zr364xx_vidioc_streamon(struct file *file, void *priv,
621 enum v4l2_buf_type type)
626 static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
627 enum v4l2_buf_type type)
633 /* open the camera */
634 static int zr364xx_open(struct inode *inode, struct file *file)
636 struct video_device *vdev = video_devdata(file);
637 struct zr364xx_camera *cam = video_get_drvdata(vdev);
638 struct usb_device *udev = cam->udev;
645 err = video_exclusive_open(inode, file);
649 if (!cam->framebuf) {
650 cam->framebuf = vmalloc_32(MAX_FRAME_SIZE * FRAMES);
651 if (!cam->framebuf) {
652 info("vmalloc_32 failed!");
657 mutex_lock(&cam->lock);
658 for (i = 0; init[cam->method][i].size != -1; i++) {
660 send_control_msg(udev, 1, init[cam->method][i].value,
661 0, init[cam->method][i].bytes,
662 init[cam->method][i].size);
664 info("error during open sequence: %d", i);
665 mutex_unlock(&cam->lock);
670 file->private_data = vdev;
672 /* Added some delay here, since opening/closing the camera quickly,
673 * like Ekiga does during its startup, can crash the webcam
677 mutex_unlock(&cam->lock);
682 /* release the camera */
683 static int zr364xx_release(struct inode *inode, struct file *file)
685 struct video_device *vdev = video_devdata(file);
686 struct zr364xx_camera *cam;
687 struct usb_device *udev;
690 DBG("zr364xx_release");
694 cam = video_get_drvdata(vdev);
698 mutex_lock(&cam->lock);
699 for (i = 0; i < 2; i++) {
701 send_control_msg(udev, 1, init[cam->method][i].value,
702 0, init[i][cam->method].bytes,
703 init[cam->method][i].size);
705 info("error during release sequence");
706 mutex_unlock(&cam->lock);
711 file->private_data = NULL;
712 video_exclusive_release(inode, file);
714 /* Added some delay here, since opening/closing the camera quickly,
715 * like Ekiga does during its startup, can crash the webcam
719 mutex_unlock(&cam->lock);
724 static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
727 unsigned long start = vma->vm_start;
728 unsigned long size = vma->vm_end - vma->vm_start;
729 struct video_device *vdev = video_devdata(file);
730 struct zr364xx_camera *cam;
732 DBG("zr364xx_mmap: %ld\n", size);
736 cam = video_get_drvdata(vdev);
740 if (vm_insert_page(vma, start, vmalloc_to_page(pos)))
744 if (size > PAGE_SIZE)
754 static const struct file_operations zr364xx_fops = {
755 .owner = THIS_MODULE,
756 .open = zr364xx_open,
757 .release = zr364xx_release,
758 .read = zr364xx_read,
759 .mmap = zr364xx_mmap,
760 .ioctl = video_ioctl2,
764 static struct video_device zr364xx_template = {
765 .owner = THIS_MODULE,
767 .type = VID_TYPE_CAPTURE,
768 .fops = &zr364xx_fops,
769 .release = video_device_release,
772 .vidioc_querycap = zr364xx_vidioc_querycap,
773 .vidioc_enum_fmt_vid_cap = zr364xx_vidioc_enum_fmt_vid_cap,
774 .vidioc_try_fmt_vid_cap = zr364xx_vidioc_try_fmt_vid_cap,
775 .vidioc_s_fmt_vid_cap = zr364xx_vidioc_s_fmt_vid_cap,
776 .vidioc_g_fmt_vid_cap = zr364xx_vidioc_g_fmt_vid_cap,
777 .vidioc_enum_input = zr364xx_vidioc_enum_input,
778 .vidioc_g_input = zr364xx_vidioc_g_input,
779 .vidioc_s_input = zr364xx_vidioc_s_input,
780 .vidioc_streamon = zr364xx_vidioc_streamon,
781 .vidioc_streamoff = zr364xx_vidioc_streamoff,
782 .vidioc_queryctrl = zr364xx_vidioc_queryctrl,
783 .vidioc_g_ctrl = zr364xx_vidioc_g_ctrl,
784 .vidioc_s_ctrl = zr364xx_vidioc_s_ctrl,
789 /*******************/
790 /* USB integration */
791 /*******************/
793 static int zr364xx_probe(struct usb_interface *intf,
794 const struct usb_device_id *id)
796 struct usb_device *udev = interface_to_usbdev(intf);
797 struct zr364xx_camera *cam = NULL;
802 info(DRIVER_DESC " compatible webcam plugged");
803 info("model %04x:%04x detected", udev->descriptor.idVendor,
804 udev->descriptor.idProduct);
806 cam = kzalloc(sizeof(struct zr364xx_camera), GFP_KERNEL);
808 info("cam: out of memory !");
811 /* save the init method used by this camera */
812 cam->method = id->driver_info;
814 cam->vdev = video_device_alloc();
815 if (cam->vdev == NULL) {
816 info("cam->vdev: out of memory !");
820 memcpy(cam->vdev, &zr364xx_template, sizeof(zr364xx_template));
821 video_set_drvdata(cam->vdev, cam);
823 cam->vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
827 if ((cam->buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL)) == NULL) {
828 info("cam->buffer: out of memory !");
829 video_device_release(cam->vdev);
836 info("160x120 mode selected");
841 info("640x480 mode selected");
846 info("320x240 mode selected");
853 m1[2].value = 0xf000 + mode;
854 m2[1].value = 0xf000 + mode;
855 header2[437] = cam->height / 256;
856 header2[438] = cam->height % 256;
857 header2[439] = cam->width / 256;
858 header2[440] = cam->width % 256;
861 cam->brightness = 64;
862 mutex_init(&cam->lock);
864 err = video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1);
866 info("video_register_device failed");
867 video_device_release(cam->vdev);
873 usb_set_intfdata(intf, cam);
875 info(DRIVER_DESC " controlling video device %d", cam->vdev->minor);
880 static void zr364xx_disconnect(struct usb_interface *intf)
882 struct zr364xx_camera *cam = usb_get_intfdata(intf);
883 usb_set_intfdata(intf, NULL);
884 dev_set_drvdata(&intf->dev, NULL);
885 info(DRIVER_DESC " webcam unplugged");
887 video_unregister_device(cam->vdev);
891 vfree(cam->framebuf);
897 /**********************/
898 /* Module integration */
899 /**********************/
901 static struct usb_driver zr364xx_driver = {
903 .probe = zr364xx_probe,
904 .disconnect = zr364xx_disconnect,
905 .id_table = device_table
909 static int __init zr364xx_init(void)
912 retval = usb_register(&zr364xx_driver);
914 info("usb_register failed!");
916 info(DRIVER_DESC " module loaded");
921 static void __exit zr364xx_exit(void)
923 info(DRIVER_DESC " module unloaded");
924 usb_deregister(&zr364xx_driver);
928 module_init(zr364xx_init);
929 module_exit(zr364xx_exit);
931 MODULE_AUTHOR(DRIVER_AUTHOR);
932 MODULE_DESCRIPTION(DRIVER_DESC);
933 MODULE_LICENSE("GPL");