Stop sensor_init from being executed twice
[microdia.git] / microdia.h
blob77cc091bbc4a1b08fb5e8fda0d032d956f2e7cae
1 /**
2 * @file microdia.h
3 * @author Nicolas VIVIEN
4 * @date 2008-02-01
6 * @brief Driver for Microdia USB video camera
8 * @note Copyright (C) Nicolas VIVIEN
10 * @par Licences
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <linux/kernel.h>
28 #include <linux/version.h>
29 #include <linux/usb.h>
30 #include <media/v4l2-common.h>
32 #ifndef MICRODIA_H
33 #define MICRODIA_H
35 #define DRIVER_NAME "microdia" /**< Name of this driver */
36 #define DRIVER_VERSION "v2008.10" /**< Version of this driver */
37 #define DRIVER_VERSION_NUM 0x000000 /**< Version numerical of this driver */
38 #define DRIVER_DESC "Microdia USB 2.0 Webcam Driver"/**< Short description of this driver */
39 #define DRIVER_AUTHOR "Nicolas VIVIEN" /**< Author of this driver */
40 #define PREFIX DRIVER_NAME ": " /**< Prefix use for the MICRODIA "printk" */
42 #define USB_0C45_VID 0x0c45 /**< Vendor ID of MICRODIA */
43 #define USB_045E_VID 0x045e /**< Vendor ID of MICROSOFT */
44 #define USB_04F2_VID 0x04f2 /**< Vendor ID of CHICONY */
45 #define USB_145F_VID 0x145f /**< Vendor ID of TRUST */
47 /* SN9C201: */
48 #define USB_6240_PID 0x6240 /**< SN9C201 + MI1300 */
49 #define USB_6242_PID 0x6242 /**< SN9C201 + MI1310 */
50 #define USB_6243_PID 0x6243 /**< SN9C201 + S5K4AAFX */
51 #define USB_6248_PID 0x6248 /**< SN9C201 + OV9655 */
52 #define USB_624B_PID 0x624b /**< SN9C201 + CX1332 */
53 #define USB_624C_PID 0x624c /**< SN9C201 + MI1320 */
54 #define USB_624E_PID 0x624e /**< SN9C201 + SOI968 */
55 #define USB_624F_PID 0x624f /**< SN9C201 + OV9650 */
56 #define USB_6253_PID 0x6253 /**< SN9C201 + OV9650 */
57 #define USB_6260_PID 0x6260 /**< SN9C201 + OV7670ISP */
58 #define USB_6262_PID 0x6262 /**< SN9C201 + OM6802 */
59 #define USB_6270_PID 0x6270 /**< SN9C201 + MI0360/MT9V111 */
60 #define USB_627A_PID 0x627a /**< SN9C201 + S5K53BEB */
61 #define USB_627B_PID 0x627b /**< SN9C201 + OV7660 */
62 #define USB_627C_PID 0x627c /**< SN9C201 + HV7131R */
63 #define USB_627F_PID 0x627f /**< EEPROM */
64 /* SN9C202:*/
65 #define USB_6280_PID 0x6280 /**< SN9C202 + MI1300 */
66 #define USB_6282_PID 0x6282 /**< SN9C202 + MI1310 */
67 #define USB_6283_PID 0x6283 /**< SN9C202 + S5K4AAFX */
68 #define USB_6288_PID 0x6288 /**< SN9C202 + OV9655 */
69 #define USB_628A_PID 0x628a /**< SN9C202 + ICM107 */
70 #define USB_628B_PID 0x628b /**< SN9C202 + CX1332 */
71 #define USB_628C_PID 0x628c /**< SN9C202 + MI1320 */
72 #define USB_628E_PID 0x628e /**< SN9C202 + SOI968 */
73 #define USB_628F_PID 0x628f /**< SN9C202 + OV9650 */
74 #define USB_62A0_PID 0x62a0 /**< SN9C202 + OV7670ISP */
75 #define USB_62A2_PID 0x62a2 /**< SN9C202 + OM6802 */
76 #define USB_62B0_PID 0x62b0 /**< SN9C202 + MI0360/MT9V111 */
77 #define USB_62B3_PID 0x62b3 /**< SN9C202 + OV9655 */
78 #define USB_62BA_PID 0x62ba /**< SN9C202 + S5K53BEB */
79 #define USB_62BB_PID 0x62bb /**< SN9C202 + OV7660 */
80 #define USB_62BC_PID 0x62bc /**< SN9C202 + HV7131R */
81 #define USB_62BE_PID 0x62be /**< SN9C202 + OV7663 */
82 /* *** "Clone"-devices ***: */
84 /* Microsoft LifeCam VX-6000: */
85 #define USB_00F4_PID 0x00f4 /**< => 628f (SN9C202 + OV9650) */
86 /* Trust WB-3600R: */
87 #define USB_013D_PID 0x013d /**< => 627b (SN9C201 + OV7660) */
88 /* Chicony Panda 7, Trust WB-3450P: */
89 #define USB_A128_PID 0xa128 /**< => 62be (SN9C202 + OV7663) */
91 #define SN9C20X_BRIDGE (1 << 16)
93 #define MICRODIA_USB_DEVICE(vend, prod, flags) \
94 .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \
95 USB_DEVICE_ID_MATCH_INT_CLASS, \
96 .idVendor = (vend), \
97 .idProduct = (prod), \
98 .bInterfaceClass = 0xff, \
99 .driver_info = (flags)
102 * @def VID_HARDWARE_MICRODIA
104 * This value must be inserted into the kernel headers linux/videodev.h
105 * It's useful only for the support of V4L v1
107 #define VID_HARDWARE_MICRODIA 88
108 /* FIXME: Can the above be removed ? */
111 * @def MAX_URBS
112 * Number maximal of URBS
114 * @def ISO_FRAMES_PER_DESC
115 * Number frames per ISOC descriptor
117 #define MAX_URBS 200
118 #define ISO_FRAMES_PER_DESC 10
121 * @def hb_multiplier(wMaxPacketSize)
122 * USB endpoint high bandwidth multiplier
124 * @def max_packet_sz(wMaxPacketSize)
125 * USB endpoint maximum packet size
127 * These values are both encoded within the wMaxPacketSize field of the usb_endpoint_descriptor structure.
128 * The 11(10:0) lowest bits hold the MaxPacketSize(according to the usb specs a value over 1024 is undefined),
129 * and the bits 12:11 will give the high bandwidth multiplier(this should be a value of 0-2).
132 #define hb_multiplier(wMaxPacketSize) (((wMaxPacketSize >> 11) & 0x03) + 1)
133 #define max_packet_sz(wMaxPacketSize) ((wMaxPacketSize) & 0x07ff)
136 * @def DRIVER_SUPPORT
138 * List of supported devices
140 #define DRIVER_SUPPORT "Microdia USB Camera"
142 #define MICRODIA_INFO (1 << 0)
143 #define MICRODIA_WARNING (1 << 1)
144 #define MICRODIA_ERROR (1 << 2)
145 #define MICRODIA_DEBUG (1 << 3)
146 #define MICRODIA_STREAM (1 << 4)
149 * @def UDIA_INFO(str, args...)
150 * Print information message.
151 * @a Use this function like the function printf.
153 * @def UDIA_ERROR(str, args...)
154 * Print error message.
155 * @a Use this function like the function printf.
157 * @def UDIA_WARNING(str, args...)
158 * Print warning message.
159 * @a Use this function like the function printf.
161 * @def UDIA_DEBUG(str, args...)
162 * Print debug message.
163 * @a Use this function like the function printf.
165 * @def UDIA_STREAM(str, args...)
166 * Print stream debug message.
167 * @a Use this function like the function printf.
169 extern __u8 log_level;
171 #define UDIA_INFO(str, args...) \
172 do { \
173 if (log_level & MICRODIA_INFO) \
174 printk(KERN_INFO PREFIX str, ##args); \
175 } while (0)
177 #define UDIA_WARNING(str, args...) \
178 do { \
179 if (log_level & MICRODIA_WARNING) \
180 printk(KERN_WARNING PREFIX str, ##args); \
181 } while (0)
183 #define UDIA_ERROR(str, args...) \
184 do { \
185 if (log_level & MICRODIA_ERROR) \
186 printk(KERN_ERR PREFIX str, ##args); \
187 } while (0)
189 #define UDIA_DEBUG(str, args...) \
190 do { \
191 if (log_level & MICRODIA_DEBUG) \
192 printk(KERN_DEBUG PREFIX str, ##args); \
193 } while (0)
195 #define UDIA_STREAM(str, args...) \
196 do { \
197 if (log_level & MICRODIA_STREAM) \
198 printk(KERN_DEBUG PREFIX str, ##args); \
199 } while (0)
202 enum microdia_buffer_state {
203 MICRODIA_BUF_STATE_IDLE = 0,
204 MICRODIA_BUF_STATE_QUEUED = 1,
205 MICRODIA_BUF_STATE_ACTIVE = 2,
206 MICRODIA_BUF_STATE_DONE = 3,
207 MICRODIA_BUF_STATE_ERROR = 4,
210 enum microdia_mode {
211 MICRODIA_MODE_IDLE = 0,
212 MICRODIA_MODE_READ = 1,
213 MICRODIA_MODE_STREAM = 2,
216 struct microdia_buffer {
217 unsigned long vma_use_count;
218 struct list_head stream;
220 /* Touched by interrupt handler. */
221 struct v4l2_buffer buf;
222 struct list_head queue;
223 wait_queue_head_t wait;
224 enum microdia_buffer_state state;
227 #define MICRODIA_QUEUE_STREAMING (1 << 0)
228 #define MICRODIA_QUEUE_DISCONNECTED (1 << 1)
229 #define MICRODIA_QUEUE_DROP_INCOMPLETE (1 << 2)
231 struct microdia_video_queue {
232 void *mem;
233 unsigned int flags;
234 __u32 sequence;
236 unsigned int count;
237 unsigned int min_buffers;
238 unsigned int max_buffers;
239 unsigned int buf_size;
241 struct microdia_buffer *buffer;
242 struct microdia_buffer *read_buffer;
243 struct mutex mutex; /* protects buffers and mainqueue */
244 spinlock_t irqlock; /* protects irqqueue */
246 struct list_head mainqueue;
247 struct list_head irqqueue;
251 * @struct microdia_urb
253 struct microdia_urb {
254 void *data;
255 struct urb *urb;
259 * @struct microdia_video
261 struct microdia_video {
262 struct v4l2_pix_format format;
263 int fps; /**< FPS setting */
264 int brightness; /**< Brightness setting */
265 int contrast; /**< Contrast setting */
266 int whiteness; /**< Whiteness setting */
267 int colour; /**< Colour setting */
268 int hue; /**< Hue setting */
269 int hflip; /**< Horizontal flip */
270 int vflip; /**< Vertical flip */
271 int exposure; /**< Exposure */
272 int sharpness; /**< Sharpness */
273 __u8 rgb_gain[4]; /**< RGB Gain (RGGB) */
274 int auto_exposure; /**< Automatic exposure */
275 int auto_whitebalance; /**< Automatic whitebalance */
279 * @struct microdia_debugfs
281 struct microdia_debugfs {
282 struct dentry *dent_device;
283 struct dentry *dent_bridge_addr;
284 struct dentry *dent_bridge_val;
285 struct dentry *dent_bridge_dump;
286 struct dentry *dent_sensor_addr;
287 struct dentry *dent_sensor_val8;
288 struct dentry *dent_sensor_val16;
289 struct dentry *dent_sensor_val32;
291 __u16 bridge_addr; /**< Current bridge register address */
292 __u8 sensor_addr; /**< Current sensor register address */
295 enum microdia_endpoints {
296 MICRODIA_VID_ISOC = 1,
297 MICRODIA_BULK = 2,
298 MICRODIA_INT = 3,
299 MICRODIA_AUD_ISOC = 4
302 enum microdia_sensors {
303 UNKNOWN_SENSOR = 0,
304 OV9650_SENSOR = 1,
305 OV9655_SENSOR = 2,
306 SOI968_SENSOR = 3,
307 OV7660_SENSOR = 4,
308 OV7670_SENSOR = 5,
309 MT9M111_SENSOR = 6,
310 MT9V111_SENSOR = 7,
311 MT9V011_SENSOR = 8,
312 MT9M001_SENSOR = 9,
317 struct usb_microdia;
319 struct microdia_video_format {
320 __u32 pix_fmt;
321 char desc[32];
322 __u8 depth;
323 int (*set_format) (struct usb_microdia *dev);
326 struct microdia_video_resolution {
327 __u16 width;
328 __u16 height;
329 __u8 scale;
330 __u16 window[4];
333 struct sensor_info {
334 __u8 id;
335 __u8 *name;
336 int (*probe) (struct usb_microdia *dev);
339 extern struct sensor_info sensors[];
341 struct microdia_camera {
343 __u8 sensor_slave_address;
344 __u8 sensor_flags;
345 __u8 sensor;
347 /* supported resolutions */
348 __u8 nmodes;
349 struct microdia_video_resolution *modes;
350 /* supported video formats */
351 __u8 nfmts;
352 struct microdia_video_format *fmts;
354 /* bridge functions */
355 int (*initialize) (struct usb_microdia *dev);
356 int (*enable_video) (struct usb_microdia *dev, int enable);
358 /* image quality functions */
360 int (*set_contrast) (struct usb_microdia *dev);
361 int (*set_brightness) (struct usb_microdia *dev);
362 int (*set_gamma) (struct usb_microdia *dev);
363 int (*set_exposure) (struct usb_microdia *dev);
364 int (*flip_detect) (struct usb_microdia *dev);
365 int (*set_hvflip) (struct usb_microdia *dev);
366 int (*set_sharpness) (struct usb_microdia *dev);
367 int (*set_rgb_gain) (struct usb_microdia *dev);
368 int (*set_auto_exposure) (struct usb_microdia *dev);
369 int (*set_auto_whitebalance) (struct usb_microdia *dev);
373 * @struct usb_microdia
375 struct usb_microdia {
376 struct video_device *vdev; /**< Pointer on a V4L2 video device */
377 struct usb_device *udev; /**< Pointer on a USB device */
378 struct usb_interface *interface; /**< Pointer on a USB interface */
380 int release; /**< Release of the device (bcdDevice) */
382 struct microdia_video vsettings; /**< Video settings (brightness, whiteness...) */
383 struct microdia_debugfs debug; /**< debugfs information structure */
385 struct kref vopen; /**< Video status (Opened or Closed) */
386 struct file *owner; /**< file handler of stream owner */
387 enum microdia_mode mode;/**< camera mode */
389 int vframes_overflow; /**< Buffer overflow frames */
390 int vframes_incomplete; /**< Incomplete frames */
391 int vframes_dropped; /**< Dropped frames */
393 struct mutex mutex; /**< Mutex */
395 struct microdia_urb urbs[MAX_URBS];
397 int resolution;
399 unsigned int frozen:1;
400 struct microdia_video_queue queue;
401 struct microdia_camera camera;
405 * @def MICRODIA_PERCENT
406 * Calculate a value from a percent
408 #define MICRODIA_PERCENT(x, y) (((int)x * (int)y) / 100)
411 extern struct mutex open_lock;
413 int usb_microdia_control_write(struct usb_microdia *, __u16, __u8 *, __u16);
414 int usb_microdia_control_read(struct usb_microdia *, __u16, __u8 *, __u16);
416 int usb_microdia_isoc_init(struct usb_microdia *,
417 struct usb_endpoint_descriptor *);
418 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19)
419 void usb_microdia_completion_handler(struct urb *, struct pt_regs *);
420 #else
421 void usb_microdia_completion_handler(struct urb *);
422 #endif
423 int usb_microdia_init_urbs(struct usb_microdia *);
424 void usb_microdia_uninit_urbs(struct usb_microdia *);
425 void usb_microdia_delete(struct kref *);
428 int dev_microdia_initialize_device(struct usb_microdia *, __u32 flags);
429 int dev_microdia_probe_sensor(struct usb_microdia *);
430 int dev_microdia_enable_video(struct usb_microdia *, int);
431 int dev_microdia_camera_settings(struct usb_microdia *);
432 int dev_microdia_camera_set_contrast(struct usb_microdia *);
433 int dev_microdia_camera_set_brightness(struct usb_microdia *);
434 int dev_microdia_camera_set_gamma(struct usb_microdia *);
435 int dev_microdia_camera_set_exposure(struct usb_microdia *);
436 int dev_microdia_camera_set_hvflip(struct usb_microdia *);
437 int dev_microdia_camera_set_sharpness(struct usb_microdia *dev);
438 int dev_microdia_camera_set_rgb_gain(struct usb_microdia *dev);
439 int dev_microdia_camera_set_auto_exposure(struct usb_microdia *dev);
440 int dev_microdia_camera_set_auto_whitebalance(struct usb_microdia *dev);
441 /* int dev_microdia_set_camera_quality(struct usb_microdia *);*/
443 struct v4l2_pix_format *v4l2_enum_supported_formats(struct usb_microdia *,
444 __u8);
445 int v4l_microdia_select_video_mode(struct usb_microdia *, int);
446 int v4l_microdia_register_video_device(struct usb_microdia *);
447 int v4l_microdia_unregister_video_device(struct usb_microdia *);
449 int microdia_create_sysfs_files(struct video_device *);
450 void microdia_remove_sysfs_files(struct video_device *);
452 void microdia_init_debugfs(void);
453 void microdia_uninit_debugfs(void);
454 int microdia_create_debugfs_files(struct usb_microdia *);
455 int microdia_remove_debugfs_files(struct usb_microdia *);
457 void microdia_queue_init(struct microdia_video_queue *);
458 int microdia_alloc_buffers(struct microdia_video_queue *,
459 unsigned int, unsigned int);
460 int microdia_free_buffers(struct microdia_video_queue *);
461 int microdia_queue_enable(struct microdia_video_queue *, int);
462 void microdia_queue_cancel(struct microdia_video_queue *, int);
463 unsigned int microdia_queue_poll(struct microdia_video_queue *,
464 struct file *, poll_table *);
465 int microdia_query_buffer(struct microdia_video_queue *, struct v4l2_buffer *);
466 int microdia_queue_buffer(struct microdia_video_queue *, struct v4l2_buffer *);
467 int microdia_dequeue_buffer(struct microdia_video_queue *,
468 struct v4l2_buffer *, int);
469 struct microdia_buffer *microdia_queue_next_buffer(
470 struct microdia_video_queue *, struct microdia_buffer *);
472 static inline int microdia_queue_streaming(struct microdia_video_queue *queue)
474 return queue->flags & MICRODIA_QUEUE_STREAMING;
477 /* Some general sensor functions which have no other home */
478 int ov_probe(struct usb_microdia *dev);
479 int ov_initialize(struct usb_microdia *dev, __u8 ov_init[][2], int array_size);
480 int mt9m111_probe(struct usb_microdia *dev);
481 int mt9m001_probe(struct usb_microdia *dev);
483 #endif