00001
00034 #ifndef STK11XX_H
00035 #define STK11XX_H
00036
00037
00038 #define DRIVER_NAME "stk11xx"
00039 #define DRIVER_VERSION "v1.0.0"
00040 #define DRIVER_VERSION_NUM 0x000100
00041 #define DRIVER_DESC "Syntek USB Video Camera"
00042 #define DRIVER_AUTHOR "Nicolas VIVIEN"
00043 #define PREFIX DRIVER_NAME ": "
00045 #define USB_SYNTEK1_VENDOR_ID 0x174F
00046 #define USB_SYNTEK2_VENDOR_ID 0x05E1
00048 #define USB_STK_A311_PRODUCT_ID 0xa311
00049 #define USB_STK_A821_PRODUCT_ID 0xa821
00050 #define USB_STK_6A31_PRODUCT_ID 0x6A31
00052 #define USB_STK_0501_PRODUCT_ID 0x0501
00061 #define VID_HARDWARE_STK11XX 88
00062
00063
00064
00065
00079 #define MAX_ISO_BUFS 16
00080 #define ISO_FRAMES_PER_DESC 10
00081 #define ISO_MAX_FRAME_SIZE 3 * 1024
00082 #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
00083
00084
00092 #define STK11XX_MAX_IMAGES 10
00093 #define STK11XX_FRAME_SIZE (1280 * 1024 * 4)
00094
00095
00096
00097
00098
00099
00100
00107 #define DRIVER_SUPPORT "Syntek USB Camera : STK-1135"
00108
00129 #ifndef CONFIG_STK11XX_DEBUG
00130 #define CONFIG_STK11XX_DEBUG 0
00131 #endif
00132
00133 #if CONFIG_STK11XX_DEBUG
00134
00135 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
00136 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
00137 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
00138 #define STK_DEBUG(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
00139
00140 #else
00141
00142 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
00143 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
00144 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
00145 #define STK_DEBUG(str, args...) do { } while(0)
00146
00147 #endif
00148
00149
00158 #ifndef CONFIG_STK11XX_DEBUG_STREAM
00159 #define CONFIG_STK11XX_DEBUG_STREAM 0
00160 #endif
00161
00162 #if CONFIG_STK11XX_DEBUG_STREAM
00163
00164 #define STK_STREAM(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
00165
00166 #else
00167
00168 #define STK_STREAM(str, args...) do { } while(0)
00169
00170 #endif
00171
00172
00173
00177 typedef enum {
00178 SYNTEK_STK_A311 = 1,
00179 SYNTEK_STK_A821 = 2,
00180 SYNTEK_STK_6A31 = 3
00181 } T_SYNTEK_DEVICE;
00182
00183
00187 enum {
00188 STK11XX_VGA,
00189 STK11XX_SXGA,
00190 STK11XX_UXGA
00191 };
00192
00193
00197 enum {
00198 STK11XX_80x60,
00199 STK11XX_128x96,
00200 STK11XX_160x120,
00201 STK11XX_213x160,
00202 STK11XX_320x240,
00203 STK11XX_640x480,
00204 STK11XX_800x600,
00205 STK11XX_1024x768,
00206 STK11XX_1280x1024,
00207 STK11XX_NBR_SIZES
00208 };
00209
00210
00214 enum {
00215 STK11XX_PALETTE_RGB24,
00216 STK11XX_PALETTE_RGB32,
00217 STK11XX_PALETTE_BGR24,
00218 STK11XX_PALETTE_BGR32
00219 };
00220
00221
00225 struct stk11xx_iso_buf {
00226 void *data;
00227 int length;
00228 int read;
00229 struct urb *urb;
00230 };
00231
00232
00236 struct stk11xx_frame_buf {
00237 int errors;
00238 void *data;
00239 volatile int filled;
00240 struct stk11xx_frame_buf *next;
00241 };
00242
00243
00247 struct stk11xx_image_buf {
00248 unsigned long offset;
00249 int vma_use_count;
00250 };
00251
00252
00256 struct stk11xx_coord {
00257 int x;
00258 int y;
00259 };
00260
00261
00265 struct stk11xx_video {
00266 int fps;
00267 int brightness;
00268 int contrast;
00269 int whiteness;
00270 int colour;
00271 int depth;
00272 int palette;
00273 int hue;
00274 int hflip;
00275 int vflip;
00276 };
00277
00278
00282 struct usb_stk11xx {
00283 struct video_device *vdev;
00284 struct usb_device *udev;
00285 struct usb_interface *interface;
00287 int release;
00288 int webcam_model;
00289 int webcam_type;
00291 unsigned char *int_in_buffer;
00292 size_t int_in_size;
00293 __u8 int_in_endpointAddr;
00295 size_t isoc_in_size;
00296 __u8 isoc_in_endpointAddr;
00298 int watchdog;
00300 struct stk11xx_video vsettings;
00302 int error_status;
00303
00304 int vopen;
00305 int visoc_errors;
00306 int vframes_error;
00307 int vframes_dumped;
00310 spinlock_t spinlock;
00311 struct semaphore mutex;
00312 wait_queue_head_t wait_frame;
00313
00314
00315
00316 char isoc_init_ok;
00317 struct stk11xx_iso_buf isobuf[MAX_ISO_BUFS];
00318
00319
00320 int frame_size;
00321 struct stk11xx_frame_buf *framebuf;
00322 struct stk11xx_frame_buf *empty_frames, *empty_frames_tail;
00323 struct stk11xx_frame_buf *full_frames, *full_frames_tail;
00324 struct stk11xx_frame_buf *fill_frame;
00325 struct stk11xx_frame_buf *read_frame;
00326
00327
00328 int image_size;
00329 void *image_data;
00330 struct stk11xx_image_buf images[STK11XX_MAX_IMAGES];
00331 int image_used[STK11XX_MAX_IMAGES];
00332 unsigned int nbuffers;
00333 unsigned int len_per_image;
00334 int image_read_pos;
00335 int fill_image;
00336 int resolution;
00337 struct stk11xx_coord view;
00338 struct stk11xx_coord image;
00339 };
00340
00341
00346 #define to_stk11xx_dev(d) container_of(d, struct usb_stk11xx, kref)
00347
00348
00349 extern const struct stk11xx_coord stk11xx_image_sizes[STK11XX_NBR_SIZES];
00350
00351
00352 void usb_stk11xx_delete(struct kref *);
00353 int usb_stk11xx_write_registry(struct usb_stk11xx *, __u16, __u16);
00354 int usb_stk11xx_read_registry(struct usb_stk11xx *, __u16, int *);
00355 int usb_stk11xx_set_feature(struct usb_stk11xx *, int);
00356 int usb_stk11xx_set_configuration(struct usb_stk11xx *);
00357 int usb_stk11xx_isoc_init(struct usb_stk11xx *);
00358 void usb_stk11xx_isoc_handler(struct urb *);
00359 void usb_stk11xx_isoc_cleanup(struct usb_stk11xx *);
00360
00361 int dev_stk11xx_initialize_device(struct usb_stk11xx *);
00362 int dev_stk11xx_start_stream(struct usb_stk11xx *);
00363 int dev_stk11xx_stop_stream(struct usb_stk11xx *);
00364 int dev_stk11xx_check_device(struct usb_stk11xx *, int);
00365 int dev_stk11xx_camera_on(struct usb_stk11xx *);
00366 int dev_stk11xx_camera_off(struct usb_stk11xx *);
00367 int dev_stk11xx_camera_asleep(struct usb_stk11xx *);
00368 int dev_stk11xx_init_camera(struct usb_stk11xx *);
00369 int dev_stk11xx_load_microcode(struct usb_stk11xx *);
00370 int dev_stk11xx_reconf_camera(struct usb_stk11xx *);
00371 int dev_stk11xx_camera_settings(struct usb_stk11xx *);
00372 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *);
00373 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *);
00374 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *);
00375
00376 int v4l_stk11xx_select_video_mode(struct usb_stk11xx *, int, int);
00377 int v4l_stk11xx_register_video_device(struct usb_stk11xx *);
00378 int v4l_stk11xx_unregister_video_device(struct usb_stk11xx *);
00379
00380 int stk11xx_create_sysfs_files(struct video_device *);
00381 void stk11xx_remove_sysfs_files(struct video_device *);
00382
00383 int stk11xx_allocate_buffers(struct usb_stk11xx *);
00384 int stk11xx_reset_buffers(struct usb_stk11xx *);
00385 int stk11xx_clear_buffers(struct usb_stk11xx *);
00386 int stk11xx_free_buffers(struct usb_stk11xx *);
00387 void stk11xx_next_image(struct usb_stk11xx *);
00388 int stk11xx_next_frame(struct usb_stk11xx *);
00389 int stk11xx_handle_frame(struct usb_stk11xx *);
00390
00391 int stk11xx_decompress(struct usb_stk11xx *);
00392
00393
00394 #endif