|  |  | 
|  | W996[87]CF JPEG USB Dual Mode Camera Chip | 
|  | Driver for Linux 2.6 (basic version) | 
|  | ========================================= | 
|  |  | 
|  | - Documentation - | 
|  |  | 
|  |  | 
|  | Index | 
|  | ===== | 
|  | 1.  Copyright | 
|  | 2.  Disclaimer | 
|  | 3.  License | 
|  | 4.  Overview | 
|  | 5.  Supported devices | 
|  | 6.  Module dependencies | 
|  | 7.  Module loading | 
|  | 8.  Module paramaters | 
|  | 9.  Contact information | 
|  | 10. Credits | 
|  |  | 
|  |  | 
|  | 1. Copyright | 
|  | ============ | 
|  | Copyright (C) 2002-2004 by Luca Risolia <luca.risolia@studio.unibo.it> | 
|  |  | 
|  |  | 
|  | 2. Disclaimer | 
|  | ============= | 
|  | Winbond is a trademark of Winbond Electronics Corporation. | 
|  | This software is not sponsored or developed by Winbond. | 
|  |  | 
|  |  | 
|  | 3. License | 
|  | ========== | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 2 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, write to the Free Software | 
|  | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  |  | 
|  |  | 
|  | 4. Overview | 
|  | =========== | 
|  | This driver supports the video streaming capabilities of the devices mounting | 
|  | Winbond W9967CF and Winbond W9968CF JPEG USB Dual Mode Camera Chips. OV681 | 
|  | based cameras should be supported as well. | 
|  |  | 
|  | The driver is divided into two modules: the basic one, "w9968cf", is needed for | 
|  | the supported devices to work; the second one, "w9968cf-vpp", is an optional | 
|  | module, which provides some useful video post-processing functions like video | 
|  | decoding, up-scaling and colour conversions. Once the driver is installed, | 
|  | every time an application tries to open a recognized device, "w9968cf" checks | 
|  | the presence of the "w9968cf-vpp" module and loads it automatically by default. | 
|  |  | 
|  | Please keep in mind that official kernels do not include the second module for | 
|  | performance purposes. However it is always recommended to download and install | 
|  | the latest and complete release of the driver, replacing the existing one, if | 
|  | present: it will be still even possible not to load the "w9968cf-vpp" module at | 
|  | all, if you ever want to. Another important missing feature of the version in | 
|  | the official Linux 2.4 kernels is the writeable /proc filesystem interface. | 
|  |  | 
|  | The latest and full-featured version of the W996[87]CF driver can be found at: | 
|  | http://www.linux-projects.org. Please refer to the documentation included in | 
|  | that package, if you are going to use it. | 
|  |  | 
|  | Up to 32 cameras can be handled at the same time. They can be connected and | 
|  | disconnected from the host many times without turning off the computer, if | 
|  | your system supports the hotplug facility. | 
|  |  | 
|  | To change the default settings for each camera, many parameters can be passed | 
|  | through command line when the module is loaded into memory. | 
|  |  | 
|  | The driver relies on the Video4Linux, USB and I2C core modules. It has been | 
|  | designed to run properly on SMP systems as well. An additional module, | 
|  | "ovcamchip", is mandatory; it provides support for some OmniVision image | 
|  | sensors connected to the W996[87]CF chips; if found in the system, the module | 
|  | will be automatically loaded by default (provided that the kernel has been | 
|  | compiled with the automatic module loading option). | 
|  |  | 
|  |  | 
|  | 5. Supported devices | 
|  | ==================== | 
|  | At the moment, known W996[87]CF and OV681 based devices are: | 
|  | - Aroma Digi Pen VGA Dual Mode ADG-5000 (unknown image sensor) | 
|  | - AVerMedia AVerTV USB (SAA7111A, Philips FI1216Mk2 tuner, PT2313L audio chip) | 
|  | - Creative Labs Video Blaster WebCam Go (OmniVision OV7610 sensor) | 
|  | - Creative Labs Video Blaster WebCam Go Plus (OmniVision OV7620 sensor) | 
|  | - Lebon LDC-035A (unknown image sensor) | 
|  | - Ezonics EZ-802 EZMega Cam (OmniVision OV8610C sensor) | 
|  | - OmniVision OV8610-EDE (OmniVision OV8610 sensor) | 
|  | - OPCOM Digi Pen VGA Dual Mode Pen Camera (unknown image sensor) | 
|  | - Pretec Digi Pen-II (OmniVision OV7620 sensor) | 
|  | - Pretec DigiPen-480 (OmniVision OV8610 sensor) | 
|  |  | 
|  | If you know any other W996[87]CF or OV681 based cameras, please contact me. | 
|  |  | 
|  | The list above does not imply that all those devices work with this driver: up | 
|  | until now only webcams that have an image sensor supported by the "ovcamchip" | 
|  | module work. Kernel messages will always tell you whether this is case. | 
|  |  | 
|  | Possible external microcontrollers of those webcams are not supported: this | 
|  | means that still images cannot be downloaded from the device memory. | 
|  |  | 
|  | Furthermore, it's worth to note that I was only able to run tests on my | 
|  | "Creative Labs Video Blaster WebCam Go". Donations of other models, for | 
|  | additional testing and full support, would be much appreciated. | 
|  |  | 
|  |  | 
|  | 6. Module dependencies | 
|  | ====================== | 
|  | For it to work properly, the driver needs kernel support for Video4Linux, USB | 
|  | and I2C, and the "ovcamchip" module for the image sensor. Make sure you are not | 
|  | actually using any external "ovcamchip" module, given that the W996[87]CF | 
|  | driver depends on the version of the module present in the official kernels. | 
|  |  | 
|  | The following options of the kernel configuration file must be enabled and | 
|  | corresponding modules must be compiled: | 
|  |  | 
|  | # Multimedia devices | 
|  | # | 
|  | CONFIG_VIDEO_DEV=m | 
|  |  | 
|  | # I2C support | 
|  | # | 
|  | CONFIG_I2C=m | 
|  |  | 
|  | The I2C core module can be compiled statically in the kernel as well. | 
|  |  | 
|  | # OmniVision Camera Chip support | 
|  | # | 
|  | CONFIG_VIDEO_OVCAMCHIP=m | 
|  |  | 
|  | # USB support | 
|  | # | 
|  | CONFIG_USB=m | 
|  |  | 
|  | In addition, depending on the hardware being used, only one of the modules | 
|  | below is necessary: | 
|  |  | 
|  | # USB Host Controller Drivers | 
|  | # | 
|  | CONFIG_USB_EHCI_HCD=m | 
|  | CONFIG_USB_UHCI_HCD=m | 
|  | CONFIG_USB_OHCI_HCD=m | 
|  |  | 
|  | And finally: | 
|  |  | 
|  | # USB Multimedia devices | 
|  | # | 
|  | CONFIG_USB_W9968CF=m | 
|  |  | 
|  |  | 
|  | 7. Module loading | 
|  | ================= | 
|  | To use the driver, it is necessary to load the "w9968cf" module into memory | 
|  | after every other module required. | 
|  |  | 
|  | Loading can be done this way, from root: | 
|  |  | 
|  | [root@localhost home]# modprobe usbcore | 
|  | [root@localhost home]# modprobe i2c-core | 
|  | [root@localhost home]# modprobe videodev | 
|  | [root@localhost home]# modprobe w9968cf | 
|  |  | 
|  | At this point the pertinent devices should be recognized: "dmesg" can be used | 
|  | to analyze kernel messages: | 
|  |  | 
|  | [user@localhost home]$ dmesg | 
|  |  | 
|  | There are a lot of parameters the module can use to change the default | 
|  | settings for each device. To list every possible parameter with a brief | 
|  | explanation about them and which syntax to use, it is recommended to run the | 
|  | "modinfo" command: | 
|  |  | 
|  | [root@locahost home]# modinfo w9968cf | 
|  |  | 
|  |  | 
|  | 8. Module parameters | 
|  | ==================== | 
|  | Module parameters are listed below: | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:            ovmod_load | 
|  | Type:            bool | 
|  | Syntax:          <0|1> | 
|  | Description:     Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled. | 
|  | If enabled, 'insmod' searches for the required 'ovcamchip' | 
|  | module in the system, according to its configuration, and | 
|  | loads that module automatically. This action is performed as | 
|  | once soon as the 'w9968cf' module is loaded into memory. | 
|  | Default:         1 | 
|  | Note:            The kernel must be compiled with the CONFIG_KMOD option | 
|  | enabled for the 'ovcamchip' module to be loaded and for | 
|  | this parameter to be present. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           vppmod_load | 
|  | Type:           bool | 
|  | Syntax:         <0|1> | 
|  | Description:    Automatic 'w9968cf-vpp' module loading: 0 disabled, 1 enabled. | 
|  | If enabled, every time an application attempts to open a | 
|  | camera, 'insmod' searches for the video post-processing module | 
|  | in the system and loads it automatically (if present). | 
|  | The optional 'w9968cf-vpp' module adds extra image manipulation | 
|  | capabilities to the 'w9968cf' module,like software up-scaling, | 
|  | colour conversions and video decompression for very high frame | 
|  | rates. | 
|  | Default:        1 | 
|  | Note:           The kernel must be compiled with the CONFIG_KMOD option | 
|  | enabled for the 'w9968cf-vpp' module to be loaded and for | 
|  | this parameter to be present. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           simcams | 
|  | Type:           int | 
|  | Syntax:         <n> | 
|  | Description:    Number of cameras allowed to stream simultaneously. | 
|  | n may vary from 0 to 32. | 
|  | Default:        32 | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           video_nr | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <-1|n[,...]> | 
|  | Description:    Specify V4L minor mode number. | 
|  | -1 = use next available | 
|  | n = use minor number n | 
|  | You can specify up to 32 cameras this way. | 
|  | For example: | 
|  | video_nr=-1,2,-1 would assign minor number 2 to the second | 
|  | recognized camera and use auto for the first one and for every | 
|  | other camera. | 
|  | Default:        -1 | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           packet_size | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Specify the maximum data payload size in bytes for alternate | 
|  | settings, for each device. n is scaled between 63 and 1023. | 
|  | Default:        1023 | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           max_buffers | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    For advanced users. | 
|  | Specify the maximum number of video frame buffers to allocate | 
|  | for each device, from 2 to 32. | 
|  | Default:        2 | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           double_buffer | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Hardware double buffering: 0 disabled, 1 enabled. | 
|  | It should be enabled if you want smooth video output: if you | 
|  | obtain out of sync. video, disable it, or try to | 
|  | decrease the 'clockdiv' module parameter value. | 
|  | Default:        1 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           clamping | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Video data clamping: 0 disabled, 1 enabled. | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           filter_type | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <0|1|2[,...]> | 
|  | Description:    Video filter type. | 
|  | 0 none, 1 (1-2-1) 3-tap filter, 2 (2-3-6-3-2) 5-tap filter. | 
|  | The filter is used to reduce noise and aliasing artifacts | 
|  | produced by the CCD or CMOS image sensor. | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           largeview | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Large view: 0 disabled, 1 enabled. | 
|  | Default:        1 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           upscaling | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Software scaling (for non-compressed video only): | 
|  | 0 disabled, 1 enabled. | 
|  | Disable it if you have a slow CPU or you don't have enough | 
|  | memory. | 
|  | Default:        0 for every device. | 
|  | Note:           If 'w9968cf-vpp' is not present, this parameter is set to 0. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           decompression | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <0|1|2[,...]> | 
|  | Description:    Software video decompression: | 
|  | 0 = disables decompression | 
|  | (doesn't allow formats needing decompression). | 
|  | 1 = forces decompression | 
|  | (allows formats needing decompression only). | 
|  | 2 = allows any permitted formats. | 
|  | Formats supporting (de)compressed video are YUV422P and | 
|  | YUV420P/YUV420 in any resolutions where width and height are | 
|  | multiples of 16. | 
|  | Default:        2 for every device. | 
|  | Note:           If 'w9968cf-vpp' is not present, forcing decompression is not | 
|  | allowed; in this case this parameter is set to 2. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           force_palette | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <0|9|10|13|15|8|7|1|6|3|4|5[,...]> | 
|  | Description:    Force picture palette. | 
|  | In order: | 
|  | 0 = Off - allows any of the following formats: | 
|  | 9 = UYVY    16 bpp - Original video, compression disabled | 
|  | 10 = YUV420  12 bpp - Original video, compression enabled | 
|  | 13 = YUV422P 16 bpp - Original video, compression enabled | 
|  | 15 = YUV420P 12 bpp - Original video, compression enabled | 
|  | 8 = YUVY    16 bpp - Software conversion from UYVY | 
|  | 7 = YUV422  16 bpp - Software conversion from UYVY | 
|  | 1 = GREY     8 bpp - Software conversion from UYVY | 
|  | 6 = RGB555  16 bpp - Software conversion from UYVY | 
|  | 3 = RGB565  16 bpp - Software conversion from UYVY | 
|  | 4 = RGB24   24 bpp - Software conversion from UYVY | 
|  | 5 = RGB32   32 bpp - Software conversion from UYVY | 
|  | When not 0, this parameter will override 'decompression'. | 
|  | Default:        0 for every device. Initial palette is 9 (UYVY). | 
|  | Note:           If 'w9968cf-vpp' is not present, this parameter is set to 9. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           force_rgb | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Read RGB video data instead of BGR: | 
|  | 1 = use RGB component ordering. | 
|  | 0 = use BGR component ordering. | 
|  | This parameter has effect when using RGBX palettes only. | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           autobright | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Image sensor automatically changes brightness: | 
|  | 0 = no, 1 = yes | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           autoexp | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Image sensor automatically changes exposure: | 
|  | 0 = no, 1 = yes | 
|  | Default:        1 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           lightfreq | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <50|60[,...]> | 
|  | Description:    Light frequency in Hz: | 
|  | 50 for European and Asian lighting, 60 for American lighting. | 
|  | Default:        50 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           bandingfilter | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Banding filter to reduce effects of fluorescent | 
|  | lighting: | 
|  | 0 disabled, 1 enabled. | 
|  | This filter tries to reduce the pattern of horizontal | 
|  | light/dark bands caused by some (usually fluorescent) lighting. | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           clockdiv | 
|  | Type:           int array (min = 0, max = 32) | 
|  | Syntax:         <-1|n[,...]> | 
|  | Description:    Force pixel clock divisor to a specific value (for experts): | 
|  | n may vary from 0 to 127. | 
|  | -1 for automatic value. | 
|  | See also the 'double_buffer' module parameter. | 
|  | Default:        -1 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           backlight | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Objects are lit from behind: | 
|  | 0 = no, 1 = yes | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           mirror | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    Reverse image horizontally: | 
|  | 0 = no, 1 = yes | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           monochrome | 
|  | Type:           bool array (min = 0, max = 32) | 
|  | Syntax:         <0|1[,...]> | 
|  | Description:    The image sensor is monochrome: | 
|  | 0 = no, 1 = yes | 
|  | Default:        0 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           brightness | 
|  | Type:           long array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Set picture brightness (0-65535). | 
|  | This parameter has no effect if 'autobright' is enabled. | 
|  | Default:        31000 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           hue | 
|  | Type:           long array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Set picture hue (0-65535). | 
|  | Default:        32768 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           colour | 
|  | Type:           long array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Set picture saturation (0-65535). | 
|  | Default:        32768 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           contrast | 
|  | Type:           long array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Set picture contrast (0-65535). | 
|  | Default:        50000 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           whiteness | 
|  | Type:           long array (min = 0, max = 32) | 
|  | Syntax:         <n[,...]> | 
|  | Description:    Set picture whiteness (0-65535). | 
|  | Default:        32768 for every device. | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           debug | 
|  | Type:           int | 
|  | Syntax:         <n> | 
|  | Description:    Debugging information level, from 0 to 6: | 
|  | 0 = none (use carefully) | 
|  | 1 = critical errors | 
|  | 2 = significant informations | 
|  | 3 = configuration or general messages | 
|  | 4 = warnings | 
|  | 5 = called functions | 
|  | 6 = function internals | 
|  | Level 5 and 6 are useful for testing only, when only one | 
|  | device is used. | 
|  | Default:        2 | 
|  | ------------------------------------------------------------------------------- | 
|  | Name:           specific_debug | 
|  | Type:           bool | 
|  | Syntax:         <0|1> | 
|  | Description:    Enable or disable specific debugging messages: | 
|  | 0 = print messages concerning every level <= 'debug' level. | 
|  | 1 = print messages concerning the level indicated by 'debug'. | 
|  | Default:        0 | 
|  | ------------------------------------------------------------------------------- | 
|  |  | 
|  |  | 
|  | 9. Contact information | 
|  | ====================== | 
|  | I may be contacted by e-mail at <luca.risolia@studio.unibo.it>. | 
|  |  | 
|  | I can accept GPG/PGP encrypted e-mail. My GPG key ID is 'FCE635A4'. | 
|  | My public 1024-bit key should be available at your keyserver; the fingerprint | 
|  | is: '88E8 F32F 7244 68BA 3958  5D40 99DA 5D2A FCE6 35A4'. | 
|  |  | 
|  |  | 
|  | 10. Credits | 
|  | ========== | 
|  | The development would not have proceed much further without having looked at | 
|  | the source code of other drivers and without the help of several persons; in | 
|  | particular: | 
|  |  | 
|  | - the I2C interface to kernel and high-level image sensor control routines have | 
|  | been taken from the OV511 driver by Mark McClelland; | 
|  |  | 
|  | - memory management code has been copied from the bttv driver by Ralph Metzler, | 
|  | Marcus Metzler and Gerd Knorr; | 
|  |  | 
|  | - the low-level I2C read function has been written by Frederic Jouault; | 
|  |  | 
|  | - the low-level I2C fast write function has been written by Piotr Czerczak. |