SyntekUSBVideoCamera
|
00001 00034 #ifndef STK11XX_H 00035 #define STK11XX_H 00036 00037 #define DRIVER_NAME "stk11xx" 00038 #define DRIVER_VERSION "v3.0.0" 00039 #define DRIVER_VERSION_NUM 0x030000 00040 #define DRIVER_YEAR 2012 00041 #define DRIVER_DESC "Syntek USB Video Camera" 00042 #define DRIVER_AUTHOR "Nicolas VIVIEN" 00043 #define PREFIX DRIVER_NAME ": " 00044 #define DRIVER_URL \ 00045 "http://sourceforge.net/projects/syntekdriver/" 00047 #define USB_SYNTEK1_VENDOR_ID 0x174f 00048 #define USB_SYNTEK2_VENDOR_ID 0x05e1 00050 #define USB_STK_A311_PRODUCT_ID 0xa311 00051 #define USB_STK_A821_PRODUCT_ID 0xa821 00052 #define USB_STK_AA11_PRODUCT_ID 0xaa11 00053 #define USB_STK_6A31_PRODUCT_ID 0x6a31 00054 #define USB_STK_6A33_PRODUCT_ID 0x6a33 00055 #define USB_STK_6A51_PRODUCT_ID 0x6a51 00056 #define USB_STK_6A54_PRODUCT_ID 0x6a54 00057 #define USB_STK_6D51_PRODUCT_ID 0x6d51 00059 #define USB_STK_0408_PRODUCT_ID 0x0408 00060 #define USB_STK_0500_PRODUCT_ID 0x0500 00061 #define USB_STK_0501_PRODUCT_ID 0x0501 00070 #define VID_HARDWARE_STK11XX 88 00071 00072 00073 00074 00088 #define MAX_ISO_BUFS 16 00089 #define ISO_FRAMES_PER_DESC 10 00090 #define ISO_MAX_FRAME_SIZE 3 * 1024 00091 #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) 00092 00093 00105 #define STK11XX_MAX_IMAGES 10 00106 #define STK11XX_FRAME_SIZE (1280 * 1024 * 4) 00107 00108 00109 00110 00111 00112 00113 00120 #define DRIVER_SUPPORT "Syntek USB Camera : STK-1135" 00121 00142 #ifndef CONFIG_STK11XX_DEBUG 00143 #define CONFIG_STK11XX_DEBUG 0 00144 #endif 00145 00146 #if CONFIG_STK11XX_DEBUG 00147 00148 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args) 00149 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args) 00150 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args) 00151 #define STK_DEBUG(str, args...) printk(KERN_DEBUG PREFIX str, ##args) 00152 00153 #else 00154 00155 #define STK_INFO(str, args...) printk(KERN_INFO PREFIX str, ##args) 00156 #define STK_ERROR(str, args...) printk(KERN_ERR PREFIX str, ##args) 00157 #define STK_WARNING(str, args...) printk(KERN_WARNING PREFIX str, ##args) 00158 #define STK_DEBUG(str, args...) do { } while(0) 00159 00160 #endif 00161 00162 00171 #ifndef CONFIG_STK11XX_DEBUG_STREAM 00172 #define CONFIG_STK11XX_DEBUG_STREAM 0 00173 #endif 00174 00175 #if CONFIG_STK11XX_DEBUG_STREAM 00176 00177 #define STK_STREAM(str, args...) printk(KERN_DEBUG PREFIX str, ##args) 00178 00179 #else 00180 00181 #define STK_STREAM(str, args...) do { } while(0) 00182 00183 #endif 00184 00185 00186 00190 typedef enum { 00191 SYNTEK_STK_M811 = 1, 00192 SYNTEK_STK_A311 = 2, 00193 SYNTEK_STK_A821 = 3, 00194 SYNTEK_STK_6A31 = 4, 00195 SYNTEK_STK_6A33 = 5, 00196 SYNTEK_STK_6A51 = 6, 00197 SYNTEK_STK_6A54 = 7, 00198 SYNTEK_STK_6D51 = 8, 00199 SYNTEK_STK_0500 = 9, 00200 SYNTEK_STK_0408 = 10, 00201 SYNTEK_STK_AA11 = 11, 00202 } T_SYNTEK_DEVICE; 00203 00204 00208 typedef enum { 00209 STK11XX_VGA, 00210 STK11XX_SXGA, 00211 STK11XX_PAL, 00212 STK11XX_UXGA 00213 } T_STK11XX_VIDEOMODE; 00214 00215 00219 typedef enum { 00220 STK11XX_80x60, 00221 STK11XX_128x96, 00222 STK11XX_160x120, 00223 STK11XX_213x160, 00224 STK11XX_320x240, 00225 STK11XX_640x480, 00226 STK11XX_720x576, 00227 STK11XX_800x600, 00228 STK11XX_1024x768, 00229 STK11XX_1280x1024, 00230 STK11XX_NBR_SIZES 00231 } T_STK11XX_RESOLUTION; 00232 00233 00237 typedef enum { 00238 STK11XX_PALETTE_RGB24, 00239 STK11XX_PALETTE_RGB32, 00240 STK11XX_PALETTE_BGR24, 00241 STK11XX_PALETTE_BGR32, 00242 STK11XX_PALETTE_UYVY, 00243 STK11XX_PALETTE_YUYV 00244 } T_STK11XX_PALETTE; 00245 00246 00250 struct stk11xx_iso_buf { 00251 void *data; 00252 int length; 00253 int read; 00254 struct urb *urb; 00255 }; 00256 00257 00261 struct stk11xx_frame_buf { 00262 int errors; 00263 void *data; 00264 volatile bool odd; 00265 volatile int filled; 00266 struct stk11xx_frame_buf *next; 00267 }; 00268 00269 00273 struct stk11xx_image_buf { 00274 unsigned long offset; 00275 int vma_use_count; 00276 }; 00277 00278 00282 struct stk11xx_coord { 00283 int x; 00284 int y; 00285 }; 00286 00287 00291 struct stk11xx_video { 00292 int fps; 00293 int brightness; 00294 int contrast; 00295 int whiteness; 00296 int colour; 00297 int depth; 00298 int palette; 00299 int hue; 00300 int hflip; 00301 int vflip; 00302 int input; 00303 int norm; 00305 // default values for the device. Above are *current* values 00306 int default_brightness; 00307 int default_contrast; 00308 int default_colour; 00309 int default_whiteness; 00310 int default_hflip; 00311 int default_vflip; 00312 }; 00313 00314 00318 struct usb_stk11xx { 00319 struct video_device *vdev; 00320 struct usb_device *udev; 00321 struct usb_interface *interface; 00323 int release; 00324 int webcam_model; 00325 int webcam_type; 00327 unsigned char *int_in_buffer; 00328 size_t int_in_size; 00329 __u8 int_in_endpointAddr; 00331 size_t isoc_in_size; 00332 __u8 isoc_in_endpointAddr; 00334 int watchdog; 00336 struct stk11xx_video vsettings; 00338 int error_status; 00339 00340 int vopen; 00341 int visoc_errors; 00342 int vframes_error; 00343 int vframes_dumped; 00344 int vsync; 00345 int v1st_cap; 00348 spinlock_t spinlock; 00349 struct semaphore mutex; 00350 wait_queue_head_t wait_frame; 00351 struct mutex modlock; 00354 // 1: isoc 00355 char isoc_init_ok; 00356 struct stk11xx_iso_buf isobuf[MAX_ISO_BUFS]; 00357 00358 // 2: frame 00359 int frame_size; 00360 struct stk11xx_frame_buf *framebuf; 00361 struct stk11xx_frame_buf *empty_frames, *empty_frames_tail; 00362 struct stk11xx_frame_buf *full_frames, *full_frames_tail; 00363 struct stk11xx_frame_buf *fill_frame; 00364 struct stk11xx_frame_buf *read_frame; 00365 00366 // 3: image 00367 int view_size; 00368 int image_size; 00369 void *image_data; 00370 struct stk11xx_image_buf images[STK11XX_MAX_IMAGES]; 00371 int image_used[STK11XX_MAX_IMAGES]; 00372 unsigned int nbuffers; 00373 unsigned int len_per_image; 00374 int image_read_pos; 00375 int fill_image; 00376 int resolution; 00377 struct stk11xx_coord view; 00378 struct stk11xx_coord image; 00379 }; 00380 00381 00386 #define STK11XX_PERCENT(x,y) ( ((int)x * (int)y) / 100) 00387 00388 00393 #define to_stk11xx_dev(d) container_of(d, struct usb_stk11xx, kref) 00394 00395 00396 extern const struct stk11xx_coord stk11xx_image_sizes[STK11XX_NBR_SIZES]; 00397 00398 00399 int usb_stk11xx_write_registry(struct usb_stk11xx *, __u16, __u16); 00400 int usb_stk11xx_read_registry(struct usb_stk11xx *, __u16, int *); 00401 int usb_stk11xx_set_feature(struct usb_stk11xx *, int); 00402 int usb_stk11xx_set_configuration(struct usb_stk11xx *); 00403 int usb_stk11xx_isoc_init(struct usb_stk11xx *); 00404 void usb_stk11xx_isoc_handler(struct urb *); 00405 void usb_stk11xx_isoc_cleanup(struct usb_stk11xx *); 00406 00407 int dev_stk11xx_decompress(struct usb_stk11xx *); 00408 int dev_stk11xx_initialize_device(struct usb_stk11xx *); 00409 int dev_stk11xx_start_stream(struct usb_stk11xx *); 00410 int dev_stk11xx_stop_stream(struct usb_stk11xx *); 00411 int dev_stk11xx_check_device(struct usb_stk11xx *, int); 00412 int dev_stk11xx_camera_on(struct usb_stk11xx *); 00413 int dev_stk11xx_camera_off(struct usb_stk11xx *); 00414 int dev_stk11xx_camera_asleep(struct usb_stk11xx *); 00415 int dev_stk11xx_init_camera(struct usb_stk11xx *); 00416 int dev_stk11xx_reconf_camera(struct usb_stk11xx *); 00417 int dev_stk11xx_camera_settings(struct usb_stk11xx *); 00418 int dev_stk11xx_set_camera_quality(struct usb_stk11xx *); 00419 int dev_stk11xx_set_camera_fps(struct usb_stk11xx *); 00420 int dev_stk11xx_watchdog_camera(struct usb_stk11xx *); 00421 00422 int v4l_stk11xx_select_video_mode(struct usb_stk11xx *, int, int); 00423 int v4l_stk11xx_register_video_device(struct usb_stk11xx *); 00424 int v4l_stk11xx_unregister_video_device(struct usb_stk11xx *); 00425 00426 int stk11xx_create_sysfs_files(struct video_device *); 00427 void stk11xx_remove_sysfs_files(struct video_device *); 00428 00429 int stk11xx_allocate_buffers(struct usb_stk11xx *); 00430 int stk11xx_reset_buffers(struct usb_stk11xx *); 00431 int stk11xx_clear_buffers(struct usb_stk11xx *); 00432 int stk11xx_free_buffers(struct usb_stk11xx *); 00433 void stk11xx_next_image(struct usb_stk11xx *); 00434 int stk11xx_next_frame(struct usb_stk11xx *); 00435 int stk11xx_handle_frame(struct usb_stk11xx *); 00436 00437 int stk11xx_decompress(struct usb_stk11xx *); 00438 00439 00440 #endif