00001
00034 #ifndef STK11XX_H
00035 #define STK11XX_H
00036
00037
00038 #define DRIVER_NAME "stk11xx"
00039 #define DRIVER_VERSION "v2.0.0"
00040 #define DRIVER_VERSION_NUM 0x020000
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
00051 #define USB_STK_6A33_PRODUCT_ID 0x6a33
00052 #define USB_STK_6A51_PRODUCT_ID 0x6a51
00053 #define USB_STK_6A54_PRODUCT_ID 0x6a54
00054 #define USB_STK_6D51_PRODUCT_ID 0x6d51
00056 #define USB_STK_0501_PRODUCT_ID 0x0501
00065 #define VID_HARDWARE_STK11XX 88
00066
00067
00068
00069
00083 #define MAX_ISO_BUFS 16
00084 #define ISO_FRAMES_PER_DESC 10
00085 #define ISO_MAX_FRAME_SIZE 3 * 1024
00086 #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE)
00087
00088
00096 #define STK11XX_MAX_IMAGES 10
00097 #define STK11XX_FRAME_SIZE (1280 * 1024 * 4)
00098
00099
00100
00101
00102
00103
00104
00111 #define DRIVER_SUPPORT "Syntek USB Camera : STK-1135"
00112
00133 #ifndef CONFIG_STK11XX_DEBUG
00134 #define CONFIG_STK11XX_DEBUG 0
00135 #endif
00136
00137 #if CONFIG_STK11XX_DEBUG
00138
00139 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
00140 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
00141 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
00142 #define STK_DEBUG(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
00143
00144 #else
00145
00146 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args)
00147 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args)
00148 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args)
00149 #define STK_DEBUG(str, args...) do { } while(0)
00150
00151 #endif
00152
00153
00162 #ifndef CONFIG_STK11XX_DEBUG_STREAM
00163 #define CONFIG_STK11XX_DEBUG_STREAM 0
00164 #endif
00165
00166 #if CONFIG_STK11XX_DEBUG_STREAM
00167
00168 #define STK_STREAM(str, args...) printk(KERN_DEBUG PREFIX str, ##args)
00169
00170 #else
00171
00172 #define STK_STREAM(str, args...) do { } while(0)
00173
00174 #endif
00175
00176
00177
00181 typedef enum {
00182 SYNTEK_STK_M811 = 1,
00183 SYNTEK_STK_A311 = 2,
00184 SYNTEK_STK_A821 = 3,
00185 SYNTEK_STK_6A31 = 4,
00186 SYNTEK_STK_6A33 = 5,
00187 SYNTEK_STK_6A51 = 6,
00188 SYNTEK_STK_6A54 = 7,
00189 SYNTEK_STK_6D51 = 8
00190 } T_SYNTEK_DEVICE;
00191
00192
00196 typedef enum {
00197 STK11XX_VGA,
00198 STK11XX_SXGA,
00199 STK11XX_UXGA
00200 } T_STK11XX_VIDEOMODE;
00201
00202
00206 typedef enum {
00207 STK11XX_80x60,
00208 STK11XX_128x96,
00209 STK11XX_160x120,
00210 STK11XX_213x160,
00211 STK11XX_320x240,
00212 STK11XX_640x480,
00213 STK11XX_800x600,
00214 STK11XX_1024x768,
00215 STK11XX_1280x1024,
00216 STK11XX_NBR_SIZES
00217 } T_STK11XX_RESOLUTION;
00218
00219
00223 typedef enum {
00224 STK11XX_PALETTE_RGB24,
00225 STK11XX_PALETTE_RGB32,
00226 STK11XX_PALETTE_BGR24,
00227 STK11XX_PALETTE_BGR32,
00228 STK11XX_PALETTE_UYVY,
00229 STK11XX_PALETTE_YUYV
00230 } T_STK11XX_PALETTE;
00231
00232
00236 struct stk11xx_iso_buf {
00237 void *data;
00238 int length;
00239 int read;
00240 struct urb *urb;
00241 };
00242
00243
00247 struct stk11xx_frame_buf {
00248 int errors;
00249 void *data;
00250 volatile int filled;
00251 struct stk11xx_frame_buf *next;
00252 };
00253
00254
00258 struct stk11xx_image_buf {
00259 unsigned long offset;
00260 int vma_use_count;
00261 };
00262
00263
00267 struct stk11xx_coord {
00268 int x;
00269 int y;
00270 };
00271
00272
00276 struct stk11xx_video {
00277 int fps;
00278 int brightness;
00279 int contrast;
00280 int whiteness;
00281 int colour;
00282 int depth;
00283 int palette;
00284 int hue;
00285 int hflip;
00286 int vflip;
00287 };
00288
00289
00293 struct usb_stk11xx {
00294 struct video_device *vdev;
00295 struct usb_device *udev;
00296 struct usb_interface *interface;
00298 int release;
00299 int webcam_model;
00300 int webcam_type;
00302 unsigned char *int_in_buffer;
00303 size_t int_in_size;
00304 __u8 int_in_endpointAddr;
00306 size_t isoc_in_size;
00307 __u8 isoc_in_endpointAddr;
00309 int watchdog;
00311 struct stk11xx_video vsettings;
00313 int error_status;
00314
00315 int vopen;
00316 int visoc_errors;
00317 int vframes_error;
00318 int vframes_dumped;
00321 spinlock_t spinlock;
00322 struct semaphore mutex;
00323 wait_queue_head_t wait_frame;
00324 struct mutex modlock;
00327
00328 char isoc_init_ok;
00329 struct stk11xx_iso_buf isobuf[MAX_ISO_BUFS];
00330
00331
00332 int frame_size;
00333 struct stk11xx_frame_buf *framebuf;
00334 struct stk11xx_frame_buf *empty_frames, *empty_frames_tail;
00335 struct stk11xx_frame_buf *full_frames, *full_frames_tail;
00336 struct stk11xx_frame_buf *fill_frame;
00337 struct stk11xx_frame_buf *read_frame;
00338
00339
00340 int view_size;
00341 int image_size;
00342 void *image_data;
00343 struct stk11xx_image_buf images[STK11XX_MAX_IMAGES];
00344 int image_used[STK11XX_MAX_IMAGES];
00345 unsigned int nbuffers;
00346 unsigned int len_per_image;
00347 int image_read_pos;
00348 int fill_image;
00349 int resolution;
00350 struct stk11xx_coord view;
00351 struct stk11xx_coord image;
00352 };
00353
00354
00359 #define STK11XX_PERCENT(x,y) ( ((int)x * (int)y) / 100)
00360
00361
00366 #define to_stk11xx_dev(d) container_of(d, struct usb_stk11xx, kref)
00367
00368
00369 extern const struct stk11xx_coord stk11xx_image_sizes[STK11XX_NBR_SIZES];
00370
00371
00372 int usb_stk11xx_write_registry(struct usb_stk11xx *, __u16, __u16);
00373 int usb_stk11xx_read_registry(struct usb_stk11xx *, __u16, int *);
00374 int usb_stk11xx_set_feature(struct usb_stk11xx *, int);
00375 int usb_stk11xx_set_configuration(struct usb_stk11xx *);
00376 int usb_stk11xx_isoc_init(struct usb_stk11xx *);
00377 void usb_stk11xx_isoc_handler(struct urb *);
00378 void usb_stk11xx_isoc_cleanup(struct usb_stk11xx *);
00379
00380 int dev_stk11xx_initialize_device(struct usb_stk11xx *);
00381 int dev_stk11xx_start_stream(struct usb_stk11xx *);
00382 int dev_stk11xx_stop_stream(struct usb_stk11xx *);
00383 int dev_stk11xx_check_device(struct usb_stk11xx *, int);
00384 int dev_stk11xx_camera_on(struct usb_stk11xx *);
00385 int dev_stk11xx_camera_off(struct usb_stk11xx *);
00386 int dev_stk11xx_camera_asleep(struct usb_stk11xx *);
00387 int dev_stk11xx_init_camera(struct usb_stk11xx *);
00388 int dev_stk11xx_reconf_camera(struct usb_stk11xx *);
00389 int dev_stk11xx_camera_settings(struct usb_stk11xx *);
00390 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *);
00391 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *);
00392 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *);
00393
00394 int v4l_stk11xx_select_video_mode(struct usb_stk11xx *, int, int);
00395 int v4l_stk11xx_register_video_device(struct usb_stk11xx *);
00396 int v4l_stk11xx_unregister_video_device(struct usb_stk11xx *);
00397
00398 int stk11xx_create_sysfs_files(struct video_device *);
00399 void stk11xx_remove_sysfs_files(struct video_device *);
00400
00401 int stk11xx_allocate_buffers(struct usb_stk11xx *);
00402 int stk11xx_reset_buffers(struct usb_stk11xx *);
00403 int stk11xx_clear_buffers(struct usb_stk11xx *);
00404 int stk11xx_free_buffers(struct usb_stk11xx *);
00405 void stk11xx_next_image(struct usb_stk11xx *);
00406 int stk11xx_next_frame(struct usb_stk11xx *);
00407 int stk11xx_handle_frame(struct usb_stk11xx *);
00408
00409 int stk11xx_decompress(struct usb_stk11xx *);
00410
00411
00412 #endif