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>
38 #include <media/v4l2-ioctl.h>
41 /* Version Information */
42 #define DRIVER_VERSION "v0.72"
43 #define DRIVER_AUTHOR "Antoine Jacquet, http://royale.zerezo.com/"
44 #define DRIVER_DESC "Zoran 364xx"
49 #define MAX_FRAME_SIZE 100000
50 #define BUFFER_SIZE 0x1000
51 #define CTRL_TIMEOUT 500
55 #define DBG(x...) if (debug) printk(KERN_INFO KBUILD_MODNAME x)
58 /* Init methods, need to find nicer names for these
59 * the exact names of the chipsets would be the best if someone finds it */
65 /* Module parameters */
70 /* Module parameters interface */
71 module_param(debug, int, 0644);
72 MODULE_PARM_DESC(debug, "Debug level");
73 module_param(mode, int, 0644);
74 MODULE_PARM_DESC(mode, "0 = 320x240, 1 = 160x120, 2 = 640x480");
77 /* Devices supported by this driver
78 * .driver_info contains the init method used by the camera */
79 static struct usb_device_id device_table[] = {
80 {USB_DEVICE(0x08ca, 0x0109), .driver_info = METHOD0 },
81 {USB_DEVICE(0x041e, 0x4024), .driver_info = METHOD0 },
82 {USB_DEVICE(0x0d64, 0x0108), .driver_info = METHOD0 },
83 {USB_DEVICE(0x0546, 0x3187), .driver_info = METHOD0 },
84 {USB_DEVICE(0x0d64, 0x3108), .driver_info = METHOD0 },
85 {USB_DEVICE(0x0595, 0x4343), .driver_info = METHOD0 },
86 {USB_DEVICE(0x0bb0, 0x500d), .driver_info = METHOD0 },
87 {USB_DEVICE(0x0feb, 0x2004), .driver_info = METHOD0 },
88 {USB_DEVICE(0x055f, 0xb500), .driver_info = METHOD0 },
89 {USB_DEVICE(0x08ca, 0x2062), .driver_info = METHOD2 },
90 {USB_DEVICE(0x052b, 0x1a18), .driver_info = METHOD1 },
91 {USB_DEVICE(0x04c8, 0x0729), .driver_info = METHOD0 },
92 {USB_DEVICE(0x04f2, 0xa208), .driver_info = METHOD0 },
93 {USB_DEVICE(0x0784, 0x0040), .driver_info = METHOD1 },
94 {USB_DEVICE(0x06d6, 0x0034), .driver_info = METHOD0 },
95 {USB_DEVICE(0x0a17, 0x0062), .driver_info = METHOD2 },
96 {USB_DEVICE(0x06d6, 0x003b), .driver_info = METHOD0 },
97 {USB_DEVICE(0x0a17, 0x004e), .driver_info = METHOD2 },
98 {USB_DEVICE(0x041e, 0x405d), .driver_info = METHOD2 },
99 {} /* Terminating entry */
102 MODULE_DEVICE_TABLE(usb, device_table);
106 struct zr364xx_camera {
107 struct usb_device *udev; /* save off the usb device pointer */
108 struct usb_interface *interface;/* the interface for this device */
109 struct video_device *vdev; /* v4l video device */
112 unsigned char *buffer;
123 /* function used to send initialisation commands to the camera */
124 static int send_control_msg(struct usb_device *udev, u8 request, u16 value,
125 u16 index, unsigned char *cp, u16 size)
129 unsigned char *transfer_buffer = kmalloc(size, GFP_KERNEL);
130 if (!transfer_buffer) {
131 dev_err(&udev->dev, "kmalloc(%d) failed\n", size);
135 memcpy(transfer_buffer, cp, size);
137 status = usb_control_msg(udev,
138 usb_sndctrlpipe(udev, 0),
140 USB_DIR_OUT | USB_TYPE_VENDOR |
141 USB_RECIP_DEVICE, value, index,
142 transfer_buffer, size, CTRL_TIMEOUT);
144 kfree(transfer_buffer);
148 "Failed sending control message, error %d.\n", status);
154 /* Control messages sent to the camera to initialize it
155 * and launch the capture */
159 unsigned char *bytes;
163 static unsigned char m0d1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
164 static unsigned char m0d2[] = { 0, 0, 0, 0, 0, 0 };
165 static unsigned char m0d3[] = { 0, 0 };
166 static message m0[] = {
169 {0x3370, sizeof(m0d1), m0d1},
172 {0x2610, sizeof(m0d2), m0d2},
177 {0x9a01, sizeof(m0d3), m0d3},
182 static unsigned char m1d1[] = { 0xff, 0xff };
183 static unsigned char m1d2[] = { 0x00, 0x00 };
184 static message m1[] = {
192 {0x2502, sizeof(m1d1), m1d1},
197 {0x9a01, sizeof(m1d2), m1d2},
202 static unsigned char m2d1[] = { 0xff, 0xff };
203 static message m2[] = {
210 {0x2502, sizeof(m2d1), m2d1},
216 static message *init[3] = { m0, m1, m2 };
219 /* JPEG static data in header (Huffman table, etc) */
220 static unsigned char header1[] = {
223 0xFF, 0xE0, 0x00, 0x10, 'J', 'F', 'I', 'F',
224 0x00, 0x01, 0x01, 0x00, 0x33, 0x8A, 0x00, 0x00, 0x33, 0x88,
226 0xFF, 0xDB, 0x00, 0x84
228 static unsigned char header2[] = {
229 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01,
230 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
231 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B,
232 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02,
233 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01,
234 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06,
235 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xA1,
236 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33,
237 0x62, 0x72, 0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25,
238 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
239 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54,
240 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67,
241 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A,
242 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94,
243 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6,
244 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8,
245 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA,
246 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2,
247 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3,
248 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 0x00, 0x1F,
249 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
250 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04,
251 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5,
252 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05,
253 0x04, 0x04, 0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11,
254 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
255 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1,
256 0x09, 0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16,
257 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 0x18, 0x19, 0x1A, 0x26, 0x27,
258 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44,
259 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57,
260 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A,
261 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 0x84,
262 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96,
263 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8,
264 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA,
265 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3,
266 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5,
267 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,
268 0xF8, 0xF9, 0xFA, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01,
269 0x40, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01,
270 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11,
273 static unsigned char header3;
277 /********************/
278 /* V4L2 integration */
279 /********************/
281 /* this function reads a full JPEG picture synchronously
282 * TODO: do it asynchronously... */
283 static int read_frame(struct zr364xx_camera *cam, int framenum)
285 int i, n, temp, head, size, actual_length;
286 unsigned char *ptr = NULL, *jpeg;
289 /* hardware brightness */
290 n = send_control_msg(cam->udev, 1, 0x2001, 0, NULL, 0);
291 temp = (0x60 << 8) + 127 - cam->brightness;
292 n = send_control_msg(cam->udev, 1, temp, 0, NULL, 0);
294 /* during the first loop we are going to insert JPEG header */
296 /* this is the place in memory where we are going to build
298 jpeg = cam->framebuf + framenum * MAX_FRAME_SIZE;
301 n = usb_bulk_msg(cam->udev,
302 usb_rcvbulkpipe(cam->udev, 0x81),
303 cam->buffer, BUFFER_SIZE, &actual_length,
305 DBG("buffer : %d %d", cam->buffer[0], cam->buffer[1]);
306 DBG("bulk : n=%d size=%d", n, actual_length);
308 dev_err(&cam->udev->dev, "error reading bulk msg\n");
311 if (actual_length < 0 || actual_length > BUFFER_SIZE) {
312 dev_err(&cam->udev->dev, "wrong number of bytes\n");
316 /* swap bytes if camera needs it */
317 if (cam->method == METHOD0) {
318 u16 *buf = (u16*)cam->buffer;
319 for (i = 0; i < BUFFER_SIZE/2; i++)
323 /* write the JPEG header */
327 memcpy(ptr, header1, sizeof(header1));
328 ptr += sizeof(header1);
330 memcpy(ptr, &header3, 1);
332 memcpy(ptr, cam->buffer, 64);
335 memcpy(ptr, &header3, 1);
337 memcpy(ptr, cam->buffer + 64, 64);
339 memcpy(ptr, header2, sizeof(header2));
340 ptr += sizeof(header2);
341 memcpy(ptr, cam->buffer + 128,
342 actual_length - 128);
343 ptr += actual_length - 128;
345 DBG("header : %d %d %d %d %d %d %d %d %d",
346 cam->buffer[0], cam->buffer[1], cam->buffer[2],
347 cam->buffer[3], cam->buffer[4], cam->buffer[5],
348 cam->buffer[6], cam->buffer[7], cam->buffer[8]);
350 memcpy(ptr, cam->buffer, actual_length);
351 ptr += actual_length;
354 /* ... until there is no more */
355 while (actual_length == BUFFER_SIZE);
357 /* we skip the 2 first frames which are usually buggy */
363 /* go back to find the JPEG EOI marker */
367 if (*ptr == 0xFF && *(ptr + 1) == 0xD9
368 && *(ptr + 2) == 0xFF)
373 DBG("No EOI marker");
375 /* Sometimes there is junk data in the middle of the picture,
376 * we want to skip this bogus frames */
378 if (*ptr == 0xFF && *(ptr + 1) == 0xFF
379 && *(ptr + 2) == 0xFF)
384 DBG("Bogus frame ? %d", cam->nb);
388 DBG("jpeg : %d %d %d %d %d %d %d %d",
389 jpeg[0], jpeg[1], jpeg[2], jpeg[3],
390 jpeg[4], jpeg[5], jpeg[6], jpeg[7]);
396 static ssize_t zr364xx_read(struct file *file, char __user *buf, size_t cnt,
399 unsigned long count = cnt;
400 struct video_device *vdev = video_devdata(file);
401 struct zr364xx_camera *cam;
403 DBG("zr364xx_read: read %d bytes.", (int) count);
407 cam = video_get_drvdata(vdev);
416 count = read_frame(cam, 0);
418 if (copy_to_user(buf, cam->framebuf, count))
425 static int zr364xx_vidioc_querycap(struct file *file, void *priv,
426 struct v4l2_capability *cap)
428 memset(cap, 0, sizeof(*cap));
429 strcpy(cap->driver, DRIVER_DESC);
430 cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE;
434 static int zr364xx_vidioc_enum_input(struct file *file, void *priv,
435 struct v4l2_input *i)
439 memset(i, 0, sizeof(*i));
441 strcpy(i->name, DRIVER_DESC " Camera");
442 i->type = V4L2_INPUT_TYPE_CAMERA;
446 static int zr364xx_vidioc_g_input(struct file *file, void *priv,
453 static int zr364xx_vidioc_s_input(struct file *file, void *priv,
461 static int zr364xx_vidioc_queryctrl(struct file *file, void *priv,
462 struct v4l2_queryctrl *c)
464 struct video_device *vdev = video_devdata(file);
465 struct zr364xx_camera *cam;
469 cam = video_get_drvdata(vdev);
472 case V4L2_CID_BRIGHTNESS:
473 c->type = V4L2_CTRL_TYPE_INTEGER;
474 strcpy(c->name, "Brightness");
478 c->default_value = cam->brightness;
487 static int zr364xx_vidioc_s_ctrl(struct file *file, void *priv,
488 struct v4l2_control *c)
490 struct video_device *vdev = video_devdata(file);
491 struct zr364xx_camera *cam;
495 cam = video_get_drvdata(vdev);
498 case V4L2_CID_BRIGHTNESS:
499 cam->brightness = c->value;
507 static int zr364xx_vidioc_g_ctrl(struct file *file, void *priv,
508 struct v4l2_control *c)
510 struct video_device *vdev = video_devdata(file);
511 struct zr364xx_camera *cam;
515 cam = video_get_drvdata(vdev);
518 case V4L2_CID_BRIGHTNESS:
519 c->value = cam->brightness;
527 static int zr364xx_vidioc_enum_fmt_vid_cap(struct file *file,
528 void *priv, struct v4l2_fmtdesc *f)
532 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
534 memset(f, 0, sizeof(*f));
536 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
537 f->flags = V4L2_FMT_FLAG_COMPRESSED;
538 strcpy(f->description, "JPEG");
539 f->pixelformat = V4L2_PIX_FMT_JPEG;
543 static int zr364xx_vidioc_try_fmt_vid_cap(struct file *file, void *priv,
544 struct v4l2_format *f)
546 struct video_device *vdev = video_devdata(file);
547 struct zr364xx_camera *cam;
551 cam = video_get_drvdata(vdev);
553 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
555 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
557 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
558 f->fmt.pix.field != V4L2_FIELD_NONE)
560 f->fmt.pix.field = V4L2_FIELD_NONE;
561 f->fmt.pix.width = cam->width;
562 f->fmt.pix.height = cam->height;
563 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
564 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
565 f->fmt.pix.colorspace = 0;
570 static int zr364xx_vidioc_g_fmt_vid_cap(struct file *file, void *priv,
571 struct v4l2_format *f)
573 struct video_device *vdev = video_devdata(file);
574 struct zr364xx_camera *cam;
578 cam = video_get_drvdata(vdev);
580 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
582 memset(&f->fmt.pix, 0, sizeof(struct v4l2_pix_format));
583 f->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
584 f->fmt.pix.pixelformat = V4L2_PIX_FMT_JPEG;
585 f->fmt.pix.field = V4L2_FIELD_NONE;
586 f->fmt.pix.width = cam->width;
587 f->fmt.pix.height = cam->height;
588 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
589 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
590 f->fmt.pix.colorspace = 0;
595 static int zr364xx_vidioc_s_fmt_vid_cap(struct file *file, void *priv,
596 struct v4l2_format *f)
598 struct video_device *vdev = video_devdata(file);
599 struct zr364xx_camera *cam;
603 cam = video_get_drvdata(vdev);
605 if (f->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
607 if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_JPEG)
609 if (f->fmt.pix.field != V4L2_FIELD_ANY &&
610 f->fmt.pix.field != V4L2_FIELD_NONE)
612 f->fmt.pix.field = V4L2_FIELD_NONE;
613 f->fmt.pix.width = cam->width;
614 f->fmt.pix.height = cam->height;
615 f->fmt.pix.bytesperline = f->fmt.pix.width * 2;
616 f->fmt.pix.sizeimage = f->fmt.pix.height * f->fmt.pix.bytesperline;
617 f->fmt.pix.colorspace = 0;
623 static int zr364xx_vidioc_streamon(struct file *file, void *priv,
624 enum v4l2_buf_type type)
629 static int zr364xx_vidioc_streamoff(struct file *file, void *priv,
630 enum v4l2_buf_type type)
636 /* open the camera */
637 static int zr364xx_open(struct inode *inode, struct file *file)
639 struct video_device *vdev = video_devdata(file);
640 struct zr364xx_camera *cam = video_get_drvdata(vdev);
641 struct usb_device *udev = cam->udev;
646 mutex_lock(&cam->lock);
653 if (!cam->framebuf) {
654 cam->framebuf = vmalloc_32(MAX_FRAME_SIZE * FRAMES);
655 if (!cam->framebuf) {
656 dev_err(&cam->udev->dev, "vmalloc_32 failed!\n");
662 for (i = 0; init[cam->method][i].size != -1; i++) {
664 send_control_msg(udev, 1, init[cam->method][i].value,
665 0, init[cam->method][i].bytes,
666 init[cam->method][i].size);
668 dev_err(&cam->udev->dev,
669 "error during open sequence: %d\n", i);
676 file->private_data = vdev;
678 /* Added some delay here, since opening/closing the camera quickly,
679 * like Ekiga does during its startup, can crash the webcam
685 mutex_unlock(&cam->lock);
690 /* release the camera */
691 static int zr364xx_release(struct inode *inode, struct file *file)
693 struct video_device *vdev = video_devdata(file);
694 struct zr364xx_camera *cam;
695 struct usb_device *udev;
698 DBG("zr364xx_release");
702 cam = video_get_drvdata(vdev);
706 mutex_lock(&cam->lock);
709 file->private_data = NULL;
711 for (i = 0; i < 2; i++) {
713 send_control_msg(udev, 1, init[cam->method][i].value,
714 0, init[i][cam->method].bytes,
715 init[cam->method][i].size);
717 dev_err(&udev->dev, "error during release sequence\n");
722 /* Added some delay here, since opening/closing the camera quickly,
723 * like Ekiga does during its startup, can crash the webcam
729 mutex_unlock(&cam->lock);
734 static int zr364xx_mmap(struct file *file, struct vm_area_struct *vma)
737 unsigned long start = vma->vm_start;
738 unsigned long size = vma->vm_end - vma->vm_start;
739 struct video_device *vdev = video_devdata(file);
740 struct zr364xx_camera *cam;
742 DBG("zr364xx_mmap: %ld\n", size);
746 cam = video_get_drvdata(vdev);
750 if (vm_insert_page(vma, start, vmalloc_to_page(pos)))
754 if (size > PAGE_SIZE)
764 static const struct file_operations zr364xx_fops = {
765 .owner = THIS_MODULE,
766 .open = zr364xx_open,
767 .release = zr364xx_release,
768 .read = zr364xx_read,
769 .mmap = zr364xx_mmap,
770 .ioctl = video_ioctl2,
774 static const struct v4l2_ioctl_ops zr364xx_ioctl_ops = {
775 .vidioc_querycap = zr364xx_vidioc_querycap,
776 .vidioc_enum_fmt_vid_cap = zr364xx_vidioc_enum_fmt_vid_cap,
777 .vidioc_try_fmt_vid_cap = zr364xx_vidioc_try_fmt_vid_cap,
778 .vidioc_s_fmt_vid_cap = zr364xx_vidioc_s_fmt_vid_cap,
779 .vidioc_g_fmt_vid_cap = zr364xx_vidioc_g_fmt_vid_cap,
780 .vidioc_enum_input = zr364xx_vidioc_enum_input,
781 .vidioc_g_input = zr364xx_vidioc_g_input,
782 .vidioc_s_input = zr364xx_vidioc_s_input,
783 .vidioc_streamon = zr364xx_vidioc_streamon,
784 .vidioc_streamoff = zr364xx_vidioc_streamoff,
785 .vidioc_queryctrl = zr364xx_vidioc_queryctrl,
786 .vidioc_g_ctrl = zr364xx_vidioc_g_ctrl,
787 .vidioc_s_ctrl = zr364xx_vidioc_s_ctrl,
790 static struct video_device zr364xx_template = {
792 .fops = &zr364xx_fops,
793 .ioctl_ops = &zr364xx_ioctl_ops,
794 .release = video_device_release,
800 /*******************/
801 /* USB integration */
802 /*******************/
804 static int zr364xx_probe(struct usb_interface *intf,
805 const struct usb_device_id *id)
807 struct usb_device *udev = interface_to_usbdev(intf);
808 struct zr364xx_camera *cam = NULL;
813 dev_info(&intf->dev, DRIVER_DESC " compatible webcam plugged\n");
814 dev_info(&intf->dev, "model %04x:%04x detected\n",
815 le16_to_cpu(udev->descriptor.idVendor),
816 le16_to_cpu(udev->descriptor.idProduct));
818 cam = kzalloc(sizeof(struct zr364xx_camera), GFP_KERNEL);
820 dev_err(&udev->dev, "cam: out of memory !\n");
823 /* save the init method used by this camera */
824 cam->method = id->driver_info;
826 cam->vdev = video_device_alloc();
827 if (cam->vdev == NULL) {
828 dev_err(&udev->dev, "cam->vdev: out of memory !\n");
832 memcpy(cam->vdev, &zr364xx_template, sizeof(zr364xx_template));
833 video_set_drvdata(cam->vdev, cam);
835 cam->vdev->debug = V4L2_DEBUG_IOCTL | V4L2_DEBUG_IOCTL_ARG;
839 if ((cam->buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL)) == NULL) {
840 dev_info(&udev->dev, "cam->buffer: out of memory !\n");
841 video_device_release(cam->vdev);
848 dev_info(&udev->dev, "160x120 mode selected\n");
853 dev_info(&udev->dev, "640x480 mode selected\n");
858 dev_info(&udev->dev, "320x240 mode selected\n");
865 m1[2].value = 0xf000 + mode;
866 m2[1].value = 0xf000 + mode;
867 header2[437] = cam->height / 256;
868 header2[438] = cam->height % 256;
869 header2[439] = cam->width / 256;
870 header2[440] = cam->width % 256;
873 cam->brightness = 64;
874 mutex_init(&cam->lock);
876 err = video_register_device(cam->vdev, VFL_TYPE_GRABBER, -1);
878 dev_err(&udev->dev, "video_register_device failed\n");
879 video_device_release(cam->vdev);
885 usb_set_intfdata(intf, cam);
887 dev_info(&udev->dev, DRIVER_DESC " controlling video device %d\n",
893 static void zr364xx_disconnect(struct usb_interface *intf)
895 struct zr364xx_camera *cam = usb_get_intfdata(intf);
896 usb_set_intfdata(intf, NULL);
897 dev_set_drvdata(&intf->dev, NULL);
898 dev_info(&intf->dev, DRIVER_DESC " webcam unplugged\n");
900 video_unregister_device(cam->vdev);
904 vfree(cam->framebuf);
910 /**********************/
911 /* Module integration */
912 /**********************/
914 static struct usb_driver zr364xx_driver = {
916 .probe = zr364xx_probe,
917 .disconnect = zr364xx_disconnect,
918 .id_table = device_table
922 static int __init zr364xx_init(void)
925 retval = usb_register(&zr364xx_driver);
927 printk(KERN_ERR KBUILD_MODNAME ": usb_register failed!\n");
929 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC "\n");
934 static void __exit zr364xx_exit(void)
936 printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_DESC " module unloaded\n");
937 usb_deregister(&zr364xx_driver);
941 module_init(zr364xx_init);
942 module_exit(zr364xx_exit);
944 MODULE_AUTHOR(DRIVER_AUTHOR);
945 MODULE_DESCRIPTION(DRIVER_DESC);
946 MODULE_LICENSE("GPL");