SyntekUSBVideoCamera
stk11xx.h
Go to the documentation of this file.
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