Fix 62B3 to use correct format decoding routines
[microdia.git] / microdia.h
blob992ed497a3829fcc6a026a71354f82600f2472bf
1 /**
2 * @file microdia.h
3 * @author Nicolas VIVIEN
4 * @date 2008-02-01
5 * @version v0.0.0
7 * @brief Driver for Microdia USB video camera
9 * @note Copyright (C) Nicolas VIVIEN
11 * @par Licences
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License as published by
15 * the Free Software Foundation; either version 2 of the License, or
16 * any later version.
18 * This program is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include <linux/kernel.h>
29 #include <linux/version.h>
30 #include <linux/usb.h>
31 #include <media/v4l2-common.h>
33 #ifndef MICRODIA_H
34 #define MICRODIA_H
37 #define DRIVER_NAME "microdia" /**< Name of this driver */
38 #define DRIVER_VERSION "v0.0.0" /**< Version of this driver */
39 #define DRIVER_VERSION_NUM 0x000000 /**< Version numerical of this driver */
40 #define DRIVER_DESC "Microdia USB Video Camera" /**< Short description of this driver */
41 #define DRIVER_AUTHOR "Nicolas VIVIEN" /**< Author of this driver */
42 #define PREFIX DRIVER_NAME ": " /**< Prefix use for the MICRODIA "printk" */
44 #define USB_VENDOR_ID_MICRODIA 0x0c45 /**< Vendor ID of MICRODIA */
45 #define USB_VENDOR_ID_MICROSOFT 0x045e /**< Vendor ID of MICROSOFT */
46 #define USB_VENDOR_ID_CHICONY 0x04f2 /**< Vendor ID of CHICONY */
47 #define USB_VENDOR_ID_TRUST 0x145f /**< Vendor ID of TRUST */
49 // SN9C201:
50 #define USB_UDIA_MICRODIA_PRODUCT_ID_6240 0x6240 /**< SN9C201 + MI1300 */
51 #define USB_UDIA_MICRODIA_PRODUCT_ID_6242 0x6242 /**< SN9C201 + MI1310 */
52 #define USB_UDIA_MICRODIA_PRODUCT_ID_6243 0x6243 /**< SN9C201 + S5K4AAFX */
53 #define USB_UDIA_MICRODIA_PRODUCT_ID_6248 0x6248 /**< SN9C201 + OV9655 */
54 #define USB_UDIA_MICRODIA_PRODUCT_ID_624B 0x624b /**< SN9C201 + CX1332 */
55 #define USB_UDIA_MICRODIA_PRODUCT_ID_624C 0x624c /**< SN9C201 + MI1320 */
56 #define USB_UDIA_MICRODIA_PRODUCT_ID_624E 0x624e /**< SN9C201 + SOI968 */
57 #define USB_UDIA_MICRODIA_PRODUCT_ID_624F 0x624f /**< SN9C201 + OV9650 */
58 #define USB_UDIA_MICRODIA_PRODUCT_ID_6253 0x6253 /**< SN9C201 + OV9650 */
59 #define USB_UDIA_MICRODIA_PRODUCT_ID_6260 0x6260 /**< SN9C201 + OV7670ISP */
60 #define USB_UDIA_MICRODIA_PRODUCT_ID_6262 0x6262 /**< SN9C201 + OM6802 */
61 #define USB_UDIA_MICRODIA_PRODUCT_ID_6270 0x6270 /**< SN9C201 + MI0360/MT9V111 */
62 #define USB_UDIA_MICRODIA_PRODUCT_ID_627A 0x627a /**< SN9C201 + S5K53BEB */
63 #define USB_UDIA_MICRODIA_PRODUCT_ID_627B 0x627b /**< SN9C201 + OV7660 */
64 #define USB_UDIA_MICRODIA_PRODUCT_ID_627C 0x627c /**< SN9C201 + HV7131R */
65 #define USB_UDIA_MICRODIA_PRODUCT_ID_627F 0x627f /**< EEPROM */
66 // SN9C202:
67 #define USB_UDIA_MICRODIA_PRODUCT_ID_6280 0x6280 /**< SN9C202 + MI1300 */
68 #define USB_UDIA_MICRODIA_PRODUCT_ID_6282 0x6282 /**< SN9C202 + MI1310 */
69 #define USB_UDIA_MICRODIA_PRODUCT_ID_6283 0x6283 /**< SN9C202 + S5K4AAFX */
70 #define USB_UDIA_MICRODIA_PRODUCT_ID_6288 0x6288 /**< SN9C202 + OV9655 */
71 #define USB_UDIA_MICRODIA_PRODUCT_ID_628A 0x628a /**< SN9C202 + ICM107 */
72 #define USB_UDIA_MICRODIA_PRODUCT_ID_628B 0x628b /**< SN9C202 + CX1332 */
73 #define USB_UDIA_MICRODIA_PRODUCT_ID_628C 0x628c /**< SN9C202 + MI1320 */
74 #define USB_UDIA_MICRODIA_PRODUCT_ID_628E 0x628e /**< SN9C202 + SOI968 */
75 #define USB_UDIA_MICRODIA_PRODUCT_ID_628F 0x628f /**< SN9C202 + OV9650 */
76 #define USB_UDIA_MICRODIA_PRODUCT_ID_62A0 0x62a0 /**< SN9C202 + OV7670ISP */
77 #define USB_UDIA_MICRODIA_PRODUCT_ID_62A2 0x62a2 /**< SN9C202 + OM6802 */
78 #define USB_UDIA_MICRODIA_PRODUCT_ID_62B0 0x62b0 /**< SN9C202 + MI0360/MT9V111 */
79 #define USB_UDIA_MICRODIA_PRODUCT_ID_62B3 0x62b3 /**< SN9C202 + OV9655 */
80 #define USB_UDIA_MICRODIA_PRODUCT_ID_62BA 0x62ba /**< SN9C202 + S5K53BEB */
81 #define USB_UDIA_MICRODIA_PRODUCT_ID_62BB 0x62bb /**< SN9C202 + OV7660 */
82 #define USB_UDIA_MICRODIA_PRODUCT_ID_62BC 0x62bc /**< SN9C202 + HV7131R */
83 #define USB_UDIA_MICRODIA_PRODUCT_ID_62BE 0x62be /**< SN9C202 + OV7663 */
84 // SN9C325:
85 #define USB_UDIA_MICRODIA_PRODUCT_ID_6128 0x6128 /**< SN9C325 + OM6802 */
86 #define USB_UDIA_MICRODIA_PRODUCT_ID_612A 0x612a /**< SN9C325 + OV7648 + POx1030xC + SOI768 + PO2030N + OV7660 + OV7670 + HV7131R */
87 // *** "Clone"-devices ***:
88 // Microsoft LifeCam VX-6000:
89 #define USB_UDIA_MICROSOFT_PRODUCT_ID_00F4 0x00f4 /**< => 628f (SN9C202 + OV9650) */
90 // Trust WB-3600R:
91 #define USB_UDIA_TRUST_PRODUCT_ID_013D 0x013d /**< => 627b (SN9C201 + OV7660) */
92 // Chicony Panda 7, Trust WB-3450P:
93 #define USB_UDIA_CHICONY_PRODUCT_ID_A128 0xa128 /**< => 62be (SN9C202 + OV7663) + EEPROM */
97 /**
98 * @def VID_HARDWARE_MICRODIA
100 * This value must be inserted into the kernel headers linux/videodev.h
101 * It's useful only for the support of V4L v1
103 #define VID_HARDWARE_MICRODIA 88
109 * @def MAX_ISO_BUFS
110 * Number maximal of ISOC buffers
112 * @def ISO_FRAMES_PER_DESC
113 * Number frames per ISOC descriptor
115 #define MAX_ISO_BUFS 200
116 #define ISO_FRAMES_PER_DESC 10
119 * @def hb_multiplier(wMaxPacketSize)
120 * USB endpoint high bandwidth multiplier
122 * @def max_packet_sz(wMaxPacketSize)
123 * USB endpoint maximum packet size
125 * These values are both encoded within the wMaxPacketSize field of the usb_endpoint_descriptor structure.
126 * The 11(10:0) lowest bits hold the MaxPacketSize(according to the usb specs a value over 1024 is undefined),
127 * and the bits 12:11 will give the high bandwidth multiplier(this should be a value of 0-2).
130 #define hb_multiplier(wMaxPacketSize) (((wMaxPacketSize >> 11) & 0x03) + 1)
131 #define max_packet_sz(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
134 * @def MICRODIA_FRAME_SIZE
135 * Maximum size after decompression
137 #define MICRODIA_FRAME_SIZE (1280 * 1024 * 3)
140 * @def MICRODIA_FRAME_SIZE_DIVISOR_DEFAULT
141 * Most models have a Frame size of image_size + image_size/2
143 * @def MICRODIA_FRAME_SIZE_DIVISOR_6260
144 * The 6260 has a Frame size of image_size + image_size
146 #define MICRODIA_FRAME_SIZE_DIVISOR_DEFAULT 2
147 #define MICRODIA_FRAME_SIZE_DIVISOR_6260 1
150 * @def DRIVER_SUPPORT
152 * List of supported devices
154 #define DRIVER_SUPPORT "Microdia USB Camera"
157 * @def CONFIG_MICRODIA_DEBUG
158 * Enable / Disable the debug mode.
160 * @def UDIA_INFO(str, args...)
161 * Print information message.
162 * @a Use this function like the function printf.
164 * @def UDIA_ERROR(str, args...)
165 * Print error message.
166 * @a Use this function like the function printf.
168 * @def UDIA_WARNING(str, args...)
169 * Print warning message.
170 * @a Use this function like the function printf.
172 * @def UDIA_DEBUG(str, args...)
173 * Print debug message.
174 * @a Use this function like the function printf.
176 #ifndef CONFIG_MICRODIA_DEBUG
177 #define CONFIG_MICRODIA_DEBUG 0
178 #endif
180 #if CONFIG_MICRODIA_DEBUG
182 #define UDIA_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
183 #define UDIA_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
184 #define UDIA_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
185 #define UDIA_DEBUG(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
187 #else
189 #define UDIA_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
190 #define UDIA_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
191 #define UDIA_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
192 #define UDIA_DEBUG(str, args...) do { } while(0)
194 #endif
198 * @def CONFIG_MICRODIA_DEBUG_STREAM
199 * Enable / Disable the debug mode about the stream.
201 * @def UDIA_STREAM(str, args...)
202 * Print stream debug message.
203 * @a Use this function like the function printf.
205 #ifndef CONFIG_MICRODIA_DEBUG_STREAM
206 #define CONFIG_MICRODIA_DEBUG_STREAM 0
207 #endif
209 #if CONFIG_MICRODIA_DEBUG_STREAM
211 #define UDIA_STREAM(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
213 #else
215 #define UDIA_STREAM(str, args...) do { } while(0)
217 #endif
222 * @enum T_MICRODIA_DEVICE Video camera supported by the driver
224 typedef enum {
225 MICRODIA_6240 = 1,
226 MICRODIA_6242 = 2,
227 MICRODIA_6243 = 3,
228 MICRODIA_6248 = 4,
229 MICRODIA_624B = 5,
230 MICRODIA_624C = 6,
231 MICRODIA_624E = 7,
232 MICRODIA_624F = 8,
233 MICRODIA_6253 = 9,
234 MICRODIA_6260 = 10,
235 MICRODIA_6262 = 11,
236 MICRODIA_6270 = 12,
237 MICRODIA_627A = 13,
238 MICRODIA_627B = 14,
239 MICRODIA_627C = 15,
240 MICRODIA_627F = 16,
241 MICRODIA_6280 = 17,
242 MICRODIA_6282 = 18,
243 MICRODIA_6283 = 19,
244 MICRODIA_6288 = 20,
245 MICRODIA_628A = 21,
246 MICRODIA_628B = 22,
247 MICRODIA_628C = 23,
248 MICRODIA_628E = 24,
249 MICRODIA_628F = 25,
250 MICRODIA_62A0 = 26,
251 MICRODIA_62A2 = 27,
252 MICRODIA_62B0 = 28,
253 MICRODIA_62B3 = 29,
254 MICRODIA_62BA = 30,
255 MICRODIA_62BB = 31,
256 MICRODIA_62BC = 32,
257 MICRODIA_62BE = 33,
258 MICRODIA_6128 = 34,
259 MICRODIA_612A = 35
260 // DO NOT ADD CLONE-DEVICES HERE !
261 } T_MICRODIA_DEVICE;
265 * @enum T_MICRODIA_VIDEOMODE Video feature supported by camera
267 typedef enum {
268 MICRODIA_VGA, /**< For VGA video camera */
269 MICRODIA_SXGA, /**< For SXGA video camera 1.3M */
270 MICRODIA_UXGA /**< For UXGA video camera 2M */
271 } T_MICRODIA_VIDEOMODE;
274 /**
275 * @enum T_MICRODIA_RESOLUTION Video resolution
277 typedef enum {
278 MICRODIA_80x60,
279 /*MICRODIA_128x96,*/
280 MICRODIA_160x120,
281 /*MICRODIA_213x160, */
282 MICRODIA_320x240,
283 MICRODIA_640x480,
284 MICRODIA_800x600,
285 MICRODIA_1024x768,
286 MICRODIA_1280x1024,
287 MICRODIA_NBR_SIZES
288 } T_MICRODIA_RESOLUTION;
290 enum microdia_buffer_state {
291 MICRODIA_BUF_STATE_IDLE = 0,
292 MICRODIA_BUF_STATE_QUEUED = 1,
293 MICRODIA_BUF_STATE_ACTIVE = 2,
294 MICRODIA_BUF_STATE_DONE = 3,
295 MICRODIA_BUF_STATE_ERROR = 4,
298 enum microdia_mode {
299 MICRODIA_MODE_IDLE = 0,
300 MICRODIA_MODE_READ = 1,
301 MICRODIA_MODE_STREAM = 2,
304 struct microdia_buffer {
305 unsigned long vma_use_count;
306 struct list_head stream;
308 /* Touched by interrupt handler. */
309 struct v4l2_buffer buf;
310 struct list_head queue;
311 wait_queue_head_t wait;
312 enum microdia_buffer_state state;
315 struct microdia_video_queue {
316 void *mem;
317 void *scratch;
318 unsigned int streaming : 1,
319 frozen : 1,
320 drop_incomplete : 1;
321 __u32 sequence;
323 unsigned int count;
324 unsigned int min_buffers;
325 unsigned int max_buffers;
326 unsigned int buf_size;
327 unsigned int frame_size; /*current frame size */
328 struct microdia_buffer *buffer;
329 struct microdia_buffer *read_buffer;
330 struct mutex mutex; /* protects buffers and mainqueue */
331 spinlock_t irqlock; /* protects irqqueue */
333 struct list_head mainqueue;
334 struct list_head irqqueue;
339 * @struct microdia_iso_buf
341 struct microdia_iso_buf {
342 void *data;
343 struct urb *urb;
347 * @struct microdia_coord
349 struct microdia_coord {
350 int x; /**< X-coordonate */
351 int y; /**< Y-coordonate */
355 * @struct microdia_video
357 struct microdia_video {
358 struct v4l2_pix_format format;
359 int fps; /**< FPS setting */
360 int brightness; /**< Brightness setting */
361 int contrast; /**< Contrast setting */
362 int whiteness; /**< Whiteness setting */
363 int colour; /**< Colour setting */
364 int hue; /**< Hue setting */
365 int hflip; /**< Horizontal flip */
366 int vflip; /**< Vertical flip */
367 int exposure; /**< Exposure */
368 int sharpness; /**< Sharpness */
369 int auto_exposure; /**< Automatic exposure */
370 int auto_whitebalance; /**< Automatic whitebalance */
371 int reg; /**< register adress */
372 int val; /**< register value */
373 int i2creg; /**< I2C register adress */
374 int i2cval; /**< I2C register value */
375 int i2cslave; /**< I2C slave adress */
379 * @struct usb_microdia
381 struct usb_microdia {
382 struct video_device *vdev; /**< Pointer on a V4L2 video device */
383 struct usb_device *udev; /**< Pointer on a USB device */
384 struct usb_interface *interface; /**< Pointer on a USB interface */
386 int release; /**< Release of the device (bcdDevice) */
387 int webcam_model; /**< Model of video camera device */
388 int webcam_type; /**< Type of camera : VGA, SXGA (1.3M), UXGA (2M) */
389 int frame_size_divisor; /**> Used to calculate frame_size */
391 __u8 sensor_slave_address; /**< I2C/SCCB slave address of the image sensor */
392 __u8 sensor_flags; /**< I2C/SCCB flags of the image sensor */
394 unsigned char *int_in_buffer; /**< Interrupt IN buffer */
395 size_t int_in_size; /**< Interrupt IN buffer size */
396 __u8 int_in_endpointAddr; /**< Interrupt IN endpoint address */
398 size_t isoc_in_size; /**< Isochrone IN size */
399 __u8 isoc_in_endpointAddr; /**< Isochrone IN endpoint address */
401 struct microdia_video vsettings; /**< Video settings (brightness, whiteness...) */
403 struct kref vopen; /**< Video status (Opened or Closed) */
404 struct file *owner; /**< file handler of stream owner */
405 enum microdia_mode mode;/**< camera mode */
407 int vframes_overflow; /**< Buffer overflow frames */
408 int vframes_incomplete; /**< Incomplete frames */
409 int vframes_dropped; /**< Dropped frames */
411 struct mutex mutex; /**< Mutex */
413 struct microdia_iso_buf isobuf[MAX_ISO_BUFS];
415 int resolution;
416 struct microdia_coord view;
417 struct microdia_coord image;
419 struct microdia_video_queue queue;
421 __u8 supported_fmts;
423 int (* initialize) (struct usb_microdia *dev);
424 int (* start_stream) (struct usb_microdia *dev);
425 int (* stop_stream) (struct usb_microdia *dev);
426 int (* set_contrast) (struct usb_microdia *dev);
427 int (* set_brightness) (struct usb_microdia *dev);
428 int (* set_gamma) (struct usb_microdia *dev);
429 int (* set_exposure) (struct usb_microdia *dev);
430 int (* flip_detect) (struct usb_microdia *dev);
431 int (* set_hvflip) (struct usb_microdia *dev);
432 int (* set_sharpness) (struct usb_microdia *dev);
433 int (* set_auto_exposure) (struct usb_microdia *dev);
434 int (* set_auto_whitebalance) (struct usb_microdia *dev);
439 * @def MICRODIA_PERCENT
440 * Calculate a value from a percent
442 #define MICRODIA_PERCENT(x,y) ( ((int)x * (int)y) / 100)
446 * @def to_microdia_dev(d)
447 * Cast a member of a structure out to the containing structure
449 #define to_microdia_dev(d) container_of(d, struct usb_microdia, kref)
452 extern const struct microdia_coord microdia_image_sizes[MICRODIA_NBR_SIZES];
453 extern struct mutex open_lock;
455 int usb_microdia_control_write(struct usb_microdia *, __u16, __u8 *, __u16);
456 int usb_microdia_control_write_multi(struct usb_microdia *, __u16*, __u8 *,
457 __u16, __u16);
458 int usb_microdia_control_read(struct usb_microdia *, __u16, __u8 *, __u16);
459 int usb_microdia_set_feature(struct usb_microdia *, int);
461 int usb_microdia_set_configuration(struct usb_microdia *);
462 int usb_microdia_isoc_init(struct usb_microdia *);
463 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
464 void usb_microdia_isoc_handler(struct urb *, struct pt_regs *);
465 #else
466 void usb_microdia_isoc_handler(struct urb *);
467 #endif
468 void usb_microdia_isoc_cleanup(struct usb_microdia *);
469 void usb_microdia_delete(struct kref *);
472 int dev_microdia_initialize_device(struct usb_microdia *);
473 int dev_microdia_start_stream(struct usb_microdia *);
474 int dev_microdia_stop_stream(struct usb_microdia *);
475 int dev_microdia_check_device(struct usb_microdia *, int);
476 int dev_microdia_camera_on(struct usb_microdia *);
477 int dev_microdia_camera_off(struct usb_microdia *);
478 int dev_microdia_camera_asleep(struct usb_microdia *);
479 int dev_microdia_init_camera(struct usb_microdia *);
480 int dev_microdia_reconf_camera(struct usb_microdia *);
481 int dev_microdia_camera_settings(struct usb_microdia *);
482 int dev_microdia_camera_set_contrast(struct usb_microdia *);
483 int dev_microdia_camera_set_brightness(struct usb_microdia *);
484 int dev_microdia_camera_set_gamma(struct usb_microdia *);
485 int dev_microdia_camera_set_exposure(struct usb_microdia *);
486 int dev_microdia_camera_set_hvflip(struct usb_microdia *);
487 int dev_microdia_camera_set_sharpness(struct usb_microdia *dev);
488 int dev_microdia_camera_set_auto_exposure(struct usb_microdia *dev);
489 int dev_microdia_camera_set_auto_whitebalance(struct usb_microdia *dev);
490 //int dev_microdia_set_camera_quality(struct usb_microdia *);
491 int dev_microdia_set_camera_fps(struct usb_microdia *);
493 struct v4l2_pix_format *v4l2_enum_supported_formats(struct usb_microdia *,
494 __u8);
495 int v4l_microdia_select_video_mode(struct usb_microdia *, int);
496 int v4l_microdia_register_video_device(struct usb_microdia *);
497 int v4l_microdia_unregister_video_device(struct usb_microdia *);
499 int microdia_create_sysfs_files(struct video_device *);
500 void microdia_remove_sysfs_files(struct video_device *);
502 void microdia_queue_init(struct microdia_video_queue *);
503 int microdia_alloc_buffers(struct microdia_video_queue *,
504 unsigned int, unsigned int);
505 int microdia_free_buffers(struct microdia_video_queue *);
506 int microdia_queue_enable(struct microdia_video_queue *, int);
507 void microdia_queue_cancel(struct microdia_video_queue *);
508 unsigned int microdia_queue_poll(struct microdia_video_queue *,
509 struct file *, poll_table *);
510 int microdia_query_buffer(struct microdia_video_queue *, struct v4l2_buffer *);
511 int microdia_queue_buffer(struct microdia_video_queue *, struct v4l2_buffer *);
512 int microdia_dequeue_buffer(struct microdia_video_queue *,
513 struct v4l2_buffer *, int);
514 struct microdia_buffer *microdia_queue_next_buffer(
515 struct microdia_video_queue *, struct microdia_buffer *);
517 int microdia_decompress(struct usb_microdia *, struct v4l2_buffer *);
518 #endif