2 * QuickCam Driver For Video4Linux.
4 * Video4Linux conversion work by Alan Cox.
5 * Parport compatibility by Phil Blundell.
6 * Busy loop avoidance by Mark Cooke.
12 * When polling the QuickCam for a response, busy-wait for a
13 * maximum of this many loops. The default of 250 gives little
14 * impact on interactive response.
16 * NOTE: If this parameter is set too high, the processor
17 * will busy wait until this loop times out, and then
18 * slowly poll for a further 5 seconds before failing
19 * the transaction. You have been warned.
21 * yieldlines=<1 - 250>
23 * When acquiring a frame from the camera, the data gathering
24 * loop will yield back to the scheduler after completing
25 * this many lines. The default of 4 provides a trade-off
26 * between increased frame acquisition time and impact on
27 * interactive response.
30 /* qcam-lib.c -- Library for programming with the Connectix QuickCam.
31 * See the included documentation for usage instructions and details
32 * of the protocol involved. */
35 /* Version 0.5, August 4, 1996 */
36 /* Version 0.7, August 27, 1996 */
37 /* Version 0.9, November 17, 1996 */
40 /******************************************************************
42 Copyright (C) 1996 by Scott Laird
44 Permission is hereby granted, free of charge, to any person obtaining
45 a copy of this software and associated documentation files (the
46 "Software"), to deal in the Software without restriction, including
47 without limitation the rights to use, copy, modify, merge, publish,
48 distribute, sublicense, and/or sell copies of the Software, and to
49 permit persons to whom the Software is furnished to do so, subject to
50 the following conditions:
52 The above copyright notice and this permission notice shall be
53 included in all copies or substantial portions of the Software.
55 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
56 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
57 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
58 IN NO EVENT SHALL SCOTT LAIRD BE LIABLE FOR ANY CLAIM, DAMAGES OR
59 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
60 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
61 OTHER DEALINGS IN THE SOFTWARE.
63 ******************************************************************/
65 #include <linux/module.h>
66 #include <linux/delay.h>
67 #include <linux/errno.h>
69 #include <linux/init.h>
70 #include <linux/kernel.h>
71 #include <linux/slab.h>
73 #include <linux/parport.h>
74 #include <linux/sched.h>
75 #include <linux/videodev.h>
76 #include <media/v4l2-common.h>
77 #include <linux/mutex.h>
78 #include <asm/uaccess.h>
82 static unsigned int maxpoll
=250; /* Maximum busy-loop count for qcam I/O */
83 static unsigned int yieldlines
=4; /* Yield after this many during capture */
84 static int video_nr
= -1;
86 module_param(maxpoll
, int, 0);
87 module_param(yieldlines
, int, 0);
88 module_param(video_nr
, int, 0);
90 static inline int read_lpstatus(struct qcam_device
*q
)
92 return parport_read_status(q
->pport
);
95 static inline int read_lpdata(struct qcam_device
*q
)
97 return parport_read_data(q
->pport
);
100 static inline void write_lpdata(struct qcam_device
*q
, int d
)
102 parport_write_data(q
->pport
, d
);
105 static inline void write_lpcontrol(struct qcam_device
*q
, int d
)
107 parport_write_control(q
->pport
, d
);
110 static int qc_waithand(struct qcam_device
*q
, int val
);
111 static int qc_command(struct qcam_device
*q
, int command
);
112 static int qc_readparam(struct qcam_device
*q
);
113 static int qc_setscanmode(struct qcam_device
*q
);
114 static int qc_readbytes(struct qcam_device
*q
, char buffer
[]);
116 static struct video_device qcam_template
;
118 static int qc_calibrate(struct qcam_device
*q
)
121 * Bugfix by Hanno Mueller hmueller@kabel.de, Mai 21 96
122 * The white balance is an individiual value for each
129 qc_command(q
, 27); /* AutoAdjustOffset */
130 qc_command(q
, 0); /* Dummy Parameter, ignored by the camera */
132 /* GetOffset (33) will read 255 until autocalibration */
133 /* is finished. After that, a value of 1-254 will be */
138 value
= qc_readparam(q
);
142 } while (value
== 0xff && count
<2048);
148 /* Initialize the QuickCam driver control structure. This is where
149 * defaults are set for people who don't have a config file.*/
151 static struct qcam_device
*qcam_init(struct parport
*port
)
153 struct qcam_device
*q
;
155 q
= kmalloc(sizeof(struct qcam_device
), GFP_KERNEL
);
160 q
->pdev
= parport_register_device(port
, "bw-qcam", NULL
, NULL
,
164 printk(KERN_ERR
"bw-qcam: couldn't register for %s.\n",
170 memcpy(&q
->vdev
, &qcam_template
, sizeof(qcam_template
));
172 mutex_init(&q
->lock
);
174 q
->port_mode
= (QC_ANY
| QC_NOTSET
);
178 q
->transfer_scale
= 2;
185 q
->status
= QC_PARAM_CHANGE
;
190 /* qc_command is probably a bit of a misnomer -- it's used to send
191 * bytes *to* the camera. Generally, these bytes are either commands
192 * or arguments to commands, so the name fits, but it still bugs me a
193 * bit. See the documentation for a list of commands. */
195 static int qc_command(struct qcam_device
*q
, int command
)
200 write_lpdata(q
, command
);
201 write_lpcontrol(q
, 6);
203 n1
= qc_waithand(q
, 1);
205 write_lpcontrol(q
, 0xe);
206 n2
= qc_waithand(q
, 0);
208 cmd
= (n1
& 0xf0) | ((n2
& 0xf0) >> 4);
212 static int qc_readparam(struct qcam_device
*q
)
217 write_lpcontrol(q
, 6);
218 n1
= qc_waithand(q
, 1);
220 write_lpcontrol(q
, 0xe);
221 n2
= qc_waithand(q
, 0);
223 cmd
= (n1
& 0xf0) | ((n2
& 0xf0) >> 4);
227 /* qc_waithand busy-waits for a handshake signal from the QuickCam.
228 * Almost all communication with the camera requires handshaking. */
230 static int qc_waithand(struct qcam_device
*q
, int val
)
237 while (!((status
= read_lpstatus(q
)) & 8))
239 /* 1000 is enough spins on the I/O for all normal
240 cases, at that point we start to poll slowly
241 until the camera wakes up. However, we are
242 busy blocked until the camera responds, so
243 setting it lower is much better for interactive
248 msleep_interruptible(5);
250 if(runs
>(maxpoll
+1000)) /* 5 seconds */
256 while (((status
= read_lpstatus(q
)) & 8))
258 /* 1000 is enough spins on the I/O for all normal
259 cases, at that point we start to poll slowly
260 until the camera wakes up. However, we are
261 busy blocked until the camera responds, so
262 setting it lower is much better for interactive
267 msleep_interruptible(5);
269 if(runs
++>(maxpoll
+1000)) /* 5 seconds */
277 /* Waithand2 is used when the qcam is in bidirectional mode, and the
278 * handshaking signal is CamRdy2 (bit 0 of data reg) instead of CamRdy1
279 * (bit 3 of status register). It also returns the last value read,
280 * since this data is useful. */
282 static unsigned int qc_waithand2(struct qcam_device
*q
, int val
)
289 status
= read_lpdata(q
);
290 /* 1000 is enough spins on the I/O for all normal
291 cases, at that point we start to poll slowly
292 until the camera wakes up. However, we are
293 busy blocked until the camera responds, so
294 setting it lower is much better for interactive
299 msleep_interruptible(5);
301 if(runs
++>(maxpoll
+1000)) /* 5 seconds */
304 while ((status
& 1) != val
);
310 /* Try to detect a QuickCam. It appears to flash the upper 4 bits of
311 the status register at 5-10 Hz. This is only used in the autoprobe
312 code. Be aware that this isn't the way Connectix detects the
313 camera (they send a reset and try to handshake), but this should be
314 almost completely safe, while their method screws up my printer if
315 I plug it in before the camera. */
317 static int qc_detect(struct qcam_device
*q
)
323 lastreg
= reg
= read_lpstatus(q
) & 0xf0;
325 for (i
= 0; i
< 500; i
++)
327 reg
= read_lpstatus(q
) & 0xf0;
336 /* Force camera detection during testing. Sometimes the camera
337 won't be flashing these bits. Possibly unloading the module
338 in the middle of a grab? Or some timeout condition?
339 I've seen this parameter as low as 19 on my 450Mhz box - mpc */
340 printk("Debugging: QCam detection counter <30-200 counts as detected>: %d\n", count
);
344 /* Be (even more) liberal in what you accept... */
346 /* if (count > 30 && count < 200) */
347 if (count
> 20 && count
< 300)
348 return 1; /* found */
350 return 0; /* not found */
354 /* Reset the QuickCam. This uses the same sequence the Windows
355 * QuickPic program uses. Someone with a bi-directional port should
356 * check that bi-directional mode is detected right, and then
357 * implement bi-directional mode in qc_readbyte(). */
359 static void qc_reset(struct qcam_device
*q
)
361 switch (q
->port_mode
& QC_FORCE_MASK
)
363 case QC_FORCE_UNIDIR
:
364 q
->port_mode
= (q
->port_mode
& ~QC_MODE_MASK
) | QC_UNIDIR
;
368 q
->port_mode
= (q
->port_mode
& ~QC_MODE_MASK
) | QC_BIDIR
;
372 write_lpcontrol(q
, 0x20);
373 write_lpdata(q
, 0x75);
375 if (read_lpdata(q
) != 0x75) {
376 q
->port_mode
= (q
->port_mode
& ~QC_MODE_MASK
) | QC_BIDIR
;
378 q
->port_mode
= (q
->port_mode
& ~QC_MODE_MASK
) | QC_UNIDIR
;
383 write_lpcontrol(q
, 0xb);
385 write_lpcontrol(q
, 0xe);
386 qc_setscanmode(q
); /* in case port_mode changed */
390 /* Decide which scan mode to use. There's no real requirement that
391 * the scanmode match the resolution in q->height and q-> width -- the
392 * camera takes the picture at the resolution specified in the
393 * "scanmode" and then returns the image at the resolution specified
394 * with the resolution commands. If the scan is bigger than the
395 * requested resolution, the upper-left hand corner of the scan is
396 * returned. If the scan is smaller, then the rest of the image
397 * returned contains garbage. */
399 static int qc_setscanmode(struct qcam_device
*q
)
401 int old_mode
= q
->mode
;
403 switch (q
->transfer_scale
)
425 switch (q
->port_mode
& QC_MODE_MASK
)
435 if (q
->mode
!= old_mode
)
436 q
->status
|= QC_PARAM_CHANGE
;
442 /* Reset the QuickCam and program for brightness, contrast,
443 * white-balance, and resolution. */
445 static void qc_set(struct qcam_device
*q
)
452 /* Set the brightness. Yes, this is repetitive, but it works.
453 * Shorter versions seem to fail subtly. Feel free to try :-). */
454 /* I think the problem was in qc_command, not here -- bls */
457 qc_command(q
, q
->brightness
);
459 val
= q
->height
/ q
->transfer_scale
;
462 if ((q
->port_mode
& QC_MODE_MASK
) == QC_UNIDIR
&& q
->bpp
== 6) {
463 /* The normal "transfers per line" calculation doesn't seem to work
464 as expected here (and yet it works fine in qc_scan). No idea
465 why this case is the odd man out. Fortunately, Laird's original
466 working version gives me a good way to guess at working values.
469 val2
= q
->transfer_scale
* 4;
471 val
= q
->width
* q
->bpp
;
472 val2
= (((q
->port_mode
& QC_MODE_MASK
) == QC_BIDIR
) ? 24 : 8) *
475 val
= (val
+ val2
- 1) / val2
;
479 /* Setting top and left -- bls */
481 qc_command(q
, q
->top
);
483 qc_command(q
, q
->left
/ 2);
486 qc_command(q
, q
->contrast
);
488 qc_command(q
, q
->whitebal
);
490 /* Clear flag that we must update the grabbing parameters on the camera
491 before we grab the next frame */
492 q
->status
&= (~QC_PARAM_CHANGE
);
495 /* Qc_readbytes reads some bytes from the QC and puts them in
496 the supplied buffer. It returns the number of bytes read,
499 static inline int qc_readbytes(struct qcam_device
*q
, char buffer
[])
503 unsigned int hi2
, lo2
;
504 static int state
= 0;
512 switch (q
->port_mode
& QC_MODE_MASK
)
514 case QC_BIDIR
: /* Bi-directional Port */
515 write_lpcontrol(q
, 0x26);
516 lo
= (qc_waithand2(q
, 1) >> 1);
517 hi
= (read_lpstatus(q
) >> 3) & 0x1f;
518 write_lpcontrol(q
, 0x2e);
519 lo2
= (qc_waithand2(q
, 0) >> 1);
520 hi2
= (read_lpstatus(q
) >> 3) & 0x1f;
524 buffer
[0] = lo
& 0xf;
525 buffer
[1] = ((lo
& 0x70) >> 4) | ((hi
& 1) << 3);
526 buffer
[2] = (hi
& 0x1e) >> 1;
527 buffer
[3] = lo2
& 0xf;
528 buffer
[4] = ((lo2
& 0x70) >> 4) | ((hi2
& 1) << 3);
529 buffer
[5] = (hi2
& 0x1e) >> 1;
533 buffer
[0] = lo
& 0x3f;
534 buffer
[1] = ((lo
& 0x40) >> 6) | (hi
<< 1);
535 buffer
[2] = lo2
& 0x3f;
536 buffer
[3] = ((lo2
& 0x40) >> 6) | (hi2
<< 1);
542 case QC_UNIDIR
: /* Unidirectional Port */
543 write_lpcontrol(q
, 6);
544 lo
= (qc_waithand(q
, 1) & 0xf0) >> 4;
545 write_lpcontrol(q
, 0xe);
546 hi
= (qc_waithand(q
, 0) & 0xf0) >> 4;
559 buffer
[0] = (lo
<< 2) | ((hi
& 0xc) >> 2);
560 q
->saved_bits
= (hi
& 3) << 4;
565 buffer
[0] = lo
| q
->saved_bits
;
566 q
->saved_bits
= hi
<< 2;
571 buffer
[0] = ((lo
& 0xc) >> 2) | q
->saved_bits
;
572 buffer
[1] = ((lo
& 3) << 4) | hi
;
584 /* requests a scan from the camera. It sends the correct instructions
585 * to the camera and then reads back the correct number of bytes. In
586 * previous versions of this routine the return structure contained
587 * the raw output from the camera, and there was a 'qc_convertscan'
588 * function that converted that to a useful format. In version 0.3 I
589 * rolled qc_convertscan into qc_scan and now I only return the
590 * converted scan. The format is just an one-dimensional array of
591 * characters, one for each pixel, with 0=black up to n=white, where
592 * n=2^(bit depth)-1. Ask me for more details if you don't understand
595 static long qc_capture(struct qcam_device
* q
, char __user
*buf
, unsigned long len
)
599 int linestotrans
, transperline
;
612 qc_command(q
, q
->mode
);
614 if ((q
->port_mode
& QC_MODE_MASK
) == QC_BIDIR
)
616 write_lpcontrol(q
, 0x2e); /* turn port around */
617 write_lpcontrol(q
, 0x26);
618 (void) qc_waithand(q
, 1);
619 write_lpcontrol(q
, 0x2e);
620 (void) qc_waithand(q
, 0);
623 /* strange -- should be 15:63 below, but 4bpp is odd */
624 invert
= (q
->bpp
== 4) ? 16 : 63;
626 linestotrans
= q
->height
/ q
->transfer_scale
;
627 pixels_per_line
= q
->width
/ q
->transfer_scale
;
628 transperline
= q
->width
* q
->bpp
;
629 divisor
= (((q
->port_mode
& QC_MODE_MASK
) == QC_BIDIR
) ? 24 : 8) *
631 transperline
= (transperline
+ divisor
- 1) / divisor
;
633 for (i
= 0, yield
= yieldlines
; i
< linestotrans
; i
++)
635 for (pixels_read
= j
= 0; j
< transperline
; j
++)
637 bytes
= qc_readbytes(q
, buffer
);
638 for (k
= 0; k
< bytes
&& (pixels_read
+ k
) < pixels_per_line
; k
++)
641 if (buffer
[k
] == 0 && invert
== 16)
643 /* 4bpp is odd (again) -- inverter is 16, not 15, but output
644 must be 0-15 -- bls */
647 o
=i
*pixels_per_line
+ pixels_read
+ k
;
651 put_user((invert
- buffer
[k
])<<shift
, buf
+o
);
654 pixels_read
+= bytes
;
656 (void) qc_readbytes(q
, NULL
); /* reset state machine */
658 /* Grabbing an entire frame from the quickcam is a lengthy
659 process. We don't (usually) want to busy-block the
660 processor for the entire frame. yieldlines is a module
661 parameter. If we yield every line, the minimum frame
662 time will be 240 / 200 = 1.2 seconds. The compile-time
663 default is to yield every 4 lines. */
665 msleep_interruptible(5);
666 yield
= i
+ yieldlines
;
670 if ((q
->port_mode
& QC_MODE_MASK
) == QC_BIDIR
)
672 write_lpcontrol(q
, 2);
673 write_lpcontrol(q
, 6);
675 write_lpcontrol(q
, 0xe);
683 * Video4linux interfacing
686 static int qcam_do_ioctl(struct inode
*inode
, struct file
*file
,
687 unsigned int cmd
, void *arg
)
689 struct video_device
*dev
= video_devdata(file
);
690 struct qcam_device
*qcam
=(struct qcam_device
*)dev
;
696 struct video_capability
*b
= arg
;
697 strcpy(b
->name
, "Quickcam");
698 b
->type
= VID_TYPE_CAPTURE
|VID_TYPE_SCALES
|VID_TYPE_MONOCHROME
;
709 struct video_channel
*v
= arg
;
714 /* Good question.. its composite or SVHS so.. */
715 v
->type
= VIDEO_TYPE_CAMERA
;
716 strcpy(v
->name
, "Camera");
721 struct video_channel
*v
= arg
;
728 struct video_tuner
*v
= arg
;
731 strcpy(v
->name
, "Format");
735 v
->mode
= VIDEO_MODE_AUTO
;
740 struct video_tuner
*v
= arg
;
743 if(v
->mode
!=VIDEO_MODE_AUTO
)
749 struct video_picture
*p
= arg
;
752 p
->brightness
=qcam
->brightness
<<8;
753 p
->contrast
=qcam
->contrast
<<8;
754 p
->whiteness
=qcam
->whitebal
<<8;
756 p
->palette
=VIDEO_PALETTE_GREY
;
761 struct video_picture
*p
= arg
;
762 if(p
->palette
!=VIDEO_PALETTE_GREY
)
764 if(p
->depth
!=4 && p
->depth
!=6)
768 * Now load the camera.
771 qcam
->brightness
= p
->brightness
>>8;
772 qcam
->contrast
= p
->contrast
>>8;
773 qcam
->whitebal
= p
->whiteness
>>8;
774 qcam
->bpp
= p
->depth
;
776 mutex_lock(&qcam
->lock
);
777 qc_setscanmode(qcam
);
778 mutex_unlock(&qcam
->lock
);
779 qcam
->status
|= QC_PARAM_CHANGE
;
785 struct video_window
*vw
= arg
;
790 if(vw
->height
<60||vw
->height
>240)
792 if(vw
->width
<80||vw
->width
>320)
797 qcam
->transfer_scale
= 4;
799 if(vw
->width
>=160 && vw
->height
>=120)
801 qcam
->transfer_scale
= 2;
803 if(vw
->width
>=320 && vw
->height
>=240)
807 qcam
->transfer_scale
= 1;
809 mutex_lock(&qcam
->lock
);
810 qc_setscanmode(qcam
);
811 mutex_unlock(&qcam
->lock
);
813 /* We must update the camera before we grab. We could
814 just have changed the grab size */
815 qcam
->status
|= QC_PARAM_CHANGE
;
817 /* Ok we figured out what to use from our wide choice */
822 struct video_window
*vw
= arg
;
823 memset(vw
, 0, sizeof(*vw
));
824 vw
->width
=qcam
->width
/qcam
->transfer_scale
;
825 vw
->height
=qcam
->height
/qcam
->transfer_scale
;
844 static int qcam_ioctl(struct inode
*inode
, struct file
*file
,
845 unsigned int cmd
, unsigned long arg
)
847 return video_usercopy(inode
, file
, cmd
, arg
, qcam_do_ioctl
);
850 static ssize_t
qcam_read(struct file
*file
, char __user
*buf
,
851 size_t count
, loff_t
*ppos
)
853 struct video_device
*v
= video_devdata(file
);
854 struct qcam_device
*qcam
=(struct qcam_device
*)v
;
856 parport_claim_or_block(qcam
->pdev
);
858 mutex_lock(&qcam
->lock
);
862 /* Update the camera parameters if we need to */
863 if (qcam
->status
& QC_PARAM_CHANGE
)
866 len
=qc_capture(qcam
, buf
,count
);
868 mutex_unlock(&qcam
->lock
);
870 parport_release(qcam
->pdev
);
874 static const struct file_operations qcam_fops
= {
875 .owner
= THIS_MODULE
,
876 .open
= video_exclusive_open
,
877 .release
= video_exclusive_release
,
879 .compat_ioctl
= v4l_compat_ioctl32
,
883 static struct video_device qcam_template
=
885 .owner
= THIS_MODULE
,
886 .name
= "Connectix Quickcam",
887 .type
= VID_TYPE_CAPTURE
,
888 .hardware
= VID_HARDWARE_QCAM_BW
,
893 static struct qcam_device
*qcams
[MAX_CAMS
];
894 static unsigned int num_cams
= 0;
896 static int init_bwqcam(struct parport
*port
)
898 struct qcam_device
*qcam
;
900 if (num_cams
== MAX_CAMS
)
902 printk(KERN_ERR
"Too many Quickcams (max %d)\n", MAX_CAMS
);
906 qcam
=qcam_init(port
);
910 parport_claim_or_block(qcam
->pdev
);
914 if(qc_detect(qcam
)==0)
916 parport_release(qcam
->pdev
);
917 parport_unregister_device(qcam
->pdev
);
923 parport_release(qcam
->pdev
);
925 printk(KERN_INFO
"Connectix Quickcam on %s\n", qcam
->pport
->name
);
927 if(video_register_device(&qcam
->vdev
, VFL_TYPE_GRABBER
, video_nr
)==-1)
929 parport_unregister_device(qcam
->pdev
);
934 qcams
[num_cams
++] = qcam
;
939 static void close_bwqcam(struct qcam_device
*qcam
)
941 video_unregister_device(&qcam
->vdev
);
942 parport_unregister_device(qcam
->pdev
);
946 /* The parport parameter controls which parports will be scanned.
947 * Scanning all parports causes some printers to print a garbage page.
948 * -- March 14, 1999 Billy Donahue <billy@escape.com> */
950 static char *parport
[MAX_CAMS
] = { NULL
, };
951 module_param_array(parport
, charp
, NULL
, 0);
954 static int accept_bwqcam(struct parport
*port
)
959 if (parport
[0] && strncmp(parport
[0], "auto", 4) != 0) {
960 /* user gave parport parameters */
961 for(n
=0; parport
[n
] && n
<MAX_CAMS
; n
++){
964 r
= simple_strtoul(parport
[n
], &ep
, 0);
965 if (ep
== parport
[n
]) {
967 "bw-qcam: bad port specifier \"%s\"\n",
971 if (r
== port
->number
)
980 static void bwqcam_attach(struct parport
*port
)
982 if (accept_bwqcam(port
))
986 static void bwqcam_detach(struct parport
*port
)
989 for (i
= 0; i
< num_cams
; i
++) {
990 struct qcam_device
*qcam
= qcams
[i
];
991 if (qcam
&& qcam
->pdev
->port
== port
) {
998 static struct parport_driver bwqcam_driver
= {
1000 .attach
= bwqcam_attach
,
1001 .detach
= bwqcam_detach
,
1004 static void __exit
exit_bw_qcams(void)
1006 parport_unregister_driver(&bwqcam_driver
);
1009 static int __init
init_bw_qcams(void)
1012 /* Do some sanity checks on the module parameters. */
1013 if (maxpoll
> 5000) {
1014 printk("Connectix Quickcam max-poll was above 5000. Using 5000.\n");
1018 if (yieldlines
< 1) {
1019 printk("Connectix Quickcam yieldlines was less than 1. Using 1.\n");
1023 return parport_register_driver(&bwqcam_driver
);
1026 module_init(init_bw_qcams
);
1027 module_exit(exit_bw_qcams
);
1029 MODULE_LICENSE("GPL");