~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/Documentation/video4linux/CQcam.txt

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 c-qcam - Connectix Color QuickCam video4linux kernel driver
  2 
  3 Copyright (C) 1999  Dave Forrest  <drf5n@virginia.edu>
  4                     released under GNU GPL.
  5 
  6 1999-12-08 Dave Forrest, written with kernel version 2.2.12 in mind
  7 
  8 
  9 Table of Contents
 10 
 11 1.0 Introduction
 12 2.0 Compilation, Installation, and Configuration
 13 3.0 Troubleshooting
 14 4.0 Future Work / current work arounds
 15 9.0 Sample Program, v4lgrab
 16 10.0 Other Information
 17 
 18 
 19 1.0 Introduction
 20 
 21   The file ../drivers/char/c-qcam.c is a device driver for the
 22 Logitech (nee Connectix) parallel port interface color CCD camera.
 23 This is a fairly inexpensive device for capturing images.  Logitech
 24 does not currently provide information for developers, but many people
 25 have engineered several solutions for non-Microsoft use of the Color
 26 Quickcam.
 27 
 28 1.1 Motivation
 29 
 30   I spent a number of hours trying to get my camera to work, and I
 31 hope this document saves you some time.  My camera will not work with
 32 the 2.2.13 kernel as distributed, but with a few patches to the
 33 module, I was able to grab some frames. See 4.0, Future Work.
 34 
 35 
 36 
 37 2.0 Compilation, Installation, and Configuration
 38 
 39   The c-qcam depends on parallel port support, video4linux, and the
 40 Color Quickcam.  It is also nice to have the parallel port readback
 41 support enabled. I enabled these as modules during the kernel
 42 configuration.  The appropriate flags are:
 43 
 44     CONFIG_PRINTER       M    for lp.o, parport.o parport_pc.o modules
 45     CONFIG_PNP_PARPORT   M for autoprobe.o IEEE1284 readback module
 46     CONFIG_PRINTER_READBACK M for parport_probe.o IEEE1284 readback module
 47     CONFIG_VIDEO_DEV     M    for videodev.o video4linux module
 48     CONFIG_VIDEO_CQCAM   M    for c-qcam.o  Color Quickcam module 
 49 
 50   With these flags, the kernel should compile and install the modules.
 51 To record and monitor the compilation, I use:
 52 
 53  (make dep; \
 54   make zlilo ; \
 55   make modules; \
 56   make modules_install ; 
 57   depmod -a ) &>log &
 58  less log  # then a capital 'F' to watch the progress
 59   
 60 But that is my personal preference.
 61 
 62 2.2 Configuration
 63  
 64   The configuration requires module configuration and device
 65 configuration.  I like kmod or kerneld process with the
 66 /etc/modules.conf file so the modules can automatically load/unload as
 67 they are used.  The video devices could already exist, be generated
 68 using MAKEDEV, or need to be created.  The following sections detail
 69 these procedures.
 70 
 71 
 72 2.1 Module Configuration  
 73 
 74   Using modules requires a bit of work to install and pass the
 75 parameters.  Do read ../modules.txt, and understand that entries
 76 in /etc/modules.conf of:
 77 
 78    alias parport_lowlevel parport_pc
 79    options parport_pc io=0x378 irq=none
 80    alias char-major-81 videodev
 81    alias char-major-81-0 c-qcam
 82 
 83 will cause the kmod/kerneld/modprobe to do certain things.  If you are
 84 using kmod or kerneld, then a request for a 'char-major-81-0' will cause
 85 the 'c-qcam' module to load.  If you have other video sources with
 86 modules, you might want to assign the different minor numbers to
 87 different modules.
 88 
 89 2.2 Device Configuration
 90 
 91   At this point, we need to ensure that the device files exist.
 92 Video4linux used the /dev/video* files, and we want to attach the
 93 Quickcam to one of these.
 94 
 95    ls -lad /dev/video*  # should produce a list of the video devices
 96 
 97 If the video devices do not exist, you can create them with:
 98 
 99   su
