summaryrefslogtreecommitdiffstats
path: root/Documentation/usb/ov511.txt
blob: d57cc2e236b232cec8716d0aae050f5210b186f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
-------------------------------------------------------------------------------
Readme for Linux device driver for the OmniVision OV511 USB to camera bridge IC
-------------------------------------------------------------------------------

Author: Mark McClelland
Homepage: http://alpha.dyndns.org/ov511

NEW IN THIS VERSION:
 o 352x288 mode
 o force_rgb parameter for apps that expect RGB instead of BGR

INTRODUCTION:

This is a preliminary version of my OV511 Linux device driver. Currently, it can
grab a frame in color (YUV420) at 640x480 or 320x240 using either vidcat or
xawtv. Other utilities may work but have not yet been tested.

Any camera using the OV511/OV511+ and the OV7610/20/20AE CCD should work. The
driver only detects known cameras though, based on their custom id number. If
you have a currently unsupported camera, the ID number should be reported to you
in the kernel logs. Please send me the model, manufacturer and ID number and I 
will add it to the detection code. In the meantime, you can add to the code
yourself in the function ov511_probe().

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.)

Next, (as root) from your appropriate modules directory (lib/modules/2.3.XX):

	insmod usb/usbcore.o
	insmod usb/usb-uhci.o  <OR>  insmod usb/ohci-hcd.o
	insmod misc/videodev.o
	insmod usb/ov511.o

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

You must make some modifications to the source and compile it before you use it.
(Note: this may not be applicable to versions other than 3.06)

In src/Xawtv.ad, change xawtv.tv.width to 640 and xawtv.tv.height to 480. Next,
in src/grab-v4l.c, change SYNC_TIMEOUT from 1 to 2. Then, 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. If
you get a scrambled image it is likely that you made a mistake in Xawtv.ad.
Try setting the size to 320x240 if all else fails.

FAQ:
Q: "Why does the picture have noise and look grainy"
A: This is a problem at low light levels, and may be also due to subtle bugs in
   the code. The cause is most likely the OV7610 settings we are currently
   using. I am looking into this problem.

Q: "The driver sometimes says `Failed to read OV7610 ID.' What is the deal?"
A: The I2C code that allows the OV511 to communicate with the camera chip is a
   bit flaky right now. This message means that the I2C bus never got
   initialized properly, and the camera will most likely not work even if you
   disable this warning. Try unloading/reloading the driver or unplugging/re-
   plugging the camera if this happens.

Q: "Why do you bother with this phony camera detection crap? It doesn't do
    anything useful!"
A: The main purpose of only supporting known camera models is to force people
   with new camera models to tell me about them, so I can assemble the list
   above, and so the code can know what CCD chip you have. Right now, nearly all
   of the cameras use the OV7610 and consequently I have not put support for
   other ones in, so the value of the detection code is questionable. Eventually
   though, new CCDs might appear and we will be fortunate to have the detection.

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 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: This is still
        experimental and very buggy. 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() will block until the snapshot
        button is pressed. Note that this does not yet work with most apps,
        including xawtv and vidcat. NOTE: See the section "TODO" for more info.

  NAME: sensor
  TYPE: integer ([0, 1, 3])
  DEFAULT: [varies]
  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 OV7620
        	1 for OV7620AE
        	3 for OV7610

  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 intermittant 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.

WORKING FEATURES:
 o Color streaming/capture at 640x480, 352x288, and 320x240
 o YUV420 color
 o Monochrome
 o Setting/getting of saturation, contrast and brightness (no hue yet; only
   works with OV7610, not the OV7620 or OV7620AE)
 o proc status reporting

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 (only works with some read() based apps; see below for more)
 o read() support

TODO:
 o Fix the noise / grainy image problem.
 o Get compression working. It would be a nice addition as it improves
   frame rate quite a bit. OmniVision wouldn't tell me how the algorithm works,
   so we can't really work on that yet. Please kindly inform OmniVision that you
   would like them to release their specifications to the Linux community.
 o Get 160x120 working
 o YUV422 (and other color modes)
 o Fix read(). It only works right now if you run an mmap() based app like xawtv
   or vidcat after loading the module and before using read(). Apparently there
   are some initialization issues.
 o Get snapshot mode working with mmap().
 o Fix fixFrameRGBoffset(). It is not stable yet with streaming video.
 o Get hue (red/blue channel balance) adjustment working (in ov511_get_picture()
   and ov511_set_picture())
 o Get autoadjust disable working
 o V4L2 support (Probably not until it goes into the kernel)
 o Fix I2C initialization. Some people are reporting problems with reading the
   7610 registers. This could be due to timing differences, an excessive I2C
   clock rate, or a problem with ov511_i2c_read().
 o Get rid of the memory management functions (put them in videodev.c??)
 o Setting of contrast and brightness not working with 7620
 o Driver/camera state save/restore for when USB supports suspend/resume
 o Multiple cameras reportedly do not work simultaneously
 o Problems with OHCI

HOW TO CONTACT ME:

You can email me at mmcclelland@delphi.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.