1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* (C) 1999-2003 Nemosoft Unv. 3*4882a593Smuzhiyun (C) 2004-2006 Luc Saillard (luc@saillard.org) 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun NOTE: this version of pwc is an unofficial (modified) release of pwc & pcwx 6*4882a593Smuzhiyun driver and thus may have bugs that are not present in the original version. 7*4882a593Smuzhiyun Please send bug reports and support requests to <luc@saillard.org>. 8*4882a593Smuzhiyun The decompression routines have been implemented by reverse-engineering the 9*4882a593Smuzhiyun Nemosoft binary pwcx module. Caveat emptor. 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun */ 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #ifndef PWC_H 14*4882a593Smuzhiyun #define PWC_H 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/module.h> 17*4882a593Smuzhiyun #include <linux/usb.h> 18*4882a593Smuzhiyun #include <linux/spinlock.h> 19*4882a593Smuzhiyun #include <linux/wait.h> 20*4882a593Smuzhiyun #include <linux/mutex.h> 21*4882a593Smuzhiyun #include <linux/mm.h> 22*4882a593Smuzhiyun #include <linux/slab.h> 23*4882a593Smuzhiyun #include <asm/errno.h> 24*4882a593Smuzhiyun #include <linux/videodev2.h> 25*4882a593Smuzhiyun #include <media/v4l2-common.h> 26*4882a593Smuzhiyun #include <media/v4l2-device.h> 27*4882a593Smuzhiyun #include <media/v4l2-ioctl.h> 28*4882a593Smuzhiyun #include <media/v4l2-ctrls.h> 29*4882a593Smuzhiyun #include <media/v4l2-fh.h> 30*4882a593Smuzhiyun #include <media/v4l2-event.h> 31*4882a593Smuzhiyun #include <media/videobuf2-v4l2.h> 32*4882a593Smuzhiyun #include <media/videobuf2-vmalloc.h> 33*4882a593Smuzhiyun #ifdef CONFIG_USB_PWC_INPUT_EVDEV 34*4882a593Smuzhiyun #include <linux/input.h> 35*4882a593Smuzhiyun #endif 36*4882a593Smuzhiyun #include "pwc-dec1.h" 37*4882a593Smuzhiyun #include "pwc-dec23.h" 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Version block */ 40*4882a593Smuzhiyun #define PWC_VERSION "10.0.15" 41*4882a593Smuzhiyun #define PWC_NAME "pwc" 42*4882a593Smuzhiyun #define PFX PWC_NAME ": " 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* Trace certain actions in the driver */ 46*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_MODULE BIT(0) 47*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_PROBE BIT(1) 48*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_OPEN BIT(2) 49*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_READ BIT(3) 50*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_MEMORY BIT(4) 51*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_FLOW BIT(5) 52*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_SIZE BIT(6) 53*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_IOCTL BIT(7) 54*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL_TRACE BIT(8) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define PWC_DEBUG_MODULE(fmt, args...) PWC_DEBUG(MODULE, fmt, ##args) 57*4882a593Smuzhiyun #define PWC_DEBUG_PROBE(fmt, args...) PWC_DEBUG(PROBE, fmt, ##args) 58*4882a593Smuzhiyun #define PWC_DEBUG_OPEN(fmt, args...) PWC_DEBUG(OPEN, fmt, ##args) 59*4882a593Smuzhiyun #define PWC_DEBUG_READ(fmt, args...) PWC_DEBUG(READ, fmt, ##args) 60*4882a593Smuzhiyun #define PWC_DEBUG_MEMORY(fmt, args...) PWC_DEBUG(MEMORY, fmt, ##args) 61*4882a593Smuzhiyun #define PWC_DEBUG_FLOW(fmt, args...) PWC_DEBUG(FLOW, fmt, ##args) 62*4882a593Smuzhiyun #define PWC_DEBUG_SIZE(fmt, args...) PWC_DEBUG(SIZE, fmt, ##args) 63*4882a593Smuzhiyun #define PWC_DEBUG_IOCTL(fmt, args...) PWC_DEBUG(IOCTL, fmt, ##args) 64*4882a593Smuzhiyun #define PWC_DEBUG_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef CONFIG_USB_PWC_DEBUG 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun #define PWC_DEBUG_LEVEL (PWC_DEBUG_LEVEL_MODULE) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define PWC_DEBUG(level, fmt, args...) do {\ 72*4882a593Smuzhiyun if ((PWC_DEBUG_LEVEL_ ##level) & pwc_trace) \ 73*4882a593Smuzhiyun printk(KERN_DEBUG PFX fmt, ##args); \ 74*4882a593Smuzhiyun } while (0) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args) 77*4882a593Smuzhiyun #define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args) 78*4882a593Smuzhiyun #define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args) 79*4882a593Smuzhiyun #define PWC_TRACE(fmt, args...) PWC_DEBUG(TRACE, fmt, ##args) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #else /* if ! CONFIG_USB_PWC_DEBUG */ 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define PWC_ERROR(fmt, args...) printk(KERN_ERR PFX fmt, ##args) 84*4882a593Smuzhiyun #define PWC_WARNING(fmt, args...) printk(KERN_WARNING PFX fmt, ##args) 85*4882a593Smuzhiyun #define PWC_INFO(fmt, args...) printk(KERN_INFO PFX fmt, ##args) 86*4882a593Smuzhiyun #define PWC_TRACE(fmt, args...) do { } while(0) 87*4882a593Smuzhiyun #define PWC_DEBUG(level, fmt, args...) do { } while(0) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define pwc_trace 0 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #endif 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun /* Defines for ToUCam cameras */ 94*4882a593Smuzhiyun #define TOUCAM_HEADER_SIZE 8 95*4882a593Smuzhiyun #define TOUCAM_TRAILER_SIZE 4 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define FEATURE_MOTOR_PANTILT 0x0001 98*4882a593Smuzhiyun #define FEATURE_CODEC1 0x0002 99*4882a593Smuzhiyun #define FEATURE_CODEC2 0x0004 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define MAX_WIDTH 640 102*4882a593Smuzhiyun #define MAX_HEIGHT 480 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* Ignore errors in the first N frames, to allow for startup delays */ 105*4882a593Smuzhiyun #define FRAME_LOWMARK 5 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* Size and number of buffers for the ISO pipe. */ 108*4882a593Smuzhiyun #define MAX_ISO_BUFS 3 109*4882a593Smuzhiyun #define ISO_FRAMES_PER_DESC 10 110*4882a593Smuzhiyun #define ISO_MAX_FRAME_SIZE 960 111*4882a593Smuzhiyun #define ISO_BUFFER_SIZE (ISO_FRAMES_PER_DESC * ISO_MAX_FRAME_SIZE) 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* Maximum size after decompression is 640x480 YUV data, 1.5 * 640 * 480 */ 114*4882a593Smuzhiyun #define PWC_FRAME_SIZE (460800 + TOUCAM_HEADER_SIZE + TOUCAM_TRAILER_SIZE) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun /* Absolute minimum and maximum number of buffers available for mmap() */ 117*4882a593Smuzhiyun #define MIN_FRAMES 2 118*4882a593Smuzhiyun #define MAX_FRAMES 16 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Some macros to quickly find the type of a webcam */ 121*4882a593Smuzhiyun #define DEVICE_USE_CODEC1(x) ((x)<675) 122*4882a593Smuzhiyun #define DEVICE_USE_CODEC2(x) ((x)>=675 && (x)<700) 123*4882a593Smuzhiyun #define DEVICE_USE_CODEC3(x) ((x)>=700) 124*4882a593Smuzhiyun #define DEVICE_USE_CODEC23(x) ((x)>=675) 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun /* Request types: video */ 127*4882a593Smuzhiyun #define SET_LUM_CTL 0x01 128*4882a593Smuzhiyun #define GET_LUM_CTL 0x02 129*4882a593Smuzhiyun #define SET_CHROM_CTL 0x03 130*4882a593Smuzhiyun #define GET_CHROM_CTL 0x04 131*4882a593Smuzhiyun #define SET_STATUS_CTL 0x05 132*4882a593Smuzhiyun #define GET_STATUS_CTL 0x06 133*4882a593Smuzhiyun #define SET_EP_STREAM_CTL 0x07 134*4882a593Smuzhiyun #define GET_EP_STREAM_CTL 0x08 135*4882a593Smuzhiyun #define GET_XX_CTL 0x09 136*4882a593Smuzhiyun #define SET_XX_CTL 0x0A 137*4882a593Smuzhiyun #define GET_XY_CTL 0x0B 138*4882a593Smuzhiyun #define SET_XY_CTL 0x0C 139*4882a593Smuzhiyun #define SET_MPT_CTL 0x0D 140*4882a593Smuzhiyun #define GET_MPT_CTL 0x0E 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun /* Selectors for the Luminance controls [GS]ET_LUM_CTL */ 143*4882a593Smuzhiyun #define AGC_MODE_FORMATTER 0x2000 144*4882a593Smuzhiyun #define PRESET_AGC_FORMATTER 0x2100 145*4882a593Smuzhiyun #define SHUTTER_MODE_FORMATTER 0x2200 146*4882a593Smuzhiyun #define PRESET_SHUTTER_FORMATTER 0x2300 147*4882a593Smuzhiyun #define PRESET_CONTOUR_FORMATTER 0x2400 148*4882a593Smuzhiyun #define AUTO_CONTOUR_FORMATTER 0x2500 149*4882a593Smuzhiyun #define BACK_LIGHT_COMPENSATION_FORMATTER 0x2600 150*4882a593Smuzhiyun #define CONTRAST_FORMATTER 0x2700 151*4882a593Smuzhiyun #define DYNAMIC_NOISE_CONTROL_FORMATTER 0x2800 152*4882a593Smuzhiyun #define FLICKERLESS_MODE_FORMATTER 0x2900 153*4882a593Smuzhiyun #define AE_CONTROL_SPEED 0x2A00 154*4882a593Smuzhiyun #define BRIGHTNESS_FORMATTER 0x2B00 155*4882a593Smuzhiyun #define GAMMA_FORMATTER 0x2C00 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun /* Selectors for the Chrominance controls [GS]ET_CHROM_CTL */ 158*4882a593Smuzhiyun #define WB_MODE_FORMATTER 0x1000 159*4882a593Smuzhiyun #define AWB_CONTROL_SPEED_FORMATTER 0x1100 160*4882a593Smuzhiyun #define AWB_CONTROL_DELAY_FORMATTER 0x1200 161*4882a593Smuzhiyun #define PRESET_MANUAL_RED_GAIN_FORMATTER 0x1300 162*4882a593Smuzhiyun #define PRESET_MANUAL_BLUE_GAIN_FORMATTER 0x1400 163*4882a593Smuzhiyun #define COLOUR_MODE_FORMATTER 0x1500 164*4882a593Smuzhiyun #define SATURATION_MODE_FORMATTER1 0x1600 165*4882a593Smuzhiyun #define SATURATION_MODE_FORMATTER2 0x1700 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun /* Selectors for the Status controls [GS]ET_STATUS_CTL */ 168*4882a593Smuzhiyun #define SAVE_USER_DEFAULTS_FORMATTER 0x0200 169*4882a593Smuzhiyun #define RESTORE_USER_DEFAULTS_FORMATTER 0x0300 170*4882a593Smuzhiyun #define RESTORE_FACTORY_DEFAULTS_FORMATTER 0x0400 171*4882a593Smuzhiyun #define READ_AGC_FORMATTER 0x0500 172*4882a593Smuzhiyun #define READ_SHUTTER_FORMATTER 0x0600 173*4882a593Smuzhiyun #define READ_RED_GAIN_FORMATTER 0x0700 174*4882a593Smuzhiyun #define READ_BLUE_GAIN_FORMATTER 0x0800 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun /* Formatters for the motorized pan & tilt [GS]ET_MPT_CTL */ 177*4882a593Smuzhiyun #define PT_RELATIVE_CONTROL_FORMATTER 0x01 178*4882a593Smuzhiyun #define PT_RESET_CONTROL_FORMATTER 0x02 179*4882a593Smuzhiyun #define PT_STATUS_FORMATTER 0x03 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Enumeration of image sizes */ 182*4882a593Smuzhiyun #define PSZ_SQCIF 0x00 183*4882a593Smuzhiyun #define PSZ_QSIF 0x01 184*4882a593Smuzhiyun #define PSZ_QCIF 0x02 185*4882a593Smuzhiyun #define PSZ_SIF 0x03 186*4882a593Smuzhiyun #define PSZ_CIF 0x04 187*4882a593Smuzhiyun #define PSZ_VGA 0x05 188*4882a593Smuzhiyun #define PSZ_MAX 6 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct pwc_raw_frame { 191*4882a593Smuzhiyun __le16 type; /* type of the webcam */ 192*4882a593Smuzhiyun __le16 vbandlength; /* Size of 4 lines compressed (used by the 193*4882a593Smuzhiyun decompressor) */ 194*4882a593Smuzhiyun __u8 cmd[4]; /* the four byte of the command (in case of 195*4882a593Smuzhiyun nala, only the first 3 bytes is filled) */ 196*4882a593Smuzhiyun __u8 rawframe[]; /* frame_size = H / 4 * vbandlength */ 197*4882a593Smuzhiyun } __packed; 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun /* intermediate buffers with raw data from the USB cam */ 200*4882a593Smuzhiyun struct pwc_frame_buf 201*4882a593Smuzhiyun { 202*4882a593Smuzhiyun /* common v4l buffer stuff -- must be first */ 203*4882a593Smuzhiyun struct vb2_v4l2_buffer vb; 204*4882a593Smuzhiyun struct list_head list; 205*4882a593Smuzhiyun void *data; 206*4882a593Smuzhiyun int filled; /* number of bytes filled */ 207*4882a593Smuzhiyun }; 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun struct pwc_device 210*4882a593Smuzhiyun { 211*4882a593Smuzhiyun struct video_device vdev; 212*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun /* videobuf2 queue and queued buffers list */ 215*4882a593Smuzhiyun struct vb2_queue vb_queue; 216*4882a593Smuzhiyun struct list_head queued_bufs; 217*4882a593Smuzhiyun spinlock_t queued_bufs_lock; /* Protects queued_bufs */ 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* If taking both locks vb_queue_lock must always be locked first! */ 220*4882a593Smuzhiyun struct mutex v4l2_lock; /* Protects everything else */ 221*4882a593Smuzhiyun struct mutex vb_queue_lock; /* Protects vb_queue and capt_file */ 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun /* Pointer to our usb_device, will be NULL after unplug */ 224*4882a593Smuzhiyun struct usb_device *udev; /* Both mutexes most be hold when setting! */ 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun /* type of cam (645, 646, 675, 680, 690, 720, 730, 740, 750) */ 227*4882a593Smuzhiyun int type; 228*4882a593Smuzhiyun int release; /* release number */ 229*4882a593Smuzhiyun int features; /* feature bits */ 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /*** Video data ***/ 232*4882a593Smuzhiyun int vendpoint; /* video isoc endpoint */ 233*4882a593Smuzhiyun int vcinterface; /* video control interface */ 234*4882a593Smuzhiyun int valternate; /* alternate interface needed */ 235*4882a593Smuzhiyun int vframes; /* frames-per-second */ 236*4882a593Smuzhiyun int pixfmt; /* pixelformat: V4L2_PIX_FMT_YUV420 or _PWCX */ 237*4882a593Smuzhiyun int vframe_count; /* received frames */ 238*4882a593Smuzhiyun int vmax_packet_size; /* USB maxpacket size */ 239*4882a593Smuzhiyun int vlast_packet_size; /* for frame synchronisation */ 240*4882a593Smuzhiyun int visoc_errors; /* number of contiguous ISOC errors */ 241*4882a593Smuzhiyun int vbandlength; /* compressed band length; 0 is uncompressed */ 242*4882a593Smuzhiyun char vsync; /* used by isoc handler */ 243*4882a593Smuzhiyun char vmirror; /* for ToUCaM series */ 244*4882a593Smuzhiyun char power_save; /* Do powersaving for this cam */ 245*4882a593Smuzhiyun 246*4882a593Smuzhiyun unsigned char cmd_buf[13]; 247*4882a593Smuzhiyun unsigned char *ctrl_buf; 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun struct urb *urbs[MAX_ISO_BUFS]; 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* 252*4882a593Smuzhiyun * Frame currently being filled, this only gets touched by the 253*4882a593Smuzhiyun * isoc urb complete handler, and by stream start / stop since 254*4882a593Smuzhiyun * start / stop touch it before / after starting / killing the urbs 255*4882a593Smuzhiyun * no locking is needed around this 256*4882a593Smuzhiyun */ 257*4882a593Smuzhiyun struct pwc_frame_buf *fill_buf; 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun int frame_header_size, frame_trailer_size; 260*4882a593Smuzhiyun int frame_size; 261*4882a593Smuzhiyun int frame_total_size; /* including header & trailer */ 262*4882a593Smuzhiyun int drop_frames; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun union { /* private data for decompression engine */ 265*4882a593Smuzhiyun struct pwc_dec1_private dec1; 266*4882a593Smuzhiyun struct pwc_dec23_private dec23; 267*4882a593Smuzhiyun }; 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun /* 270*4882a593Smuzhiyun * We have an 'image' and a 'view', where 'image' is the fixed-size img 271*4882a593Smuzhiyun * as delivered by the camera, and 'view' is the size requested by the 272*4882a593Smuzhiyun * program. The camera image is centered in this viewport, laced with 273*4882a593Smuzhiyun * a gray or black border. view_min <= image <= view <= view_max; 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun int image_mask; /* supported sizes */ 276*4882a593Smuzhiyun int width, height; /* current resolution */ 277*4882a593Smuzhiyun 278*4882a593Smuzhiyun #ifdef CONFIG_USB_PWC_INPUT_EVDEV 279*4882a593Smuzhiyun struct input_dev *button_dev; /* webcam snapshot button input */ 280*4882a593Smuzhiyun char button_phys[64]; 281*4882a593Smuzhiyun #endif 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* controls */ 284*4882a593Smuzhiyun struct v4l2_ctrl_handler ctrl_handler; 285*4882a593Smuzhiyun u16 saturation_fmt; 286*4882a593Smuzhiyun struct v4l2_ctrl *brightness; 287*4882a593Smuzhiyun struct v4l2_ctrl *contrast; 288*4882a593Smuzhiyun struct v4l2_ctrl *saturation; 289*4882a593Smuzhiyun struct v4l2_ctrl *gamma; 290*4882a593Smuzhiyun struct { 291*4882a593Smuzhiyun /* awb / red-blue balance cluster */ 292*4882a593Smuzhiyun struct v4l2_ctrl *auto_white_balance; 293*4882a593Smuzhiyun struct v4l2_ctrl *red_balance; 294*4882a593Smuzhiyun struct v4l2_ctrl *blue_balance; 295*4882a593Smuzhiyun /* usb ctrl transfers are slow, so we cache things */ 296*4882a593Smuzhiyun int color_bal_valid; 297*4882a593Smuzhiyun unsigned long last_color_bal_update; /* In jiffies */ 298*4882a593Smuzhiyun s32 last_red_balance; 299*4882a593Smuzhiyun s32 last_blue_balance; 300*4882a593Smuzhiyun }; 301*4882a593Smuzhiyun struct { 302*4882a593Smuzhiyun /* autogain / gain cluster */ 303*4882a593Smuzhiyun struct v4l2_ctrl *autogain; 304*4882a593Smuzhiyun struct v4l2_ctrl *gain; 305*4882a593Smuzhiyun int gain_valid; 306*4882a593Smuzhiyun unsigned long last_gain_update; /* In jiffies */ 307*4882a593Smuzhiyun s32 last_gain; 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun struct { 310*4882a593Smuzhiyun /* exposure_auto / exposure cluster */ 311*4882a593Smuzhiyun struct v4l2_ctrl *exposure_auto; 312*4882a593Smuzhiyun struct v4l2_ctrl *exposure; 313*4882a593Smuzhiyun int exposure_valid; 314*4882a593Smuzhiyun unsigned long last_exposure_update; /* In jiffies */ 315*4882a593Smuzhiyun s32 last_exposure; 316*4882a593Smuzhiyun }; 317*4882a593Smuzhiyun struct v4l2_ctrl *colorfx; 318*4882a593Smuzhiyun struct { 319*4882a593Smuzhiyun /* autocontour/contour cluster */ 320*4882a593Smuzhiyun struct v4l2_ctrl *autocontour; 321*4882a593Smuzhiyun struct v4l2_ctrl *contour; 322*4882a593Smuzhiyun }; 323*4882a593Smuzhiyun struct v4l2_ctrl *backlight; 324*4882a593Smuzhiyun struct v4l2_ctrl *flicker; 325*4882a593Smuzhiyun struct v4l2_ctrl *noise_reduction; 326*4882a593Smuzhiyun struct v4l2_ctrl *save_user; 327*4882a593Smuzhiyun struct v4l2_ctrl *restore_user; 328*4882a593Smuzhiyun struct v4l2_ctrl *restore_factory; 329*4882a593Smuzhiyun struct v4l2_ctrl *awb_speed; 330*4882a593Smuzhiyun struct v4l2_ctrl *awb_delay; 331*4882a593Smuzhiyun struct { 332*4882a593Smuzhiyun /* motor control cluster */ 333*4882a593Smuzhiyun struct v4l2_ctrl *motor_pan; 334*4882a593Smuzhiyun struct v4l2_ctrl *motor_tilt; 335*4882a593Smuzhiyun struct v4l2_ctrl *motor_pan_reset; 336*4882a593Smuzhiyun struct v4l2_ctrl *motor_tilt_reset; 337*4882a593Smuzhiyun }; 338*4882a593Smuzhiyun /* CODEC3 models have both gain and exposure controlled by autogain */ 339*4882a593Smuzhiyun struct v4l2_ctrl *autogain_expo_cluster[3]; 340*4882a593Smuzhiyun }; 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* Global variables */ 343*4882a593Smuzhiyun #ifdef CONFIG_USB_PWC_DEBUG 344*4882a593Smuzhiyun extern int pwc_trace; 345*4882a593Smuzhiyun #endif 346*4882a593Smuzhiyun 347*4882a593Smuzhiyun /** Functions in pwc-misc.c */ 348*4882a593Smuzhiyun /* sizes in pixels */ 349*4882a593Smuzhiyun extern const int pwc_image_sizes[PSZ_MAX][2]; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun int pwc_get_size(struct pwc_device *pdev, int width, int height); 352*4882a593Smuzhiyun void pwc_construct(struct pwc_device *pdev); 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /** Functions in pwc-ctrl.c */ 355*4882a593Smuzhiyun /* Request a certain video mode. Returns < 0 if not possible */ 356*4882a593Smuzhiyun extern int pwc_set_video_mode(struct pwc_device *pdev, int width, int height, 357*4882a593Smuzhiyun int pixfmt, int frames, int *compression, int send_to_cam); 358*4882a593Smuzhiyun extern unsigned int pwc_get_fps(struct pwc_device *pdev, unsigned int index, unsigned int size); 359*4882a593Smuzhiyun extern int pwc_set_leds(struct pwc_device *pdev, int on_value, int off_value); 360*4882a593Smuzhiyun extern int pwc_get_cmos_sensor(struct pwc_device *pdev, int *sensor); 361*4882a593Smuzhiyun extern int send_control_msg(struct pwc_device *pdev, 362*4882a593Smuzhiyun u8 request, u16 value, void *buf, int buflen); 363*4882a593Smuzhiyun 364*4882a593Smuzhiyun /* Control get / set helpers */ 365*4882a593Smuzhiyun int pwc_get_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); 366*4882a593Smuzhiyun int pwc_set_u8_ctrl(struct pwc_device *pdev, u8 request, u16 value, u8 data); 367*4882a593Smuzhiyun int pwc_get_s8_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *data); 368*4882a593Smuzhiyun #define pwc_set_s8_ctrl pwc_set_u8_ctrl 369*4882a593Smuzhiyun int pwc_get_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, int *dat); 370*4882a593Smuzhiyun int pwc_set_u16_ctrl(struct pwc_device *pdev, u8 request, u16 value, u16 data); 371*4882a593Smuzhiyun int pwc_button_ctrl(struct pwc_device *pdev, u16 value); 372*4882a593Smuzhiyun int pwc_init_controls(struct pwc_device *pdev); 373*4882a593Smuzhiyun 374*4882a593Smuzhiyun /* Power down or up the camera; not supported by all models */ 375*4882a593Smuzhiyun extern void pwc_camera_power(struct pwc_device *pdev, int power); 376*4882a593Smuzhiyun 377*4882a593Smuzhiyun extern const struct v4l2_ioctl_ops pwc_ioctl_ops; 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun /** pwc-uncompress.c */ 380*4882a593Smuzhiyun /* Expand frame to image, possibly including decompression. Uses read_frame and fill_image */ 381*4882a593Smuzhiyun int pwc_decompress(struct pwc_device *pdev, struct pwc_frame_buf *fbuf); 382*4882a593Smuzhiyun 383*4882a593Smuzhiyun #endif 384