CQcam.txt
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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