------------------------------------------------------------------------------- Readme for Linux device driver for the OmniVision OV511 USB to camera bridge IC ------------------------------------------------------------------------------- Author: Mark McClelland Homepage: http://ovcam.org/ov511 INTRODUCTION: This is a driver for the OV511, a USB-only chip used in many "webcam" devices. Any camera using the OV511/OV511+ and the OV6620/OV7610/20/20AE should work. Video capture devices that use the Philips SAA7111A decoder also work. It supports streaming and capture of color or monochrome video via the Video4Linux API. Most V4L apps are compatible with it. Most resolutions with a width and height that are a multiple of 8 are supported. If you need more information, please visit the OV511 homepage at the above URL. WHAT YOU NEED: - Kernel support for I2C, Video4Linux, and USB - A Video4Linux compatible frame grabber program (I recommend vidcat and xawtv) vidcat is part of the w3cam package: http://www.hdk-berlin.de/~rasca/w3cam/ xawtv is available at: http://www.in-berlin.de/User/kraxel/xawtv.html HOW TO USE IT: Note: These are simplified instructions. For complete instructions see: http://ovcam.org/ov511/install.html You must have first compiled USB support, support for your specific USB host controller (UHCI or OHCI), and Video4Linux support for your kernel (I recommend making them modules.) Make sure "Enforce bandwidth allocation" is NOT enabled. Next, (as root): modprobe usbcore modprobe usb-uhci modprobe usb-ohci (they're called uhci-hcd and ohci-hcd on 2.5 kernels) modprobe videodev modprobe i2c-core modprobe ov511 If it is not already there (it usually is), create the video device: mknod /dev/video0 c 81 0 You will have to set permissions on this device to allow you to read/write from it: chmod 660 /dev/video0 chown user.group /dev/video0 (substitute your user and group) Now you are ready to run a video app! Both vidcat and xawtv work well for me. (NOTE: vidcat might not work with cameras that have an OV6620 or OV6630 sensor) [Using vidcat:] vidcat -s 352x288 -p y -d /dev/video0 > test.jpg xview test.jpg [Using xawtv:] From the main xawtv directory: make clean ./configure make make install Now you should be able to run "xawtv -c /dev/video0". Right click for the options dialog. MODULE PARAMETERS: You can set these with: insmod ov511 NAME=VALUE There is currently no way to set these on a per-camera basis. NAME: autobright TYPE: integer (Boolean) DEFAULT: 1 DESC: Brightness is normally under automatic control and can't be set manually by the video app. Set to 0 for manual control. NAME: autoexp TYPE: integer (Boolean) DEFAULT: 1 DESC: Auto Exposure Control enable. NAME: debug TYPE: integer (0-6) DEFAULT: 3 DESC: Sets the threshold for printing debug messages. The higher the value, the more is printed. The levels are cumulative, and are as follows: 0=no debug messages 1=init/detection/unload and other significant messages 2=some warning messages 3=config/control function calls 4=most function calls and data parsing messages 5=highly repetitive mesgs NAME: snapshot TYPE: integer (Boolean) DEFAULT: 0 DESC: Set to 1 to enable snapshot mode. read()/VIDIOCSYNC will block until the snapshot button is pressed. Note: enabling this mode disables /proc/video/ov511//button NAME: cams TYPE: integer (1-4 for OV511, 1-31 for OV511+) DEFAULT: 1 DESC: Number of cameras allowed to stream simultaneously on a single bus. Values higher than 1 reduce the data rate of each camera, allowing two or more to be used at once. If you have a complicated setup involving both OV511 and OV511+ cameras, trial-and-error may be necessary for finding the optimum setting. NAME: compress TYPE: integer (Boolean) DEFAULT: 0 (OV511) or 1 (OV518) DESC: Set this to 1 to turn on the camera's compression engine. This can potentially increase the frame rate at the expense of quality, if you have a fast CPU. OV518 cameras require compression, so this option can't be disabled with them. NAME: dumppix TYPE: integer (0-2) DEFAULT: 0 DESC: Dumps raw pixel data and skips post-processing and format conversion. It is for debugging purposes only. Options are: 0: Disable (default) 1: Dump raw data from camera, excluding headers and trailers 2: Dumps data exactly as received from camera NAME: led TYPE: integer (0-2) DEFAULT: 1 (Always on) DESC: Controls whether the LED (the little light) on the front of the camera is always off (0), always on (1), or only on when driver is open (2). This is not supported with the OV511, and might only work with certain cameras (ones that actually have the LED wired to the control pin, and not just hard-wired to be on all the time). NAME: dump_bridge TYPE: integer (Boolean) DEFAULT: 0 DESC: Dumps the bridge (OV511[+] or OV518[+]) register values to the system log. Only useful for serious debugging/development purposes. NAME: printph TYPE: integer (Boolean) DEFAULT: 0 DESC: Setting this to 1 will dump the first 12 bytes of each isoc frame. This is only useful if you are trying to debug problems with the isoc data stream (i.e.: camera initializes, but vidcat hangs until Ctrl-C). Be warned that this dumps a large number of messages to your kernel log. NAME: phy, phuv, pvy, pvuv, qhy, qhuv, qvy, qvuv TYPE: integer (0-63 for phy and phuv, 0-255 for rest) DEFAULT: OV511 default values DESC: These are registers 70h - 77h of the OV511, which control the prediction ranges and quantization thresholds of the compressor, for the Y and UV channels in the horizontal and vertical directions. See the OV511 or OV511+ data sheet for more detailed descriptions. These normally do not need to be changed. NAME: lightfreq TYPE: integer (0, 50, or 60) DEFAULT: 0 (use sensor default) DESC: Sets the sensor to match your lighting frequency. This can reduce the appearance of "banding", i.e. horizontal lines or waves of light and dark that are often caused by artificial lighting. Valid values are: 0 - Use default (depends on sensor, most likely 60 Hz) 50 - For European and Asian 50 Hz power 60 - For American 60 Hz power NAME: bandingfilter TYPE: integer (Boolean) DEFAULT: 0 (off) DESC: Enables the sensorīs banding filter exposure algorithm. This reduces or stabilizes the "banding" caused by some artificial light sources (especially fluorescent). You might have to set lightfreq correctly for this to work right. As an added bonus, this sometimes makes it possible to capture your monitorīs output. NAME: fastset TYPE: integer (Boolean) DEFAULT: 0 (off) DESC: Allows picture settings (brightness, contrast, color, and hue) to take effect immediately, even in the middle of a frame. This reduces the time to change settings, but can ruin frames during the change. Only affects OmniVision sensors. NAME: force_palette TYPE: integer DEFAULT: OV511/OV511+: 0 (off); OV518/OV518+: 15 (YUV420P) DESC: Forces the palette (color format) to a specific value. If an application requests a different palette, it will be rejected, thereby forcing it to try others until it succeeds. This is useful for forcing greyscale mode with a color camera, for example. Supported modes are: 0 (Allows all the following formats) 1 VIDEO_PALETTE_GREY (Linear greyscale) 10 VIDEO_PALETTE_YUV420 (YUV 4:2:0 Planar) 15 VIDEO_PALETTE_YUV420P (YUV 4:2:0 Planar, same as 10) NAME: tuner TYPE: integer DEFAULT: -1 (autodetect) DESC: This sets the exact type of the tuner module in a device. This is set automatically based on the custom ID of the OV511 device. In cases where this fails, you can override this auto-detection. Please see linux/drivers/media/video/tuner.h for a complete list. NAME: backlight TYPE: integer (Boolean) DEFAULT: 0 (off) DESC: Setting this flag changes the exposure algorithm for OmniVision sensors such that objects in the camera's view (i.e. your head) can be clearly seen when they are illuminated from behind. It reduces or eliminates the sensor's auto-exposure function, so it should only be used when needed. Additionally, it is only supported with the OV6620 and OV7620. NAME: unit_video TYPE: Up to 16 comma-separated integers DEFAULT: 0,0,0... (automatically assign the next available minor(s)) DESC: You can specify up to 16 minor numbers to be assigned to ov511 devices. For example, "unit_video=1,3" will make the driver use /dev/video1 and /dev/video3 for the first two devices it detects. Additional devices will be assigned automatically starting at the first available device node (/dev/video0 in this case). Note that you cannot specify 0 as a minor number. This feature requires kernel version 2.4.5 or higher. NAME: remove_zeros TYPE: integer (Boolean) DEFAULT: 0 (do not skip any incoming data) DESC: Setting this to 1 will remove zero-padding from incoming data. This will compensate for the blocks of corruption that can appear when the camera cannot keep up with the speed of the USB bus (eg. at low frame resolutions). This feature is always enabled when compression is on. NAME: mirror TYPE: integer (Boolean) DEFAULT: 0 (off) DESC: Setting this to 1 will reverse ("mirror") the image horizontally. This might be necessary if your camera has a custom lens assembly. This has no effect with video capture devices. NAME: i2c_clockdiv TYPE: integer (0-255) DEFAULT: 1 (46.75 KHz) DESC: This allows you to slow the I2C clock down for devices that can't support the full rate. Most cameras don't need this, but you might if you are using custom hardware, or if your camera doesn't work and you see I2C errors in your syslog. The clock is determined by the formula: I2C_bit_rate = 93.5 Khz / (i2c_clockdiv + 1) This was set to 0 (93.5 KHz) in older drivers. If that setting works but the default doesn't, please report it to me. NOTE: OV518/OV518+ cameras do not implement this module parameter NAME: dev_hint TYPE: 0-16 comma-separated strings DEFAULT: N/A (automatically assign minors (/dev/video nodes)) DESC: This allows you to force cameras with specified custom IDs to register with specific minor numbers. If the minor is in use, the unit_video parameter will be tried next, and if none of those is free, the next available one will be assigned. Syntax: c:[,c:]... Example: Assign camera with custom ID 21 (Creative Webcam 3) to /dev/video4, and assign camera with custom ID 0 to /dev/video1: dev_hint=c21:4,c0:1 NAME: v4l2 TYPE: integer (Boolean) DEFAULT: 0 (disabled) DESC: This enables Video4Linux2 support, if you have a kernel that supports it. Driver support is incomplete, so there is no reason to do that yet. Note: V4L2 custom controls and most other ioctls are always supported, regardless of this setting. This setting just enables VIDIOC_QUERYCAP. WORKING FEATURES: o Color streaming/capture at most widths and heights that are multiples of 8. o Monochrome (use force_palette=1 to enable) o Setting/getting of saturation, contrast, brightness, and hue (only some of them work the OV7620 and OV7620AE) o /proc status reporting o SAA7111A video capture support at 320x240 and 640x480 o Compression support o SMP compatibility SUPPORT: You can email me at mark@ovcam.org . Please prefix the subject line with "OV511: " so that I am certain to notice your message. CREDITS: The code is based in no small part on the CPiA driver by Johannes Erdfelt, Randy Dunlap, and others. Big thanks to them for their pioneering work on that and the USB stack. Thanks to Bret Wallach for getting camera reg IO, ISOC, and image capture working. Thanks to Orion Sky Lawlor, Kevin Moore, and Claudio Matsuoka for their work as well.