100   cd /dev
101   for ii in 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ; do
102     mknod video$ii c 81 $ii   # char-major-81-[0-16]
103     chown root.root video$ii  # owned by root
104     chmod 600 video$ii        # read/writable by root only
105   done
106 
107   Lots of people connect video0 to video and bttv, but you might want
108 your c-qcam to mean something more:
109 
110    ln -s video0 c-qcam  # make /dev/c-qcam a working file
111    ln -s c-qcam video   # make /dev/c-qcam your default video source
112 
113   But these are conveniences.  The important part is to make the proper
114 special character files with the right major and minor numbers.  All
115 of the special device files are listed in ../devices.txt.  If you
116 would like the c-qcam readable by non-root users, you will need to
117 change the permissions.
118 
119 3.0 Troubleshooting
120 
121   If the sample program below, v4lgrab, gives you output then
122 everything is working.
123 
124     v4lgrab | wc # should give you a count of characters
125 
126   Otherwise, you have some problem.
127 
128   The c-qcam is IEEE1284 compatible, so if you are using the proc file
129 system (CONFIG_PROC_FS), the parallel printer support
130 (CONFIG_PRINTER), the IEEE 1284 system,(CONFIG_PRINTER_READBACK), you
131 should be able to read some identification from your quickcam with
132 
133          modprobe -v parport
134          modprobe -v parport_probe
135          cat /proc/parport/PORTNUMBER/autoprobe
136 Returns:
137   CLASS:MEDIA;
138   MODEL:Color QuickCam 2.0;
139   MANUFACTURER:Connectix;
140 
141   A good response to this indicates that your color quickcam is alive
142 and well.  A common problem is that the current driver does not
143 reliably detect a c-qcam, even though one is attached.  In this case,
144 
145      modprobe -v c-qcam     
146 or
147      insmod -v c-qcam
148 
149   Returns a message saying "Device or resource busy"  Development is
150 currently underway, but a workaround is to patch the module to skip
151 the detection code and attach to a defined port.  Check the
152 video4linux mailing list and archive for more current information.
153 
154 3.1 Checklist:
155 
156   Can you get an image?
157             v4lgrab >qcam.ppm ; wc qcam.ppm ; xv qcam.ppm
158 
159   Is a working c-qcam connected to the port? 
160             grep ^ /proc/parport/?/autoprobe
161 
162   Do the /dev/video* files exist?  
163             ls -lad /dev/video
164 
165   Is the c-qcam module loaded?     
166             modprobe -v c-qcam ; lsmod
167 
168   Does the camera work with alternate programs? cqcam, etc?
169 
170 
171 
172 
173 4.0 Future Work / current workarounds
174 
175   It is hoped that this section will soon become obsolete, but if it
176 isn't, you might try patching the c-qcam module to add a parport=xxx
177 option as in the bw-qcam module so you can specify the parallel port:
178 
179        insmod -v c-qcam parport=0  
180 
181 And bypass the detection code, see ../../drivers/char/c-qcam.c and
182 look for the 'qc_detect' code and call.
183 
184   Note that there is work in progress to change the video4linux API,
185 this work is documented at the video4linux2 site listed below.
186 
187 
188 9.0 --- A sample program using v4lgrabber, 
189 
190 This program is a simple image grabber that will copy a frame from the
191 first video device, /dev/video0 to standard output in portable pixmap
192 format (.ppm)  Using this like: 'v4lgrab | convert - c-qcam.jpg'
193 produced this picture of me at 
194     http://mug.sys.virginia.edu/~drf5n/extras/c-qcam.jpg
195 
196 -------------------- 8< ---------------- 8< -----------------------------
197 
198 /* Simple Video4Linux image grabber. */
199 /*
200  *      Video4Linux Driver Test/Example Framegrabbing Program
201  *
202  *      Compile with:
203  *              gcc -s -Wall -Wstrict-prototypes v4lgrab.c -o v4lgrab
204  *      Use as:
205  *              v4lgrab >image.ppm
206  *
207  *      Copyright (C) 1998-05-03, Phil Blundell <philb@gnu.org>  
208  *      Copied from http://www.tazenda.demon.co.uk/phil/vgrabber.c 
209  *      with minor modifications (Dave Forrest, drf5n@virginia.edu).
210  *
211  */
212 
213 #include <unistd.h>
214 #include <sys/types.h>
215 #include <sys/stat.h>
216 #include <fcntl.h>
217 #include <stdio.h>
218 #include <sys/ioctl.h>
219 #include <stdlib.h>
220 
221 #include <linux/types.h>
222 #include <linux/videodev.h>
223 
224 #define FILE "/dev/video0"
225 
226 /* Stole this from tvset.c */
227 
228 #define READ_VIDEO_PIXEL(buf, format, depth, r, g, b)                   \
229 {                                                                       \
230         switch (format)                                                 \
231         {                                                               \
232                 case VIDEO_PALETTE_GREY:                                \
233                         switch (depth)                                  \
234                         {                                               \
235                                 case 4:                                 \
236                                 case 6:                                 \
237                                 case 8:                                 \
238                                         (r) = (g) = (b) = (*buf++ << 8);\
239                                         break;                          \
240                                                                         \
241                                 case 16:                                \
242                                         (r) = (g) = (b) =               \
243                                                 *((unsigned short *) buf);      \
244                                         buf += 2;                       \
245                                         break;                          \
246                         }                                               \
247                         break;                                          \
248                                                                         \
249                                                                         \
250                 case VIDEO_PALETTE_RGB565:                              \
251                 {                                                       \
252                         unsigned short tmp = *(unsigned short *)buf;    \
253                         (r) = tmp&0xF800;                               \
254                         (g) = (tmp<<5)&0xFC00;                          \
255                         (b) = (tmp<<11)&0xF800;                         \
256                         buf += 2;                                       \
257                 }                                                       \
258                 break;                                                  \
259                                                                         \
260                 case VIDEO_PALETTE_RGB555:                              \
261                         (r) = (buf[0]&0xF8)<<8;                         \
262                         (g) = ((buf[0] << 5 | buf[1] >> 3)&0xF8)<<8;    \
263                         (b) = ((buf[1] << 2 ) & 0xF8)<<8;               \
264                         buf += 2;                                       \
265                         break;                                          \
266                                                                         \
267                 case VIDEO_PALETTE_RGB24:                               \
268                         (r) = buf[0] << 8; (g) = buf[1] << 8;           \
269                         (b) = buf[2] << 8;                              \
270                         buf += 3;                                       \
271                         break;                                          \
272                                                                         \
273                 default:                                                \
274                         fprintf(stderr,                                 \
275                                 "Format %d not yet supported\n",        \
276                                 format);                                \
277         }                                                               \
278 }                                               
279 
280 int get_brightness_adj(unsigned char *image, long size, int *brightness) {
281   long i, tot = 0;
282   for (i=0;i<size*3;i++)
283     tot += image[i];
284   *brightness = (128 - tot/(size*3))/3;
285   return !((tot/(size*3)) >= 126 && (tot/(size*3)) <= 130);
286 }
287 
288 int main(int argc, char ** argv)
289 {
290   int fd = open(FILE, O_RDONLY), f;
291   struct video_capability cap;
292   struct video_window win;
293   struct video_picture vpic;
294 
295   unsigned char *buffer, *src;
296   int bpp = 24, r, g, b;
297   unsigned int i, src_depth;
298 
299   if (fd < 0) {
300     perror(FILE);
301     exit(1);
302   }
303 
304   if (ioctl(fd, VIDIOCGCAP, &cap) < 0) {
305     perror("VIDIOGCAP");
306     fprintf(stderr, "(" FILE " not a video4linux device?)\n");
307     close(fd);
308     exit(1);
309   }
310 
311   if (ioctl(fd, VIDIOCGWIN, &win) < 0) {
312     perror("VIDIOCGWIN");
313     close(fd);
314     exit(1);
315   }
316 
317   if (ioctl(fd, VIDIOCGPICT, &vpic) < 0) {
318     perror("VIDIOCGPICT");
319     close(fd);
320     exit(1);
321   }
322 
323   if (cap.type & VID_TYPE_MONOCHROME) {
324     vpic.depth=8;
325     vpic.palette=VIDEO_PALETTE_GREY;    /* 8bit grey */
326     if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
327       vpic.depth=6;
328       if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
329         vpic.depth=4;
330         if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
331           fprintf(stderr, "Unable to find a supported capture format.\n");
332           close(fd);
333           exit(1);
334         }
335       }
336     }
337   } else {
338     vpic.depth=24;
339     vpic.palette=VIDEO_PALETTE_RGB24;
340     
341     if(ioctl(fd, VIDIOCSPICT, &vpic) < 0) {
342       vpic.palette=VIDEO_PALETTE_RGB565;
343       vpic.depth=16;
344       
345       if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
346         vpic.palette=VIDEO_PALETTE_RGB555;
347         vpic.depth=15;
348         
349         if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
350           fprintf(stderr, "Unable to find a supported capture format.\n");
351           return -1;
352         }
353       }
354     }
355   }
356   
357   buffer = malloc(win.width * win.height * bpp);
358   if (!buffer) {
359     fprintf(stderr, "Out of memory.\n");
360     exit(1);
361   }
362   
363   do {
364     int newbright;
365     read(fd, buffer, win.width * win.height * bpp);
366     f = get_brightness_adj(buffer, win.width * win.height, &newbright);
367     if (f) {
368       vpic.brightness += (newbright << 8);
369       if(ioctl(fd, VIDIOCSPICT, &vpic)==-1) {
370         perror("VIDIOSPICT");
371         break;
372       }
373     }
374   } while (f);
375 
376   fprintf(stdout, "P6\n%d %d 255\n", win.width, win.height);
377 
378   src = buffer;
379 
380   for (i = 0; i < win.width * win.height; i++) {
381     READ_VIDEO_PIXEL(src, vpic.palette, src_depth, r, g, b);
382     fputc(r>>8, stdout);
383     fputc(g>>8, stdout);
384     fputc(b>>8, stdout);
385   }
386     
387   close(fd);
388   return 0;
389 }
390 -------------------- 8< ---------------- 8< -----------------------------
391 
392 
393 10.0 --- Other Information
394 
395 Use the ../../Maintainers file, particularly the  VIDEO FOR LINUX and PARALLEL
396 PORT SUPPORT sections
397 
398 The video4linux page:
399   http://roadrunner.swansea.linux.org.uk/v4l.shtml
400 
401 The video4linux2 page:
402   http://millennium.diads.com/bdirks/v4l2.htm
403 
404 Some web pages about the quickcams:
405    http://www.dkfz-heidelberg.de/Macromol/wedemann/mini-HOWTO-cqcam.html
406 
407    http://www.crynwr.com/qcpc/            QuickCam Third-Party Drivers
408    http://www.crynwr.com/qcpc/re.html     Some Reverse Engineering
409    http://cse.unl.edu/~cluening/gqcam/    v4l client
410    http://phobos.illtel.denver.co.us/pub/qcread/ doesn't use v4l
411    ftp://ftp.cs.unm.edu/pub/chris/quickcam/   Has lots of drivers
412    http://www.cs.duke.edu/~reynolds/quickcam/ Has lots of information
413 
414 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.