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 <media/v4l2-ioctl.h>
39 #include <linux/mutex.h>
40 #include <linux/jiffies.h>
42 #include <asm/uaccess.h>
45 struct video_device vdev;
46 struct pardevice *pdev;
47 struct parport *pport;
49 int ccd_width, ccd_height;
51 int contrast, brightness, whitebal;
53 unsigned int bidirectional;
61 /* The three possible QuickCam modes */
62 #define QC_MILLIONS 0x18
63 #define QC_BILLIONS 0x10
64 #define QC_THOUSANDS 0x08 /* with VIDEC compression (not supported) */
66 /* The three possible decimations */
67 #define QC_DECIMATION_1 0
68 #define QC_DECIMATION_2 2
69 #define QC_DECIMATION_4 4
71 #define BANNER "Colour QuickCam for Video4Linux v0.05"
73 static int parport[MAX_CAMS] = { [1 ... MAX_CAMS-1] = -1 };
76 static int video_nr = -1;
78 static inline void qcam_set_ack(struct qcam_device *qcam, unsigned int i)
80 /* note: the QC specs refer to the PCAck pin by voltage, not
81 software level. PC ports have builtin inverters. */
82 parport_frob_control(qcam->pport, 8, i?8:0);
85 static inline unsigned int qcam_ready1(struct qcam_device *qcam)
87 return (parport_read_status(qcam->pport) & 0x8)?1:0;
90 static inline unsigned int qcam_ready2(struct qcam_device *qcam)
92 return (parport_read_data(qcam->pport) & 0x1)?1:0;
95 static unsigned int qcam_await_ready1(struct qcam_device *qcam,
98 unsigned long oldjiffies = jiffies;
101 for (oldjiffies = jiffies;
102 time_before(jiffies, oldjiffies + msecs_to_jiffies(40)); )
103 if (qcam_ready1(qcam) == value)
106 /* If the camera didn't respond within 1/25 second, poll slowly
108 for (i = 0; i < 50; i++)
110 if (qcam_ready1(qcam) == value)
112 msleep_interruptible(100);
115 /* Probably somebody pulled the plug out. Not much we can do. */
116 printk(KERN_ERR "c-qcam: ready1 timeout (%d) %x %x\n", value,
117 parport_read_status(qcam->pport),
118 parport_read_control(qcam->pport));
122 static unsigned int qcam_await_ready2(struct qcam_device *qcam, int value)
124 unsigned long oldjiffies = jiffies;
127 for (oldjiffies = jiffies;
128 time_before(jiffies, oldjiffies + msecs_to_jiffies(40)); )
129 if (qcam_ready2(qcam) == value)
132 /* If the camera didn't respond within 1/25 second, poll slowly
134 for (i = 0; i < 50; i++)
136 if (qcam_ready2(qcam) == value)
138 msleep_interruptible(100);
141 /* Probably somebody pulled the plug out. Not much we can do. */
142 printk(KERN_ERR "c-qcam: ready2 timeout (%d) %x %x %x\n", value,
143 parport_read_status(qcam->pport),
144 parport_read_control(qcam->pport),
145 parport_read_data(qcam->pport));
149 static int qcam_read_data(struct qcam_device *qcam)
152 qcam_set_ack(qcam, 0);
153 if (qcam_await_ready1(qcam, 1)) return -1;
154 idata = parport_read_status(qcam->pport) & 0xf0;
155 qcam_set_ack(qcam, 1);
156 if (qcam_await_ready1(qcam, 0)) return -1;
157 idata |= (parport_read_status(qcam->pport) >> 4);
161 static int qcam_write_data(struct qcam_device *qcam, unsigned int data)
164 parport_write_data(qcam->pport, data);
165 idata = qcam_read_data(qcam);
168 printk(KERN_WARNING "cqcam: sent %x but received %x\n", data,
175 static inline int qcam_set(struct qcam_device *qcam, unsigned int cmd, unsigned int data)
177 if (qcam_write_data(qcam, cmd))
179 if (qcam_write_data(qcam, data))
184 static inline int qcam_get(struct qcam_device *qcam, unsigned int cmd)
186 if (qcam_write_data(qcam, cmd))
188 return qcam_read_data(qcam);
191 static int qc_detect(struct qcam_device *qcam)
193 unsigned int stat, ostat, i, count = 0;
195 /* The probe routine below is not very reliable. The IEEE-1284
196 probe takes precedence. */
197 /* XXX Currently parport provides no way to distinguish between
198 "the IEEE probe was not done" and "the probe was done, but
199 no device was found". Fix this one day. */
200 if (qcam->pport->probe_info[0].class == PARPORT_CLASS_MEDIA
201 && qcam->pport->probe_info[0].model
202 && !strcmp(qcam->pdev->port->probe_info[0].model,
203 "Color QuickCam 2.0")) {
204 printk(KERN_DEBUG "QuickCam: Found by IEEE1284 probe.\n");
211 parport_write_control(qcam->pport, 0xc);
213 /* look for a heartbeat */
214 ostat = stat = parport_read_status(qcam->pport);
215 for (i=0; i<250; i++)
218 stat = parport_read_status(qcam->pport);
221 if (++count >= 3) return 1;
226 /* Reset the camera and try again */
227 parport_write_control(qcam->pport, 0xc);
228 parport_write_control(qcam->pport, 0x8);
230 parport_write_control(qcam->pport, 0xc);
234 ostat = stat = parport_read_status(qcam->pport);
235 for (i=0; i<250; i++)
238 stat = parport_read_status(qcam->pport);
241 if (++count >= 3) return 1;
246 /* no (or flatline) camera, give up */
250 static void qc_reset(struct qcam_device *qcam)
252 parport_write_control(qcam->pport, 0xc);
253 parport_write_control(qcam->pport, 0x8);
255 parport_write_control(qcam->pport, 0xc);
259 /* Reset the QuickCam and program for brightness, contrast,
260 * white-balance, and resolution. */
262 static void qc_setup(struct qcam_device *q)
266 /* Set the brightness. */
267 qcam_set(q, 11, q->brightness);
269 /* Set the height and width. These refer to the actual
270 CCD area *before* applying the selected decimation. */
271 qcam_set(q, 17, q->ccd_height);
272 qcam_set(q, 19, q->ccd_width / 2);
274 /* Set top and left. */
275 qcam_set(q, 0xd, q->top);
276 qcam_set(q, 0xf, q->left);
278 /* Set contrast and white balance. */
279 qcam_set(q, 0x19, q->contrast);
280 qcam_set(q, 0x1f, q->whitebal);
286 /* Read some bytes from the camera and put them in the buffer.
287 nbytes should be a multiple of 3, because bidirectional mode gives
288 us three bytes at a time. */
290 static unsigned int qcam_read_bytes(struct qcam_device *q, unsigned char *buf, unsigned int nbytes)
292 unsigned int bytes = 0;
295 if (q->bidirectional)
297 /* It's a bidirectional port */
298 while (bytes < nbytes)
300 unsigned int lo1, hi1, lo2, hi2;
301 unsigned char r, g, b;
303 if (qcam_await_ready2(q, 1)) return bytes;
304 lo1 = parport_read_data(q->pport) >> 1;
305 hi1 = ((parport_read_status(q->pport) >> 3) & 0x1f) ^ 0x10;
307 if (qcam_await_ready2(q, 0)) return bytes;
308 lo2 = parport_read_data(q->pport) >> 1;
309 hi2 = ((parport_read_status(q->pport) >> 3) & 0x1f) ^ 0x10;
311 r = (lo1 | ((hi1 & 1)<<7));
312 g = ((hi1 & 0x1e)<<3) | ((hi2 & 0x1e)>>1);
313 b = (lo2 | ((hi2 & 1)<<7));
327 /* It's a unidirectional port */
328 int i = 0, n = bytes;
329 unsigned char rgb[3];
331 while (bytes < nbytes)
335 if (qcam_await_ready1(q, 1)) return bytes;
336 hi = (parport_read_status(q->pport) & 0xf0);
338 if (qcam_await_ready1(q, 0)) return bytes;
339 lo = (parport_read_status(q->pport) & 0xf0);
342 rgb[(i = bytes++ % 3)] = (hi | (lo >> 4)) ^ 0x88;
366 static long qc_capture(struct qcam_device *q, char __user *buf, unsigned long len)
368 unsigned lines, pixelsperline, bitsperxfer;
369 unsigned int is_bi_dir = q->bidirectional;
370 size_t wantlen, outptr = 0;
373 if (!access_ok(VERIFY_WRITE, buf, len))
376 /* Wait for camera to become ready */
379 int i = qcam_get(q, 41);
390 if (qcam_set(q, 7, (q->mode | (is_bi_dir?1:0)) + 1))
394 pixelsperline = q->width;
395 bitsperxfer = (is_bi_dir) ? 24 : 8;
399 /* Turn the port around */
400 parport_data_reverse(q->pport);
403 if (qcam_await_ready1(q, 1)) {
408 if (qcam_await_ready1(q, 0)) {
414 wantlen = lines * pixelsperline * 24 / 8;
419 s = (wantlen > BUFSZ)?BUFSZ:wantlen;
420 t = qcam_read_bytes(q, tmpbuf, s);
423 size_t sz = len - outptr;
425 if (__copy_to_user(buf+outptr, tmpbuf, sz))
439 printk("qcam: short read.\n");
441 parport_data_forward(q->pport);
450 l = qcam_read_bytes(q, tmpbuf, 3);
452 } while (l && (tmpbuf[0] == 0x7e || tmpbuf[1] == 0x7e || tmpbuf[2] == 0x7e));
454 if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
455 printk("qcam: bad EOF\n");
457 if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
458 printk("qcam: bad EOF\n");
461 if (qcam_await_ready1(q, 1))
463 printk("qcam: no ack after EOF\n");
464 parport_data_forward(q->pport);
468 parport_data_forward(q->pport);
471 if (qcam_await_ready1(q, 0))
473 printk("qcam: no ack to port turnaround\n");
482 l = qcam_read_bytes(q, tmpbuf, 1);
484 } while (l && tmpbuf[0] == 0x7e);
485 l = qcam_read_bytes(q, tmpbuf+1, 2);
487 if (tmpbuf[0] != 0xe || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xf)
488 printk("qcam: bad EOF\n");
490 if (tmpbuf[0] != 0xf || tmpbuf[1] != 0x0 || tmpbuf[2] != 0xe)
491 printk("qcam: bad EOF\n");
495 qcam_write_data(q, 0);
500 * Video4linux interfacing
503 static int qcam_do_ioctl(struct inode *inode, struct file *file,
504 unsigned int cmd, void *arg)
506 struct video_device *dev = video_devdata(file);
507 struct qcam_device *qcam=(struct qcam_device *)dev;
513 struct video_capability *b = arg;
514 strcpy(b->name, "Quickcam");
515 b->type = VID_TYPE_CAPTURE|VID_TYPE_SCALES;
526 struct video_channel *v = arg;
531 /* Good question.. its composite or SVHS so.. */
532 v->type = VIDEO_TYPE_CAMERA;
533 strcpy(v->name, "Camera");
538 struct video_channel *v = arg;
545 struct video_tuner *v = arg;
548 memset(v,0,sizeof(*v));
549 strcpy(v->name, "Format");
550 v->mode = VIDEO_MODE_AUTO;
555 struct video_tuner *v = arg;
558 if(v->mode!=VIDEO_MODE_AUTO)
564 struct video_picture *p = arg;
567 p->brightness=qcam->brightness<<8;
568 p->contrast=qcam->contrast<<8;
569 p->whiteness=qcam->whitebal<<8;
571 p->palette=VIDEO_PALETTE_RGB24;
576 struct video_picture *p = arg;
581 if (p->depth != 24 || p->palette != VIDEO_PALETTE_RGB24)
585 * Now load the camera.
587 qcam->brightness = p->brightness>>8;
588 qcam->contrast = p->contrast>>8;
589 qcam->whitebal = p->whiteness>>8;
591 mutex_lock(&qcam->lock);
592 parport_claim_or_block(qcam->pdev);
594 parport_release(qcam->pdev);
595 mutex_unlock(&qcam->lock);
600 struct video_window *vw = arg;
606 if(vw->height<60||vw->height>240)
608 if(vw->width<80||vw->width>320)
613 qcam->mode = QC_DECIMATION_4;
615 if(vw->width>=160 && vw->height>=120)
619 qcam->mode = QC_DECIMATION_2;
621 if(vw->width>=320 && vw->height>=240)
625 qcam->mode = QC_DECIMATION_1;
627 qcam->mode |= QC_MILLIONS;
629 if(vw->width>=640 && vw->height>=480)
633 qcam->mode = QC_BILLIONS | QC_DECIMATION_1;
636 /* Ok we figured out what to use from our
638 mutex_lock(&qcam->lock);
639 parport_claim_or_block(qcam->pdev);
641 parport_release(qcam->pdev);
642 mutex_unlock(&qcam->lock);
647 struct video_window *vw = arg;
648 memset(vw, 0, sizeof(*vw));
649 vw->width=qcam->width;
650 vw->height=qcam->height;
669 static int qcam_ioctl(struct inode *inode, struct file *file,
670 unsigned int cmd, unsigned long arg)
672 return video_usercopy(inode, file, cmd, arg, qcam_do_ioctl);
675 static ssize_t qcam_read(struct file *file, char __user *buf,
676 size_t count, loff_t *ppos)
678 struct video_device *v = video_devdata(file);
679 struct qcam_device *qcam=(struct qcam_device *)v;
682 mutex_lock(&qcam->lock);
683 parport_claim_or_block(qcam->pdev);
684 /* Probably should have a semaphore against multiple users */
685 len = qc_capture(qcam, buf,count);
686 parport_release(qcam->pdev);
687 mutex_unlock(&qcam->lock);
691 static int qcam_exclusive_open(struct inode *inode, struct file *file)
693 struct video_device *dev = video_devdata(file);
694 struct qcam_device *qcam = (struct qcam_device *)dev;
696 return test_and_set_bit(0, &qcam->in_use) ? -EBUSY : 0;
699 static int qcam_exclusive_release(struct inode *inode, struct file *file)
701 struct video_device *dev = video_devdata(file);
702 struct qcam_device *qcam = (struct qcam_device *)dev;
704 clear_bit(0, &qcam->in_use);
708 /* video device template */
709 static const struct file_operations qcam_fops = {
710 .owner = THIS_MODULE,
711 .open = qcam_exclusive_open,
712 .release = qcam_exclusive_release,
715 .compat_ioctl = v4l_compat_ioctl32,
721 static struct video_device qcam_template=
723 .name = "Colour QuickCam",
725 .release = video_device_release_empty,
728 /* Initialize the QuickCam driver control structure. */
730 static struct qcam_device *qcam_init(struct parport *port)
732 struct qcam_device *q;
734 q = kmalloc(sizeof(struct qcam_device), GFP_KERNEL);
739 q->pdev = parport_register_device(port, "c-qcam", NULL, NULL,
742 q->bidirectional = (q->pport->modes & PARPORT_MODE_TRISTATE)?1:0;
746 printk(KERN_ERR "c-qcam: couldn't register for %s.\n",
752 memcpy(&q->vdev, &qcam_template, sizeof(qcam_template));
754 mutex_init(&q->lock);
755 q->width = q->ccd_width = 320;
756 q->height = q->ccd_height = 240;
757 q->mode = QC_MILLIONS | QC_DECIMATION_1;
766 static struct qcam_device *qcams[MAX_CAMS];
767 static unsigned int num_cams;
769 static int init_cqcam(struct parport *port)
771 struct qcam_device *qcam;
773 if (parport[0] != -1)
775 /* The user gave specific instructions */
777 for (i = 0; i < MAX_CAMS && parport[i] != -1; i++)
779 if (parport[0] == port->number)
786 if (num_cams == MAX_CAMS)
789 qcam = qcam_init(port);
793 parport_claim_or_block(qcam->pdev);
797 if (probe && qc_detect(qcam)==0)
799 parport_release(qcam->pdev);
800 parport_unregister_device(qcam->pdev);
807 parport_release(qcam->pdev);
809 if (video_register_device(&qcam->vdev, VFL_TYPE_GRABBER, video_nr) < 0) {
810 printk(KERN_ERR "Unable to register Colour QuickCam on %s\n",
812 parport_unregister_device(qcam->pdev);
817 printk(KERN_INFO "video%d: Colour QuickCam found on %s\n",
818 qcam->vdev.minor, qcam->pport->name);
820 qcams[num_cams++] = qcam;
825 static void close_cqcam(struct qcam_device *qcam)
827 video_unregister_device(&qcam->vdev);
828 parport_unregister_device(qcam->pdev);
832 static void cq_attach(struct parport *port)
837 static void cq_detach(struct parport *port)
839 /* Write this some day. */
842 static struct parport_driver cqcam_driver = {
848 static int __init cqcam_init (void)
852 return parport_register_driver(&cqcam_driver);
855 static void __exit cqcam_cleanup (void)
859 for (i = 0; i < num_cams; i++)
860 close_cqcam(qcams[i]);
862 parport_unregister_driver(&cqcam_driver);
865 MODULE_AUTHOR("Philip Blundell <philb@gnu.org>");
866 MODULE_DESCRIPTION(BANNER);
867 MODULE_LICENSE("GPL");
869 /* FIXME: parport=auto would never have worked, surely? --RR */
870 MODULE_PARM_DESC(parport ,"parport=<auto|n[,n]...> for port detection method\n\
871 probe=<0|1|2> for camera detection method\n\
872 force_rgb=<0|1> for RGB data format (default BGR)");
873 module_param_array(parport, int, NULL, 0);
874 module_param(probe, int, 0);
875 module_param(force_rgb, bool, 0);
876 module_param(video_nr, int, 0);
878 module_init(cqcam_init);
879 module_exit(cqcam_cleanup);