1
2 #ifndef __LINUX_OV511_H
3 #define __LINUX_OV511_H
4
5 #include <asm/uaccess.h>
6 #include <linux/videodev.h>
7 #include <linux/smp_lock.h>
8
9 #define OV511_DEBUG /* Turn on debug messages */
10
11 #ifdef OV511_DEBUG
12 # define PDEBUG(level, fmt, args...) \
13 if (debug >= level) info("[" __PRETTY_FUNCTION__ ":%d] " fmt, __LINE__ , ## args)
14 #else
15 # define PDEBUG(level, fmt, args...) do {} while(0)
16 #endif
17
18 /* Camera interface register numbers */
19 #define OV511_REG_CAMERA_DELAY_MODE 0x10
20 #define OV511_REG_CAMERA_EDGE_MODE 0x11
21 #define OV511_REG_CAMERA_CLAMPED_PIXEL_NUM 0x12
22 #define OV511_REG_CAMERA_CLAMPED_LINE_NUM 0x13
23 #define OV511_REG_CAMERA_PIXEL_DIVISOR 0x14
24 #define OV511_REG_CAMERA_LINE_DIVISOR 0x15
25 #define OV511_REG_CAMERA_DATA_INPUT_SELECT 0x16
26 #define OV511_REG_CAMERA_RESERVED_LINE_MODE 0x17
27 #define OV511_REG_CAMERA_BITMASK 0x18
28
29 /* Snapshot mode camera interface register numbers */
30 #define OV511_REG_SNAP_CAPTURED_FRAME 0x19
31 #define OV511_REG_SNAP_CLAMPED_PIXEL_NUM 0x1A
32 #define OV511_REG_SNAP_CLAMPED_LINE_NUM 0x1B
33 #define OV511_REG_SNAP_PIXEL_DIVISOR 0x1C
34 #define OV511_REG_SNAP_LINE_DIVISOR 0x1D
35 #define OV511_REG_SNAP_DATA_INPUT_SELECT 0x1E
36 #define OV511_REG_SNAP_BITMASK 0x1F
37
38 /* DRAM register numbers */
39 #define OV511_REG_DRAM_ENABLE_FLOW_CONTROL 0x20
40 #define OV511_REG_DRAM_READ_CYCLE_PREDICT 0x21
41 #define OV511_REG_DRAM_MANUAL_READ_CYCLE 0x22
42 #define OV511_REG_DRAM_REFRESH_COUNTER 0x23
43
44 /* ISO FIFO register numbers */
45 #define OV511_REG_FIFO_PACKET_SIZE 0x30
46 #define OV511_REG_FIFO_BITMASK 0x31
47
48 /* PIO register numbers */
49 #define OV511_REG_PIO_BITMASK 0x38
50 #define OV511_REG_PIO_DATA_PORT 0x39
51 #define OV511_REG_PIO_BIST 0x3E
52
53 /* I2C register numbers */
54 #define OV511_REG_I2C_CONTROL 0x40
55 #define OV511_REG_I2C_SLAVE_ID_WRITE 0x41
56 #define OV511_REG_I2C_SUB_ADDRESS_3_BYTE 0x42
57 #define OV511_REG_I2C_SUB_ADDRESS_2_BYTE 0x43
58 #define OV511_REG_I2C_SLAVE_ID_READ 0x44
59 #define OV511_REG_I2C_DATA_PORT 0x45
60 #define OV511_REG_I2C_CLOCK_PRESCALER 0x46
61 #define OV511_REG_I2C_TIME_OUT_COUNTER 0x47
62
63 /* I2C snapshot register numbers */
64 #define OV511_REG_I2C_SNAP_SUB_ADDRESS 0x48
65 #define OV511_REG_I2C_SNAP_DATA_PORT 0x49
66
67 /* System control register numbers */
68 #define OV511_REG_SYSTEM_RESET 0x50
69 #define OV511_RESET_UDC 0x01
70 #define OV511_RESET_I2C 0x02
71 #define OV511_RESET_FIFO 0x04
72 #define OV511_RESET_OMNICE 0x08
73 #define OV511_RESET_DRAM_INTF 0x10
74 #define OV511_RESET_CAMERA_INTF 0x20
75 #define OV511_RESET_OV511 0x40
76 #define OV511_RESET_NOREGS 0x3F /* All but OV511 & regs */
77 #define OV511_RESET_ALL 0x7F
78 #define OV511_REG_SYSTEM_CLOCK_DIVISOR 0x51
79 #define OV511_REG_SYSTEM_SNAPSHOT 0x52
80 #define OV511_REG_SYSTEM_INIT 0x53
81 #define OV511_REG_SYSTEM_PWR_CLK 0x54 /* OV511+ only */
82 #define OV511_REG_SYSTEM_LED_CTL 0x55 /* OV511+ only */
83 #define OV511_REG_SYSTEM_USER_DEFINED 0x5E
84 #define OV511_REG_SYSTEM_CUSTOM_ID 0x5F
85
86 /* OmniCE register numbers */
87 #define OV511_OMNICE_PREDICTION_HORIZ_Y 0x70
88 #define OV511_OMNICE_PREDICTION_HORIZ_UV 0x71
89 #define OV511_OMNICE_PREDICTION_VERT_Y 0x72
90 #define OV511_OMNICE_PREDICTION_VERT_UV 0x73
91 #define OV511_OMNICE_QUANTIZATION_HORIZ_Y 0x74
92 #define OV511_OMNICE_QUANTIZATION_HORIZ_UV 0x75
93 #define OV511_OMNICE_QUANTIZATION_VERT_Y 0x76
94 #define OV511_OMNICE_QUANTIZATION_VERT_UV 0x77
95 #define OV511_OMNICE_ENABLE 0x78
96 #define OV511_OMNICE_LUT_ENABLE 0x79
97 #define OV511_OMNICE_Y_LUT_BEGIN 0x80
98 #define OV511_OMNICE_Y_LUT_END 0x9F
99 #define OV511_OMNICE_UV_LUT_BEGIN 0xA0
100 #define OV511_OMNICE_UV_LUT_END 0xBF
101
102 /* Alternate numbers for various max packet sizes (OV511 only) */
103 #define OV511_ALT_SIZE_992 0
104 #define OV511_ALT_SIZE_993 1
105 #define OV511_ALT_SIZE_768 2
106 #define OV511_ALT_SIZE_769 3
107 #define OV511_ALT_SIZE_512 4
108 #define OV511_ALT_SIZE_513 5
109 #define OV511_ALT_SIZE_257 6
110 #define OV511_ALT_SIZE_0 7
111
112 /* Alternate numbers for various max packet sizes (OV511+ only) */
113 #define OV511PLUS_ALT_SIZE_0 0
114 #define OV511PLUS_ALT_SIZE_33 1
115 #define OV511PLUS_ALT_SIZE_129 2
116 #define OV511PLUS_ALT_SIZE_257 3
117 #define OV511PLUS_ALT_SIZE_385 4
118 #define OV511PLUS_ALT_SIZE_513 5
119 #define OV511PLUS_ALT_SIZE_769 6
120 #define OV511PLUS_ALT_SIZE_961 7
121
122 /* OV7610 registers */
123 #define OV7610_REG_GAIN 0x00 /* gain setting (5:0) */
124 #define OV7610_REG_BLUE 0x01 /* blue channel balance */
125 #define OV7610_REG_RED 0x02 /* red channel balance */
126 #define OV7610_REG_SAT 0x03 /* saturation */
127 /* 04 reserved */
128 #define OV7610_REG_CNT 0x05 /* Y contrast */
129 #define OV7610_REG_BRT 0x06 /* Y brightness */
130 /* 08-0b reserved */
131 #define OV7610_REG_BLUE_BIAS 0x0C /* blue channel bias (5:0) */
132 #define OV7610_REG_RED_BIAS 0x0D /* read channel bias (5:0) */
133 #define OV7610_REG_GAMMA_COEFF 0x0E /* gamma settings */
134 #define OV7610_REG_WB_RANGE 0x0F /* AEC/ALC/S-AWB settings */
135 #define OV7610_REG_EXP 0x10 /* manual exposure setting */
136 #define OV7610_REG_CLOCK 0x11 /* polarity/clock prescaler */
137 #define OV7610_REG_COM_A 0x12 /* misc common regs */
138 #define OV7610_REG_COM_B 0x13 /* misc common regs */
139 #define OV7610_REG_COM_C 0x14 /* misc common regs */
140 #define OV7610_REG_COM_D 0x15 /* misc common regs */
141 #define OV7610_REG_FIELD_DIVIDE 0x16 /* field interval/mode settings */
142 #define OV7610_REG_HWIN_START 0x17 /* horizontal window start */
143 #define OV7610_REG_HWIN_END 0x18 /* horizontal window end */
144 #define OV7610_REG_VWIN_START 0x19 /* vertical window start */
145 #define OV7610_REG_VWIN_END 0x1A /* vertical window end */
146 #define OV7610_REG_PIXEL_SHIFT 0x1B /* pixel shift */
147 #define OV7610_REG_ID_HIGH 0x1C /* manufacturer ID MSB */
148 #define OV7610_REG_ID_LOW 0x1D /* manufacturer ID LSB */
149 /* 0e-0f reserved */
150 #define OV7610_REG_COM_E 0x20 /* misc common regs */
151 #define OV7610_REG_YOFFSET 0x21 /* Y channel offset */
152 #define OV7610_REG_UOFFSET 0x22 /* U channel offset */
153 /* 23 reserved */
154 #define OV7610_REG_ECW 0x24 /* Exposure white level for AEC */
155 #define OV7610_REG_ECB 0x25 /* Exposure black level for AEC */
156 #define OV7610_REG_COM_F 0x26 /* misc settings */
157 #define OV7610_REG_COM_G 0x27 /* misc settings */
158 #define OV7610_REG_COM_H 0x28 /* misc settings */
159 #define OV7610_REG_COM_I 0x29 /* misc settings */
160 #define OV7610_REG_FRAMERATE_H 0x2A /* frame rate MSB + misc */
161 #define OV7610_REG_FRAMERATE_L 0x2B /* frame rate LSB */
162 #define OV7610_REG_ALC 0x2C /* Auto Level Control settings */
163 #define OV7610_REG_COM_J 0x2D /* misc settings */
164 #define OV7610_REG_VOFFSET 0x2E /* V channel offset adjustment */
165 #define OV7610_REG_ARRAY_BIAS 0x2F /* Array bias -- don't change */
166 /* 30-32 reserved */
167 #define OV7610_REG_YGAMMA 0x33 /* misc gamma settings (7:6) */
168 #define OV7610_REG_BIAS_ADJUST 0x34 /* misc bias settings */
169 #define OV7610_REG_COM_L 0x35 /* misc settings */
170 /* 36-37 reserved */
171 #define OV7610_REG_COM_K 0x38 /* misc registers */
172
173
174 #define SCRATCH_BUF_SIZE 512
175
176 #define FRAMES_PER_DESC 10 /* FIXME - What should this be? */
177 #define FRAME_SIZE_PER_DESC 993 /* FIXME - Deprecated */
178 #define MAX_FRAME_SIZE_PER_DESC 993 /* For statically allocated stuff */
179
180 #define OV511_ENDPOINT_ADDRESS 1 /* Isoc endpoint number */
181
182 // CAMERA SPECIFIC
183 // FIXME - these can vary between specific models
184 #define OV7610_I2C_WRITE_ID 0x42
185 #define OV7610_I2C_READ_ID 0x43
186 #define OV6xx0_I2C_WRITE_ID 0xC0
187 #define OV6xx0_I2C_READ_ID 0xC1
188
189 #define OV511_I2C_CLOCK_PRESCALER 0x03
190
191 /* Prototypes */
192 int usb_ov511_reg_read(struct usb_device *dev, unsigned char reg);
193 int usb_ov511_reg_write(struct usb_device *dev,
194 unsigned char reg,
195 unsigned char value);
196
197 /* Bridge types */
198 enum {
199 BRG_OV511,
200 BRG_OV511PLUS,
201 };
202
203 /* Sensor types */
204 enum {
205 SEN_UNKNOWN,
206 SEN_OV7610,
207 SEN_OV7620,
208 SEN_OV7620AE,
209 SEN_OV6620,
210 };
211
212 enum {
213 STATE_SCANNING, /* Scanning for start */
214 STATE_HEADER, /* Parsing header */
215 STATE_LINES, /* Parsing lines */
216 };
217
218 /* Buffer states */
219 enum {
220 BUF_NOT_ALLOCATED,
221 BUF_ALLOCATED,
222 BUF_PEND_DEALLOC, /* ov511->buf_timer is set */
223 };
224
225 struct usb_device;
226
227 struct ov511_sbuf {
228 char *data;
229 urb_t *urb;
230 };
231
232 enum {
233 FRAME_UNUSED, /* Unused (no MCAPTURE) */
234 FRAME_READY, /* Ready to start grabbing */
235 FRAME_GRABBING, /* In the process of being grabbed into */
236 FRAME_DONE, /* Finished grabbing, but not been synced yet */
237 FRAME_ERROR, /* Something bad happened while processing */
238 };
239
240 struct ov511_regvals {
241 enum {
242 OV511_DONE_BUS,
243 OV511_REG_BUS,
244 OV511_I2C_BUS,
245 } bus;
246 unsigned char reg;
247 unsigned char val;
248 };
249
250 struct ov511_frame {
251 char *data; /* Frame buffer */
252
253 int depth; /* Bytes per pixel */
254 int width; /* Width application is expecting */
255 int height; /* Height */
256
257 int hdrwidth; /* Width the frame actually is */
258 int hdrheight; /* Height */
259
260 int sub_flag; /* Sub-capture mode for this frame? */
261 unsigned int format; /* Format for this frame */
262 int segsize; /* How big is each segment from the camera? */
263
264 volatile int grabstate; /* State of grabbing */
265 int scanstate; /* State of scanning */
266
267 int curline; /* Line of frame we're working on */
268 int curpix;
269 int segment; /* Segment from the incoming data */
270
271 long scanlength; /* uncompressed, raw data length of frame */
272 long bytes_read; /* amount of scanlength that has been read from *data */
273
274 wait_queue_head_t wq; /* Processes waiting */
275
276 int snapshot; /* True if frame was a snapshot */
277 };
278
279 #define OV511_NUMFRAMES 2
280 #define OV511_NUMSBUF 2
281
282 struct usb_ov511 {
283 struct video_device vdev;
284
285 /* Device structure */
286 struct usb_device *dev;
287
288 int customid;
289 int desc;
290 unsigned char iface;
291
292 /* Determined by sensor type */
293 int maxwidth;
294 int maxheight;
295
296 int brightness;
297 int colour;
298 int contrast;
299 int hue;
300 int whiteness;
301
302 struct semaphore lock;
303 int user; /* user count for exclusive use */
304
305 int streaming; /* Are we streaming Isochronous? */
306 int grabbing; /* Are we grabbing? */
307
308 int compress; /* Should the next frame be compressed? */
309
310 char *fbuf; /* Videodev buffer area */
311
312 int sub_flag; /* Pix Array subcapture on flag */
313 int subx; /* Pix Array subcapture x offset */
314 int suby; /* Pix Array subcapture y offset */
315 int subw; /* Pix Array subcapture width */
316 int subh; /* Pix Array subcapture height */
317
318 int curframe; /* Current receiving sbuf */
319 struct ov511_frame frame[OV511_NUMFRAMES];
320
321 int cursbuf; /* Current receiving sbuf */
322 struct ov511_sbuf sbuf[OV511_NUMSBUF];
323
324 /* Scratch space from the Isochronous pipe */
325 unsigned char scratch[SCRATCH_BUF_SIZE];
326 int scratchlen;
327
328 wait_queue_head_t wq; /* Processes waiting */
329
330 int snap_enabled; /* Snapshot mode enabled */
331
332 int bridge; /* Type of bridge (OV511 or OV511+) */
333 int sensor; /* Type of image sensor chip */
334
335 int packet_size; /* Frame size per isoc desc */
336
337 /* proc interface */
338 struct semaphore param_lock; /* params lock for this camera */
339 struct proc_dir_entry *proc_entry; /* /proc/ov511/videoX */
340
341 /* Framebuffer/sbuf management */
342 int buf_state;
343 struct semaphore buf_lock;
344 struct timer_list buf_timer;
345 };
346
347 struct cam_list {
348 int id;
349 char *description;
350 };
351
352 struct palette_list {
353 int num;
354 char *name;
355 };
356
357 struct mode_list {
358 int width;
359 int height;
360 int color; /* 0=grayscale, 1=color */
361 u8 pxcnt; /* pixel counter */
362 u8 lncnt; /* line counter */
363 u8 pxdv; /* pixel divisor */
364 u8 lndv; /* line divisor */
365 u8 m420;
366 u8 common_A;
367 u8 common_L;
368 };
369
370 #endif
371
372
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.