-------------------------------------------------------------------------------
Readme for Linux device driver for the OmniVision OV511 USB to camera bridge IC
-------------------------------------------------------------------------------

Author: Mark McClelland
Homepage: http://alpha.dyndns.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 CCD should 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:

- If you want to help with the development, get the chip's specification docs at
  http://www.ovt.com/omniusbp.html

- 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:

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  <OR>  modprobe usb-ohci
	modprobe videodev
	modprobe ov511

If it is not already there (it usually is), create the video device:

	mknod /dev/video c 81 0

Sometimes /dev/video is a symlink to /dev/video0

You will have to set permissions on this device to allow you to read/write
from it:

	chmod 666 /dev/video
	chmod 666 /dev/video0 (if necessary)
	
Now you are ready to run a video app! Both vidcat and xawtv work well for me
at 640x480.
	
[Using vidcat:]

	vidcat -s 640x480 > 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. 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: autoadjust
  TYPE: integer (Boolean)
  DEFAULT: 1
  DESC: The camera normally adjusts exposure, gain, and hue automatically. This
        can be set to 0 to disable this automatic adjustment. Note that there is
        currently no way to set some of these parameters manually once
        autoadjust is disabled.

  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: fix_rgb_offset
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: Some people have reported that the blue component of the image is one
        or so lines higher than the red component. This is only apparent in 
        images with white objects on black backgrounds at 640x480. Setting this
        to 1 will realign the color planes correctly. NOTE: You will likely
        need a fast (500 MHz) CPU.

  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/<minor#>/button

  NAME: sensor
  TYPE: integer (0 - 7)
  DEFAULT: Initially zero, varies after detection
  DESC: If you know that your camera sensor is not detected correctly, set this
        parameter. This is a global option for all attached OV511 cameras. You
        will probably never need to set this, but if you do, valid values are:
		0 for autodetect
		1 for OV7610
		2 for OV7620
		3 for OV7620AE
		4 for OV6620
		5 for OV6630
		6 for OV8600 (unsupported)
		7 for KS0127 (unsupported)
		8 for KS0127B (unsupported)
		9 for SAA7111A

	Note that you cannot set an OV6xxx series sensor to detect as an OV7xxx
	series one or vice versa, since they use different communication
	addresses.

  NAME: i2c_detect_tries
  TYPE: integer (don't set it insanely high!)
  DEFAULT: 5
  DESC: This is the number of times the driver will try to sync and detect the
        internal i2c bus (which connects the OV511 and sensor). If you are
        getting intermittent detection failures ("Failed to read sensor ID...")
        you should increase this by a modest amount. If setting it to 20 or so
        doesn't fix things, look elsewhere for the cause of the problem.

  NAME: aperture
  TYPE: integer (0 - 15)
  DEFAULT: [varies by sensor]
  DESC: For legal values, see the OV7610/7620 specs under register Common F.
        This setting affects the upper nybble of that reg (bits 4-7). This is
        for if you want to play with the camera's pixel saturation.

  NAME: force_rgb
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: Force image to be read in RGB instead of BGR. This option allow
        programs that expect RGB data (e.g. gqcam) to work with this driver. If
        your colors look VERY wrong, you may want to change this.

  NAME: buf_timeout
  TYPE: integer
  DEFAULT: 5 (seconds)
  DESC: Number of seconds before unused frame buffers are deallocated.
        Previously, memory was allocated upon open() and deallocated upon
        close(). Deallocation now occurs only if the driver is closed and this
        timeout is reached. If you are capturing frames less frequently than
        the default timeout, increase this. This will not make any difference
        with programs that capture multiple frames during an open/close cycle.

  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: retry_sync
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: Prevent apps from timing out if frame is not done in time. This is
        useful if you are having problems with Xawtv getting "stuck" on a frame
        when your system is under heavy load.

  NAME: compress
  TYPE: integer (Boolean)
  DEFAULT: 0
  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. This does not work reliably yet (only stable with very
        dark images.) You must load the proper compression module for your
        camera before starting your application.

  NAME: testpat
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: This configures the camera's sensor to transmit a colored test-pattern
        instead of an image. This does not work correctly yet.

  NAME: sensor_gbr (*** TEMPORARILY DISABLED ***)
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: This makes the sensor output GBR422 instead of YUV420. This saves the
        driver the trouble of converting YUV to RGB, but it currently does not
        work very well (the colors are not quite right)

  NAME: dumppix
  TYPE: integer (0-1)
  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

  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 only supported with the OV511+ chipset, and even then only on
	some cameras (ones that actually have the LED wired to the control pin,
	and not just hardwired 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: dump_sensor
  TYPE: integer (Boolean)
  DEFAULT: 0
  DESC: Dumps the sensor 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 sensors 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 monitors 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 (Boolean)
  DEFAULT: 0 (off)
  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)
		3   VIDEO_PALETTE_RGB565    (565 16 bit RGB)
		4   VIDEO_PALETTE_RGB24     (24bit RGB)
		7   VIDEO_PALETTE_YUV422    (YUV422 capture)
		8   VIDEO_PALETTE_YUYV      (YUV422 capture; same as 7)
		10  VIDEO_PALETTE_YUV420    (YUV 4:2:0 Planar)
		13  VIDEO_PALETTE_YUV422P   (YUV 4:2:2 Planar)
		15  VIDEO_PALETTE_YUV420P   (YUV 4:2:0 Planar, same as 10)


WORKING FEATURES:
 o Color streaming/capture at most widths and heights that are multiples of 8.
 o RGB24, RGB565, YUV420, YUV422, YUYV, and YUV422P color
 o Monochrome
 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

EXPERIMENTAL FEATURES:
 o fix_rgb_offset: Sometimes works, but other times causes errors with xawtv and
   corrupted frames. If you have a very fast CPU, you can try it.
 o Snapshot mode
 o 176x144, 160x120
 o OV6630 sensor support
 o Compression support
 o Banding filter

TO-DO:
 o V4L2 support (This will be done after the next kernel patch release)
 o Setting of hue not working with OV7620
 o Setting of contrast and hue not working with OV7620AE
 o Driver/camera state save/restore for when USB supports suspend/resume
 o Unstable on SMP systems
 o Driver sometimes hangs upon close() with OHCI
 o The image should always be written properly to the mmap'ed buffer as long as
   the requested image size is at least the minimum size. This will likely
   require a rewrite of all the parsing code.
 o OV8600 sensor support (Not used in anything yet)
 o OV518/OV518+ support
 o cams >= 3 not working

HOW TO CONTACT ME:

You can email me at mmcclell@bigfoot.com . 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.

