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 <linux/mutex.h>
39 #include <asm/uaccess.h>
42 struct video_device vdev
;
43 struct pardevice
*pdev
;
44 struct parport
*pport
;
46 int ccd_width
, ccd_height
;
48 int contrast
, brightness
, whitebal
;
50 unsigned int bidirectional
;
57 /* The three possible QuickCam modes */
58 #define QC_MILLIONS 0x18
59 #define QC_BILLIONS 0x10
60 #define QC_THOUSANDS 0x08 /* with VIDEC compression (not supported) */
62 /* The three possible decimations */
63 #define QC_DECIMATION_1 0
64 #define QC_DECIMATION_2 2
65 #define QC_DECIMATION_4 4
67 #define BANNER "Colour QuickCam for Video4Linux v0.05"
69 static int parport
[MAX_CAMS
] = { [1 ... MAX_CAMS
-1] = -1 };
71 static int force_rgb
= 0;
72 static int video_nr
= -1;
74 static inline void qcam_set_ack(struct qcam_device
*qcam
, unsigned int i
)
76 /* note: the QC specs refer to the PCAck pin by voltage, not
77 software level. PC ports have builtin inverters. */
78 parport_frob_control(qcam
->pport
, 8, i
?8:0);
81 static inline unsigned int qcam_ready1(struct qcam_device
*qcam
)
83 return (parport_read_status(qcam
->pport
) & 0x8)?1:0;
86 static inline unsigned int qcam_ready2(struct qcam_device
*qcam
)
88 return (parport_read_data(qcam
->pport
) & 0x1)?1:0;
91 static unsigned int qcam_await_ready1(struct qcam_device
*qcam
,
94 unsigned long oldjiffies
= jiffies
;
97 for (oldjiffies
= jiffies
; (jiffies
- oldjiffies
) < (HZ
/25); )
98 if (qcam_ready1(qcam
) == value
)
101 /* If the camera didn't respond within 1/25 second, poll slowly
103 for (i
= 0; i
< 50; i
++)
105 if (qcam_ready1(qcam
) == value
)
107 msleep_interruptible(100);
110 /* Probably somebody pulled the plug out. Not much we can do. */
111 printk(KERN_ERR
"c-qcam: ready1 timeout (%d) %x %x\n", value
,
112 parport_read_status(qcam
->pport
),
113 parport_read_control(qcam
->pport
));
117 static unsigned int qcam_await_ready2(struct qcam_device
*qcam
, int value
)
119 unsigned long oldjiffies
= jiffies
;
122 for (oldjiffies
= jiffies
; (jiffies
- oldjiffies
) < (HZ
/25); )
123 if (qcam_ready2(qcam
) == value
)
126 /* If the camera didn't respond within 1/25 second, poll slowly
128 for (i
= 0; i
< 50; i
++)
130 if (qcam_ready2(qcam
) == value
)
132 msleep_interruptible(100);
135 /* Probably somebody pulled the plug out. Not much we can do. */
136 printk(KERN_ERR
"c-qcam: ready2 timeout (%d) %x %x %x\n", value
,
137 parport_read_status(qcam
->pport
),
138 parport_read_control(qcam
->pport
),
139 parport_read_data(qcam
->pport
));
143 static int qcam_read_data(struct qcam_device
*qcam
)
146 qcam_set_ack(qcam
, 0);
147 if (qcam_await_ready1(qcam
, 1)) return -1;
148 idata
= parport_read_status(qcam
->pport
) & 0xf0;
149 qcam_set_ack(qcam
, 1);
150 if (qcam_await_ready1(qcam
, 0)) return -1;
151 idata
|= (parport_read_status(qcam
->pport
) >> 4);
155 static int qcam_write_data(struct qcam_device
*qcam
, unsigned int data
)
158 parport_write_data(qcam
->pport
, data
);
159 idata
= qcam_read_data(qcam
);
162 printk(KERN_WARNING
"cqcam: sent %x but received %x\n", data
,
169 static inline int qcam_set(struct qcam_device
*qcam
, unsigned int cmd
, unsigned int data
)
171 if (qcam_write_data(qcam
, cmd
))
173 if (qcam_write_data(qcam
, data
))
178 static inline int qcam_get(struct qcam_device
*qcam
, unsigned int cmd
)
180 if (qcam_write_data(qcam
, cmd
))
182 return qcam_read_data(qcam
);
185 static int qc_detect(struct qcam_device
*qcam
)
187 unsigned int stat
, ostat
, i
, count
= 0;
189 /* The probe routine below is not very reliable. The IEEE-1284
190 probe takes precedence. */
191 /* XXX Currently parport provides no way to distinguish between
192 "the IEEE probe was not done" and "the probe was done, but
193 no device was found". Fix this one day. */
194 if (qcam
->pport
->probe_info
[0].class == PARPORT_CLASS_MEDIA
195 && qcam
->pport
->probe_info
[0].model
196 && !strcmp(qcam
->pdev
->port
->probe_info
[0].model
,
197 "Color QuickCam 2.0")) {
198 printk(KERN_DEBUG
"QuickCam: Found by IEEE1284 probe.\n");
205 parport_write_control(qcam
->pport
, 0xc);
207 /* look for a heartbeat */
208 ostat
= stat
= parport_read_status(qcam
->pport
);
209 for (i
=0; i
<250; i
++)
212 stat
= parport_read_status(qcam
->pport
);
215 if (++count
>= 3) return 1;
220 /* Reset the camera and try again */
221 parport_write_control(qcam
->pport
, 0xc);
222 parport_write_control(qcam
->pport
, 0x8);
224 parport_write_control(qcam
->pport
, 0xc);
228 ostat
= stat
= parport_read_status(qcam
->pport
);
229 for (i
=0; i
<250; i
++)
232 stat
= parport_read_status(qcam
->pport
);
235 if (++count
>= 3) return 1;
240 /* no (or flatline) camera, give up */
244 static void qc_reset(struct qcam_device
*qcam
)
246 parport_write_control(qcam
->pport
, 0xc);
247 parport_write_control(qcam
->pport
, 0x8);
249 parport_write_control(qcam
->pport
, 0xc);
253 /* Reset the QuickCam and program for brightness, contrast,
254 * white-balance, and resolution. */
256 static void qc_setup(struct qcam_device
*q
)
260 /* Set the brightness. */
261 qcam_set(q
, 11, q
->brightness
);
263 /* Set the height and width. These refer to the actual
264 CCD area *before* applying the selected decimation. */
265 qcam_set(q
, 17, q
->ccd_height
);
266 qcam_set(q
, 19, q
->ccd_width
/ 2);
268 /* Set top and left. */
269 qcam_set(q
, 0xd, q
->top
);
270 qcam_set(q
, 0xf, q
->left
);
272 /* Set contrast and white balance. */
273 qcam_set(q
, 0x19, q
->contrast
);
274 qcam_set(q
, 0x1f, q
->whitebal
);
280 /* Read some bytes from the camera and put them in the buffer.
281 nbytes should be a multiple of 3, because bidirectional mode gives
282 us three bytes at a time. */
284 static unsigned int qcam_read_bytes(struct qcam_device
*q
, unsigned char *buf
, unsigned int nbytes
)
286 unsigned int bytes
= 0;
289 if (q
->bidirectional
)
291 /* It's a bidirectional port */
292 while (bytes
< nbytes
)
294 unsigned int lo1
, hi1
, lo2
, hi2
;
295 unsigned char r
, g
, b
;
297 if (qcam_await_ready2(q
, 1)) return bytes
;
298 lo1
= parport_read_data(q
->pport
) >> 1;
299 hi1
= ((parport_read_status(q
->pport
) >> 3) & 0x1f) ^ 0x10;
301 if (qcam_await_ready2(q
, 0)) return bytes
;
302 lo2
= parport_read_data(q
->pport
) >> 1;
303 hi2
= ((parport_read_status(q
->pport
) >> 3) & 0x1f) ^ 0x10;
305 r
= (lo1
| ((hi1
& 1)<<7));
306 g
= ((hi1
& 0x1e)<<3) | ((hi2
& 0x1e)>>1);
307 b
= (lo2
| ((hi2
& 1)<<7));
321 /* It's a unidirectional port */
322 int i
= 0, n
= bytes
;
323 unsigned char rgb
[3];
325 while (bytes
< nbytes
)
329 if (qcam_await_ready1(q
, 1)) return bytes
;
330 hi
= (parport_read_status(q
->pport
) & 0xf0);
332 if (qcam_await_ready1(q
, 0)) return bytes
;
333 lo
= (parport_read_status(q
->pport
) & 0xf0);
336 rgb
[(i
= bytes
++ % 3)] = (hi
| (lo
>> 4)) ^ 0x88;
360 static long qc_capture(struct qcam_device
*q
, char __user
*buf
, unsigned long len
)
362 unsigned lines
, pixelsperline
, bitsperxfer
;
363 unsigned int is_bi_dir
= q
->bidirectional
;
364 size_t wantlen
, outptr
= 0;
367 if (!access_ok(VERIFY_WRITE
, buf
, len
))
370 /* Wait for camera to become ready */
373 int i
= qcam_get(q
, 41);
384 if (qcam_set(q
, 7, (q
->mode
| (is_bi_dir
?1:0)) + 1))
388 pixelsperline
= q
->width
;
389 bitsperxfer
= (is_bi_dir
) ? 24 : 8;
393 /* Turn the port around */
394 parport_data_reverse(q
->pport
);
397 if (qcam_await_ready1(q
, 1)) {
402 if (qcam_await_ready1(q
, 0)) {
408 wantlen
= lines
* pixelsperline
* 24 / 8;
413 s
= (wantlen
> BUFSZ
)?BUFSZ
:wantlen
;
414 t
= qcam_read_bytes(q
, tmpbuf
, s
);
417 size_t sz
= len
- outptr
;
419 if (__copy_to_user(buf
+outptr
, tmpbuf
, sz
))
433 printk("qcam: short read.\n");
435 parport_data_forward(q
->pport
);
444 l
= qcam_read_bytes(q
, tmpbuf
, 3);
446 } while (l
&& (tmpbuf
[0] == 0x7e || tmpbuf
[1] == 0x7e || tmpbuf
[2] == 0x7e));
448 if (tmpbuf
[0] != 0xe || tmpbuf
[1] != 0x0 || tmpbuf
[2] != 0xf)
449 printk("qcam: bad EOF\n");
451 if (tmpbuf
[0] != 0xf || tmpbuf
[1] != 0x0 || tmpbuf
[2] != 0xe)
452 printk("qcam: bad EOF\n");
455 if (qcam_await_ready1(q
, 1))
457 printk("qcam: no ack after EOF\n");
458 parport_data_forward(q
->pport
);
462 parport_data_forward(q
->pport
);
465 if (qcam_await_ready1(q
, 0))
467 printk("qcam: no ack to port turnaround\n");
476 l
= qcam_read_bytes(q
, tmpbuf
, 1);
478 } while (l
&& tmpbuf
[0] == 0x7e);
479 l
= qcam_read_bytes(q
, tmpbuf
+1, 2);
481 if (tmpbuf
[0] != 0xe || tmpbuf
[1] != 0x0 || tmpbuf
[2] != 0xf)
482 printk("qcam: bad EOF\n");
484 if (tmpbuf
[0] != 0xf || tmpbuf
[1] != 0x0 || tmpbuf
[2] != 0xe)
485 printk("qcam: bad EOF\n");
489 qcam_write_data(q
, 0);
494 * Video4linux interfacing
497 static int qcam_do_ioctl(struct inode
*inode
, struct file
*file
,
498 unsigned int cmd
, void *arg
)
500 struct video_device
*dev
= video_devdata(file
);
501 struct qcam_device
*qcam
=(struct qcam_device
*)dev
;
507 struct video_capability
*b
= arg
;
508 strcpy(b
->name
, "Quickcam");
509 b
->type
= VID_TYPE_CAPTURE
|VID_TYPE_SCALES
;
520 struct video_channel
*v
= arg
;
525 /* Good question.. its composite or SVHS so.. */
526 v
->type
= VIDEO_TYPE_CAMERA
;
527 strcpy(v
->name
, "Camera");
532 struct video_channel
*v
= arg
;
539 struct video_tuner
*v
= arg
;
542 memset(v
,0,sizeof(*v
));
543 strcpy(v
->name
, "Format");
544 v
->mode
= VIDEO_MODE_AUTO
;
549 struct video_tuner
*v
= arg
;
552 if(v
->mode
!=VIDEO_MODE_AUTO
)
558 struct video_picture
*p
= arg
;
561 p
->brightness
=qcam
->brightness
<<8;
562 p
->contrast
=qcam
->contrast
<<8;
563 p
->whiteness
=qcam
->whitebal
<<8;
565 p
->palette
=VIDEO_PALETTE_RGB24
;
570 struct video_picture
*p
= arg
;
575 if (p
->depth
!= 24 || p
->palette
!= VIDEO_PALETTE_RGB24
)
579 * Now load the camera.
581 qcam
->brightness
= p
->brightness
>>8;
582 qcam
->contrast
= p
->contrast
>>8;
583 qcam
->whitebal
= p
->whiteness
>>8;
585 mutex_lock(&qcam
->lock
);
586 parport_claim_or_block(qcam
->pdev
);
588 parport_release(qcam
->pdev
);
589 mutex_unlock(&qcam
->lock
);
594 struct video_window
*vw
= arg
;
600 if(vw
->height
<60||vw
->height
>240)
602 if(vw
->width
<80||vw
->width
>320)
607 qcam
->mode
= QC_DECIMATION_4
;
609 if(vw
->width
>=160 && vw
->height
>=120)
613 qcam
->mode
= QC_DECIMATION_2
;
615 if(vw
->width
>=320 && vw
->height
>=240)
619 qcam
->mode
= QC_DECIMATION_1
;
621 qcam
->mode
|= QC_MILLIONS
;
623 if(vw
->width
>=640 && vw
->height
>=480)
627 qcam
->mode
= QC_BILLIONS
| QC_DECIMATION_1
;
630 /* Ok we figured out what to use from our
632 mutex_lock(&qcam
->lock
);
633 parport_claim_or_block(qcam
->pdev
);
635 parport_release(qcam
->pdev
);
636 mutex_unlock(&qcam
->lock
);
641 struct video_window
*vw
= arg
;
642 memset(vw
, 0, sizeof(*vw
));
643 vw
->width
=qcam
->width
;
644 vw
->height
=qcam
->height
;
663 static int qcam_ioctl(struct inode
*inode
, struct file
*file
,
664 unsigned int cmd
, unsigned long arg
)
666 return video_usercopy(inode
, file
, cmd
, arg
, qcam_do_ioctl
);
669 static ssize_t
qcam_read(struct file
*file
, char __user
*buf
,
670 size_t count
, loff_t
*ppos
)
672 struct video_device
*v
= video_devdata(file
);
673 struct qcam_device
*qcam
=(struct qcam_device
*)v
;
676 mutex_lock(&qcam
->lock
);
677 parport_claim_or_block(qcam
->pdev
);
678 /* Probably should have a semaphore against multiple users */
679 len
= qc_capture(qcam
, buf
,count
);
680 parport_release(qcam
->pdev
);
681 mutex_unlock(&qcam
->lock
);
685 /* video device template */
686 static struct file_operations qcam_fops
= {
687 .owner
= THIS_MODULE
,
688 .open
= video_exclusive_open
,
689 .release
= video_exclusive_release
,
691 .compat_ioctl
= v4l_compat_ioctl32
,
696 static struct video_device qcam_template
=
698 .owner
= THIS_MODULE
,
699 .name
= "Colour QuickCam",
700 .type
= VID_TYPE_CAPTURE
,
701 .hardware
= VID_HARDWARE_QCAM_C
,
705 /* Initialize the QuickCam driver control structure. */
707 static struct qcam_device
*qcam_init(struct parport
*port
)
709 struct qcam_device
*q
;
711 q
= kmalloc(sizeof(struct qcam_device
), GFP_KERNEL
);
716 q
->pdev
= parport_register_device(port
, "c-qcam", NULL
, NULL
,
719 q
->bidirectional
= (q
->pport
->modes
& PARPORT_MODE_TRISTATE
)?1:0;
723 printk(KERN_ERR
"c-qcam: couldn't register for %s.\n",
729 memcpy(&q
->vdev
, &qcam_template
, sizeof(qcam_template
));
731 mutex_init(&q
->lock
);
732 q
->width
= q
->ccd_width
= 320;
733 q
->height
= q
->ccd_height
= 240;
734 q
->mode
= QC_MILLIONS
| QC_DECIMATION_1
;
743 static struct qcam_device
*qcams
[MAX_CAMS
];
744 static unsigned int num_cams
= 0;
746 static int init_cqcam(struct parport
*port
)
748 struct qcam_device
*qcam
;
750 if (parport
[0] != -1)
752 /* The user gave specific instructions */
754 for (i
= 0; i
< MAX_CAMS
&& parport
[i
] != -1; i
++)
756 if (parport
[0] == port
->number
)
763 if (num_cams
== MAX_CAMS
)
766 qcam
= qcam_init(port
);
770 parport_claim_or_block(qcam
->pdev
);
774 if (probe
&& qc_detect(qcam
)==0)
776 parport_release(qcam
->pdev
);
777 parport_unregister_device(qcam
->pdev
);
784 parport_release(qcam
->pdev
);
786 if (video_register_device(&qcam
->vdev
, VFL_TYPE_GRABBER
, video_nr
)==-1)
788 printk(KERN_ERR
"Unable to register Colour QuickCam on %s\n",
790 parport_unregister_device(qcam
->pdev
);
795 printk(KERN_INFO
"video%d: Colour QuickCam found on %s\n",
796 qcam
->vdev
.minor
, qcam
->pport
->name
);
798 qcams
[num_cams
++] = qcam
;
803 static void close_cqcam(struct qcam_device
*qcam
)
805 video_unregister_device(&qcam
->vdev
);
806 parport_unregister_device(qcam
->pdev
);
810 static void cq_attach(struct parport
*port
)
815 static void cq_detach(struct parport
*port
)
817 /* Write this some day. */
820 static struct parport_driver cqcam_driver
= {
826 static int __init
cqcam_init (void)
830 return parport_register_driver(&cqcam_driver
);
833 static void __exit
cqcam_cleanup (void)
837 for (i
= 0; i
< num_cams
; i
++)
838 close_cqcam(qcams
[i
]);
840 parport_unregister_driver(&cqcam_driver
);
843 MODULE_AUTHOR("Philip Blundell <philb@gnu.org>");
844 MODULE_DESCRIPTION(BANNER
);
845 MODULE_LICENSE("GPL");
847 /* FIXME: parport=auto would never have worked, surely? --RR */
848 MODULE_PARM_DESC(parport
,"parport=<auto|n[,n]...> for port detection method\n\
849 probe=<0|1|2> for camera detection method\n\
850 force_rgb=<0|1> for RGB data format (default BGR)");
851 module_param_array(parport
, int, NULL
, 0);
852 module_param(probe
, int, 0);
853 module_param(force_rgb
, bool, 0);
854 module_param(video_nr
, int, 0);
856 module_init(cqcam_init
);
857 module_exit(cqcam_cleanup
);