2 * Video4Linux Colour QuickCam driver
3 * Copyright 1997-2000 Philip Blundell <philb@gnu.org>
7 * parport=auto -- probe all parports (default)
8 * parport=0 -- parport0 becomes qcam1
9 * parport=2,0,1 -- parports 2,0,1 are tried in that order
11 * probe=0 -- do no probing, assume camera is present
12 * probe=1 -- use IEEE-1284 autoprobe data only (default)
13 * probe=2 -- probe aggressively for cameras
15 * force_rgb=1 -- force data format to RGB (default is BGR)
17 * The parport parameter controls which parports will be scanned.
18 * Scanning all parports causes some printers to print a garbage page.
19 * -- March 14, 1999 Billy Donahue <billy@escape.com>
21 * Fixed data format to BGR, added force_rgb parameter. Added missing
22 * parport_unregister_driver() on module removal.
23 * -- May 28, 2000 Claudio Matsuoka <claudio@conectiva.com>
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <linux/errno.h>
30 #include <linux/init.h>
31 #include <linux/kernel.h>
32 #include <linux/slab.h>
34 #include <linux/parport.h>
35 #include <linux/sched.h>
36 #include <linux/videodev.h>
37 #include <media/v4l2-common.h>
38 #include <linux/mutex.h>
39 #include <linux/jiffies.h>
41 #include <asm/uaccess.h>
44 struct video_device vdev;
45 struct pardevice *pdev;
46 struct parport *pport;
48 int ccd_width, ccd_height;
50 int contrast, brightness, whitebal;
52 unsigned int bidirectional;
59 /* The three possible QuickCam modes */
60 #define QC_MILLIONS 0x18
61 #define QC_BILLIONS 0x10
62 #define QC_THOUSANDS 0x08 /* with VIDEC compression (not supported) */
64 /* The three possible decimations */
65 #define QC_DECIMATION_1 0
66 #define QC_DECIMATION_2 2
67 #define QC_DECIMATION_4 4
69 #define BANNER "Colour QuickCam for Video4Linux v0.05"
71 static int parport[MAX_CAMS] = { [1 ... MAX_CAMS-1] = -1 };
74 static int video_nr = -1;
76 static inline void qcam_set_ack(struct qcam_device *qcam, unsigned int i)
78 /* note: the QC specs refer to the PCAck pin by voltage, not
79 software level. PC ports have builtin inverters. */
80 parport_frob_control(qcam->pport, 8, i?8:0);
83 static inline unsigned int qcam_ready1(struct qcam_device *qcam)
85 return (parport_read_status(qcam->pport) & 0x8)?1:0;
88 static inline unsigned int qcam_ready2(struct qcam_device *qcam)
90 return (parport_read_data(qcam->pport) & 0x1)?1:0;
93 static unsigned int qcam_await_ready1(struct qcam_device *qcam,
96 unsigned long oldjiffies = jiffies;
99 for (oldjiffies = jiffies;
100 time_before(jiffies, oldjiffies + msecs_to_jiffies(40)); )
101 if (qcam_ready1(qcam) == value)
104 /* If the camera didn't respond within 1/25 second, poll slowly
106 for (i = 0; i < 50; i++)
108 if (qcam_ready1(qcam) == value)
110 msleep_interruptible(100);
113 /* Probably somebody pulled the plug out. Not much we can do. */
114 printk(KERN_ERR "c-qcam: ready1 timeout (%d) %x %x\n", value,
115 parport_read_status(qcam->pport),
116 parport_read_control(qcam->pport));
120 static unsigned int qcam_await_ready2(struct qcam_device *qcam, int value)
122 unsigned long oldjiffies = jiffies;
125 for (oldjiffies = jiffies;
126 time_before(jiffies, oldjiffies + msecs_to_jiffies(40)); )
127 if (qcam_ready2(qcam) == value)
130 /* If the camera didn't respond within 1/25 second, poll slowly
132 for (i = 0; i < 50; i++)
134 if (qcam_ready2(qcam) == value)
136 msleep_interruptible(100);
139 /* Probably somebody pulled the plug out. Not much we can do. */
140 printk(KERN_ERR "c-qcam: ready2 timeout (%d) %x %x %x\n", value,
141 parport_read_status(qcam->pport),
142 parport_read_control(qcam->pport),
143 parport_read_data(qcam->pport));
147 static int qcam_read_data(struct qcam_device *qcam)
150 qcam_set_ack(qcam, 0);
151 if (qcam_await_ready1(qcam, 1)) return -1;
152 idata = parport_read_status(qcam->pport) & 0xf0;
153 qcam_set_ack(qcam, 1);
154 if (qcam_await_ready1(qcam, 0)) return -1;
155 idata |= (parport_read_status(qcam->pport) >> 4);
159 static int qcam_write_data(struct qcam_device *qcam, unsigned int data)
162 parport_write_data(qcam->pport, data);
163 idata = qcam_read_data(qcam);
166 printk(KERN_WARNING "cqcam: sent %x but received %x\n", data,
173 static inline int qcam_set(struct qcam_device *qcam, unsigned int cmd, unsigned int data)
175 if (qcam_write_data(qcam, cmd))
177 if (qcam_write_data(qcam, data))
182 static inline int qcam_get(struct qcam_device *qcam, unsigned int cmd)
184 if (qcam_write_data(qcam, cmd))
186 return qcam_read_data(qcam);
189 static int qc_detect(struct qcam_device *qcam)
191 unsigned int stat, ostat, i, count = 0;
193 /* The probe routine below is not very reliable. The IEEE-1284
194 probe takes precedence. */
195 /* XXX Currently parport provides no way to distinguish between
196 "the IEEE probe was not done" and "the probe was done, but
197 no device was found". Fix this one day. */
198 if (qcam->pport->probe_info[0].class == PARPORT_CLASS_MEDIA
199 && qcam->pport->probe_info[0].model
200 && !strcmp(qcam->pdev->port->probe_info[0].model,
201 "Color QuickCam 2.0")) {
202 printk(KERN_DEBUG "QuickCam: Found by IEEE1284 probe.\n");
209 parport_write_control(qcam->pport, 0xc);
211 /* look for a heartbeat */
212 ostat = stat = parport_read_status(qcam->pport);
213 for (i=0; i<250; i++)
216 stat = parport_read_status(qcam->pport);
219 if (++count >= 3) return 1;
224 /* Reset the camera and try again */
225 parport_write_control(qcam->pport, 0xc);
226 parport_write_control(qcam->pport, 0x8);
228 parport_write_control(qcam->pport, 0xc);
232 ostat = stat = parport_read_status(qcam->pport);
233 for (i=0; i<250; i++)
236 stat = parport_read_status(qcam->pport);
239 if (++count >= 3) return 1;
244 /* no (or flatline) camera, give up */
248 static void qc_reset(struct qcam_device *qcam)
250 parport_write_control(qcam->pport, 0xc);
251 parport_write_control(qcam->pport, 0x8);
253 parport_write_control(qcam->pport, 0xc);
257 /* Reset the QuickCam and program for brightness, contrast,
258 * white-balance, and resolution. */
260 static void qc_setup(struct qcam_device *q)
264 /* Set the brightness. */
265 qcam_set(q, 11, q->brightness);
267 /* Set the height and width. These refer to the actual
268 CCD area *before* applying the selected decimation. */
269 qcam_set(q, 17, q->ccd_height);
270 qcam_set(q, 19, q->ccd_width / 2);
272 /* Set top and left. */
273 qcam_set(q, 0xd, q->top);
274 qcam_set(q, 0xf, q->left);
276 /* Set contrast and white balance. */
277 qcam_set(q, 0x19, q->contrast);
278 qcam_set(q, 0x1f, q->whitebal);
284 /* Read some bytes from the camera and put them in the buffer.
285 nbytes should be a multiple of 3, because bidirectional mode gives
286 us three bytes at a time. */
288 static unsigned int qcam_read_bytes(struct qcam_device *q, unsigned char *buf, unsigned int nbytes)
290 unsigned int bytes = 0;
293 if (q->bidirectional)
295 /* It's a bidirectional port */
296 while (bytes < nbytes)
298 unsigned int lo1, hi1, lo2, hi2;
299 unsigned char r, g, b;
301 if (qcam_await_ready2(q, 1)) return bytes;
302 lo1 = parport_read_data(q->pport) >> 1;
303 hi1 = ((parport_read_status(q->pport) >> 3) & 0x1f) ^ 0x10;
305 if (qcam_await_ready2(q, 0)) return bytes;
306 lo2 = parport_read_data(q->pport) >> 1;
307 hi2 = ((parport_read_status(q->pport) >> 3) & 0x1f) ^ 0x10;
309 r = (lo1 | ((hi1 & 1)<<7));
310 g = ((hi1 & 0x1e)<<3) | ((hi2 & 0x1e)>>1);
311 b = (lo2 | ((hi2 & 1)<<7));
325 /* It's a unidirectional port */
326 int i = 0, n = bytes;
327 unsigned char rgb[3];
329 while (bytes < nbytes)
333 if (qcam_await_ready1(q, 1)) return bytes;
334 hi = (parport_read_status(q->pport) & 0xf0);
336 if (qcam_await_ready1(q, 0)) return bytes;
337 lo = (parport_read_status(q->pport) & 0xf0);
340 rgb[(i = bytes++ % 3)] = (hi | (lo >> 4)) ^ 0x88;
364 static long qc_capture(struct qcam_device *q, char __user *buf, unsigned long len)
366 unsigned lines, pixelsperline, bitsperxfer;
367 unsigned int is_bi_dir = q->bidirectional;
368 size_t wantlen, outptr = 0;
371 if (!access_ok(VERIFY_WRITE, buf, len))
374 /* Wait for camera to become ready */
377 int i = qcam_get(q, 41);
388 if (qcam_set(q, 7, (q->mode | (is_bi_dir?1:0)) + 1))
392 pixelsperline = q->width;
393 bitsperxfer = (is_bi_dir) ? 24 : 8;
397 /* Turn the port around */
398 parport_data_reverse(q->pport);
401 if (qcam_await_ready1(q, 1)) {
406 if (qcam_await_ready1(q, 0)) {
412 wantlen = lines * pixelsperline * 24 / 8;
417 s = (wantlen > BUFSZ)?BUFSZ:wantlen;
418 t = qcam_read_bytes(q, tmpbuf, s);
421 size_t sz = len - outptr;
423 if (__copy_to_user(buf+outptr, tmpbuf, sz))
437 printk("qcam: short read.\n");
439 parport_data_forward(q->pport);
448 l = qcam_read_bytes(q, tmpbuf, 3);
450 } while (l && (tmpbuf[0] == 0x7e || tmpbuf[1] == 0x7e || tmpbuf[2] == 0x7e));
452 if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
453 printk("qcam: bad EOF\n");
455 if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
456 printk("qcam: bad EOF\n");
459 if (qcam_await_ready1(q, 1))
461 printk("qcam: no ack after EOF\n");
462 parport_data_forward(q->pport);
466 parport_data_forward(q->pport);
469 if (qcam_await_ready1(q, 0))
471 printk("qcam: no ack to port turnaround\n");
480 l = qcam_read_bytes(q, tmpbuf, 1);
482 } while (l && tmpbuf[0] == 0x7e);
483 l = qcam_read_bytes(q, tmpbuf+1, 2);
485 if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
486 printk("qcam: bad EOF\n");
488 if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
489 printk("qcam: bad EOF\n");
493 qcam_write_data(q, 0);
498 * Video4linux interfacing
501 static int qcam_do_ioctl(struct inode *inode, struct file *file,
502 unsigned int cmd, void *arg)
504 struct video_device *dev = video_devdata(file);
505 struct qcam_device *qcam=(struct qcam_device *)dev;
511 struct video_capability *b = arg;
512 strcpy(b->name, "Quickcam");
513 b->type = VID_TYPE_CAPTURE|VID_TYPE_SCALES;
524 struct video_channel *v = arg;
529 /* Good question.. its composite or SVHS so.. */
530 v->type = VIDEO_TYPE_CAMERA;
531 strcpy(v->name, "Camera");
536 struct video_channel *v = arg;
543 struct video_tuner *v = arg;
546 memset(v,0,sizeof(*v));
547 strcpy(v->name, "Format");
548 v->mode = VIDEO_MODE_AUTO;
553 struct video_tuner *v = arg;
556 if(v->mode!=VIDEO_MODE_AUTO)
562 struct video_picture *p = arg;
565 p->brightness=qcam->brightness<<8;
566 p->contrast=qcam->contrast<<8;
567 p->whiteness=qcam->whitebal<<8;
569 p->palette=VIDEO_PALETTE_RGB24;
574 struct video_picture *p = arg;
579 if (p->depth != 24 || p->palette != VIDEO_PALETTE_RGB24)
583 * Now load the camera.
585 qcam->brightness = p->brightness>>8;
586 qcam->contrast = p->contrast>>8;
587 qcam->whitebal = p->whiteness>>8;
589 mutex_lock(&qcam->lock);
590 parport_claim_or_block(qcam->pdev);
592 parport_release(qcam->pdev);
593 mutex_unlock(&qcam->lock);
598 struct video_window *vw = arg;
604 if(vw->height<60||vw->height>240)
606 if(vw->width<80||vw->width>320)
611 qcam->mode = QC_DECIMATION_4;
613 if(vw->width>=160 && vw->height>=120)
617 qcam->mode = QC_DECIMATION_2;
619 if(vw->width>=320 && vw->height>=240)
623 qcam->mode = QC_DECIMATION_1;
625 qcam->mode |= QC_MILLIONS;
627 if(vw->width>=640 && vw->height>=480)
631 qcam->mode = QC_BILLIONS | QC_DECIMATION_1;
634 /* Ok we figured out what to use from our
636 mutex_lock(&qcam->lock);
637 parport_claim_or_block(qcam->pdev);
639 parport_release(qcam->pdev);
640 mutex_unlock(&qcam->lock);
645 struct video_window *vw = arg;
646 memset(vw, 0, sizeof(*vw));
647 vw->width=qcam->width;
648 vw->height=qcam->height;
667 static int qcam_ioctl(struct inode *inode, struct file *file,
668 unsigned int cmd, unsigned long arg)
670 return video_usercopy(inode, file, cmd, arg, qcam_do_ioctl);
673 static ssize_t qcam_read(struct file *file, char __user *buf,
674 size_t count, loff_t *ppos)
676 struct video_device *v = video_devdata(file);
677 struct qcam_device *qcam=(struct qcam_device *)v;
680 mutex_lock(&qcam->lock);
681 parport_claim_or_block(qcam->pdev);
682 /* Probably should have a semaphore against multiple users */
683 len = qc_capture(qcam, buf,count);
684 parport_release(qcam->pdev);
685 mutex_unlock(&qcam->lock);
689 /* video device template */
690 static const struct file_operations qcam_fops = {
691 .owner = THIS_MODULE,
692 .open = video_exclusive_open,
693 .release = video_exclusive_release,
696 .compat_ioctl = v4l_compat_ioctl32,
702 static struct video_device qcam_template=
704 .owner = THIS_MODULE,
705 .name = "Colour QuickCam",
706 .type = VID_TYPE_CAPTURE,
710 /* Initialize the QuickCam driver control structure. */
712 static struct qcam_device *qcam_init(struct parport *port)
714 struct qcam_device *q;
716 q = kmalloc(sizeof(struct qcam_device), GFP_KERNEL);
721 q->pdev = parport_register_device(port, "c-qcam", NULL, NULL,
724 q->bidirectional = (q->pport->modes & PARPORT_MODE_TRISTATE)?1:0;
728 printk(KERN_ERR "c-qcam: couldn't register for %s.\n",
734 memcpy(&q->vdev, &qcam_template, sizeof(qcam_template));
736 mutex_init(&q->lock);
737 q->width = q->ccd_width = 320;
738 q->height = q->ccd_height = 240;
739 q->mode = QC_MILLIONS | QC_DECIMATION_1;
748 static struct qcam_device *qcams[MAX_CAMS];
749 static unsigned int num_cams;
751 static int init_cqcam(struct parport *port)
753 struct qcam_device *qcam;
755 if (parport[0] != -1)
757 /* The user gave specific instructions */
759 for (i = 0; i < MAX_CAMS && parport[i] != -1; i++)
761 if (parport[0] == port->number)
768 if (num_cams == MAX_CAMS)
771 qcam = qcam_init(port);
775 parport_claim_or_block(qcam->pdev);
779 if (probe && qc_detect(qcam)==0)
781 parport_release(qcam->pdev);
782 parport_unregister_device(qcam->pdev);
789 parport_release(qcam->pdev);
791 if (video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr)==-1)
793 printk(KERN_ERR "Unable to register Colour QuickCam on %s\n",
795 parport_unregister_device(qcam->pdev);
800 printk(KERN_INFO "video%d: Colour QuickCam found on %s\n",
801 qcam->vdev.minor, qcam->pport->name);
803 qcams[num_cams++] = qcam;
808 static void close_cqcam(struct qcam_device *qcam)
810 video_unregister_device(&qcam->vdev);
811 parport_unregister_device(qcam->pdev);
815 static void cq_attach(struct parport *port)
820 static void cq_detach(struct parport *port)
822 /* Write this some day. */
825 static struct parport_driver cqcam_driver = {
831 static int __init cqcam_init (void)
835 return parport_register_driver(&cqcam_driver);
838 static void __exit cqcam_cleanup (void)
842 for (i = 0; i < num_cams; i++)
843 close_cqcam(qcams[i]);
845 parport_unregister_driver(&cqcam_driver);
848 MODULE_AUTHOR("Philip Blundell <philb@gnu.org>");
849 MODULE_DESCRIPTION(BANNER);
850 MODULE_LICENSE("GPL");
852 /* FIXME: parport=auto would never have worked, surely? --RR */
853 MODULE_PARM_DESC(parport ,"parport=<auto|n[,n]...> for port detection method\n\
854 probe=<0|1|2> for camera detection method\n\
855 force_rgb=<0|1> for RGB data format (default BGR)");
856 module_param_array(parport, int, NULL, 0);
857 module_param(probe, int, 0);
858 module_param(force_rgb, bool, 0);
859 module_param(video_nr, int, 0);
861 module_init(cqcam_init);
862 module_exit(cqcam_cleanup);