diff options
Diffstat (limited to 'drivers/media/usb/cpia2/cpia2.h')
-rw-r--r-- | drivers/media/usb/cpia2/cpia2.h | 487 |
1 files changed, 487 insertions, 0 deletions
diff --git a/drivers/media/usb/cpia2/cpia2.h b/drivers/media/usb/cpia2/cpia2.h new file mode 100644 index 000000000000..cdef677d57ec --- /dev/null +++ b/drivers/media/usb/cpia2/cpia2.h | |||
@@ -0,0 +1,487 @@ | |||
1 | /**************************************************************************** | ||
2 | * | ||
3 | * Filename: cpia2.h | ||
4 | * | ||
5 | * Copyright 2001, STMicrolectronics, Inc. | ||
6 | * | ||
7 | * Contact: steve.miller@st.com | ||
8 | * | ||
9 | * Description: | ||
10 | * This is a USB driver for CPiA2 based video cameras. | ||
11 | * | ||
12 | * This driver is modelled on the cpia usb driver by | ||
13 | * Jochen Scharrlach and Johannes Erdfeldt. | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
28 | * | ||
29 | ****************************************************************************/ | ||
30 | |||
31 | #ifndef __CPIA2_H__ | ||
32 | #define __CPIA2_H__ | ||
33 | |||
34 | #include <linux/videodev2.h> | ||
35 | #include <linux/usb.h> | ||
36 | #include <linux/poll.h> | ||
37 | #include <media/v4l2-common.h> | ||
38 | #include <media/v4l2-device.h> | ||
39 | #include <media/v4l2-ctrls.h> | ||
40 | |||
41 | #include "cpia2_registers.h" | ||
42 | |||
43 | /* define for verbose debug output */ | ||
44 | //#define _CPIA2_DEBUG_ | ||
45 | |||
46 | /*** | ||
47 | * Image defines | ||
48 | ***/ | ||
49 | |||
50 | /* Misc constants */ | ||
51 | #define ALLOW_CORRUPT 0 /* Causes collater to discard checksum */ | ||
52 | |||
53 | /* USB Transfer mode */ | ||
54 | #define XFER_ISOC 0 | ||
55 | #define XFER_BULK 1 | ||
56 | |||
57 | /* USB Alternates */ | ||
58 | #define USBIF_CMDONLY 0 | ||
59 | #define USBIF_BULK 1 | ||
60 | #define USBIF_ISO_1 2 /* 128 bytes/ms */ | ||
61 | #define USBIF_ISO_2 3 /* 384 bytes/ms */ | ||
62 | #define USBIF_ISO_3 4 /* 640 bytes/ms */ | ||
63 | #define USBIF_ISO_4 5 /* 768 bytes/ms */ | ||
64 | #define USBIF_ISO_5 6 /* 896 bytes/ms */ | ||
65 | #define USBIF_ISO_6 7 /* 1023 bytes/ms */ | ||
66 | |||
67 | /* Flicker Modes */ | ||
68 | #define NEVER_FLICKER 0 | ||
69 | #define FLICKER_60 60 | ||
70 | #define FLICKER_50 50 | ||
71 | |||
72 | /* Debug flags */ | ||
73 | #define DEBUG_NONE 0 | ||
74 | #define DEBUG_REG 0x00000001 | ||
75 | #define DEBUG_DUMP_PATCH 0x00000002 | ||
76 | #define DEBUG_DUMP_REGS 0x00000004 | ||
77 | |||
78 | /*** | ||
79 | * Video frame sizes | ||
80 | ***/ | ||
81 | enum { | ||
82 | VIDEOSIZE_VGA = 0, /* 640x480 */ | ||
83 | VIDEOSIZE_CIF, /* 352x288 */ | ||
84 | VIDEOSIZE_QVGA, /* 320x240 */ | ||
85 | VIDEOSIZE_QCIF, /* 176x144 */ | ||
86 | VIDEOSIZE_288_216, | ||
87 | VIDEOSIZE_256_192, | ||
88 | VIDEOSIZE_224_168, | ||
89 | VIDEOSIZE_192_144, | ||
90 | }; | ||
91 | |||
92 | #define STV_IMAGE_CIF_ROWS 288 | ||
93 | #define STV_IMAGE_CIF_COLS 352 | ||
94 | |||
95 | #define STV_IMAGE_QCIF_ROWS 144 | ||
96 | #define STV_IMAGE_QCIF_COLS 176 | ||
97 | |||
98 | #define STV_IMAGE_VGA_ROWS 480 | ||
99 | #define STV_IMAGE_VGA_COLS 640 | ||
100 | |||
101 | #define STV_IMAGE_QVGA_ROWS 240 | ||
102 | #define STV_IMAGE_QVGA_COLS 320 | ||
103 | |||
104 | #define JPEG_MARKER_COM (1<<6) /* Comment segment */ | ||
105 | |||
106 | /*** | ||
107 | * Enums | ||
108 | ***/ | ||
109 | /* Sensor types available with cpia2 asics */ | ||
110 | enum sensors { | ||
111 | CPIA2_SENSOR_410, | ||
112 | CPIA2_SENSOR_500 | ||
113 | }; | ||
114 | |||
115 | /* Asic types available in the CPiA2 architecture */ | ||
116 | #define CPIA2_ASIC_672 0x67 | ||
117 | |||
118 | /* Device types (stv672, stv676, etc) */ | ||
119 | #define DEVICE_STV_672 0x0001 | ||
120 | #define DEVICE_STV_676 0x0002 | ||
121 | |||
122 | enum frame_status { | ||
123 | FRAME_EMPTY, | ||
124 | FRAME_READING, /* In the process of being grabbed into */ | ||
125 | FRAME_READY, /* Ready to be read */ | ||
126 | FRAME_ERROR, | ||
127 | }; | ||
128 | |||
129 | /*** | ||
130 | * Register access (for USB request byte) | ||
131 | ***/ | ||
132 | enum { | ||
133 | CAMERAACCESS_SYSTEM = 0, | ||
134 | CAMERAACCESS_VC, | ||
135 | CAMERAACCESS_VP, | ||
136 | CAMERAACCESS_IDATA | ||
137 | }; | ||
138 | |||
139 | #define CAMERAACCESS_TYPE_BLOCK 0x00 | ||
140 | #define CAMERAACCESS_TYPE_RANDOM 0x04 | ||
141 | #define CAMERAACCESS_TYPE_MASK 0x08 | ||
142 | #define CAMERAACCESS_TYPE_REPEAT 0x0C | ||
143 | |||
144 | #define TRANSFER_READ 0 | ||
145 | #define TRANSFER_WRITE 1 | ||
146 | |||
147 | #define DEFAULT_ALT USBIF_ISO_6 | ||
148 | #define DEFAULT_BRIGHTNESS 0x46 | ||
149 | #define DEFAULT_CONTRAST 0x93 | ||
150 | #define DEFAULT_SATURATION 0x7f | ||
151 | |||
152 | /* Power state */ | ||
153 | #define HI_POWER_MODE CPIA2_SYSTEM_CONTROL_HIGH_POWER | ||
154 | #define LO_POWER_MODE CPIA2_SYSTEM_CONTROL_LOW_POWER | ||
155 | |||
156 | |||
157 | /******** | ||
158 | * Commands | ||
159 | *******/ | ||
160 | enum { | ||
161 | CPIA2_CMD_NONE = 0, | ||
162 | CPIA2_CMD_GET_VERSION, | ||
163 | CPIA2_CMD_GET_PNP_ID, | ||
164 | CPIA2_CMD_GET_ASIC_TYPE, | ||
165 | CPIA2_CMD_GET_SENSOR, | ||
166 | CPIA2_CMD_GET_VP_DEVICE, | ||
167 | CPIA2_CMD_GET_VP_BRIGHTNESS, | ||
168 | CPIA2_CMD_SET_VP_BRIGHTNESS, | ||
169 | CPIA2_CMD_GET_CONTRAST, | ||
170 | CPIA2_CMD_SET_CONTRAST, | ||
171 | CPIA2_CMD_GET_VP_SATURATION, | ||
172 | CPIA2_CMD_SET_VP_SATURATION, | ||
173 | CPIA2_CMD_GET_VP_GPIO_DIRECTION, | ||
174 | CPIA2_CMD_SET_VP_GPIO_DIRECTION, | ||
175 | CPIA2_CMD_GET_VP_GPIO_DATA, | ||
176 | CPIA2_CMD_SET_VP_GPIO_DATA, | ||
177 | CPIA2_CMD_GET_VC_MP_GPIO_DIRECTION, | ||
178 | CPIA2_CMD_SET_VC_MP_GPIO_DIRECTION, | ||
179 | CPIA2_CMD_GET_VC_MP_GPIO_DATA, | ||
180 | CPIA2_CMD_SET_VC_MP_GPIO_DATA, | ||
181 | CPIA2_CMD_ENABLE_PACKET_CTRL, | ||
182 | CPIA2_CMD_GET_FLICKER_MODES, | ||
183 | CPIA2_CMD_SET_FLICKER_MODES, | ||
184 | CPIA2_CMD_RESET_FIFO, /* clear fifo and enable stream block */ | ||
185 | CPIA2_CMD_SET_HI_POWER, | ||
186 | CPIA2_CMD_SET_LOW_POWER, | ||
187 | CPIA2_CMD_CLEAR_V2W_ERR, | ||
188 | CPIA2_CMD_SET_USER_MODE, | ||
189 | CPIA2_CMD_GET_USER_MODE, | ||
190 | CPIA2_CMD_FRAMERATE_REQ, | ||
191 | CPIA2_CMD_SET_COMPRESSION_STATE, | ||
192 | CPIA2_CMD_GET_WAKEUP, | ||
193 | CPIA2_CMD_SET_WAKEUP, | ||
194 | CPIA2_CMD_GET_PW_CONTROL, | ||
195 | CPIA2_CMD_SET_PW_CONTROL, | ||
196 | CPIA2_CMD_GET_SYSTEM_CTRL, | ||
197 | CPIA2_CMD_SET_SYSTEM_CTRL, | ||
198 | CPIA2_CMD_GET_VP_SYSTEM_STATE, | ||
199 | CPIA2_CMD_GET_VP_SYSTEM_CTRL, | ||
200 | CPIA2_CMD_SET_VP_SYSTEM_CTRL, | ||
201 | CPIA2_CMD_GET_VP_EXP_MODES, | ||
202 | CPIA2_CMD_SET_VP_EXP_MODES, | ||
203 | CPIA2_CMD_GET_DEVICE_CONFIG, | ||
204 | CPIA2_CMD_SET_DEVICE_CONFIG, | ||
205 | CPIA2_CMD_SET_SERIAL_ADDR, | ||
206 | CPIA2_CMD_SET_SENSOR_CR1, | ||
207 | CPIA2_CMD_GET_VC_CONTROL, | ||
208 | CPIA2_CMD_SET_VC_CONTROL, | ||
209 | CPIA2_CMD_SET_TARGET_KB, | ||
210 | CPIA2_CMD_SET_DEF_JPEG_OPT, | ||
211 | CPIA2_CMD_REHASH_VP4, | ||
212 | CPIA2_CMD_GET_USER_EFFECTS, | ||
213 | CPIA2_CMD_SET_USER_EFFECTS | ||
214 | }; | ||
215 | |||
216 | enum user_cmd { | ||
217 | COMMAND_NONE = 0x00000001, | ||
218 | COMMAND_SET_FPS = 0x00000002, | ||
219 | COMMAND_SET_COLOR_PARAMS = 0x00000004, | ||
220 | COMMAND_GET_COLOR_PARAMS = 0x00000008, | ||
221 | COMMAND_SET_FORMAT = 0x00000010, /* size, etc */ | ||
222 | COMMAND_SET_FLICKER = 0x00000020 | ||
223 | }; | ||
224 | |||
225 | /*** | ||
226 | * Some defines specific to the 676 chip | ||
227 | ***/ | ||
228 | #define CAMACC_CIF 0x01 | ||
229 | #define CAMACC_VGA 0x02 | ||
230 | #define CAMACC_QCIF 0x04 | ||
231 | #define CAMACC_QVGA 0x08 | ||
232 | |||
233 | |||
234 | struct cpia2_register { | ||
235 | u8 index; | ||
236 | u8 value; | ||
237 | }; | ||
238 | |||
239 | struct cpia2_reg_mask { | ||
240 | u8 index; | ||
241 | u8 and_mask; | ||
242 | u8 or_mask; | ||
243 | u8 fill; | ||
244 | }; | ||
245 | |||
246 | struct cpia2_command { | ||
247 | u32 command; | ||
248 | u8 req_mode; /* (Block or random) | registerBank */ | ||
249 | u8 reg_count; | ||
250 | u8 direction; | ||
251 | u8 start; | ||
252 | union reg_types { | ||
253 | struct cpia2_register registers[32]; | ||
254 | struct cpia2_reg_mask masks[16]; | ||
255 | u8 block_data[64]; | ||
256 | u8 *patch_data; /* points to function defined block */ | ||
257 | } buffer; | ||
258 | }; | ||
259 | |||
260 | struct camera_params { | ||
261 | struct { | ||
262 | u8 firmware_revision_hi; /* For system register set (bank 0) */ | ||
263 | u8 firmware_revision_lo; | ||
264 | u8 asic_id; /* Video Compressor set (bank 1) */ | ||
265 | u8 asic_rev; | ||
266 | u8 vp_device_hi; /* Video Processor set (bank 2) */ | ||
267 | u8 vp_device_lo; | ||
268 | u8 sensor_flags; | ||
269 | u8 sensor_rev; | ||
270 | } version; | ||
271 | |||
272 | struct { | ||
273 | u32 device_type; /* enumerated from vendor/product ids. | ||
274 | * Currently, either STV_672 or STV_676 */ | ||
275 | u16 vendor; | ||
276 | u16 product; | ||
277 | u16 device_revision; | ||
278 | } pnp_id; | ||
279 | |||
280 | struct { | ||
281 | u8 brightness; /* CPIA2_VP_EXPOSURE_TARGET */ | ||
282 | u8 contrast; /* Note: this is CPIA2_VP_YRANGE */ | ||
283 | u8 saturation; /* CPIA2_VP_SATURATION */ | ||
284 | } color_params; | ||
285 | |||
286 | struct { | ||
287 | u8 cam_register; | ||
288 | u8 flicker_mode_req; /* 1 if flicker on, else never flicker */ | ||
289 | } flicker_control; | ||
290 | |||
291 | struct { | ||
292 | u8 jpeg_options; | ||
293 | u8 creep_period; | ||
294 | u8 user_squeeze; | ||
295 | u8 inhibit_htables; | ||
296 | } compression; | ||
297 | |||
298 | struct { | ||
299 | u8 ohsize; /* output image size */ | ||
300 | u8 ovsize; | ||
301 | u8 hcrop; /* cropping start_pos/4 */ | ||
302 | u8 vcrop; | ||
303 | u8 hphase; /* scaling registers */ | ||
304 | u8 vphase; | ||
305 | u8 hispan; | ||
306 | u8 vispan; | ||
307 | u8 hicrop; | ||
308 | u8 vicrop; | ||
309 | u8 hifraction; | ||
310 | u8 vifraction; | ||
311 | } image_size; | ||
312 | |||
313 | struct { | ||
314 | int width; /* actual window width */ | ||
315 | int height; /* actual window height */ | ||
316 | } roi; | ||
317 | |||
318 | struct { | ||
319 | u8 video_mode; | ||
320 | u8 frame_rate; | ||
321 | u8 video_size; /* Not a register, just a convenience for cropped sizes */ | ||
322 | u8 gpio_direction; | ||
323 | u8 gpio_data; | ||
324 | u8 system_ctrl; | ||
325 | u8 system_state; | ||
326 | u8 lowlight_boost; /* Bool: 0 = off, 1 = on */ | ||
327 | u8 device_config; | ||
328 | u8 exposure_modes; | ||
329 | u8 user_effects; | ||
330 | } vp_params; | ||
331 | |||
332 | struct { | ||
333 | u8 pw_control; | ||
334 | u8 wakeup; | ||
335 | u8 vc_control; | ||
336 | u8 vc_mp_direction; | ||
337 | u8 vc_mp_data; | ||
338 | u8 quality; | ||
339 | } vc_params; | ||
340 | |||
341 | struct { | ||
342 | u8 power_mode; | ||
343 | u8 system_ctrl; | ||
344 | u8 stream_mode; /* This is the current alternate for usb drivers */ | ||
345 | u8 allow_corrupt; | ||
346 | } camera_state; | ||
347 | }; | ||
348 | |||
349 | #define NUM_SBUF 2 | ||
350 | |||
351 | struct cpia2_sbuf { | ||
352 | char *data; | ||
353 | struct urb *urb; | ||
354 | }; | ||
355 | |||
356 | struct framebuf { | ||
357 | struct timeval timestamp; | ||
358 | unsigned long seq; | ||
359 | int num; | ||
360 | int length; | ||
361 | int max_length; | ||
362 | volatile enum frame_status status; | ||
363 | u8 *data; | ||
364 | struct framebuf *next; | ||
365 | }; | ||
366 | |||
367 | struct camera_data { | ||
368 | /* locks */ | ||
369 | struct v4l2_device v4l2_dev; | ||
370 | struct mutex v4l2_lock; /* serialize file operations */ | ||
371 | struct v4l2_ctrl_handler hdl; | ||
372 | struct { | ||
373 | /* Lights control cluster */ | ||
374 | struct v4l2_ctrl *top_light; | ||
375 | struct v4l2_ctrl *bottom_light; | ||
376 | }; | ||
377 | struct v4l2_ctrl *usb_alt; | ||
378 | |||
379 | /* camera status */ | ||
380 | int first_image_seen; | ||
381 | enum sensors sensor_type; | ||
382 | u8 flush; | ||
383 | struct v4l2_fh *stream_fh; | ||
384 | u8 mmapped; | ||
385 | int streaming; /* 0 = no, 1 = yes */ | ||
386 | int xfer_mode; /* XFER_BULK or XFER_ISOC */ | ||
387 | struct camera_params params; /* camera settings */ | ||
388 | |||
389 | /* v4l */ | ||
390 | int video_size; /* VIDEO_SIZE_ */ | ||
391 | struct video_device vdev; /* v4l videodev */ | ||
392 | u32 width; | ||
393 | u32 height; /* Its size */ | ||
394 | __u32 pixelformat; /* Format fourcc */ | ||
395 | |||
396 | /* USB */ | ||
397 | struct usb_device *dev; | ||
398 | unsigned char iface; | ||
399 | unsigned int cur_alt; | ||
400 | unsigned int old_alt; | ||
401 | struct cpia2_sbuf sbuf[NUM_SBUF]; /* Double buffering */ | ||
402 | |||
403 | wait_queue_head_t wq_stream; | ||
404 | |||
405 | /* Buffering */ | ||
406 | u32 frame_size; | ||
407 | int num_frames; | ||
408 | unsigned long frame_count; | ||
409 | u8 *frame_buffer; /* frame buffer data */ | ||
410 | struct framebuf *buffers; | ||
411 | struct framebuf * volatile curbuff; | ||
412 | struct framebuf *workbuff; | ||
413 | |||
414 | /* MJPEG Extension */ | ||
415 | int APPn; /* Number of APP segment to be written, must be 0..15 */ | ||
416 | int APP_len; /* Length of data in JPEG APPn segment */ | ||
417 | char APP_data[60]; /* Data in the JPEG APPn segment. */ | ||
418 | |||
419 | int COM_len; /* Length of data in JPEG COM segment */ | ||
420 | char COM_data[60]; /* Data in JPEG COM segment */ | ||
421 | }; | ||
422 | |||
423 | /* v4l */ | ||
424 | int cpia2_register_camera(struct camera_data *cam); | ||
425 | void cpia2_unregister_camera(struct camera_data *cam); | ||
426 | void cpia2_camera_release(struct v4l2_device *v4l2_dev); | ||
427 | |||
428 | /* core */ | ||
429 | int cpia2_reset_camera(struct camera_data *cam); | ||
430 | int cpia2_set_low_power(struct camera_data *cam); | ||
431 | void cpia2_dbg_dump_registers(struct camera_data *cam); | ||
432 | int cpia2_match_video_size(int width, int height); | ||
433 | void cpia2_set_camera_state(struct camera_data *cam); | ||
434 | void cpia2_save_camera_state(struct camera_data *cam); | ||
435 | void cpia2_set_color_params(struct camera_data *cam); | ||
436 | void cpia2_set_brightness(struct camera_data *cam, unsigned char value); | ||
437 | void cpia2_set_contrast(struct camera_data *cam, unsigned char value); | ||
438 | void cpia2_set_saturation(struct camera_data *cam, unsigned char value); | ||
439 | int cpia2_set_flicker_mode(struct camera_data *cam, int mode); | ||
440 | void cpia2_set_format(struct camera_data *cam); | ||
441 | int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd); | ||
442 | int cpia2_do_command(struct camera_data *cam, | ||
443 | unsigned int command, | ||
444 | unsigned char direction, unsigned char param); | ||
445 | struct camera_data *cpia2_init_camera_struct(struct usb_interface *intf); | ||
446 | int cpia2_init_camera(struct camera_data *cam); | ||
447 | int cpia2_allocate_buffers(struct camera_data *cam); | ||
448 | void cpia2_free_buffers(struct camera_data *cam); | ||
449 | long cpia2_read(struct camera_data *cam, | ||
450 | char __user *buf, unsigned long count, int noblock); | ||
451 | unsigned int cpia2_poll(struct camera_data *cam, | ||
452 | struct file *filp, poll_table *wait); | ||
453 | int cpia2_remap_buffer(struct camera_data *cam, struct vm_area_struct *vma); | ||
454 | void cpia2_set_property_flip(struct camera_data *cam, int prop_val); | ||
455 | void cpia2_set_property_mirror(struct camera_data *cam, int prop_val); | ||
456 | int cpia2_set_gpio(struct camera_data *cam, unsigned char setting); | ||
457 | int cpia2_set_fps(struct camera_data *cam, int framerate); | ||
458 | |||
459 | /* usb */ | ||
460 | int cpia2_usb_init(void); | ||
461 | void cpia2_usb_cleanup(void); | ||
462 | int cpia2_usb_transfer_cmd(struct camera_data *cam, void *registers, | ||
463 | u8 request, u8 start, u8 count, u8 direction); | ||
464 | int cpia2_usb_stream_start(struct camera_data *cam, unsigned int alternate); | ||
465 | int cpia2_usb_stream_stop(struct camera_data *cam); | ||
466 | int cpia2_usb_stream_pause(struct camera_data *cam); | ||
467 | int cpia2_usb_stream_resume(struct camera_data *cam); | ||
468 | int cpia2_usb_change_streaming_alternate(struct camera_data *cam, | ||
469 | unsigned int alt); | ||
470 | |||
471 | |||
472 | /* ----------------------- debug functions ---------------------- */ | ||
473 | #ifdef _CPIA2_DEBUG_ | ||
474 | #define ALOG(lev, fmt, args...) printk(lev "%s:%d %s(): " fmt, __FILE__, __LINE__, __func__, ## args) | ||
475 | #define LOG(fmt, args...) ALOG(KERN_INFO, fmt, ## args) | ||
476 | #define ERR(fmt, args...) ALOG(KERN_ERR, fmt, ## args) | ||
477 | #define DBG(fmt, args...) ALOG(KERN_DEBUG, fmt, ## args) | ||
478 | #else | ||
479 | #define ALOG(fmt,args...) printk(fmt,##args) | ||
480 | #define LOG(fmt,args...) ALOG(KERN_INFO "cpia2: "fmt,##args) | ||
481 | #define ERR(fmt,args...) ALOG(KERN_ERR "cpia2: "fmt,##args) | ||
482 | #define DBG(fmn,args...) do {} while(0) | ||
483 | #endif | ||
484 | /* No function or lineno, for shorter lines */ | ||
485 | #define KINFO(fmt, args...) printk(KERN_INFO fmt,##args) | ||
486 | |||
487 | #endif | ||