7030 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Z-Star/Vimicro zc301/zc302p/vc30x driver4 *5 * Copyright (C) 2009-2012 Jean-Francois Moine <http://moinejf.free.fr>6 * Copyright (C) 2004 2005 2006 Michel Xhaard mxhaard@magic.fr7 */8 9#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt10 11#include <linux/input.h>12#include "gspca.h"13#include "jpeg.h"14 15MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, Serge A. Suchkov <Serge.A.S@tochka.ru>");16MODULE_DESCRIPTION("GSPCA ZC03xx/VC3xx USB Camera Driver");17MODULE_LICENSE("GPL");18 19static int force_sensor = -1;20 21#define REG08_DEF 3 /* default JPEG compression (75%) */22#include "zc3xx-reg.h"23 24/* specific webcam descriptor */25struct sd {26 struct gspca_dev gspca_dev; /* !! must be the first item */27 28 struct { /* gamma/brightness/contrast control cluster */29 struct v4l2_ctrl *gamma;30 struct v4l2_ctrl *brightness;31 struct v4l2_ctrl *contrast;32 };33 struct { /* autogain/exposure control cluster */34 struct v4l2_ctrl *autogain;35 struct v4l2_ctrl *exposure;36 };37 struct v4l2_ctrl *plfreq;38 struct v4l2_ctrl *sharpness;39 struct v4l2_ctrl *jpegqual;40 41 struct work_struct work;42 43 u8 reg08; /* webcam compression quality */44 45 u8 bridge;46 u8 sensor; /* Type of image sensor chip */47 u16 chip_revision;48 49 u8 jpeg_hdr[JPEG_HDR_SZ];50};51enum bridges {52 BRIDGE_ZC301,53 BRIDGE_ZC303,54};55enum sensors {56 SENSOR_ADCM2700,57 SENSOR_CS2102,58 SENSOR_CS2102K,59 SENSOR_GC0303,60 SENSOR_GC0305,61 SENSOR_HDCS2020,62 SENSOR_HV7131B,63 SENSOR_HV7131R,64 SENSOR_ICM105A,65 SENSOR_MC501CB,66 SENSOR_MT9V111_1, /* (mi360soc) zc301 */67 SENSOR_MT9V111_3, /* (mi360soc) zc303 */68 SENSOR_OV7620, /* OV7648 - same values */69 SENSOR_OV7630C,70 SENSOR_PAS106,71 SENSOR_PAS202B,72 SENSOR_PB0330,73 SENSOR_PO2030,74 SENSOR_TAS5130C,75 SENSOR_MAX76};77 78static const struct v4l2_pix_format vga_mode[] = {79 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,80 .bytesperline = 320,81 .sizeimage = 320 * 240 * 3 / 8 + 590,82 .colorspace = V4L2_COLORSPACE_JPEG,83 .priv = 1},84 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,85 .bytesperline = 640,86 .sizeimage = 640 * 480 * 3 / 8 + 590,87 .colorspace = V4L2_COLORSPACE_JPEG,88 .priv = 0},89};90 91static const struct v4l2_pix_format broken_vga_mode[] = {92 {320, 232, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,93 .bytesperline = 320,94 .sizeimage = 320 * 232 * 4 / 8 + 590,95 .colorspace = V4L2_COLORSPACE_JPEG,96 .priv = 1},97 {640, 472, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,98 .bytesperline = 640,99 .sizeimage = 640 * 472 * 3 / 8 + 590,100 .colorspace = V4L2_COLORSPACE_JPEG,101 .priv = 0},102};103 104static const struct v4l2_pix_format sif_mode[] = {105 {176, 144, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,106 .bytesperline = 176,107 .sizeimage = 176 * 144 * 3 / 8 + 590,108 .colorspace = V4L2_COLORSPACE_JPEG,109 .priv = 1},110 {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE,111 .bytesperline = 352,112 .sizeimage = 352 * 288 * 3 / 8 + 590,113 .colorspace = V4L2_COLORSPACE_JPEG,114 .priv = 0},115};116 117/*118 * Bridge reg08 bits 1-2 -> JPEG quality conversion table. Note the highest119 * quality setting is not usable as USB 1 does not have enough bandwidth.120 */121static u8 jpeg_qual[] = {50, 75, 87, /* 94 */};122 123/* usb exchanges */124struct usb_action {125 u8 req;126 u8 val;127 u16 idx;128};129 130static const struct usb_action adcm2700_Initial[] = {131 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */132 {0xa0, 0x04, ZC3XX_R002_CLOCKSELECT}, /* 00,02,04,cc */133 {0xa0, 0x00, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */134 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */135 {0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,d3,cc */136 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */137 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */138 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */139 {0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d8,cc */140 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */141 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */142 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */143 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */144 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */145 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */146 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */147 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */148 {0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,de,cc */149 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */150 {0xbb, 0x00, 0x0400}, /* 04,00,00,bb */151 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */152 {0xbb, 0x0f, 0x140f}, /* 14,0f,0f,bb */153 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */154 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */155 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */156 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */157 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */158 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */159 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */160 {0xa0, 0x58, ZC3XX_R116_RGAIN}, /* 01,16,58,cc */161 {0xa0, 0x5a, ZC3XX_R118_BGAIN}, /* 01,18,5a,cc */162 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */163 {0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,d3,cc */164 {0xbb, 0x00, 0x0408}, /* 04,00,08,bb */165 {0xdd, 0x00, 0x0200}, /* 00,02,00,dd */166 {0xbb, 0x00, 0x0400}, /* 04,00,00,bb */167 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */168 {0xbb, 0x0f, 0x140f}, /* 14,0f,0f,bb */169 {0xbb, 0xe0, 0x0c2e}, /* 0c,e0,2e,bb */170 {0xbb, 0x01, 0x2000}, /* 20,01,00,bb */171 {0xbb, 0x96, 0x2400}, /* 24,96,00,bb */172 {0xbb, 0x06, 0x1006}, /* 10,06,06,bb */173 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */174 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */175 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */176 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */177 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */178 {0xbb, 0x5f, 0x2090}, /* 20,5f,90,bb */179 {0xbb, 0x01, 0x8000}, /* 80,01,00,bb */180 {0xbb, 0x09, 0x8400}, /* 84,09,00,bb */181 {0xbb, 0x86, 0x0002}, /* 00,86,02,bb */182 {0xbb, 0xe6, 0x0401}, /* 04,e6,01,bb */183 {0xbb, 0x86, 0x0802}, /* 08,86,02,bb */184 {0xbb, 0xe6, 0x0c01}, /* 0c,e6,01,bb */185 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */186 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */187 {0xaa, 0xfe, 0x0000}, /* 00,fe,00,aa */188 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */189 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */190 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */191 {0xaa, 0xfe, 0x0020}, /* 00,fe,20,aa */192/*mswin+*/193 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},194 {0xaa, 0xfe, 0x0002},195 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},196 {0xaa, 0xb4, 0xcd37},197 {0xaa, 0xa4, 0x0004},198 {0xaa, 0xa8, 0x0007},199 {0xaa, 0xac, 0x0004},200/*mswin-*/201 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */202 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */203 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */204 {0xaa, 0xfe, 0x0000}, /* 00,fe,00,aa */205 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */206 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */207 {0xbb, 0x04, 0x0400}, /* 04,04,00,bb */208 {0xdd, 0x00, 0x0100}, /* 00,01,00,dd */209 {0xbb, 0x01, 0x0400}, /* 04,01,00,bb */210 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */211 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */212 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */213 {0xbb, 0x41, 0x2803}, /* 28,41,03,bb */214 {0xbb, 0x40, 0x2c03}, /* 2c,40,03,bb */215 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */216 {0xaa, 0xfe, 0x0010}, /* 00,fe,10,aa */217 {}218};219static const struct usb_action adcm2700_InitialScale[] = {220 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */221 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */222 {0xa0, 0x00, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */223 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */224 {0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,d3,cc */225 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */226 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */227 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */228 {0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d0,cc */229 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */230 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */231 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */232 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */233 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */234 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */235 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */236 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */237 {0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,d8,cc */238 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */239 {0xbb, 0x00, 0x0400}, /* 04,00,00,bb */240 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */241 {0xbb, 0x0f, 0x140f}, /* 14,0f,0f,bb */242 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */243 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */244 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */245 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */246 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */247 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */248 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */249 {0xa0, 0x58, ZC3XX_R116_RGAIN}, /* 01,16,58,cc */250 {0xa0, 0x5a, ZC3XX_R118_BGAIN}, /* 01,18,5a,cc */251 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */252 {0xa0, 0xd3, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,d3,cc */253 {0xbb, 0x00, 0x0408}, /* 04,00,08,bb */254 {0xdd, 0x00, 0x0200}, /* 00,02,00,dd */255 {0xbb, 0x00, 0x0400}, /* 04,00,00,bb */256 {0xdd, 0x00, 0x0050}, /* 00,00,50,dd */257 {0xbb, 0x0f, 0x140f}, /* 14,0f,0f,bb */258 {0xbb, 0xe0, 0x0c2e}, /* 0c,e0,2e,bb */259 {0xbb, 0x01, 0x2000}, /* 20,01,00,bb */260 {0xbb, 0x96, 0x2400}, /* 24,96,00,bb */261 {0xbb, 0x06, 0x1006}, /* 10,06,06,bb */262 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */263 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */264 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */265 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */266 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */267 {0xbb, 0x5f, 0x2090}, /* 20,5f,90,bb */268 {0xbb, 0x01, 0x8000}, /* 80,01,00,bb */269 {0xbb, 0x09, 0x8400}, /* 84,09,00,bb */270 {0xbb, 0x86, 0x0002}, /* 00,88,02,bb */271 {0xbb, 0xe6, 0x0401}, /* 04,e6,01,bb */272 {0xbb, 0x86, 0x0802}, /* 08,88,02,bb */273 {0xbb, 0xe6, 0x0c01}, /* 0c,e6,01,bb */274 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */275 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */276 {0xaa, 0xfe, 0x0000}, /* 00,fe,00,aa */277 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */278 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */279 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */280 {0xaa, 0xfe, 0x0020}, /* 00,fe,20,aa */281 /*******/282 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */283 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */284 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */285 {0xaa, 0xfe, 0x0000}, /* 00,fe,00,aa */286 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */287 {0xdd, 0x00, 0x0010}, /* 00,00,10,dd */288 {0xbb, 0x04, 0x0400}, /* 04,04,00,bb */289 {0xdd, 0x00, 0x0100}, /* 00,01,00,dd */290 {0xbb, 0x01, 0x0400}, /* 04,01,00,bb */291 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */292 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */293 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */294 {0xbb, 0x41, 0x2803}, /* 28,41,03,bb */295 {0xbb, 0x40, 0x2c03}, /* 2c,40,03,bb */296 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */297 {0xaa, 0xfe, 0x0010}, /* 00,fe,10,aa */298 {}299};300static const struct usb_action adcm2700_50HZ[] = {301 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */302 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */303 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */304 {0xbb, 0x05, 0x8400}, /* 84,05,00,bb */305 {0xbb, 0xd0, 0xb007}, /* b0,d0,07,bb */306 {0xbb, 0xa0, 0xb80f}, /* b8,a0,0f,bb */307 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */308 {0xaa, 0xfe, 0x0010}, /* 00,fe,10,aa */309 {0xaa, 0x26, 0x00d0}, /* 00,26,d0,aa */310 {0xaa, 0x28, 0x0002}, /* 00,28,02,aa */311 {}312};313static const struct usb_action adcm2700_60HZ[] = {314 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */315 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */316 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */317 {0xbb, 0x07, 0x8400}, /* 84,07,00,bb */318 {0xbb, 0x82, 0xb006}, /* b0,82,06,bb */319 {0xbb, 0x04, 0xb80d}, /* b8,04,0d,bb */320 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */321 {0xaa, 0xfe, 0x0010}, /* 00,fe,10,aa */322 {0xaa, 0x26, 0x0057}, /* 00,26,57,aa */323 {0xaa, 0x28, 0x0002}, /* 00,28,02,aa */324 {}325};326static const struct usb_action adcm2700_NoFlicker[] = {327 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */328 {0xaa, 0xfe, 0x0002}, /* 00,fe,02,aa */329 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0a,cc */330 {0xbb, 0x07, 0x8400}, /* 84,07,00,bb */331 {0xbb, 0x05, 0xb000}, /* b0,05,00,bb */332 {0xbb, 0xa0, 0xb801}, /* b8,a0,01,bb */333 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */334 {0xaa, 0xfe, 0x0010}, /* 00,fe,10,aa */335 {}336};337static const struct usb_action cs2102_InitialScale[] = { /* 320x240 */338 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},339 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},340 {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},341 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},342 {0xa0, 0x20, ZC3XX_R080_HBLANKHIGH},343 {0xa0, 0x21, ZC3XX_R081_HBLANKLOW},344 {0xa0, 0x30, ZC3XX_R083_RGAINADDR},345 {0xa0, 0x31, ZC3XX_R084_GGAINADDR},346 {0xa0, 0x32, ZC3XX_R085_BGAINADDR},347 {0xa0, 0x23, ZC3XX_R086_EXPTIMEHIGH},348 {0xa0, 0x24, ZC3XX_R087_EXPTIMEMID},349 {0xa0, 0x25, ZC3XX_R088_EXPTIMELOW},350 {0xa0, 0xb3, ZC3XX_R08B_I2CDEVICEADDR},351 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */352 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},353 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},354 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},355 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},356 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},357 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},358 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},359 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},360 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},361 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},362 {0xaa, 0x02, 0x0008},363 {0xaa, 0x03, 0x0000},364 {0xaa, 0x11, 0x0000},365 {0xaa, 0x12, 0x0089},366 {0xaa, 0x13, 0x0000},367 {0xaa, 0x14, 0x00e9},368 {0xaa, 0x20, 0x0000},369 {0xaa, 0x22, 0x0000},370 {0xaa, 0x0b, 0x0004},371 {0xaa, 0x30, 0x0030},372 {0xaa, 0x31, 0x0030},373 {0xaa, 0x32, 0x0030},374 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},375 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},376 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},377 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},378 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},379 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},380 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},381 {0xa0, 0x10, 0x01ae},382 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},383 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},384 {0xa0, 0x68, ZC3XX_R18D_YTARGET},385 {0xa0, 0x00, 0x01ad},386 {}387};388 389static const struct usb_action cs2102_Initial[] = { /* 640x480 */390 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},391 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},392 {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},393 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},394 {0xa0, 0x20, ZC3XX_R080_HBLANKHIGH},395 {0xa0, 0x21, ZC3XX_R081_HBLANKLOW},396 {0xa0, 0x30, ZC3XX_R083_RGAINADDR},397 {0xa0, 0x31, ZC3XX_R084_GGAINADDR},398 {0xa0, 0x32, ZC3XX_R085_BGAINADDR},399 {0xa0, 0x23, ZC3XX_R086_EXPTIMEHIGH},400 {0xa0, 0x24, ZC3XX_R087_EXPTIMEMID},401 {0xa0, 0x25, ZC3XX_R088_EXPTIMELOW},402 {0xa0, 0xb3, ZC3XX_R08B_I2CDEVICEADDR},403 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */404 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},405 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},406 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},407 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},408 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},409 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},410 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},411 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},412 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},413 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},414 {0xaa, 0x02, 0x0008},415 {0xaa, 0x03, 0x0000},416 {0xaa, 0x11, 0x0001},417 {0xaa, 0x12, 0x0087},418 {0xaa, 0x13, 0x0001},419 {0xaa, 0x14, 0x00e7},420 {0xaa, 0x20, 0x0000},421 {0xaa, 0x22, 0x0000},422 {0xaa, 0x0b, 0x0004},423 {0xaa, 0x30, 0x0030},424 {0xaa, 0x31, 0x0030},425 {0xaa, 0x32, 0x0030},426 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},427 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},428 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},429 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},430 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},431 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},432 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},433 {0xa0, 0x15, 0x01ae},434 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},435 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},436 {0xa0, 0x68, ZC3XX_R18D_YTARGET},437 {0xa0, 0x00, 0x01ad},438 {}439};440static const struct usb_action cs2102_50HZScale[] = {441 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},442 {0xaa, 0x23, 0x0001},443 {0xaa, 0x24, 0x005f},444 {0xaa, 0x25, 0x0090},445 {0xaa, 0x21, 0x00dd},446 {0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},447 {0xa0, 0xbf, ZC3XX_R191_EXPOSURELIMITMID},448 {0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW},449 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},450 {0xa0, 0x3a, ZC3XX_R196_ANTIFLICKERMID},451 {0xa0, 0x98, ZC3XX_R197_ANTIFLICKERLOW},452 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},453 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},454 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},455 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},456 {0xa0, 0xdd, ZC3XX_R01D_HSYNC_0},457 {0xa0, 0xe4, ZC3XX_R01E_HSYNC_1},458 {0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},459 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},460 {}461};462static const struct usb_action cs2102_50HZ[] = {463 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},464 {0xaa, 0x23, 0x0000},465 {0xaa, 0x24, 0x00af},466 {0xaa, 0x25, 0x00c8},467 {0xaa, 0x21, 0x0068},468 {0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},469 {0xa0, 0x5f, ZC3XX_R191_EXPOSURELIMITMID},470 {0xa0, 0x90, ZC3XX_R192_EXPOSURELIMITLOW},471 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},472 {0xa0, 0x1d, ZC3XX_R196_ANTIFLICKERMID},473 {0xa0, 0x4c, ZC3XX_R197_ANTIFLICKERLOW},474 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},475 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},476 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},477 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},478 {0xa0, 0x68, ZC3XX_R01D_HSYNC_0},479 {0xa0, 0xe3, ZC3XX_R01E_HSYNC_1},480 {0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},481 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},482 {}483};484static const struct usb_action cs2102_60HZScale[] = {485 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},486 {0xaa, 0x23, 0x0001},487 {0xaa, 0x24, 0x0055},488 {0xaa, 0x25, 0x00cc},489 {0xaa, 0x21, 0x003f},490 {0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},491 {0xa0, 0xab, ZC3XX_R191_EXPOSURELIMITMID},492 {0xa0, 0x98, ZC3XX_R192_EXPOSURELIMITLOW},493 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},494 {0xa0, 0x30, ZC3XX_R196_ANTIFLICKERMID},495 {0xa0, 0xd4, ZC3XX_R197_ANTIFLICKERLOW},496 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},497 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},498 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},499 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},500 {0xa0, 0x39, ZC3XX_R01D_HSYNC_0},501 {0xa0, 0x70, ZC3XX_R01E_HSYNC_1},502 {0xa0, 0xb0, ZC3XX_R01F_HSYNC_2},503 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},504 {}505};506static const struct usb_action cs2102_60HZ[] = {507 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},508 {0xaa, 0x23, 0x0000},509 {0xaa, 0x24, 0x00aa},510 {0xaa, 0x25, 0x00e6},511 {0xaa, 0x21, 0x003f},512 {0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},513 {0xa0, 0x55, ZC3XX_R191_EXPOSURELIMITMID},514 {0xa0, 0xcc, ZC3XX_R192_EXPOSURELIMITLOW},515 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},516 {0xa0, 0x18, ZC3XX_R196_ANTIFLICKERMID},517 {0xa0, 0x6a, ZC3XX_R197_ANTIFLICKERLOW},518 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},519 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},520 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},521 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},522 {0xa0, 0x3f, ZC3XX_R01D_HSYNC_0},523 {0xa0, 0xa5, ZC3XX_R01E_HSYNC_1},524 {0xa0, 0xf0, ZC3XX_R01F_HSYNC_2},525 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},526 {}527};528static const struct usb_action cs2102_NoFlickerScale[] = {529 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},530 {0xaa, 0x23, 0x0001},531 {0xaa, 0x24, 0x005f},532 {0xaa, 0x25, 0x0000},533 {0xaa, 0x21, 0x0001},534 {0xa0, 0x02, ZC3XX_R190_EXPOSURELIMITHIGH},535 {0xa0, 0xbf, ZC3XX_R191_EXPOSURELIMITMID},536 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},537 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},538 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},539 {0xa0, 0x80, ZC3XX_R197_ANTIFLICKERLOW},540 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},541 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},542 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},543 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},544 {0xa0, 0x01, ZC3XX_R01D_HSYNC_0},545 {0xa0, 0x40, ZC3XX_R01E_HSYNC_1},546 {0xa0, 0xa0, ZC3XX_R01F_HSYNC_2},547 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},548 {}549};550static const struct usb_action cs2102_NoFlicker[] = {551 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},552 {0xaa, 0x23, 0x0000},553 {0xaa, 0x24, 0x00af},554 {0xaa, 0x25, 0x0080},555 {0xaa, 0x21, 0x0001},556 {0xa0, 0x01, ZC3XX_R190_EXPOSURELIMITHIGH},557 {0xa0, 0x5f, ZC3XX_R191_EXPOSURELIMITMID},558 {0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},559 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},560 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},561 {0xa0, 0x80, ZC3XX_R197_ANTIFLICKERLOW},562 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},563 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},564 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},565 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},566 {0xa0, 0x01, ZC3XX_R01D_HSYNC_0},567 {0xa0, 0x40, ZC3XX_R01E_HSYNC_1},568 {0xa0, 0xa0, ZC3XX_R01F_HSYNC_2},569 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},570 {}571};572 573/* CS2102_KOCOM */574static const struct usb_action cs2102K_InitialScale[] = {575 {0xa0, 0x11, ZC3XX_R002_CLOCKSELECT},576 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},577 {0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},578 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},579 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},580 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},581 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},582 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},583 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},584 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},585 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},586 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},587 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},588 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},589 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},590 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},591 {0xa0, 0x55, ZC3XX_R08B_I2CDEVICEADDR},592 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},593 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},594 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},595 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},596 {0xa0, 0x0a, ZC3XX_R092_I2CADDRESSSELECT},597 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},598 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},599 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},600 {0xa0, 0x0b, ZC3XX_R092_I2CADDRESSSELECT},601 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},602 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},603 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},604 {0xa0, 0x0c, ZC3XX_R092_I2CADDRESSSELECT},605 {0xa0, 0x7c, ZC3XX_R093_I2CSETVALUE},606 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},607 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},608 {0xa0, 0x0d, ZC3XX_R092_I2CADDRESSSELECT},609 {0xa0, 0xa3, ZC3XX_R093_I2CSETVALUE},610 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},611 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},612 {0xa0, 0x03, ZC3XX_R092_I2CADDRESSSELECT},613 {0xa0, 0xfb, ZC3XX_R093_I2CSETVALUE},614 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},615 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},616 {0xa0, 0x05, ZC3XX_R092_I2CADDRESSSELECT},617 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},618 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},619 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},620 {0xa0, 0x06, ZC3XX_R092_I2CADDRESSSELECT},621 {0xa0, 0x03, ZC3XX_R093_I2CSETVALUE},622 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},623 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},624 {0xa0, 0x09, ZC3XX_R092_I2CADDRESSSELECT},625 {0xa0, 0x08, ZC3XX_R093_I2CSETVALUE},626 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},627 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},628 {0xa0, 0x0e, ZC3XX_R092_I2CADDRESSSELECT},629 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},630 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},631 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},632 {0xa0, 0x0f, ZC3XX_R092_I2CADDRESSSELECT},633 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},634 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},635 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},636 {0xa0, 0x10, ZC3XX_R092_I2CADDRESSSELECT},637 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},638 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},639 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},640 {0xa0, 0x11, ZC3XX_R092_I2CADDRESSSELECT},641 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},642 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},643 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},644 {0xa0, 0x12, ZC3XX_R092_I2CADDRESSSELECT},645 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},646 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},647 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},648 {0xa0, 0x15, ZC3XX_R092_I2CADDRESSSELECT},649 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},650 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},651 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},652 {0xa0, 0x16, ZC3XX_R092_I2CADDRESSSELECT},653 {0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},654 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},655 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},656 {0xa0, 0x17, ZC3XX_R092_I2CADDRESSSELECT},657 {0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},658 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},659 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},660 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},661 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},662 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},663 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},664 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},665 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},666 {0xa0, 0x78, ZC3XX_R18D_YTARGET},667 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},668 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},669 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},670 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},671 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},672 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},673 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},674 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},675 {0xa0, 0x00, 0x01ad},676 {0xa0, 0x01, 0x01b1},677 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},678 {0xa0, 0x60, ZC3XX_R116_RGAIN},679 {0xa0, 0x40, ZC3XX_R117_GGAIN},680 {0xa0, 0x4c, ZC3XX_R118_BGAIN},681 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */682 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */683 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */684 {0xa0, 0x13, ZC3XX_R120_GAMMA00}, /* gamma 4 */685 {0xa0, 0x38, ZC3XX_R121_GAMMA01},686 {0xa0, 0x59, ZC3XX_R122_GAMMA02},687 {0xa0, 0x79, ZC3XX_R123_GAMMA03},688 {0xa0, 0x92, ZC3XX_R124_GAMMA04},689 {0xa0, 0xa7, ZC3XX_R125_GAMMA05},690 {0xa0, 0xb9, ZC3XX_R126_GAMMA06},691 {0xa0, 0xc8, ZC3XX_R127_GAMMA07},692 {0xa0, 0xd4, ZC3XX_R128_GAMMA08},693 {0xa0, 0xdf, ZC3XX_R129_GAMMA09},694 {0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},695 {0xa0, 0xee, ZC3XX_R12B_GAMMA0B},696 {0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},697 {0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},698 {0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},699 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},700 {0xa0, 0x26, ZC3XX_R130_GAMMA10},701 {0xa0, 0x22, ZC3XX_R131_GAMMA11},702 {0xa0, 0x20, ZC3XX_R132_GAMMA12},703 {0xa0, 0x1c, ZC3XX_R133_GAMMA13},704 {0xa0, 0x16, ZC3XX_R134_GAMMA14},705 {0xa0, 0x13, ZC3XX_R135_GAMMA15},706 {0xa0, 0x10, ZC3XX_R136_GAMMA16},707 {0xa0, 0x0d, ZC3XX_R137_GAMMA17},708 {0xa0, 0x0b, ZC3XX_R138_GAMMA18},709 {0xa0, 0x09, ZC3XX_R139_GAMMA19},710 {0xa0, 0x07, ZC3XX_R13A_GAMMA1A},711 {0xa0, 0x06, ZC3XX_R13B_GAMMA1B},712 {0xa0, 0x05, ZC3XX_R13C_GAMMA1C},713 {0xa0, 0x04, ZC3XX_R13D_GAMMA1D},714 {0xa0, 0x03, ZC3XX_R13E_GAMMA1E},715 {0xa0, 0x02, ZC3XX_R13F_GAMMA1F},716 {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */717 {0xa0, 0xf4, ZC3XX_R10B_RGB01},718 {0xa0, 0xf4, ZC3XX_R10C_RGB02},719 {0xa0, 0xf4, ZC3XX_R10D_RGB10},720 {0xa0, 0x58, ZC3XX_R10E_RGB11},721 {0xa0, 0xf4, ZC3XX_R10F_RGB12},722 {0xa0, 0xf4, ZC3XX_R110_RGB20},723 {0xa0, 0xf4, ZC3XX_R111_RGB21},724 {0xa0, 0x58, ZC3XX_R112_RGB22},725 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},726 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},727 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},728 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},729 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},730 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},731 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},732 {0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},733 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},734 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},735 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},736 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},737 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},738 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},739 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},740 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},741 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},742 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},743 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},744 {0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},745 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},746 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},747 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},748 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},749 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},750 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},751 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH},752 {0xa0, 0x22, ZC3XX_R0A4_EXPOSURETIMELOW},753 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},754 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},755 {0xa0, 0xee, ZC3XX_R192_EXPOSURELIMITLOW},756 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},757 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},758 {0xa0, 0x3a, ZC3XX_R197_ANTIFLICKERLOW},759 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},760 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},761 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},762 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},763 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0},764 {0xa0, 0x0f, ZC3XX_R01E_HSYNC_1},765 {0xa0, 0x19, ZC3XX_R01F_HSYNC_2},766 {0xa0, 0x1f, ZC3XX_R020_HSYNC_3},767 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},768 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},769 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},770 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},771 {0xa0, 0x60, ZC3XX_R116_RGAIN},772 {0xa0, 0x40, ZC3XX_R117_GGAIN},773 {0xa0, 0x4c, ZC3XX_R118_BGAIN},774 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},775 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},776 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},777 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},778 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},779 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},780 {0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},781 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},782 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},783 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},784 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},785 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},786 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},787 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},788 {0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},789 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},790 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},791 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},792 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},793 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},794 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},795 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},796 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},797 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},798 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},799 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},800 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},801 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},802 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},803 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},804 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},805 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},806 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},807 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},808 {0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},809 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},810 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},811 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},812 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},813 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},814 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},815 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},816 {0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},817 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},818 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},819 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},820 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},821 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},822 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},823 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},824 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},825 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},826 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},827 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},828 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},829 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},830 {}831};832 833static const struct usb_action cs2102K_Initial[] = {834 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},835 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},836 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},837 {0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},838 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},839 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},840 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},841 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},842 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},843 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},844 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},845 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},846 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},847 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},848 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},849 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},850 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},851/*fixme: next sequence = i2c exchanges*/852 {0xa0, 0x55, ZC3XX_R08B_I2CDEVICEADDR},853 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},854 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},855 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},856 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},857 {0xa0, 0x0a, ZC3XX_R092_I2CADDRESSSELECT},858 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},859 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},860 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},861 {0xa0, 0x0b, ZC3XX_R092_I2CADDRESSSELECT},862 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},863 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},864 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},865 {0xa0, 0x0c, ZC3XX_R092_I2CADDRESSSELECT},866 {0xa0, 0x7b, ZC3XX_R093_I2CSETVALUE},867 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},868 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},869 {0xa0, 0x0d, ZC3XX_R092_I2CADDRESSSELECT},870 {0xa0, 0xa3, ZC3XX_R093_I2CSETVALUE},871 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},872 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},873 {0xa0, 0x03, ZC3XX_R092_I2CADDRESSSELECT},874 {0xa0, 0xfb, ZC3XX_R093_I2CSETVALUE},875 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},876 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},877 {0xa0, 0x05, ZC3XX_R092_I2CADDRESSSELECT},878 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},879 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},880 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},881 {0xa0, 0x06, ZC3XX_R092_I2CADDRESSSELECT},882 {0xa0, 0x03, ZC3XX_R093_I2CSETVALUE},883 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},884 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},885 {0xa0, 0x09, ZC3XX_R092_I2CADDRESSSELECT},886 {0xa0, 0x08, ZC3XX_R093_I2CSETVALUE},887 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},888 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},889 {0xa0, 0x0e, ZC3XX_R092_I2CADDRESSSELECT},890 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},891 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},892 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},893 {0xa0, 0x0f, ZC3XX_R092_I2CADDRESSSELECT},894 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},895 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},896 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},897 {0xa0, 0x10, ZC3XX_R092_I2CADDRESSSELECT},898 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},899 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},900 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},901 {0xa0, 0x11, ZC3XX_R092_I2CADDRESSSELECT},902 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},903 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},904 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},905 {0xa0, 0x12, ZC3XX_R092_I2CADDRESSSELECT},906 {0xa0, 0x18, ZC3XX_R093_I2CSETVALUE},907 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},908 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},909 {0xa0, 0x15, ZC3XX_R092_I2CADDRESSSELECT},910 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},911 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},912 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},913 {0xa0, 0x16, ZC3XX_R092_I2CADDRESSSELECT},914 {0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},915 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},916 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},917 {0xa0, 0x17, ZC3XX_R092_I2CADDRESSSELECT},918 {0xa0, 0x0c, ZC3XX_R093_I2CSETVALUE},919 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},920 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},921 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},922 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},923 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},924 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},925 {0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},926 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},927 {0xa0, 0x78, ZC3XX_R18D_YTARGET},928 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},929 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},930 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},931 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},932 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID},933 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW},934 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},935 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},936 {0xa0, 0x00, 0x01ad},937 {0xa0, 0x01, 0x01b1},938 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},939 {0xa0, 0x60, ZC3XX_R116_RGAIN},940 {0xa0, 0x40, ZC3XX_R117_GGAIN},941 {0xa0, 0x4c, ZC3XX_R118_BGAIN},942 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */943 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */944 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */945 {0xa0, 0x13, ZC3XX_R120_GAMMA00}, /* gamma 4 */946 {0xa0, 0x38, ZC3XX_R121_GAMMA01},947 {0xa0, 0x59, ZC3XX_R122_GAMMA02},948 {0xa0, 0x79, ZC3XX_R123_GAMMA03},949 {0xa0, 0x92, ZC3XX_R124_GAMMA04},950 {0xa0, 0xa7, ZC3XX_R125_GAMMA05},951 {0xa0, 0xb9, ZC3XX_R126_GAMMA06},952 {0xa0, 0xc8, ZC3XX_R127_GAMMA07},953 {0xa0, 0xd4, ZC3XX_R128_GAMMA08},954 {0xa0, 0xdf, ZC3XX_R129_GAMMA09},955 {0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},956 {0xa0, 0xee, ZC3XX_R12B_GAMMA0B},957 {0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},958 {0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},959 {0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},960 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},961 {0xa0, 0x26, ZC3XX_R130_GAMMA10},962 {0xa0, 0x22, ZC3XX_R131_GAMMA11},963 {0xa0, 0x20, ZC3XX_R132_GAMMA12},964 {0xa0, 0x1c, ZC3XX_R133_GAMMA13},965 {0xa0, 0x16, ZC3XX_R134_GAMMA14},966 {0xa0, 0x13, ZC3XX_R135_GAMMA15},967 {0xa0, 0x10, ZC3XX_R136_GAMMA16},968 {0xa0, 0x0d, ZC3XX_R137_GAMMA17},969 {0xa0, 0x0b, ZC3XX_R138_GAMMA18},970 {0xa0, 0x09, ZC3XX_R139_GAMMA19},971 {0xa0, 0x07, ZC3XX_R13A_GAMMA1A},972 {0xa0, 0x06, ZC3XX_R13B_GAMMA1B},973 {0xa0, 0x05, ZC3XX_R13C_GAMMA1C},974 {0xa0, 0x04, ZC3XX_R13D_GAMMA1D},975 {0xa0, 0x03, ZC3XX_R13E_GAMMA1E},976 {0xa0, 0x02, ZC3XX_R13F_GAMMA1F},977 {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */978 {0xa0, 0xf4, ZC3XX_R10B_RGB01},979 {0xa0, 0xf4, ZC3XX_R10C_RGB02},980 {0xa0, 0xf4, ZC3XX_R10D_RGB10},981 {0xa0, 0x58, ZC3XX_R10E_RGB11},982 {0xa0, 0xf4, ZC3XX_R10F_RGB12},983 {0xa0, 0xf4, ZC3XX_R110_RGB20},984 {0xa0, 0xf4, ZC3XX_R111_RGB21},985 {0xa0, 0x58, ZC3XX_R112_RGB22},986 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},987 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},988 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},989 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},990 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},991 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},992 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},993 {0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},994 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},995 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},996 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},997 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},998 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},999 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1000 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1001 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1002 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1003 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1004 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1005 {0xa0, 0x22, ZC3XX_R093_I2CSETVALUE},1006 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1007 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1008 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1009 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1010 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1011 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1012 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH},1013 {0xa0, 0x22, ZC3XX_R0A4_EXPOSURETIMELOW},1014 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},1015 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},1016 {0xa0, 0xee, ZC3XX_R192_EXPOSURELIMITLOW},1017 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},1018 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},1019 {0xa0, 0x3a, ZC3XX_R197_ANTIFLICKERLOW},1020 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},1021 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},1022 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},1023 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},1024 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0},1025 {0xa0, 0x0f, ZC3XX_R01E_HSYNC_1},1026 {0xa0, 0x19, ZC3XX_R01F_HSYNC_2},1027 {0xa0, 0x1f, ZC3XX_R020_HSYNC_3},1028 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},1029 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},1030 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1031 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1032 {0xa0, 0x60, ZC3XX_R116_RGAIN},1033 {0xa0, 0x40, ZC3XX_R117_GGAIN},1034 {0xa0, 0x4c, ZC3XX_R118_BGAIN},1035 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1036 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1037 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1038 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1039 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1040 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1041 {0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},1042 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1043 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1044 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1045 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1046 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1047 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1048 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1049 {0xa0, 0x5c, ZC3XX_R093_I2CSETVALUE},1050 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1051 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1052 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1053 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1054 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1055 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1056 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1057 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1058 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1059 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1060 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1061 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1062 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1063 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1064 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1065 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1066 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1067 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1068 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1069 {0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},1070 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1071 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1072 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1073 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1074 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1075 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1076 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1077 {0xa0, 0x96, ZC3XX_R093_I2CSETVALUE},1078 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1079 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1080 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1081 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1082 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1083 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1084 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1085 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1086 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1087 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1088 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1089 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1090 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1091/*fixme:what does the next sequence?*/1092 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1093 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1094 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1095 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1096 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1097 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1098 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1099 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1100 {0xa0, 0xd0, ZC3XX_R093_I2CSETVALUE},1101 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1102 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1103 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1104 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1105 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1106 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1107 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1108 {0xa0, 0xd0, ZC3XX_R093_I2CSETVALUE},1109 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1110 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1111 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1112 {0xa0, 0x01, ZC3XX_R093_I2CSETVALUE},1113 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1114 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1115 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1116 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1117 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1118 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1119 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1120 {0xa0, 0x02, ZC3XX_R008_CLOCKSETTING},1121 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1122 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1123 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1124 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1125 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1126 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1127 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1128 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1129 {0xa0, 0x0a, ZC3XX_R093_I2CSETVALUE},1130 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1131 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1132 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1133 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1134 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1135 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1136 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1137 {0xa0, 0x0a, ZC3XX_R093_I2CSETVALUE},1138 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1139 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1140 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1141 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1142 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1143 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1144 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1145 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1146 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1147 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1148 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1149 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1150 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1151 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1152 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1153 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1154 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1155 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1156 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1157 {0xa0, 0x44, ZC3XX_R093_I2CSETVALUE},1158 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1159 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1160 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1161 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1162 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1163 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1164 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1165 {0xa0, 0x44, ZC3XX_R093_I2CSETVALUE},1166 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1167 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1168 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1169 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1170 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1171 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1172 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1173 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1174 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1175 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1176 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1177 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1178 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1179 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1180 {0xa0, 0x20, ZC3XX_R092_I2CADDRESSSELECT},1181 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1182 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1183 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1184 {0xa0, 0x21, ZC3XX_R092_I2CADDRESSSELECT},1185 {0xa0, 0x7e, ZC3XX_R093_I2CSETVALUE},1186 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1187 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1188 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1189 {0xa0, 0x00, ZC3XX_R093_I2CSETVALUE},1190 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1191 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1192 {0xa0, 0x13, ZC3XX_R092_I2CADDRESSSELECT},1193 {0xa0, 0x7e, ZC3XX_R093_I2CSETVALUE},1194 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1195 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1196 {0xa0, 0x14, ZC3XX_R092_I2CADDRESSSELECT},1197 {0xa0, 0x02, ZC3XX_R093_I2CSETVALUE},1198 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1199 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1200 {0xa0, 0x18, ZC3XX_R092_I2CADDRESSSELECT},1201 {0xa0, 0x04, ZC3XX_R093_I2CSETVALUE},1202 {0xa0, 0x00, ZC3XX_R094_I2CWRITEACK},1203 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},1204 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1205 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1206 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},1207 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},1208 {}1209};1210 1211static const struct usb_action gc0305_Initial[] = { /* 640x480 */1212 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */1213 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */1214 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */1215 {0xa0, 0x04, ZC3XX_R002_CLOCKSELECT}, /* 00,02,04,cc */1216 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */1217 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */1218 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */1219 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */1220 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */1221 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */1222 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */1223 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */1224 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */1225 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */1226 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */1227 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e6,cc */1228 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */1229 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc */1230 {0xaa, 0x13, 0x0002}, /* 00,13,02,aa */1231 {0xaa, 0x15, 0x0003}, /* 00,15,03,aa */1232 {0xaa, 0x01, 0x0000}, /* 00,01,00,aa */1233 {0xaa, 0x02, 0x0000}, /* 00,02,00,aa */1234 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */1235 {0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa */1236 {0xaa, 0x1d, 0x0080}, /* 00,1d,80,aa */1237 {0xaa, 0x1f, 0x0008}, /* 00,1f,08,aa */1238 {0xaa, 0x21, 0x0012}, /* 00,21,12,aa */1239 {0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,82,cc */1240 {0xa0, 0x83, ZC3XX_R087_EXPTIMEMID}, /* 00,87,83,cc */1241 {0xa0, 0x84, ZC3XX_R088_EXPTIMELOW}, /* 00,88,84,cc */1242 {0xaa, 0x05, 0x0000}, /* 00,05,00,aa */1243 {0xaa, 0x0a, 0x0000}, /* 00,0a,00,aa */1244 {0xaa, 0x0b, 0x00b0}, /* 00,0b,b0,aa */1245 {0xaa, 0x0c, 0x0000}, /* 00,0c,00,aa */1246 {0xaa, 0x0d, 0x00b0}, /* 00,0d,b0,aa */1247 {0xaa, 0x0e, 0x0000}, /* 00,0e,00,aa */1248 {0xaa, 0x0f, 0x00b0}, /* 00,0f,b0,aa */1249 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */1250 {0xaa, 0x11, 0x00b0}, /* 00,11,b0,aa */1251 {0xaa, 0x16, 0x0001}, /* 00,16,01,aa */1252 {0xaa, 0x17, 0x00e6}, /* 00,17,e6,aa */1253 {0xaa, 0x18, 0x0002}, /* 00,18,02,aa */1254 {0xaa, 0x19, 0x0086}, /* 00,19,86,aa */1255 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1256 {0xaa, 0x1b, 0x0020}, /* 00,1b,20,aa */1257 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,b7,cc */1258 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */1259 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */1260 {0xa0, 0x76, ZC3XX_R189_AWBSTATUS}, /* 01,89,76,cc */1261 {0xa0, 0x09, 0x01ad}, /* 01,ad,09,cc */1262 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */1263 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */1264 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */1265 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */1266 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */1267 {0xa0, 0x85, ZC3XX_R18D_YTARGET}, /* 01,8d,85,cc */1268 {0xa0, 0x00, 0x011e}, /* 01,1e,00,cc */1269 {0xa0, 0x52, ZC3XX_R116_RGAIN}, /* 01,16,52,cc */1270 {0xa0, 0x40, ZC3XX_R117_GGAIN}, /* 01,17,40,cc */1271 {0xa0, 0x52, ZC3XX_R118_BGAIN}, /* 01,18,52,cc */1272 {0xa0, 0x03, ZC3XX_R113_RGB03}, /* 01,13,03,cc */1273 {}1274};1275static const struct usb_action gc0305_InitialScale[] = { /* 320x240 */1276 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */1277 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */1278 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */1279 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */1280 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */1281 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */1282 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */1283 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */1284 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */1285 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */1286 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */1287 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */1288 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */1289 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */1290 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */1291 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e8,cc */1292 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */1293 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc */1294 {0xaa, 0x13, 0x0000}, /* 00,13,00,aa */1295 {0xaa, 0x15, 0x0001}, /* 00,15,01,aa */1296 {0xaa, 0x01, 0x0000}, /* 00,01,00,aa */1297 {0xaa, 0x02, 0x0000}, /* 00,02,00,aa */1298 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */1299 {0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa */1300 {0xaa, 0x1d, 0x0080}, /* 00,1d,80,aa */1301 {0xaa, 0x1f, 0x0008}, /* 00,1f,08,aa */1302 {0xaa, 0x21, 0x0012}, /* 00,21,12,aa */1303 {0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,82,cc */1304 {0xa0, 0x83, ZC3XX_R087_EXPTIMEMID}, /* 00,87,83,cc */1305 {0xa0, 0x84, ZC3XX_R088_EXPTIMELOW}, /* 00,88,84,cc */1306 {0xaa, 0x05, 0x0000}, /* 00,05,00,aa */1307 {0xaa, 0x0a, 0x0000}, /* 00,0a,00,aa */1308 {0xaa, 0x0b, 0x00b0}, /* 00,0b,b0,aa */1309 {0xaa, 0x0c, 0x0000}, /* 00,0c,00,aa */1310 {0xaa, 0x0d, 0x00b0}, /* 00,0d,b0,aa */1311 {0xaa, 0x0e, 0x0000}, /* 00,0e,00,aa */1312 {0xaa, 0x0f, 0x00b0}, /* 00,0f,b0,aa */1313 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */1314 {0xaa, 0x11, 0x00b0}, /* 00,11,b0,aa */1315 {0xaa, 0x16, 0x0001}, /* 00,16,01,aa */1316 {0xaa, 0x17, 0x00e8}, /* 00,17,e8,aa */1317 {0xaa, 0x18, 0x0002}, /* 00,18,02,aa */1318 {0xaa, 0x19, 0x0088}, /* 00,19,88,aa */1319 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1320 {0xaa, 0x1b, 0x0020}, /* 00,1b,20,aa */1321 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,b7,cc */1322 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */1323 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */1324 {0xa0, 0x76, ZC3XX_R189_AWBSTATUS}, /* 01,89,76,cc */1325 {0xa0, 0x09, 0x01ad}, /* 01,ad,09,cc */1326 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */1327 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */1328 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */1329 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */1330 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */1331 {0xa0, 0x00, 0x011e}, /* 01,1e,00,cc */1332 {0xa0, 0x52, ZC3XX_R116_RGAIN}, /* 01,16,52,cc */1333 {0xa0, 0x40, ZC3XX_R117_GGAIN}, /* 01,17,40,cc */1334 {0xa0, 0x52, ZC3XX_R118_BGAIN}, /* 01,18,52,cc */1335 {0xa0, 0x03, ZC3XX_R113_RGB03}, /* 01,13,03,cc */1336 {}1337};1338static const struct usb_action gc0305_50HZ[] = {1339 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */1340 {0xaa, 0x83, 0x0002}, /* 00,83,02,aa */1341 {0xaa, 0x84, 0x0038}, /* 00,84,38,aa */ /* win: 00,84,ec */1342 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1343 {0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,0b,cc */1344 {0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */1345 /* win: 01,92,10 */1346 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1347 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1348 {0xa0, 0x8e, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,8e,cc */1349 /* win: 01,97,ec */1350 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc */1351 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc */1352 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */1353 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1354 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc */1355 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc */1356 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc */1357 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */1358 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,60,cc */1359 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */1360/* {0xa0, 0x85, ZC3XX_R18D_YTARGET}, * 01,8d,85,cc *1361 * if 640x480 */1362 {}1363};1364static const struct usb_action gc0305_60HZ[] = {1365 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */1366 {0xaa, 0x83, 0x0000}, /* 00,83,00,aa */1367 {0xaa, 0x84, 0x00ec}, /* 00,84,ec,aa */1368 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1369 {0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,0b,cc */1370 {0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,10,cc */1371 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1372 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1373 {0xa0, 0xec, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,ec,cc */1374 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc */1375 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc */1376 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */1377 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1378 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc */1379 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc */1380 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc */1381 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */1382 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,60,cc */1383 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */1384 {0xa0, 0x80, ZC3XX_R18D_YTARGET}, /* 01,8d,80,cc */1385 {}1386};1387 1388static const struct usb_action gc0305_NoFlicker[] = {1389 {0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0c,cc */1390 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */1391 {0xaa, 0x83, 0x0000}, /* 00,83,00,aa */1392 {0xaa, 0x84, 0x0020}, /* 00,84,20,aa */1393 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1394 {0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,00,cc */1395 {0xa0, 0x48, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,48,cc */1396 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1397 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1398 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */1399 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc */1400 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc */1401 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc */1402 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc */1403 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc */1404 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */1405 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,60,cc */1406 {0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,03,cc */1407 {0xa0, 0x80, ZC3XX_R18D_YTARGET}, /* 01,8d,80,cc */1408 {}1409};1410 1411static const struct usb_action hdcs2020_InitialScale[] = {1412 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},1413 {0xa0, 0x11, ZC3XX_R002_CLOCKSELECT},1414 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* qtable 0x05 */1415 {0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},1416 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},1417 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},1418 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},1419 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},1420 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},1421 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},1422 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},1423 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},1424 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},1425 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},1426 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},1427 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},1428 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},1429 {0xaa, 0x1c, 0x0000},1430 {0xaa, 0x0a, 0x0001},1431 {0xaa, 0x0b, 0x0006},1432 {0xaa, 0x0c, 0x007b},1433 {0xaa, 0x0d, 0x00a7},1434 {0xaa, 0x03, 0x00fb},1435 {0xaa, 0x05, 0x0000},1436 {0xaa, 0x06, 0x0003},1437 {0xaa, 0x09, 0x0008},1438 1439 {0xaa, 0x0f, 0x0018}, /* set sensor gain */1440 {0xaa, 0x10, 0x0018},1441 {0xaa, 0x11, 0x0018},1442 {0xaa, 0x12, 0x0018},1443 1444 {0xaa, 0x15, 0x004e},1445 {0xaa, 0x1c, 0x0004},1446 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},1447 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},1448 {0xa0, 0x70, ZC3XX_R18D_YTARGET},1449 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},1450 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},1451 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},1452 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},1453 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},1454 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},1455 {0xa1, 0x01, 0x0002},1456 {0xa1, 0x01, 0x0008},1457 {0xa1, 0x01, 0x0180},1458 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},1459 {0xa0, 0x40, ZC3XX_R116_RGAIN},1460 {0xa0, 0x40, ZC3XX_R117_GGAIN},1461 {0xa0, 0x40, ZC3XX_R118_BGAIN},1462 {0xa1, 0x01, 0x0008},1463 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */1464 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */1465 {0xa1, 0x01, 0x01c8},1466 {0xa1, 0x01, 0x01c9},1467 {0xa1, 0x01, 0x01ca},1468 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */1469 {0xa0, 0x13, ZC3XX_R120_GAMMA00}, /* gamma 4 */1470 {0xa0, 0x38, ZC3XX_R121_GAMMA01},1471 {0xa0, 0x59, ZC3XX_R122_GAMMA02},1472 {0xa0, 0x79, ZC3XX_R123_GAMMA03},1473 {0xa0, 0x92, ZC3XX_R124_GAMMA04},1474 {0xa0, 0xa7, ZC3XX_R125_GAMMA05},1475 {0xa0, 0xb9, ZC3XX_R126_GAMMA06},1476 {0xa0, 0xc8, ZC3XX_R127_GAMMA07},1477 {0xa0, 0xd4, ZC3XX_R128_GAMMA08},1478 {0xa0, 0xdf, ZC3XX_R129_GAMMA09},1479 {0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},1480 {0xa0, 0xee, ZC3XX_R12B_GAMMA0B},1481 {0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},1482 {0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},1483 {0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},1484 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},1485 {0xa0, 0x26, ZC3XX_R130_GAMMA10},1486 {0xa0, 0x22, ZC3XX_R131_GAMMA11},1487 {0xa0, 0x20, ZC3XX_R132_GAMMA12},1488 {0xa0, 0x1c, ZC3XX_R133_GAMMA13},1489 {0xa0, 0x16, ZC3XX_R134_GAMMA14},1490 {0xa0, 0x13, ZC3XX_R135_GAMMA15},1491 {0xa0, 0x10, ZC3XX_R136_GAMMA16},1492 {0xa0, 0x0d, ZC3XX_R137_GAMMA17},1493 {0xa0, 0x0b, ZC3XX_R138_GAMMA18},1494 {0xa0, 0x09, ZC3XX_R139_GAMMA19},1495 {0xa0, 0x07, ZC3XX_R13A_GAMMA1A},1496 {0xa0, 0x06, ZC3XX_R13B_GAMMA1B},1497 {0xa0, 0x05, ZC3XX_R13C_GAMMA1C},1498 {0xa0, 0x04, ZC3XX_R13D_GAMMA1D},1499 {0xa0, 0x03, ZC3XX_R13E_GAMMA1E},1500 {0xa0, 0x02, ZC3XX_R13F_GAMMA1F},1501 1502 {0xa0, 0x66, ZC3XX_R10A_RGB00}, /* matrix */1503 {0xa0, 0xed, ZC3XX_R10B_RGB01},1504 {0xa0, 0xed, ZC3XX_R10C_RGB02},1505 {0xa0, 0xed, ZC3XX_R10D_RGB10},1506 {0xa0, 0x66, ZC3XX_R10E_RGB11},1507 {0xa0, 0xed, ZC3XX_R10F_RGB12},1508 {0xa0, 0xed, ZC3XX_R110_RGB20},1509 {0xa0, 0xed, ZC3XX_R111_RGB21},1510 {0xa0, 0x66, ZC3XX_R112_RGB22},1511 1512 {0xa1, 0x01, 0x0180},1513 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},1514 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},1515 {0xaa, 0x13, 0x0031},1516 {0xaa, 0x14, 0x0001},1517 {0xaa, 0x0e, 0x0004},1518 {0xaa, 0x19, 0x00cd},1519 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},1520 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},1521 {0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW},1522 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},1523 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},1524 {0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},1525 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},1526 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},1527 1528 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 0x14 */1529 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},1530 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0},1531 {0xa0, 0x18, ZC3XX_R01E_HSYNC_1},1532 {0xa0, 0x2c, ZC3XX_R01F_HSYNC_2},1533 {0xa0, 0x41, ZC3XX_R020_HSYNC_3},1534 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},1535 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1536 {0xa1, 0x01, 0x0180},1537 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1538 {0xa0, 0x40, ZC3XX_R116_RGAIN},1539 {0xa0, 0x40, ZC3XX_R117_GGAIN},1540 {0xa0, 0x40, ZC3XX_R118_BGAIN},1541 {}1542};1543static const struct usb_action hdcs2020_Initial[] = {1544 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},1545 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},1546 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},1547 {0xa0, 0x08, ZC3XX_R010_CMOSSENSORSELECT},1548 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},1549 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},1550 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},1551 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},1552 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},1553 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},1554 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},1555 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},1556 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},1557 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},1558 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},1559 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},1560 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},1561 {0xaa, 0x1c, 0x0000},1562 {0xaa, 0x0a, 0x0001},1563 {0xaa, 0x0b, 0x0006},1564 {0xaa, 0x0c, 0x007a},1565 {0xaa, 0x0d, 0x00a7},1566 {0xaa, 0x03, 0x00fb},1567 {0xaa, 0x05, 0x0000},1568 {0xaa, 0x06, 0x0003},1569 {0xaa, 0x09, 0x0008},1570 {0xaa, 0x0f, 0x0018}, /* original setting */1571 {0xaa, 0x10, 0x0018},1572 {0xaa, 0x11, 0x0018},1573 {0xaa, 0x12, 0x0018},1574 {0xaa, 0x15, 0x004e},1575 {0xaa, 0x1c, 0x0004},1576 {0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},1577 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},1578 {0xa0, 0x70, ZC3XX_R18D_YTARGET},1579 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},1580 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},1581 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},1582 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},1583 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},1584 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},1585 {0xa1, 0x01, 0x0002},1586 {0xa1, 0x01, 0x0008},1587 {0xa1, 0x01, 0x0180},1588 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},1589 {0xa0, 0x40, ZC3XX_R116_RGAIN},1590 {0xa0, 0x40, ZC3XX_R117_GGAIN},1591 {0xa0, 0x40, ZC3XX_R118_BGAIN},1592 {0xa1, 0x01, 0x0008},1593 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */1594 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */1595 {0xa1, 0x01, 0x01c8},1596 {0xa1, 0x01, 0x01c9},1597 {0xa1, 0x01, 0x01ca},1598 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */1599 {0xa0, 0x13, ZC3XX_R120_GAMMA00}, /* gamma 4 */1600 {0xa0, 0x38, ZC3XX_R121_GAMMA01},1601 {0xa0, 0x59, ZC3XX_R122_GAMMA02},1602 {0xa0, 0x79, ZC3XX_R123_GAMMA03},1603 {0xa0, 0x92, ZC3XX_R124_GAMMA04},1604 {0xa0, 0xa7, ZC3XX_R125_GAMMA05},1605 {0xa0, 0xb9, ZC3XX_R126_GAMMA06},1606 {0xa0, 0xc8, ZC3XX_R127_GAMMA07},1607 {0xa0, 0xd4, ZC3XX_R128_GAMMA08},1608 {0xa0, 0xdf, ZC3XX_R129_GAMMA09},1609 {0xa0, 0xe7, ZC3XX_R12A_GAMMA0A},1610 {0xa0, 0xee, ZC3XX_R12B_GAMMA0B},1611 {0xa0, 0xf4, ZC3XX_R12C_GAMMA0C},1612 {0xa0, 0xf9, ZC3XX_R12D_GAMMA0D},1613 {0xa0, 0xfc, ZC3XX_R12E_GAMMA0E},1614 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},1615 {0xa0, 0x26, ZC3XX_R130_GAMMA10},1616 {0xa0, 0x22, ZC3XX_R131_GAMMA11},1617 {0xa0, 0x20, ZC3XX_R132_GAMMA12},1618 {0xa0, 0x1c, ZC3XX_R133_GAMMA13},1619 {0xa0, 0x16, ZC3XX_R134_GAMMA14},1620 {0xa0, 0x13, ZC3XX_R135_GAMMA15},1621 {0xa0, 0x10, ZC3XX_R136_GAMMA16},1622 {0xa0, 0x0d, ZC3XX_R137_GAMMA17},1623 {0xa0, 0x0b, ZC3XX_R138_GAMMA18},1624 {0xa0, 0x09, ZC3XX_R139_GAMMA19},1625 {0xa0, 0x07, ZC3XX_R13A_GAMMA1A},1626 {0xa0, 0x06, ZC3XX_R13B_GAMMA1B},1627 {0xa0, 0x05, ZC3XX_R13C_GAMMA1C},1628 {0xa0, 0x04, ZC3XX_R13D_GAMMA1D},1629 {0xa0, 0x03, ZC3XX_R13E_GAMMA1E},1630 {0xa0, 0x02, ZC3XX_R13F_GAMMA1F},1631 {0xa0, 0x66, ZC3XX_R10A_RGB00}, /* matrix */1632 {0xa0, 0xed, ZC3XX_R10B_RGB01},1633 {0xa0, 0xed, ZC3XX_R10C_RGB02},1634 {0xa0, 0xed, ZC3XX_R10D_RGB10},1635 {0xa0, 0x66, ZC3XX_R10E_RGB11},1636 {0xa0, 0xed, ZC3XX_R10F_RGB12},1637 {0xa0, 0xed, ZC3XX_R110_RGB20},1638 {0xa0, 0xed, ZC3XX_R111_RGB21},1639 {0xa0, 0x66, ZC3XX_R112_RGB22},1640 {0xa1, 0x01, 0x0180},1641 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},1642 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},1643 /**** set exposure ***/1644 {0xaa, 0x13, 0x0031},1645 {0xaa, 0x14, 0x0001},1646 {0xaa, 0x0e, 0x0004},1647 {0xaa, 0x19, 0x00cd},1648 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},1649 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},1650 {0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW},1651 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},1652 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},1653 {0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},1654 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},1655 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},1656 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF},1657 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP},1658 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0},1659 {0xa0, 0x18, ZC3XX_R01E_HSYNC_1},1660 {0xa0, 0x2c, ZC3XX_R01F_HSYNC_2},1661 {0xa0, 0x41, ZC3XX_R020_HSYNC_3},1662 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},1663 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1664 {0xa1, 0x01, 0x0180},1665 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},1666 {0xa0, 0x40, ZC3XX_R116_RGAIN},1667 {0xa0, 0x40, ZC3XX_R117_GGAIN},1668 {0xa0, 0x40, ZC3XX_R118_BGAIN},1669 {}1670};1671static const struct usb_action hdcs2020_50HZ[] = {1672 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1673 {0xaa, 0x13, 0x0018}, /* 00,13,18,aa */1674 {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */1675 {0xaa, 0x0e, 0x0005}, /* 00,0e,05,aa */1676 {0xaa, 0x19, 0x001f}, /* 00,19,1f,aa */1677 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1678 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */1679 {0xa0, 0x76, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,76,cc */1680 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1681 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1682 {0xa0, 0x46, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,46,cc */1683 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */1684 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */1685 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,0c,cc */1686 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,28,cc */1687 {0xa0, 0x05, ZC3XX_R01D_HSYNC_0}, /* 00,1d,05,cc */1688 {0xa0, 0x1a, ZC3XX_R01E_HSYNC_1}, /* 00,1e,1a,cc */1689 {0xa0, 0x2f, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2f,cc */1690 {}1691};1692static const struct usb_action hdcs2020_60HZ[] = {1693 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1694 {0xaa, 0x13, 0x0031}, /* 00,13,31,aa */1695 {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */1696 {0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */1697 {0xaa, 0x19, 0x00cd}, /* 00,19,cd,aa */1698 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1699 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */1700 {0xa0, 0x62, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,62,cc */1701 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1702 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1703 {0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,3d,cc */1704 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */1705 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */1706 {0xa0, 0x0c, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,0c,cc */1707 {0xa0, 0x28, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,28,cc */1708 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0}, /* 00,1d,04,cc */1709 {0xa0, 0x18, ZC3XX_R01E_HSYNC_1}, /* 00,1e,18,cc */1710 {0xa0, 0x2c, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2c,cc */1711 {}1712};1713static const struct usb_action hdcs2020_NoFlicker[] = {1714 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1715 {0xaa, 0x13, 0x0010}, /* 00,13,10,aa */1716 {0xaa, 0x14, 0x0001}, /* 00,14,01,aa */1717 {0xaa, 0x0e, 0x0004}, /* 00,0e,04,aa */1718 {0xaa, 0x19, 0x0000}, /* 00,19,00,aa */1719 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */1720 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,02,cc */1721 {0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */1722 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1723 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */1724 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */1725 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */1726 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */1727 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */1728 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */1729 {0xa0, 0x04, ZC3XX_R01D_HSYNC_0}, /* 00,1d,04,cc */1730 {0xa0, 0x17, ZC3XX_R01E_HSYNC_1}, /* 00,1e,17,cc */1731 {0xa0, 0x2a, ZC3XX_R01F_HSYNC_2}, /* 00,1f,2a,cc */1732 {}1733};1734 1735static const struct usb_action hv7131b_InitialScale[] = { /* 320x240 */1736 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},1737 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},1738 {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},1739 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},1740 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},1741 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */1742 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},1743 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},1744 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},1745 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},1746 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},1747 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},1748 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},1749 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},1750 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},1751 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},1752 {0xaa, 0x30, 0x002d},1753 {0xaa, 0x01, 0x0005},1754 {0xaa, 0x11, 0x0000},1755 {0xaa, 0x13, 0x0001}, /* {0xaa, 0x13, 0x0000}, */1756 {0xaa, 0x14, 0x0001},1757 {0xaa, 0x15, 0x00e8},1758 {0xaa, 0x16, 0x0002},1759 {0xaa, 0x17, 0x0086}, /* 00,17,88,aa */1760 {0xaa, 0x31, 0x0038},1761 {0xaa, 0x32, 0x0038},1762 {0xaa, 0x33, 0x0038},1763 {0xaa, 0x5b, 0x0001},1764 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},1765 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},1766 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},1767 {0xa0, 0x68, ZC3XX_R18D_YTARGET},1768 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},1769 {0xa0, 0x00, 0x01ad},1770 {0xa0, 0xc0, 0x019b},1771 {0xa0, 0xa0, 0x019c},1772 {0xa0, 0x02, ZC3XX_R188_MINGAIN},1773 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},1774 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},1775 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},1776 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},1777 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},1778 {0xaa, 0x02, 0x0090}, /* 00,02,80,aa */1779 {}1780};1781 1782static const struct usb_action hv7131b_Initial[] = { /* 640x480*/1783 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},1784 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},1785 {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT},1786 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},1787 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},1788 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */1789 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},1790 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},1791 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},1792 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},1793 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},1794 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},1795 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},1796 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},1797 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},1798 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},1799 {0xaa, 0x30, 0x002d},1800 {0xaa, 0x01, 0x0005},1801 {0xaa, 0x11, 0x0001},1802 {0xaa, 0x13, 0x0000}, /* {0xaa, 0x13, 0x0001}; */1803 {0xaa, 0x14, 0x0001},1804 {0xaa, 0x15, 0x00e6},1805 {0xaa, 0x16, 0x0002},1806 {0xaa, 0x17, 0x0086},1807 {0xaa, 0x31, 0x0038},1808 {0xaa, 0x32, 0x0038},1809 {0xaa, 0x33, 0x0038},1810 {0xaa, 0x5b, 0x0001},1811 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},1812 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},1813 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},1814 {0xa0, 0x70, ZC3XX_R18D_YTARGET},1815 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},1816 {0xa0, 0x00, 0x01ad},1817 {0xa0, 0xc0, 0x019b},1818 {0xa0, 0xa0, 0x019c},1819 {0xa0, 0x02, ZC3XX_R188_MINGAIN},1820 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},1821 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},1822 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},1823 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},1824 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},1825 {0xaa, 0x02, 0x0090}, /* {0xaa, 0x02, 0x0080}, */1826 {}1827};1828static const struct usb_action hv7131b_50HZ[] = { /* 640x480*/1829 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1830 {0xaa, 0x25, 0x0007}, /* 00,25,07,aa */1831 {0xaa, 0x26, 0x0053}, /* 00,26,53,aa */1832 {0xaa, 0x27, 0x0000}, /* 00,27,00,aa */1833 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1834 {0xaa, 0x21, 0x0050}, /* 00,21,50,aa */1835 {0xaa, 0x22, 0x001b}, /* 00,22,1b,aa */1836 {0xaa, 0x23, 0x00fc}, /* 00,23,fc,aa */1837 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1838 {0xa0, 0x9b, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,9b,cc */1839 {0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,80,cc */1840 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1841 {0xa0, 0xea, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,ea,cc */1842 {0xa0, 0x60, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,60,cc */1843 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */1844 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */1845 {0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,18,cc */1846 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1847 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1848 {0xa0, 0x50, ZC3XX_R01E_HSYNC_1}, /* 00,1e,50,cc */1849 {0xa0, 0x1b, ZC3XX_R01F_HSYNC_2}, /* 00,1f,1b,cc */1850 {0xa0, 0xfc, ZC3XX_R020_HSYNC_3}, /* 00,20,fc,cc */1851 {}1852};1853static const struct usb_action hv7131b_50HZScale[] = { /* 320x240 */1854 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1855 {0xaa, 0x25, 0x0007}, /* 00,25,07,aa */1856 {0xaa, 0x26, 0x0053}, /* 00,26,53,aa */1857 {0xaa, 0x27, 0x0000}, /* 00,27,00,aa */1858 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1859 {0xaa, 0x21, 0x0050}, /* 00,21,50,aa */1860 {0xaa, 0x22, 0x0012}, /* 00,22,12,aa */1861 {0xaa, 0x23, 0x0080}, /* 00,23,80,aa */1862 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1863 {0xa0, 0x9b, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,9b,cc */1864 {0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,80,cc */1865 {0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,01,cc */1866 {0xa0, 0xd4, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,d4,cc */1867 {0xa0, 0xc0, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,c0,cc */1868 {0xa0, 0x07, ZC3XX_R18C_AEFREEZE}, /* 01,8c,07,cc */1869 {0xa0, 0x0f, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,0f,cc */1870 {0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,18,cc */1871 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1872 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1873 {0xa0, 0x50, ZC3XX_R01E_HSYNC_1}, /* 00,1e,50,cc */1874 {0xa0, 0x12, ZC3XX_R01F_HSYNC_2}, /* 00,1f,12,cc */1875 {0xa0, 0x80, ZC3XX_R020_HSYNC_3}, /* 00,20,80,cc */1876 {}1877};1878static const struct usb_action hv7131b_60HZ[] = { /* 640x480*/1879 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1880 {0xaa, 0x25, 0x0007}, /* 00,25,07,aa */1881 {0xaa, 0x26, 0x00a1}, /* 00,26,a1,aa */1882 {0xaa, 0x27, 0x0020}, /* 00,27,20,aa */1883 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1884 {0xaa, 0x21, 0x0040}, /* 00,21,40,aa */1885 {0xaa, 0x22, 0x0013}, /* 00,22,13,aa */1886 {0xaa, 0x23, 0x004c}, /* 00,23,4c,aa */1887 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1888 {0xa0, 0x4d, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,4d,cc */1889 {0xa0, 0x60, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,60,cc */1890 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1891 {0xa0, 0xc3, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,c3,cc */1892 {0xa0, 0x50, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,50,cc */1893 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */1894 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */1895 {0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,18,cc */1896 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1897 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1898 {0xa0, 0x40, ZC3XX_R01E_HSYNC_1}, /* 00,1e,40,cc */1899 {0xa0, 0x13, ZC3XX_R01F_HSYNC_2}, /* 00,1f,13,cc */1900 {0xa0, 0x4c, ZC3XX_R020_HSYNC_3}, /* 00,20,4c,cc */1901 {}1902};1903static const struct usb_action hv7131b_60HZScale[] = { /* 320x240 */1904 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1905 {0xaa, 0x25, 0x0007}, /* 00,25,07,aa */1906 {0xaa, 0x26, 0x00a1}, /* 00,26,a1,aa */1907 {0xaa, 0x27, 0x0020}, /* 00,27,20,aa */1908 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1909 {0xaa, 0x21, 0x00a0}, /* 00,21,a0,aa */1910 {0xaa, 0x22, 0x0016}, /* 00,22,16,aa */1911 {0xaa, 0x23, 0x0040}, /* 00,23,40,aa */1912 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1913 {0xa0, 0x4d, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,4d,cc */1914 {0xa0, 0x60, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,60,cc */1915 {0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,01,cc */1916 {0xa0, 0x86, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,86,cc */1917 {0xa0, 0xa0, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,a0,cc */1918 {0xa0, 0x07, ZC3XX_R18C_AEFREEZE}, /* 01,8c,07,cc */1919 {0xa0, 0x0f, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,0f,cc */1920 {0xa0, 0x18, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,18,cc */1921 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */1922 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1923 {0xa0, 0xa0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,a0,cc */1924 {0xa0, 0x16, ZC3XX_R01F_HSYNC_2}, /* 00,1f,16,cc */1925 {0xa0, 0x40, ZC3XX_R020_HSYNC_3}, /* 00,20,40,cc */1926 {}1927};1928static const struct usb_action hv7131b_NoFlicker[] = { /* 640x480*/1929 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1930 {0xaa, 0x25, 0x0003}, /* 00,25,03,aa */1931 {0xaa, 0x26, 0x0000}, /* 00,26,00,aa */1932 {0xaa, 0x27, 0x0000}, /* 00,27,00,aa */1933 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1934 {0xaa, 0x21, 0x0010}, /* 00,21,10,aa */1935 {0xaa, 0x22, 0x0000}, /* 00,22,00,aa */1936 {0xaa, 0x23, 0x0003}, /* 00,23,03,aa */1937 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1938 {0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,f8,cc */1939 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,00,cc */1940 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1941 {0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,02,cc */1942 {0xa0, 0x00, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,00,cc */1943 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */1944 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */1945 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */1946 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */1947 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1948 {0xa0, 0x10, ZC3XX_R01E_HSYNC_1}, /* 00,1e,10,cc */1949 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2}, /* 00,1f,00,cc */1950 {0xa0, 0x03, ZC3XX_R020_HSYNC_3}, /* 00,20,03,cc */1951 {}1952};1953static const struct usb_action hv7131b_NoFlickerScale[] = { /* 320x240 */1954 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */1955 {0xaa, 0x25, 0x0003}, /* 00,25,03,aa */1956 {0xaa, 0x26, 0x0000}, /* 00,26,00,aa */1957 {0xaa, 0x27, 0x0000}, /* 00,27,00,aa */1958 {0xaa, 0x20, 0x0000}, /* 00,20,00,aa */1959 {0xaa, 0x21, 0x00a0}, /* 00,21,a0,aa */1960 {0xaa, 0x22, 0x0016}, /* 00,22,16,aa */1961 {0xaa, 0x23, 0x0040}, /* 00,23,40,aa */1962 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,2f,cc */1963 {0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,f8,cc */1964 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,00,cc */1965 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */1966 {0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,02,cc */1967 {0xa0, 0x00, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,00,cc */1968 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */1969 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */1970 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */1971 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */1972 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0}, /* 00,1d,00,cc */1973 {0xa0, 0xa0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,a0,cc */1974 {0xa0, 0x16, ZC3XX_R01F_HSYNC_2}, /* 00,1f,16,cc */1975 {0xa0, 0x40, ZC3XX_R020_HSYNC_3}, /* 00,20,40,cc */1976 {}1977};1978 1979/* from lPEPI264v.inf (hv7131b!) */1980static const struct usb_action hv7131r_InitialScale[] = {1981 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},1982 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},1983 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},1984 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},1985 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},1986 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},1987 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},1988 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},1989 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},1990 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},1991 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},1992 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},1993 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},1994 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},1995 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},1996 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},1997 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},1998 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},1999 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},2000 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},2001 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},2002 {0xdd, 0x00, 0x0200},2003 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},2004 {0xaa, 0x01, 0x000c},2005 {0xaa, 0x11, 0x0000},2006 {0xaa, 0x13, 0x0000},2007 {0xaa, 0x14, 0x0001},2008 {0xaa, 0x15, 0x00e8},2009 {0xaa, 0x16, 0x0002},2010 {0xaa, 0x17, 0x0088},2011 {0xaa, 0x30, 0x000b},2012 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2013 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},2014 {0xa0, 0x78, ZC3XX_R18D_YTARGET},2015 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},2016 {0xa0, 0x00, 0x01ad},2017 {0xa0, 0xc0, 0x019b},2018 {0xa0, 0xa0, 0x019c},2019 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},2020 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},2021 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},2022 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},2023 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},2024 {}2025};2026static const struct usb_action hv7131r_Initial[] = {2027 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},2028 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},2029 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT},2030 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},2031 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},2032 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},2033 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},2034 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},2035 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},2036 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},2037 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},2038 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},2039 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},2040 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},2041 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},2042 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},2043 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},2044 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},2045 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},2046 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},2047 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},2048 {0xdd, 0x00, 0x0200},2049 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},2050 {0xaa, 0x01, 0x000c},2051 {0xaa, 0x11, 0x0000},2052 {0xaa, 0x13, 0x0000},2053 {0xaa, 0x14, 0x0001},2054 {0xaa, 0x15, 0x00e6},2055 {0xaa, 0x16, 0x0002},2056 {0xaa, 0x17, 0x0086},2057 {0xaa, 0x30, 0x000b},2058 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2059 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},2060 {0xa0, 0x78, ZC3XX_R18D_YTARGET},2061 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},2062 {0xa0, 0x00, 0x01ad},2063 {0xa0, 0xc0, 0x019b},2064 {0xa0, 0xa0, 0x019c},2065 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},2066 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},2067 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},2068 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},2069 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},2070 {}2071};2072static const struct usb_action hv7131r_50HZ[] = {2073 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2074 {0xa0, 0x06, ZC3XX_R190_EXPOSURELIMITHIGH},2075 {0xa0, 0x68, ZC3XX_R191_EXPOSURELIMITMID},2076 {0xa0, 0xa0, ZC3XX_R192_EXPOSURELIMITLOW},2077 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2078 {0xa0, 0xea, ZC3XX_R196_ANTIFLICKERMID},2079 {0xa0, 0x60, ZC3XX_R197_ANTIFLICKERLOW},2080 {0xa0, 0x18, ZC3XX_R18C_AEFREEZE},2081 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2082 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2083 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},2084 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2085 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2086 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2087 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2088 {}2089};2090static const struct usb_action hv7131r_50HZScale[] = {2091 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2092 {0xa0, 0x0c, ZC3XX_R190_EXPOSURELIMITHIGH},2093 {0xa0, 0xd1, ZC3XX_R191_EXPOSURELIMITMID},2094 {0xa0, 0x40, ZC3XX_R192_EXPOSURELIMITLOW},2095 {0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},2096 {0xa0, 0xd4, ZC3XX_R196_ANTIFLICKERMID},2097 {0xa0, 0xc0, ZC3XX_R197_ANTIFLICKERLOW},2098 {0xa0, 0x18, ZC3XX_R18C_AEFREEZE},2099 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2100 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2101 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},2102 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2103 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2104 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2105 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2106 {}2107};2108static const struct usb_action hv7131r_60HZ[] = {2109 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2110 {0xa0, 0x06, ZC3XX_R190_EXPOSURELIMITHIGH},2111 {0xa0, 0x1a, ZC3XX_R191_EXPOSURELIMITMID},2112 {0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW},2113 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2114 {0xa0, 0xc3, ZC3XX_R196_ANTIFLICKERMID},2115 {0xa0, 0x50, ZC3XX_R197_ANTIFLICKERLOW},2116 {0xa0, 0x18, ZC3XX_R18C_AEFREEZE},2117 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2118 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2119 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},2120 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2121 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2122 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2123 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2124 {}2125};2126static const struct usb_action hv7131r_60HZScale[] = {2127 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2128 {0xa0, 0x0c, ZC3XX_R190_EXPOSURELIMITHIGH},2129 {0xa0, 0x35, ZC3XX_R191_EXPOSURELIMITMID},2130 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},2131 {0xa0, 0x01, ZC3XX_R195_ANTIFLICKERHIGH},2132 {0xa0, 0x86, ZC3XX_R196_ANTIFLICKERMID},2133 {0xa0, 0xa0, ZC3XX_R197_ANTIFLICKERLOW},2134 {0xa0, 0x18, ZC3XX_R18C_AEFREEZE},2135 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2136 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2137 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},2138 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2139 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2140 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2141 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2142 {}2143};2144static const struct usb_action hv7131r_NoFlicker[] = {2145 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2146 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},2147 {0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},2148 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},2149 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2150 {0xa0, 0x02, ZC3XX_R196_ANTIFLICKERMID},2151 {0xa0, 0x58, ZC3XX_R197_ANTIFLICKERLOW},2152 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},2153 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},2154 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},2155 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},2156 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2157 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2158 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2159 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2160 {}2161};2162static const struct usb_action hv7131r_NoFlickerScale[] = {2163 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2164 {0xa0, 0x2f, ZC3XX_R190_EXPOSURELIMITHIGH},2165 {0xa0, 0xf8, ZC3XX_R191_EXPOSURELIMITMID},2166 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},2167 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2168 {0xa0, 0x04, ZC3XX_R196_ANTIFLICKERMID},2169 {0xa0, 0xb0, ZC3XX_R197_ANTIFLICKERLOW},2170 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},2171 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},2172 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},2173 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},2174 {0xa0, 0x00, ZC3XX_R01D_HSYNC_0},2175 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1},2176 {0xa0, 0x00, ZC3XX_R01F_HSYNC_2},2177 {0xa0, 0x08, ZC3XX_R020_HSYNC_3},2178 {}2179};2180 2181static const struct usb_action icm105a_InitialScale[] = {2182 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},2183 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},2184 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},2185 {0xa0, 0x0c, ZC3XX_R010_CMOSSENSORSELECT},2186 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},2187 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},2188 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},2189 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},2190 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},2191 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},2192 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},2193 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},2194 {0xa0, 0x00, ZC3XX_R097_WINYSTARTHIGH},2195 {0xa0, 0x01, ZC3XX_R098_WINYSTARTLOW},2196 {0xa0, 0x00, ZC3XX_R099_WINXSTARTHIGH},2197 {0xa0, 0x01, ZC3XX_R09A_WINXSTARTLOW},2198 {0xa0, 0x01, ZC3XX_R11A_FIRSTYLOW},2199 {0xa0, 0x01, ZC3XX_R11C_FIRSTXLOW},2200 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},2201 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},2202 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},2203 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},2204 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},2205 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},2206 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},2207 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},2208 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},2209 {0xaa, 0x01, 0x0010},2210 {0xaa, 0x03, 0x0000},2211 {0xaa, 0x04, 0x0001},2212 {0xaa, 0x05, 0x0020},2213 {0xaa, 0x06, 0x0001},2214 {0xaa, 0x08, 0x0000},2215 {0xaa, 0x03, 0x0001},2216 {0xaa, 0x04, 0x0011},2217 {0xaa, 0x05, 0x00a0},2218 {0xaa, 0x06, 0x0001},2219 {0xaa, 0x08, 0x0000},2220 {0xaa, 0x03, 0x0002},2221 {0xaa, 0x04, 0x0013},2222 {0xaa, 0x05, 0x0020},2223 {0xaa, 0x06, 0x0001},2224 {0xaa, 0x08, 0x0000},2225 {0xaa, 0x03, 0x0003},2226 {0xaa, 0x04, 0x0015},2227 {0xaa, 0x05, 0x0020},2228 {0xaa, 0x06, 0x0005},2229 {0xaa, 0x08, 0x0000},2230 {0xaa, 0x03, 0x0004},2231 {0xaa, 0x04, 0x0017},2232 {0xaa, 0x05, 0x0020},2233 {0xaa, 0x06, 0x000d},2234 {0xaa, 0x08, 0x0000},2235 {0xaa, 0x03, 0x0005},2236 {0xaa, 0x04, 0x0019},2237 {0xaa, 0x05, 0x0020},2238 {0xaa, 0x06, 0x0005},2239 {0xaa, 0x08, 0x0000},2240 {0xaa, 0x03, 0x0006},2241 {0xaa, 0x04, 0x0017},2242 {0xaa, 0x05, 0x0026},2243 {0xaa, 0x06, 0x0005},2244 {0xaa, 0x08, 0x0000},2245 {0xaa, 0x03, 0x0007},2246 {0xaa, 0x04, 0x0019},2247 {0xaa, 0x05, 0x0022},2248 {0xaa, 0x06, 0x0005},2249 {0xaa, 0x08, 0x0000},2250 {0xaa, 0x03, 0x0008},2251 {0xaa, 0x04, 0x0021},2252 {0xaa, 0x05, 0x00aa},2253 {0xaa, 0x06, 0x0005},2254 {0xaa, 0x08, 0x0000},2255 {0xaa, 0x03, 0x0009},2256 {0xaa, 0x04, 0x0023},2257 {0xaa, 0x05, 0x00aa},2258 {0xaa, 0x06, 0x000d},2259 {0xaa, 0x08, 0x0000},2260 {0xaa, 0x03, 0x000a},2261 {0xaa, 0x04, 0x0025},2262 {0xaa, 0x05, 0x00aa},2263 {0xaa, 0x06, 0x0005},2264 {0xaa, 0x08, 0x0000},2265 {0xaa, 0x03, 0x000b},2266 {0xaa, 0x04, 0x00ec},2267 {0xaa, 0x05, 0x002e},2268 {0xaa, 0x06, 0x0005},2269 {0xaa, 0x08, 0x0000},2270 {0xaa, 0x03, 0x000c},2271 {0xaa, 0x04, 0x00fa},2272 {0xaa, 0x05, 0x002a},2273 {0xaa, 0x06, 0x0005},2274 {0xaa, 0x08, 0x0000},2275 {0xaa, 0x07, 0x000d},2276 {0xaa, 0x01, 0x0005},2277 {0xaa, 0x94, 0x0002},2278 {0xaa, 0x90, 0x0000},2279 {0xaa, 0x91, 0x001f},2280 {0xaa, 0x10, 0x0064},2281 {0xaa, 0x9b, 0x00f0},2282 {0xaa, 0x9c, 0x0002},2283 {0xaa, 0x14, 0x001a},2284 {0xaa, 0x20, 0x0080},2285 {0xaa, 0x22, 0x0080},2286 {0xaa, 0x24, 0x0080},2287 {0xaa, 0x26, 0x0080},2288 {0xaa, 0x00, 0x0084},2289 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},2290 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},2291 {0xaa, 0xa8, 0x00c0},2292 {0xa1, 0x01, 0x0002},2293 {0xa1, 0x01, 0x0008},2294 {0xa1, 0x01, 0x0180},2295 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},2296 {0xa0, 0x40, ZC3XX_R116_RGAIN},2297 {0xa0, 0x40, ZC3XX_R117_GGAIN},2298 {0xa0, 0x40, ZC3XX_R118_BGAIN},2299 {0xa1, 0x01, 0x0008},2300 2301 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */2302 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */2303 {0xa1, 0x01, 0x01c8},2304 {0xa1, 0x01, 0x01c9},2305 {0xa1, 0x01, 0x01ca},2306 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */2307 {0xa0, 0x52, ZC3XX_R10A_RGB00}, /* matrix */2308 {0xa0, 0xf7, ZC3XX_R10B_RGB01},2309 {0xa0, 0xf7, ZC3XX_R10C_RGB02},2310 {0xa0, 0xf7, ZC3XX_R10D_RGB10},2311 {0xa0, 0x52, ZC3XX_R10E_RGB11},2312 {0xa0, 0xf7, ZC3XX_R10F_RGB12},2313 {0xa0, 0xf7, ZC3XX_R110_RGB20},2314 {0xa0, 0xf7, ZC3XX_R111_RGB21},2315 {0xa0, 0x52, ZC3XX_R112_RGB22},2316 {0xa1, 0x01, 0x0180},2317 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},2318 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2319 {0xaa, 0x0d, 0x0003},2320 {0xaa, 0x0c, 0x008c},2321 {0xaa, 0x0e, 0x0095},2322 {0xaa, 0x0f, 0x0002},2323 {0xaa, 0x1c, 0x0094},2324 {0xaa, 0x1d, 0x0002},2325 {0xaa, 0x20, 0x0080},2326 {0xaa, 0x22, 0x0080},2327 {0xaa, 0x24, 0x0080},2328 {0xaa, 0x26, 0x0080},2329 {0xaa, 0x00, 0x0084},2330 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH},2331 {0xa0, 0x94, ZC3XX_R0A4_EXPOSURETIMELOW},2332 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},2333 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},2334 {0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW},2335 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2336 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},2337 {0xa0, 0x84, ZC3XX_R197_ANTIFLICKERLOW},2338 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},2339 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2340 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2341 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP},2342 {0xa0, 0xe3, ZC3XX_R01D_HSYNC_0},2343 {0xa0, 0xec, ZC3XX_R01E_HSYNC_1},2344 {0xa0, 0xf5, ZC3XX_R01F_HSYNC_2},2345 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},2346 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},2347 {0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN},2348 {0xa0, 0xc0, ZC3XX_R11D_GLOBALGAIN},2349 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},2350 {0xa1, 0x01, 0x0180},2351 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},2352 {0xa0, 0x40, ZC3XX_R116_RGAIN},2353 {0xa0, 0x40, ZC3XX_R117_GGAIN},2354 {0xa0, 0x40, ZC3XX_R118_BGAIN},2355 {}2356};2357 2358static const struct usb_action icm105a_Initial[] = {2359 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},2360 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},2361 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},2362 {0xa0, 0x0c, ZC3XX_R010_CMOSSENSORSELECT},2363 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},2364 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},2365 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},2366 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},2367 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},2368 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},2369 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},2370 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},2371 {0xa0, 0x00, ZC3XX_R097_WINYSTARTHIGH},2372 {0xa0, 0x02, ZC3XX_R098_WINYSTARTLOW},2373 {0xa0, 0x00, ZC3XX_R099_WINXSTARTHIGH},2374 {0xa0, 0x02, ZC3XX_R09A_WINXSTARTLOW},2375 {0xa0, 0x02, ZC3XX_R11A_FIRSTYLOW},2376 {0xa0, 0x02, ZC3XX_R11C_FIRSTXLOW},2377 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH},2378 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},2379 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},2380 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},2381 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},2382 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},2383 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},2384 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},2385 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},2386 {0xaa, 0x01, 0x0010},2387 {0xaa, 0x03, 0x0000},2388 {0xaa, 0x04, 0x0001},2389 {0xaa, 0x05, 0x0020},2390 {0xaa, 0x06, 0x0001},2391 {0xaa, 0x08, 0x0000},2392 {0xaa, 0x03, 0x0001},2393 {0xaa, 0x04, 0x0011},2394 {0xaa, 0x05, 0x00a0},2395 {0xaa, 0x06, 0x0001},2396 {0xaa, 0x08, 0x0000},2397 {0xaa, 0x03, 0x0002},2398 {0xaa, 0x04, 0x0013},2399 {0xaa, 0x05, 0x0020},2400 {0xaa, 0x06, 0x0001},2401 {0xaa, 0x08, 0x0000},2402 {0xaa, 0x03, 0x0003},2403 {0xaa, 0x04, 0x0015},2404 {0xaa, 0x05, 0x0020},2405 {0xaa, 0x06, 0x0005},2406 {0xaa, 0x08, 0x0000},2407 {0xaa, 0x03, 0x0004},2408 {0xaa, 0x04, 0x0017},2409 {0xaa, 0x05, 0x0020},2410 {0xaa, 0x06, 0x000d},2411 {0xaa, 0x08, 0x0000},2412 {0xaa, 0x03, 0x0005},2413 {0xa0, 0x04, ZC3XX_R092_I2CADDRESSSELECT},2414 {0xa0, 0x19, ZC3XX_R093_I2CSETVALUE},2415 {0xa0, 0x01, ZC3XX_R090_I2CCOMMAND},2416 {0xa1, 0x01, 0x0091},2417 {0xaa, 0x05, 0x0020},2418 {0xaa, 0x06, 0x0005},2419 {0xaa, 0x08, 0x0000},2420 {0xaa, 0x03, 0x0006},2421 {0xaa, 0x04, 0x0017},2422 {0xaa, 0x05, 0x0026},2423 {0xaa, 0x06, 0x0005},2424 {0xaa, 0x08, 0x0000},2425 {0xaa, 0x03, 0x0007},2426 {0xaa, 0x04, 0x0019},2427 {0xaa, 0x05, 0x0022},2428 {0xaa, 0x06, 0x0005},2429 {0xaa, 0x08, 0x0000},2430 {0xaa, 0x03, 0x0008},2431 {0xaa, 0x04, 0x0021},2432 {0xaa, 0x05, 0x00aa},2433 {0xaa, 0x06, 0x0005},2434 {0xaa, 0x08, 0x0000},2435 {0xaa, 0x03, 0x0009},2436 {0xaa, 0x04, 0x0023},2437 {0xaa, 0x05, 0x00aa},2438 {0xaa, 0x06, 0x000d},2439 {0xaa, 0x08, 0x0000},2440 {0xaa, 0x03, 0x000a},2441 {0xaa, 0x04, 0x0025},2442 {0xaa, 0x05, 0x00aa},2443 {0xaa, 0x06, 0x0005},2444 {0xaa, 0x08, 0x0000},2445 {0xaa, 0x03, 0x000b},2446 {0xaa, 0x04, 0x00ec},2447 {0xaa, 0x05, 0x002e},2448 {0xaa, 0x06, 0x0005},2449 {0xaa, 0x08, 0x0000},2450 {0xaa, 0x03, 0x000c},2451 {0xaa, 0x04, 0x00fa},2452 {0xaa, 0x05, 0x002a},2453 {0xaa, 0x06, 0x0005},2454 {0xaa, 0x08, 0x0000},2455 {0xaa, 0x07, 0x000d},2456 {0xaa, 0x01, 0x0005},2457 {0xaa, 0x94, 0x0002},2458 {0xaa, 0x90, 0x0000},2459 {0xaa, 0x91, 0x0010},2460 {0xaa, 0x10, 0x0064},2461 {0xaa, 0x9b, 0x00f0},2462 {0xaa, 0x9c, 0x0002},2463 {0xaa, 0x14, 0x001a},2464 {0xaa, 0x20, 0x0080},2465 {0xaa, 0x22, 0x0080},2466 {0xaa, 0x24, 0x0080},2467 {0xaa, 0x26, 0x0080},2468 {0xaa, 0x00, 0x0084},2469 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},2470 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},2471 {0xaa, 0xa8, 0x0080},2472 {0xa0, 0x78, ZC3XX_R18D_YTARGET},2473 {0xa1, 0x01, 0x0002},2474 {0xa1, 0x01, 0x0008},2475 {0xa1, 0x01, 0x0180},2476 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},2477 {0xa0, 0x40, ZC3XX_R116_RGAIN},2478 {0xa0, 0x40, ZC3XX_R117_GGAIN},2479 {0xa0, 0x40, ZC3XX_R118_BGAIN},2480 {0xa1, 0x01, 0x0008},2481 2482 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */2483 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */2484 {0xa1, 0x01, 0x01c8},2485 {0xa1, 0x01, 0x01c9},2486 {0xa1, 0x01, 0x01ca},2487 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */2488 2489 {0xa0, 0x52, ZC3XX_R10A_RGB00}, /* matrix */2490 {0xa0, 0xf7, ZC3XX_R10B_RGB01},2491 {0xa0, 0xf7, ZC3XX_R10C_RGB02},2492 {0xa0, 0xf7, ZC3XX_R10D_RGB10},2493 {0xa0, 0x52, ZC3XX_R10E_RGB11},2494 {0xa0, 0xf7, ZC3XX_R10F_RGB12},2495 {0xa0, 0xf7, ZC3XX_R110_RGB20},2496 {0xa0, 0xf7, ZC3XX_R111_RGB21},2497 {0xa0, 0x52, ZC3XX_R112_RGB22},2498 {0xa1, 0x01, 0x0180},2499 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},2500 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},2501 {0xaa, 0x0d, 0x0003},2502 {0xaa, 0x0c, 0x0020},2503 {0xaa, 0x0e, 0x000e},2504 {0xaa, 0x0f, 0x0002},2505 {0xaa, 0x1c, 0x000d},2506 {0xaa, 0x1d, 0x0002},2507 {0xaa, 0x20, 0x0080},2508 {0xaa, 0x22, 0x0080},2509 {0xaa, 0x24, 0x0080},2510 {0xaa, 0x26, 0x0080},2511 {0xaa, 0x00, 0x0084},2512 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH},2513 {0xa0, 0x0d, ZC3XX_R0A4_EXPOSURETIMELOW},2514 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},2515 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},2516 {0xa0, 0x1a, ZC3XX_R192_EXPOSURELIMITLOW},2517 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},2518 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},2519 {0xa0, 0x4b, ZC3XX_R197_ANTIFLICKERLOW},2520 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},2521 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},2522 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},2523 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP},2524 {0xa0, 0xc8, ZC3XX_R01D_HSYNC_0},2525 {0xa0, 0xd8, ZC3XX_R01E_HSYNC_1},2526 {0xa0, 0xea, ZC3XX_R01F_HSYNC_2},2527 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},2528 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN},2529 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},2530 {0xa1, 0x01, 0x0180},2531 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},2532 {0xa0, 0x40, ZC3XX_R116_RGAIN},2533 {0xa0, 0x40, ZC3XX_R117_GGAIN},2534 {0xa0, 0x40, ZC3XX_R118_BGAIN},2535 {}2536};2537static const struct usb_action icm105a_50HZScale[] = {2538 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2539 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2540 {0xaa, 0x0c, 0x0020}, /* 00,0c,20,aa */2541 {0xaa, 0x0e, 0x000e}, /* 00,0e,0e,aa */2542 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2543 {0xaa, 0x1c, 0x000d}, /* 00,1c,0d,aa */2544 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2545 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2546 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2547 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2548 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2549 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2550 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2551 {0xa0, 0x0d, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,0d,cc */2552 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2553 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2554 {0xa0, 0x1a, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,1a,cc */2555 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2556 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2557 {0xa0, 0x4b, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,4b,cc */2558 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2559 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2560 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */2561 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */2562 {0xa0, 0xc8, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c8,cc */2563 {0xa0, 0xd8, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d8,cc */2564 {0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */2565 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2566 {}2567};2568static const struct usb_action icm105a_50HZ[] = {2569 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2570 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2571 {0xaa, 0x0c, 0x008c}, /* 00,0c,8c,aa */2572 {0xaa, 0x0e, 0x0095}, /* 00,0e,95,aa */2573 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2574 {0xaa, 0x1c, 0x0094}, /* 00,1c,94,aa */2575 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2576 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2577 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2578 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2579 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2580 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2581 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2582 {0xa0, 0x94, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,94,cc */2583 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2584 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2585 {0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */2586 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2587 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2588 {0xa0, 0x84, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,84,cc */2589 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2590 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2591 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */2592 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */2593 {0xa0, 0xe3, ZC3XX_R01D_HSYNC_0}, /* 00,1d,e3,cc */2594 {0xa0, 0xec, ZC3XX_R01E_HSYNC_1}, /* 00,1e,ec,cc */2595 {0xa0, 0xf5, ZC3XX_R01F_HSYNC_2}, /* 00,1f,f5,cc */2596 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2597 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */2598 {0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */2599 {}2600};2601static const struct usb_action icm105a_60HZScale[] = {2602 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2603 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2604 {0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */2605 {0xaa, 0x0e, 0x000d}, /* 00,0e,0d,aa */2606 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2607 {0xaa, 0x1c, 0x0008}, /* 00,1c,08,aa */2608 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2609 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2610 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2611 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2612 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2613 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2614 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2615 {0xa0, 0x08, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,08,cc */2616 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2617 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2618 {0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,10,cc */2619 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2620 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2621 {0xa0, 0x41, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,41,cc */2622 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2623 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2624 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */2625 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */2626 {0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */2627 {0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */2628 {0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */2629 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2630 {}2631};2632static const struct usb_action icm105a_60HZ[] = {2633 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2634 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2635 {0xaa, 0x0c, 0x0008}, /* 00,0c,08,aa */2636 {0xaa, 0x0e, 0x0086}, /* 00,0e,86,aa */2637 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2638 {0xaa, 0x1c, 0x0085}, /* 00,1c,85,aa */2639 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2640 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2641 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2642 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2643 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2644 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2645 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2646 {0xa0, 0x85, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,85,cc */2647 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2648 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2649 {0xa0, 0x08, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,08,cc */2650 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2651 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2652 {0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,81,cc */2653 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2654 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2655 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */2656 {0xa0, 0x12, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,12,cc */2657 {0xa0, 0xc2, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c2,cc */2658 {0xa0, 0xd6, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d6,cc */2659 {0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */2660 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2661 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */2662 {0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */2663 {}2664};2665static const struct usb_action icm105a_NoFlickerScale[] = {2666 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2667 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2668 {0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */2669 {0xaa, 0x0e, 0x000d}, /* 00,0e,0d,aa */2670 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2671 {0xaa, 0x1c, 0x0000}, /* 00,1c,00,aa */2672 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2673 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2674 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2675 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2676 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2677 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2678 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2679 {0xa0, 0x00, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,00,cc */2680 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2681 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2682 {0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */2683 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2684 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2685 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */2686 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2687 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2688 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */2689 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */2690 {0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */2691 {0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */2692 {0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */2693 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2694 {}2695};2696static const struct usb_action icm105a_NoFlicker[] = {2697 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2698 {0xaa, 0x0d, 0x0003}, /* 00,0d,03,aa */2699 {0xaa, 0x0c, 0x0004}, /* 00,0c,04,aa */2700 {0xaa, 0x0e, 0x0081}, /* 00,0e,81,aa */2701 {0xaa, 0x0f, 0x0002}, /* 00,0f,02,aa */2702 {0xaa, 0x1c, 0x0080}, /* 00,1c,80,aa */2703 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */2704 {0xaa, 0x20, 0x0080}, /* 00,20,80,aa */2705 {0xaa, 0x22, 0x0080}, /* 00,22,80,aa */2706 {0xaa, 0x24, 0x0080}, /* 00,24,80,aa */2707 {0xaa, 0x26, 0x0080}, /* 00,26,80,aa */2708 {0xaa, 0x00, 0x0084}, /* 00,00,84,aa */2709 {0xa0, 0x02, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,02,cc */2710 {0xa0, 0x80, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,80,cc */2711 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */2712 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */2713 {0xa0, 0x20, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,20,cc */2714 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */2715 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */2716 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */2717 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */2718 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */2719 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */2720 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */2721 {0xa0, 0xc1, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c1,cc */2722 {0xa0, 0xd4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d4,cc */2723 {0xa0, 0xe8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e8,cc */2724 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */2725 {0xa0, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN}, /* 01,a7,00,cc */2726 {0xa0, 0xc0, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,c0,cc */2727 {}2728};2729 2730static const struct usb_action mc501cb_Initial[] = {2731 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */2732 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, /* 00,02,00,cc */2733 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */2734 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */2735 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */2736 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */2737 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */2738 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */2739 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */2740 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */2741 {0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d8,cc */2742 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */2743 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */2744 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */2745 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */2746 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */2747 {0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,de,cc */2748 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */2749 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */2750 {0xa0, 0x33, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,33,cc */2751 {0xa0, 0x34, ZC3XX_R087_EXPTIMEMID}, /* 00,87,34,cc */2752 {0xa0, 0x35, ZC3XX_R088_EXPTIMELOW}, /* 00,88,35,cc */2753 {0xa0, 0xb0, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,b0,cc */2754 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */2755 {0xaa, 0x01, 0x0001}, /* 00,01,01,aa */2756 {0xaa, 0x01, 0x0003}, /* 00,01,03,aa */2757 {0xaa, 0x01, 0x0001}, /* 00,01,01,aa */2758 {0xaa, 0x03, 0x0000}, /* 00,03,00,aa */2759 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */2760 {0xaa, 0x11, 0x0080}, /* 00,11,80,aa */2761 {0xaa, 0x12, 0x0000}, /* 00,12,00,aa */2762 {0xaa, 0x13, 0x0000}, /* 00,13,00,aa */2763 {0xaa, 0x14, 0x0000}, /* 00,14,00,aa */2764 {0xaa, 0x15, 0x0000}, /* 00,15,00,aa */2765 {0xaa, 0x16, 0x0000}, /* 00,16,00,aa */2766 {0xaa, 0x17, 0x0001}, /* 00,17,01,aa */2767 {0xaa, 0x18, 0x00de}, /* 00,18,de,aa */2768 {0xaa, 0x19, 0x0002}, /* 00,19,02,aa */2769 {0xaa, 0x1a, 0x0086}, /* 00,1a,86,aa */2770 {0xaa, 0x20, 0x00a8}, /* 00,20,a8,aa */2771 {0xaa, 0x22, 0x0000}, /* 00,22,00,aa */2772 {0xaa, 0x23, 0x0000}, /* 00,23,00,aa */2773 {0xaa, 0x24, 0x0000}, /* 00,24,00,aa */2774 {0xaa, 0x40, 0x0033}, /* 00,40,33,aa */2775 {0xaa, 0x41, 0x0077}, /* 00,41,77,aa */2776 {0xaa, 0x42, 0x0053}, /* 00,42,53,aa */2777 {0xaa, 0x43, 0x00b0}, /* 00,43,b0,aa */2778 {0xaa, 0x4b, 0x0001}, /* 00,4b,01,aa */2779 {0xaa, 0x72, 0x0020}, /* 00,72,20,aa */2780 {0xaa, 0x73, 0x0000}, /* 00,73,00,aa */2781 {0xaa, 0x80, 0x0000}, /* 00,80,00,aa */2782 {0xaa, 0x85, 0x0050}, /* 00,85,50,aa */2783 {0xaa, 0x91, 0x0070}, /* 00,91,70,aa */2784 {0xaa, 0x92, 0x0072}, /* 00,92,72,aa */2785 {0xaa, 0x03, 0x0001}, /* 00,03,01,aa */2786 {0xaa, 0x10, 0x00a0}, /* 00,10,a0,aa */2787 {0xaa, 0x11, 0x0001}, /* 00,11,01,aa */2788 {0xaa, 0x30, 0x0000}, /* 00,30,00,aa */2789 {0xaa, 0x60, 0x0000}, /* 00,60,00,aa */2790 {0xaa, 0xa0, 0x001a}, /* 00,a0,1a,aa */2791 {0xaa, 0xa1, 0x0000}, /* 00,a1,00,aa */2792 {0xaa, 0xa2, 0x003f}, /* 00,a2,3f,aa */2793 {0xaa, 0xa3, 0x0028}, /* 00,a3,28,aa */2794 {0xaa, 0xa4, 0x0010}, /* 00,a4,10,aa */2795 {0xaa, 0xa5, 0x0020}, /* 00,a5,20,aa */2796 {0xaa, 0xb1, 0x0044}, /* 00,b1,44,aa */2797 {0xaa, 0xd0, 0x0001}, /* 00,d0,01,aa */2798 {0xaa, 0xd1, 0x0085}, /* 00,d1,85,aa */2799 {0xaa, 0xd2, 0x0080}, /* 00,d2,80,aa */2800 {0xaa, 0xd3, 0x0080}, /* 00,d3,80,aa */2801 {0xaa, 0xd4, 0x0080}, /* 00,d4,80,aa */2802 {0xaa, 0xd5, 0x0080}, /* 00,d5,80,aa */2803 {0xaa, 0xc0, 0x00c3}, /* 00,c0,c3,aa */2804 {0xaa, 0xc2, 0x0044}, /* 00,c2,44,aa */2805 {0xaa, 0xc4, 0x0040}, /* 00,c4,40,aa */2806 {0xaa, 0xc5, 0x0020}, /* 00,c5,20,aa */2807 {0xaa, 0xc6, 0x0008}, /* 00,c6,08,aa */2808 {0xaa, 0x03, 0x0004}, /* 00,03,04,aa */2809 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */2810 {0xaa, 0x40, 0x0030}, /* 00,40,30,aa */2811 {0xaa, 0x41, 0x0020}, /* 00,41,20,aa */2812 {0xaa, 0x42, 0x002d}, /* 00,42,2d,aa */2813 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2814 {0xaa, 0x1c, 0x0050}, /* 00,1C,50,aa */2815 {0xaa, 0x11, 0x0081}, /* 00,11,81,aa */2816 {0xaa, 0x3b, 0x001d}, /* 00,3b,1D,aa */2817 {0xaa, 0x3c, 0x004c}, /* 00,3c,4C,aa */2818 {0xaa, 0x3d, 0x0018}, /* 00,3d,18,aa */2819 {0xaa, 0x3e, 0x006a}, /* 00,3e,6A,aa */2820 {0xaa, 0x01, 0x0000}, /* 00,01,00,aa */2821 {0xaa, 0x52, 0x00ff}, /* 00,52,FF,aa */2822 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2823 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */2824 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */2825 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */2826 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */2827 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */2828 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */2829 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */2830 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */2831 {0xaa, 0x03, 0x0002}, /* 00,03,02,aa */2832 {0xaa, 0x51, 0x0027}, /* 00,51,27,aa */2833 {0xaa, 0x52, 0x0020}, /* 00,52,20,aa */2834 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2835 {0xaa, 0x50, 0x0010}, /* 00,50,10,aa */2836 {0xaa, 0x51, 0x0010}, /* 00,51,10,aa */2837 {0xaa, 0x54, 0x0010}, /* 00,54,10,aa */2838 {0xaa, 0x55, 0x0010}, /* 00,55,10,aa */2839 {0xa0, 0xf0, 0x0199}, /* 01,99,F0,cc */2840 {0xa0, 0x80, 0x019a}, /* 01,9A,80,cc */2841 2842 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2843 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */2844 {0xaa, 0x36, 0x001d}, /* 00,36,1D,aa */2845 {0xaa, 0x37, 0x004c}, /* 00,37,4C,aa */2846 {0xaa, 0x3b, 0x001d}, /* 00,3B,1D,aa */2847 {}2848};2849 2850static const struct usb_action mc501cb_InitialScale[] = { /* 320x240 */2851 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */2852 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */2853 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */2854 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */2855 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */2856 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */2857 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */2858 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */2859 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */2860 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */2861 {0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d0,cc */2862 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */2863 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */2864 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */2865 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */2866 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */2867 {0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,d8,cc */2868 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */2869 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */2870 {0xa0, 0x33, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,33,cc */2871 {0xa0, 0x34, ZC3XX_R087_EXPTIMEMID}, /* 00,87,34,cc */2872 {0xa0, 0x35, ZC3XX_R088_EXPTIMELOW}, /* 00,88,35,cc */2873 {0xa0, 0xb0, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,b0,cc */2874 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */2875 {0xaa, 0x01, 0x0001}, /* 00,01,01,aa */2876 {0xaa, 0x01, 0x0003}, /* 00,01,03,aa */2877 {0xaa, 0x01, 0x0001}, /* 00,01,01,aa */2878 {0xaa, 0x03, 0x0000}, /* 00,03,00,aa */2879 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */2880 {0xaa, 0x11, 0x0080}, /* 00,11,80,aa */2881 {0xaa, 0x12, 0x0000}, /* 00,12,00,aa */2882 {0xaa, 0x13, 0x0000}, /* 00,13,00,aa */2883 {0xaa, 0x14, 0x0000}, /* 00,14,00,aa */2884 {0xaa, 0x15, 0x0000}, /* 00,15,00,aa */2885 {0xaa, 0x16, 0x0000}, /* 00,16,00,aa */2886 {0xaa, 0x17, 0x0001}, /* 00,17,01,aa */2887 {0xaa, 0x18, 0x00d8}, /* 00,18,d8,aa */2888 {0xaa, 0x19, 0x0002}, /* 00,19,02,aa */2889 {0xaa, 0x1a, 0x0088}, /* 00,1a,88,aa */2890 {0xaa, 0x20, 0x00a8}, /* 00,20,a8,aa */2891 {0xaa, 0x22, 0x0000}, /* 00,22,00,aa */2892 {0xaa, 0x23, 0x0000}, /* 00,23,00,aa */2893 {0xaa, 0x24, 0x0000}, /* 00,24,00,aa */2894 {0xaa, 0x40, 0x0033}, /* 00,40,33,aa */2895 {0xaa, 0x41, 0x0077}, /* 00,41,77,aa */2896 {0xaa, 0x42, 0x0053}, /* 00,42,53,aa */2897 {0xaa, 0x43, 0x00b0}, /* 00,43,b0,aa */2898 {0xaa, 0x4b, 0x0001}, /* 00,4b,01,aa */2899 {0xaa, 0x72, 0x0020}, /* 00,72,20,aa */2900 {0xaa, 0x73, 0x0000}, /* 00,73,00,aa */2901 {0xaa, 0x80, 0x0000}, /* 00,80,00,aa */2902 {0xaa, 0x85, 0x0050}, /* 00,85,50,aa */2903 {0xaa, 0x91, 0x0070}, /* 00,91,70,aa */2904 {0xaa, 0x92, 0x0072}, /* 00,92,72,aa */2905 {0xaa, 0x03, 0x0001}, /* 00,03,01,aa */2906 {0xaa, 0x10, 0x00a0}, /* 00,10,a0,aa */2907 {0xaa, 0x11, 0x0001}, /* 00,11,01,aa */2908 {0xaa, 0x30, 0x0000}, /* 00,30,00,aa */2909 {0xaa, 0x60, 0x0000}, /* 00,60,00,aa */2910 {0xaa, 0xa0, 0x001a}, /* 00,a0,1a,aa */2911 {0xaa, 0xa1, 0x0000}, /* 00,a1,00,aa */2912 {0xaa, 0xa2, 0x003f}, /* 00,a2,3f,aa */2913 {0xaa, 0xa3, 0x0028}, /* 00,a3,28,aa */2914 {0xaa, 0xa4, 0x0010}, /* 00,a4,10,aa */2915 {0xaa, 0xa5, 0x0020}, /* 00,a5,20,aa */2916 {0xaa, 0xb1, 0x0044}, /* 00,b1,44,aa */2917 {0xaa, 0xd0, 0x0001}, /* 00,d0,01,aa */2918 {0xaa, 0xd1, 0x0085}, /* 00,d1,85,aa */2919 {0xaa, 0xd2, 0x0080}, /* 00,d2,80,aa */2920 {0xaa, 0xd3, 0x0080}, /* 00,d3,80,aa */2921 {0xaa, 0xd4, 0x0080}, /* 00,d4,80,aa */2922 {0xaa, 0xd5, 0x0080}, /* 00,d5,80,aa */2923 {0xaa, 0xc0, 0x00c3}, /* 00,c0,c3,aa */2924 {0xaa, 0xc2, 0x0044}, /* 00,c2,44,aa */2925 {0xaa, 0xc4, 0x0040}, /* 00,c4,40,aa */2926 {0xaa, 0xc5, 0x0020}, /* 00,c5,20,aa */2927 {0xaa, 0xc6, 0x0008}, /* 00,c6,08,aa */2928 {0xaa, 0x03, 0x0004}, /* 00,03,04,aa */2929 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */2930 {0xaa, 0x40, 0x0030}, /* 00,40,30,aa */2931 {0xaa, 0x41, 0x0020}, /* 00,41,20,aa */2932 {0xaa, 0x42, 0x002d}, /* 00,42,2d,aa */2933 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2934 {0xaa, 0x1c, 0x0050}, /* 00,1c,50,aa */2935 {0xaa, 0x11, 0x0081}, /* 00,11,81,aa */2936 {0xaa, 0x3b, 0x003a}, /* 00,3b,3A,aa */2937 {0xaa, 0x3c, 0x0098}, /* 00,3c,98,aa */2938 {0xaa, 0x3d, 0x0030}, /* 00,3d,30,aa */2939 {0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */2940 {0xaa, 0x01, 0x0000}, /* 00,01,00,aa */2941 {0xaa, 0x52, 0x00ff}, /* 00,52,FF,aa */2942 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */2943 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */2944 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */2945 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */2946 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */2947 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */2948 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */2949 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */2950 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */2951 {0xaa, 0x03, 0x0002}, /* 00,03,02,aa */2952 {0xaa, 0x51, 0x004e}, /* 00,51,4E,aa */2953 {0xaa, 0x52, 0x0041}, /* 00,52,41,aa */2954 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2955 {0xaa, 0x50, 0x0010}, /* 00,50,10,aa */2956 {0xaa, 0x51, 0x0010}, /* 00,51,10,aa */2957 {0xaa, 0x54, 0x0010}, /* 00,54,10,aa */2958 {0xaa, 0x55, 0x0010}, /* 00,55,10,aa */2959 {0xa0, 0xf0, 0x0199}, /* 01,99,F0,cc */2960 {0xa0, 0x80, 0x019a}, /* 01,9A,80,cc */2961 {}2962};2963 2964static const struct usb_action mc501cb_50HZ[] = {2965 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2966 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */2967 {0xaa, 0x36, 0x001d}, /* 00,36,1D,aa */2968 {0xaa, 0x37, 0x004c}, /* 00,37,4C,aa */2969 {0xaa, 0x3b, 0x001d}, /* 00,3B,1D,aa */2970 {0xaa, 0x3c, 0x004c}, /* 00,3C,4C,aa */2971 {0xaa, 0x3d, 0x001d}, /* 00,3D,1D,aa */2972 {0xaa, 0x3e, 0x004c}, /* 00,3E,4C,aa */2973 {}2974};2975 2976static const struct usb_action mc501cb_50HZScale[] = {2977 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2978 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */2979 {0xaa, 0x36, 0x003a}, /* 00,36,3A,aa */2980 {0xaa, 0x37, 0x0098}, /* 00,37,98,aa */2981 {0xaa, 0x3b, 0x003a}, /* 00,3B,3A,aa */2982 {0xaa, 0x3c, 0x0098}, /* 00,3C,98,aa */2983 {0xaa, 0x3d, 0x003a}, /* 00,3D,3A,aa */2984 {0xaa, 0x3e, 0x0098}, /* 00,3E,98,aa */2985 {}2986};2987 2988static const struct usb_action mc501cb_60HZ[] = {2989 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */2990 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */2991 {0xaa, 0x36, 0x0018}, /* 00,36,18,aa */2992 {0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */2993 {0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */2994 {0xaa, 0x3e, 0x006a}, /* 00,3E,6A,aa */2995 {0xaa, 0x3b, 0x0018}, /* 00,3B,18,aa */2996 {0xaa, 0x3c, 0x006a}, /* 00,3C,6A,aa */2997 {}2998};2999 3000static const struct usb_action mc501cb_60HZScale[] = {3001 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */3002 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */3003 {0xaa, 0x36, 0x0030}, /* 00,36,30,aa */3004 {0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */3005 {0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */3006 {0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */3007 {0xaa, 0x3b, 0x0030}, /* 00,3B,30,aa */3008 {0xaa, 0x3c, 0x00d4}, /* 00,3C,D4,aa */3009 {}3010};3011 3012static const struct usb_action mc501cb_NoFlicker[] = {3013 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */3014 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */3015 {0xaa, 0x36, 0x0018}, /* 00,36,18,aa */3016 {0xaa, 0x37, 0x006a}, /* 00,37,6A,aa */3017 {0xaa, 0x3d, 0x0018}, /* 00,3D,18,aa */3018 {0xaa, 0x3e, 0x006a}, /* 00,3E,6A,aa */3019 {0xaa, 0x3b, 0x0018}, /* 00,3B,18,aa */3020 {0xaa, 0x3c, 0x006a}, /* 00,3C,6A,aa */3021 {}3022};3023 3024static const struct usb_action mc501cb_NoFlickerScale[] = {3025 {0xaa, 0x03, 0x0003}, /* 00,03,03,aa */3026 {0xaa, 0x10, 0x00fc}, /* 00,10,fc,aa */3027 {0xaa, 0x36, 0x0030}, /* 00,36,30,aa */3028 {0xaa, 0x37, 0x00d4}, /* 00,37,D4,aa */3029 {0xaa, 0x3d, 0x0030}, /* 00,3D,30,aa */3030 {0xaa, 0x3e, 0x00d4}, /* 00,3E,D4,aa */3031 {0xaa, 0x3b, 0x0030}, /* 00,3B,30,aa */3032 {0xaa, 0x3c, 0x00d4}, /* 00,3C,D4,aa */3033 {}3034};3035 3036/* from zs211.inf */3037static const struct usb_action ov7620_Initial[] = { /* 640x480 */3038 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */3039 {0xa0, 0x40, ZC3XX_R002_CLOCKSELECT}, /* 00,02,40,cc */3040 {0xa0, 0x00, ZC3XX_R008_CLOCKSETTING}, /* 00,08,00,cc */3041 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */3042 {0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,06,cc */3043 {0xa0, 0x02, ZC3XX_R083_RGAINADDR}, /* 00,83,02,cc */3044 {0xa0, 0x01, ZC3XX_R085_BGAINADDR}, /* 00,85,01,cc */3045 {0xa0, 0x80, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,80,cc */3046 {0xa0, 0x81, ZC3XX_R087_EXPTIMEMID}, /* 00,87,81,cc */3047 {0xa0, 0x10, ZC3XX_R088_EXPTIMELOW}, /* 00,88,10,cc */3048 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,a1,cc */3049 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */3050 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */3051 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */3052 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */3053 {0xa0, 0xd8, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d8,cc */3054 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */3055 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */3056 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */3057 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */3058 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */3059 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */3060 {0xa0, 0xde, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,de,cc */3061 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */3062 {0xaa, 0x12, 0x0088}, /* 00,12,88,aa */3063 {0xaa, 0x12, 0x0048}, /* 00,12,48,aa */3064 {0xaa, 0x75, 0x008a}, /* 00,75,8a,aa */3065 {0xaa, 0x13, 0x00a3}, /* 00,13,a3,aa */3066 {0xaa, 0x04, 0x0000}, /* 00,04,00,aa */3067 {0xaa, 0x05, 0x0000}, /* 00,05,00,aa */3068 {0xaa, 0x14, 0x0000}, /* 00,14,00,aa */3069 {0xaa, 0x15, 0x0004}, /* 00,15,04,aa */3070 {0xaa, 0x17, 0x0018}, /* 00,17,18,aa */3071 {0xaa, 0x18, 0x00ba}, /* 00,18,ba,aa */3072 {0xaa, 0x19, 0x0002}, /* 00,19,02,aa */3073 {0xaa, 0x1a, 0x00f1}, /* 00,1a,f1,aa */3074 {0xaa, 0x20, 0x0040}, /* 00,20,40,aa */3075 {0xaa, 0x24, 0x0088}, /* 00,24,88,aa */3076 {0xaa, 0x25, 0x0078}, /* 00,25,78,aa */3077 {0xaa, 0x27, 0x00f6}, /* 00,27,f6,aa */3078 {0xaa, 0x28, 0x00a0}, /* 00,28,a0,aa */3079 {0xaa, 0x21, 0x0000}, /* 00,21,00,aa */3080 {0xaa, 0x2a, 0x0083}, /* 00,2a,83,aa */3081 {0xaa, 0x2b, 0x0096}, /* 00,2b,96,aa */3082 {0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */3083 {0xaa, 0x74, 0x0020}, /* 00,74,20,aa */3084 {0xaa, 0x61, 0x0068}, /* 00,61,68,aa */3085 {0xaa, 0x64, 0x0088}, /* 00,64,88,aa */3086 {0xaa, 0x00, 0x0000}, /* 00,00,00,aa */3087 {0xaa, 0x06, 0x0080}, /* 00,06,80,aa */3088 {0xaa, 0x01, 0x0090}, /* 00,01,90,aa */3089 {0xaa, 0x02, 0x0030}, /* 00,02,30,aa */3090 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,77,cc */3091 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */3092 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */3093 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */3094 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */3095 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */3096 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */3097 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */3098 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */3099 {0xa0, 0x68, ZC3XX_R116_RGAIN}, /* 01,16,68,cc */3100 {0xa0, 0x52, ZC3XX_R118_BGAIN}, /* 01,18,52,cc */3101 {0xa0, 0x40, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,40,cc */3102 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */3103 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,50,cc */3104 {}3105};3106static const struct usb_action ov7620_InitialScale[] = { /* 320x240 */3107 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */3108 {0xa0, 0x50, ZC3XX_R002_CLOCKSELECT}, /* 00,02,50,cc */3109 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,00,cc */3110 /* mx change? */3111 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */3112 {0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,06,cc */3113 {0xa0, 0x02, ZC3XX_R083_RGAINADDR}, /* 00,83,02,cc */3114 {0xa0, 0x01, ZC3XX_R085_BGAINADDR}, /* 00,85,01,cc */3115 {0xa0, 0x80, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,80,cc */3116 {0xa0, 0x81, ZC3XX_R087_EXPTIMEMID}, /* 00,87,81,cc */3117 {0xa0, 0x10, ZC3XX_R088_EXPTIMELOW}, /* 00,88,10,cc */3118 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,a1,cc */3119 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */3120 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */3121 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */3122 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */3123 {0xa0, 0xd0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,d0,cc */3124 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */3125 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */3126 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */3127 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */3128 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */3129 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */3130 {0xa0, 0xd6, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,d6,cc */3131 /* OV7648 00,9c,d8,cc */3132 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */3133 {0xaa, 0x12, 0x0088}, /* 00,12,88,aa */3134 {0xaa, 0x12, 0x0048}, /* 00,12,48,aa */3135 {0xaa, 0x75, 0x008a}, /* 00,75,8a,aa */3136 {0xaa, 0x13, 0x00a3}, /* 00,13,a3,aa */3137 {0xaa, 0x04, 0x0000}, /* 00,04,00,aa */3138 {0xaa, 0x05, 0x0000}, /* 00,05,00,aa */3139 {0xaa, 0x14, 0x0000}, /* 00,14,00,aa */3140 {0xaa, 0x15, 0x0004}, /* 00,15,04,aa */3141 {0xaa, 0x24, 0x0088}, /* 00,24,88,aa */3142 {0xaa, 0x25, 0x0078}, /* 00,25,78,aa */3143 {0xaa, 0x17, 0x0018}, /* 00,17,18,aa */3144 {0xaa, 0x18, 0x00ba}, /* 00,18,ba,aa */3145 {0xaa, 0x19, 0x0002}, /* 00,19,02,aa */3146 {0xaa, 0x1a, 0x00f2}, /* 00,1a,f2,aa */3147 {0xaa, 0x20, 0x0040}, /* 00,20,40,aa */3148 {0xaa, 0x27, 0x00f6}, /* 00,27,f6,aa */3149 {0xaa, 0x28, 0x00a0}, /* 00,28,a0,aa */3150 {0xaa, 0x21, 0x0000}, /* 00,21,00,aa */3151 {0xaa, 0x2a, 0x0083}, /* 00,2a,83,aa */3152 {0xaa, 0x2b, 0x0096}, /* 00,2b,96,aa */3153 {0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */3154 {0xaa, 0x74, 0x0020}, /* 00,74,20,aa */3155 {0xaa, 0x61, 0x0068}, /* 00,61,68,aa */3156 {0xaa, 0x64, 0x0088}, /* 00,64,88,aa */3157 {0xaa, 0x00, 0x0000}, /* 00,00,00,aa */3158 {0xaa, 0x06, 0x0080}, /* 00,06,80,aa */3159 {0xaa, 0x01, 0x0090}, /* 00,01,90,aa */3160 {0xaa, 0x02, 0x0030}, /* 00,02,30,aa */3161 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,77,cc */3162 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */3163 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */3164 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */3165 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */3166 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */3167 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */3168 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */3169 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */3170 {0xa0, 0x68, ZC3XX_R116_RGAIN}, /* 01,16,68,cc */3171 {0xa0, 0x52, ZC3XX_R118_BGAIN}, /* 01,18,52,cc */3172 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,50,cc */3173 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */3174 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,50,cc */3175 {}3176};3177static const struct usb_action ov7620_50HZ[] = {3178 {0xdd, 0x00, 0x0100}, /* 00,01,00,dd */3179 {0xaa, 0x2b, 0x0096}, /* 00,2b,96,aa */3180 /* enable 1/120s & 1/100s exposures for banding filter */3181 {0xaa, 0x75, 0x008e},3182 {0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */3183 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3184 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */3185 {0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */3186 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3187 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3188 {0xa0, 0x83, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,83,cc */3189 {0xaa, 0x76, 0x0003}, /* 00,76,03,aa */3190/* {0xa0, 0x40, ZC3XX_R002_CLOCKSELECT}, * 00,02,40,cc3191 * if mode0 (640x480) */3192 {}3193};3194static const struct usb_action ov7620_60HZ[] = {3195 {0xdd, 0x00, 0x0100}, /* 00,01,00,dd */3196 {0xaa, 0x2b, 0x0000}, /* 00,2b,00,aa */3197 /* enable 1/120s & 1/100s exposures for banding filter */3198 {0xaa, 0x75, 0x008e},3199 {0xaa, 0x2d, 0x0005}, /* 00,2d,05,aa */3200 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3201 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */3202 {0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */3203 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3204 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3205 {0xa0, 0x83, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,83,cc */3206 {0xaa, 0x76, 0x0003}, /* 00,76,03,aa */3207/* {0xa0, 0x40, ZC3XX_R002_CLOCKSELECT}, * 00,02,40,cc3208 * if mode0 (640x480) */3209/* ?? in gspca v1, it was3210 {0xa0, 0x00, 0x0039}, * 00,00,00,dd *3211 {0xa1, 0x01, 0x0037}, */3212 {}3213};3214static const struct usb_action ov7620_NoFlicker[] = {3215 {0xdd, 0x00, 0x0100}, /* 00,01,00,dd */3216 {0xaa, 0x2b, 0x0000}, /* 00,2b,00,aa */3217 /* disable 1/120s & 1/100s exposures for banding filter */3218 {0xaa, 0x75, 0x008a},3219 {0xaa, 0x2d, 0x0001}, /* 00,2d,01,aa */3220 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3221 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,04,cc */3222 {0xa0, 0x18, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,18,cc */3223 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3224 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3225 {0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,01,cc */3226/* {0xa0, 0x44, ZC3XX_R002_CLOCKSELECT}, * 00,02,44,cc3227 * if mode1 (320x240) */3228/* ?? was3229 {0xa0, 0x00, 0x0039}, * 00,00,00,dd *3230 {0xa1, 0x01, 0x0037}, */3231 {}3232};3233 3234static const struct usb_action ov7630c_InitialScale[] = {3235 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},3236 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},3237 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},3238 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},3239 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3240 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},3241 {0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT},3242 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},3243 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},3244 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},3245 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},3246 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},3247 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},3248 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},3249 {0xaa, 0x12, 0x0080},3250 {0xa0, 0x02, ZC3XX_R083_RGAINADDR},3251 {0xa0, 0x01, ZC3XX_R085_BGAINADDR},3252 {0xa0, 0x90, ZC3XX_R086_EXPTIMEHIGH},3253 {0xa0, 0x91, ZC3XX_R087_EXPTIMEMID},3254 {0xa0, 0x10, ZC3XX_R088_EXPTIMELOW},3255 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},3256 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},3257 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},3258 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},3259 {0xa0, 0xd8, ZC3XX_R09C_WINHEIGHTLOW},3260 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},3261 {0xaa, 0x12, 0x0069},3262 {0xaa, 0x04, 0x0020},3263 {0xaa, 0x06, 0x0050},3264 {0xaa, 0x13, 0x0083},3265 {0xaa, 0x14, 0x0000},3266 {0xaa, 0x15, 0x0024},3267 {0xaa, 0x17, 0x0018},3268 {0xaa, 0x18, 0x00ba},3269 {0xaa, 0x19, 0x0002},3270 {0xaa, 0x1a, 0x00f6},3271 {0xaa, 0x1b, 0x0002},3272 {0xaa, 0x20, 0x00c2},3273 {0xaa, 0x24, 0x0060},3274 {0xaa, 0x25, 0x0040},3275 {0xaa, 0x26, 0x0030},3276 {0xaa, 0x27, 0x00ea},3277 {0xaa, 0x28, 0x00a0},3278 {0xaa, 0x21, 0x0000},3279 {0xaa, 0x2a, 0x0081},3280 {0xaa, 0x2b, 0x0096},3281 {0xaa, 0x2d, 0x0094},3282 {0xaa, 0x2f, 0x003d},3283 {0xaa, 0x30, 0x0024},3284 {0xaa, 0x60, 0x0000},3285 {0xaa, 0x61, 0x0040},3286 {0xaa, 0x68, 0x007c},3287 {0xaa, 0x6f, 0x0015},3288 {0xaa, 0x75, 0x0088},3289 {0xaa, 0x77, 0x00b5},3290 {0xaa, 0x01, 0x0060},3291 {0xaa, 0x02, 0x0060},3292 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},3293 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},3294 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3295 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3296 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},3297 {0xa0, 0x00, 0x01ad},3298 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},3299 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},3300 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3301 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3302 {0xa0, 0x60, ZC3XX_R116_RGAIN},3303 {0xa0, 0x46, ZC3XX_R118_BGAIN},3304 {0xa0, 0x04, ZC3XX_R113_RGB03},3305/* 0x10, */3306 {0xa1, 0x01, 0x0002},3307 {0xa0, 0x50, ZC3XX_R10A_RGB00}, /* matrix */3308 {0xa0, 0xf8, ZC3XX_R10B_RGB01},3309 {0xa0, 0xf8, ZC3XX_R10C_RGB02},3310 {0xa0, 0xf8, ZC3XX_R10D_RGB10},3311 {0xa0, 0x50, ZC3XX_R10E_RGB11},3312 {0xa0, 0xf8, ZC3XX_R10F_RGB12},3313 {0xa0, 0xf8, ZC3XX_R110_RGB20},3314 {0xa0, 0xf8, ZC3XX_R111_RGB21},3315 {0xa0, 0x50, ZC3XX_R112_RGB22},3316 {0xa1, 0x01, 0x0008},3317 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */3318 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */3319 {0xa1, 0x01, 0x01c8},3320 {0xa1, 0x01, 0x01c9},3321 {0xa1, 0x01, 0x01ca},3322 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */3323 {0xa0, 0x01, ZC3XX_R120_GAMMA00}, /* gamma 2 ?*/3324 {0xa0, 0x0c, ZC3XX_R121_GAMMA01},3325 {0xa0, 0x1f, ZC3XX_R122_GAMMA02},3326 {0xa0, 0x3a, ZC3XX_R123_GAMMA03},3327 {0xa0, 0x53, ZC3XX_R124_GAMMA04},3328 {0xa0, 0x6d, ZC3XX_R125_GAMMA05},3329 {0xa0, 0x85, ZC3XX_R126_GAMMA06},3330 {0xa0, 0x9c, ZC3XX_R127_GAMMA07},3331 {0xa0, 0xb0, ZC3XX_R128_GAMMA08},3332 {0xa0, 0xc2, ZC3XX_R129_GAMMA09},3333 {0xa0, 0xd1, ZC3XX_R12A_GAMMA0A},3334 {0xa0, 0xde, ZC3XX_R12B_GAMMA0B},3335 {0xa0, 0xe9, ZC3XX_R12C_GAMMA0C},3336 {0xa0, 0xf2, ZC3XX_R12D_GAMMA0D},3337 {0xa0, 0xf9, ZC3XX_R12E_GAMMA0E},3338 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},3339 {0xa0, 0x05, ZC3XX_R130_GAMMA10},3340 {0xa0, 0x0f, ZC3XX_R131_GAMMA11},3341 {0xa0, 0x16, ZC3XX_R132_GAMMA12},3342 {0xa0, 0x1a, ZC3XX_R133_GAMMA13},3343 {0xa0, 0x19, ZC3XX_R134_GAMMA14},3344 {0xa0, 0x19, ZC3XX_R135_GAMMA15},3345 {0xa0, 0x17, ZC3XX_R136_GAMMA16},3346 {0xa0, 0x15, ZC3XX_R137_GAMMA17},3347 {0xa0, 0x12, ZC3XX_R138_GAMMA18},3348 {0xa0, 0x10, ZC3XX_R139_GAMMA19},3349 {0xa0, 0x0e, ZC3XX_R13A_GAMMA1A},3350 {0xa0, 0x0b, ZC3XX_R13B_GAMMA1B},3351 {0xa0, 0x09, ZC3XX_R13C_GAMMA1C},3352 {0xa0, 0x08, ZC3XX_R13D_GAMMA1D},3353 {0xa0, 0x06, ZC3XX_R13E_GAMMA1E},3354 {0xa0, 0x03, ZC3XX_R13F_GAMMA1F},3355 {0xa0, 0x50, ZC3XX_R10A_RGB00}, /* matrix */3356 {0xa0, 0xf8, ZC3XX_R10B_RGB01},3357 {0xa0, 0xf8, ZC3XX_R10C_RGB02},3358 {0xa0, 0xf8, ZC3XX_R10D_RGB10},3359 {0xa0, 0x50, ZC3XX_R10E_RGB11},3360 {0xa0, 0xf8, ZC3XX_R10F_RGB12},3361 {0xa0, 0xf8, ZC3XX_R110_RGB20},3362 {0xa0, 0xf8, ZC3XX_R111_RGB21},3363 {0xa0, 0x50, ZC3XX_R112_RGB22},3364 3365 {0xa1, 0x01, 0x0180},3366 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},3367 {0xaa, 0x10, 0x001b},3368 {0xaa, 0x76, 0x0002},3369 {0xaa, 0x2a, 0x0081},3370 {0xaa, 0x2b, 0x0000},3371 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},3372 {0xa0, 0x01, ZC3XX_R191_EXPOSURELIMITMID},3373 {0xa0, 0xb8, ZC3XX_R192_EXPOSURELIMITLOW},3374 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},3375 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},3376 {0xa0, 0x37, ZC3XX_R197_ANTIFLICKERLOW},3377 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},3378 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},3379 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},3380 {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},3381 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},3382 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},3383 {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},3384 {0xaa, 0x13, 0x0083}, /* 40 */3385 {0xa1, 0x01, 0x0180},3386 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},3387 {}3388};3389 3390static const struct usb_action ov7630c_Initial[] = {3391 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},3392 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},3393 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3394 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},3395 {0xa0, 0x06, ZC3XX_R010_CMOSSENSORSELECT},3396 {0xa0, 0xa1, ZC3XX_R08B_I2CDEVICEADDR},3397 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},3398 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},3399 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},3400 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},3401 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},3402 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},3403 3404 {0xaa, 0x12, 0x0080},3405 {0xa0, 0x02, ZC3XX_R083_RGAINADDR},3406 {0xa0, 0x01, ZC3XX_R085_BGAINADDR},3407 {0xa0, 0x90, ZC3XX_R086_EXPTIMEHIGH},3408 {0xa0, 0x91, ZC3XX_R087_EXPTIMEMID},3409 {0xa0, 0x10, ZC3XX_R088_EXPTIMELOW},3410 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},3411 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},3412 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},3413 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},3414 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},3415 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},3416 {0xaa, 0x12, 0x0069}, /* i2c */3417 {0xaa, 0x04, 0x0020},3418 {0xaa, 0x06, 0x0050},3419 {0xaa, 0x13, 0x00c3},3420 {0xaa, 0x14, 0x0000},3421 {0xaa, 0x15, 0x0024},3422 {0xaa, 0x19, 0x0003},3423 {0xaa, 0x1a, 0x00f6},3424 {0xaa, 0x1b, 0x0002},3425 {0xaa, 0x20, 0x00c2},3426 {0xaa, 0x24, 0x0060},3427 {0xaa, 0x25, 0x0040},3428 {0xaa, 0x26, 0x0030},3429 {0xaa, 0x27, 0x00ea},3430 {0xaa, 0x28, 0x00a0},3431 {0xaa, 0x21, 0x0000},3432 {0xaa, 0x2a, 0x0081},3433 {0xaa, 0x2b, 0x0096},3434 {0xaa, 0x2d, 0x0084},3435 {0xaa, 0x2f, 0x003d},3436 {0xaa, 0x30, 0x0024},3437 {0xaa, 0x60, 0x0000},3438 {0xaa, 0x61, 0x0040},3439 {0xaa, 0x68, 0x007c},3440 {0xaa, 0x6f, 0x0015},3441 {0xaa, 0x75, 0x0088},3442 {0xaa, 0x77, 0x00b5},3443 {0xaa, 0x01, 0x0060},3444 {0xaa, 0x02, 0x0060},3445 {0xaa, 0x17, 0x0018},3446 {0xaa, 0x18, 0x00ba},3447 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},3448 {0xa0, 0x77, ZC3XX_R101_SENSORCORRECTION},3449 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3450 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3451 {0xa0, 0x04, ZC3XX_R1A7_CALCGLOBALMEAN},3452 {0xa0, 0x00, 0x01ad},3453 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},3454 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},3455 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3456 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3457 {0xa0, 0x60, ZC3XX_R116_RGAIN},3458 {0xa0, 0x46, ZC3XX_R118_BGAIN},3459 {0xa0, 0x04, ZC3XX_R113_RGB03},3460 3461 {0xa1, 0x01, 0x0002},3462 {0xa0, 0x4e, ZC3XX_R10A_RGB00}, /* matrix */3463 {0xa0, 0xfe, ZC3XX_R10B_RGB01},3464 {0xa0, 0xf4, ZC3XX_R10C_RGB02},3465 {0xa0, 0xf7, ZC3XX_R10D_RGB10},3466 {0xa0, 0x4d, ZC3XX_R10E_RGB11},3467 {0xa0, 0xfc, ZC3XX_R10F_RGB12},3468 {0xa0, 0x00, ZC3XX_R110_RGB20},3469 {0xa0, 0xf6, ZC3XX_R111_RGB21},3470 {0xa0, 0x4a, ZC3XX_R112_RGB22},3471 3472 {0xa1, 0x01, 0x0008},3473 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* clock ? */3474 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00}, /* sharpness+ */3475 {0xa1, 0x01, 0x01c8},3476 {0xa1, 0x01, 0x01c9},3477 {0xa1, 0x01, 0x01ca},3478 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05}, /* sharpness- */3479 {0xa0, 0x16, ZC3XX_R120_GAMMA00}, /* gamma ~4 */3480 {0xa0, 0x3a, ZC3XX_R121_GAMMA01},3481 {0xa0, 0x5b, ZC3XX_R122_GAMMA02},3482 {0xa0, 0x7c, ZC3XX_R123_GAMMA03},3483 {0xa0, 0x94, ZC3XX_R124_GAMMA04},3484 {0xa0, 0xa9, ZC3XX_R125_GAMMA05},3485 {0xa0, 0xbb, ZC3XX_R126_GAMMA06},3486 {0xa0, 0xca, ZC3XX_R127_GAMMA07},3487 {0xa0, 0xd7, ZC3XX_R128_GAMMA08},3488 {0xa0, 0xe1, ZC3XX_R129_GAMMA09},3489 {0xa0, 0xea, ZC3XX_R12A_GAMMA0A},3490 {0xa0, 0xf1, ZC3XX_R12B_GAMMA0B},3491 {0xa0, 0xf7, ZC3XX_R12C_GAMMA0C},3492 {0xa0, 0xfc, ZC3XX_R12D_GAMMA0D},3493 {0xa0, 0xff, ZC3XX_R12E_GAMMA0E},3494 {0xa0, 0xff, ZC3XX_R12F_GAMMA0F},3495 {0xa0, 0x20, ZC3XX_R130_GAMMA10},3496 {0xa0, 0x22, ZC3XX_R131_GAMMA11},3497 {0xa0, 0x20, ZC3XX_R132_GAMMA12},3498 {0xa0, 0x1c, ZC3XX_R133_GAMMA13},3499 {0xa0, 0x16, ZC3XX_R134_GAMMA14},3500 {0xa0, 0x13, ZC3XX_R135_GAMMA15},3501 {0xa0, 0x10, ZC3XX_R136_GAMMA16},3502 {0xa0, 0x0d, ZC3XX_R137_GAMMA17},3503 {0xa0, 0x0b, ZC3XX_R138_GAMMA18},3504 {0xa0, 0x09, ZC3XX_R139_GAMMA19},3505 {0xa0, 0x07, ZC3XX_R13A_GAMMA1A},3506 {0xa0, 0x06, ZC3XX_R13B_GAMMA1B},3507 {0xa0, 0x05, ZC3XX_R13C_GAMMA1C},3508 {0xa0, 0x04, ZC3XX_R13D_GAMMA1D},3509 {0xa0, 0x00, ZC3XX_R13E_GAMMA1E},3510 {0xa0, 0x01, ZC3XX_R13F_GAMMA1F},3511 {0xa0, 0x4e, ZC3XX_R10A_RGB00}, /* matrix */3512 {0xa0, 0xfe, ZC3XX_R10B_RGB01},3513 {0xa0, 0xf4, ZC3XX_R10C_RGB02},3514 {0xa0, 0xf7, ZC3XX_R10D_RGB10},3515 {0xa0, 0x4d, ZC3XX_R10E_RGB11},3516 {0xa0, 0xfc, ZC3XX_R10F_RGB12},3517 {0xa0, 0x00, ZC3XX_R110_RGB20},3518 {0xa0, 0xf6, ZC3XX_R111_RGB21},3519 {0xa0, 0x4a, ZC3XX_R112_RGB22},3520 3521 {0xa1, 0x01, 0x0180},3522 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},3523 {0xaa, 0x10, 0x000d},3524 {0xaa, 0x76, 0x0002},3525 {0xaa, 0x2a, 0x0081},3526 {0xaa, 0x2b, 0x0000},3527 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},3528 {0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID},3529 {0xa0, 0xd8, ZC3XX_R192_EXPOSURELIMITLOW},3530 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},3531 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},3532 {0xa0, 0x1b, ZC3XX_R197_ANTIFLICKERLOW},3533 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},3534 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},3535 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF},3536 {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},3537 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},3538 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE},3539 {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},3540 {0xaa, 0x13, 0x00c3},3541 3542 {0xa1, 0x01, 0x0180},3543 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},3544 {}3545};3546 3547static const struct usb_action pas106b_Initial_com[] = {3548/* Sream and Sensor specific */3549 {0xa1, 0x01, 0x0010}, /* CMOSSensorSelect */3550/* System */3551 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* SystemControl */3552 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* SystemControl */3553/* Picture size */3554 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, /* ClockSelect */3555 {0xa0, 0x03, 0x003a},3556 {0xa0, 0x0c, 0x003b},3557 {0xa0, 0x04, 0x0038},3558 {}3559};3560 3561static const struct usb_action pas106b_InitialScale[] = { /* 176x144 */3562/* JPEG control */3563 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3564/* Sream and Sensor specific */3565 {0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},3566/* Picture size */3567 {0xa0, 0x00, ZC3XX_R003_FRAMEWIDTHHIGH},3568 {0xa0, 0xb0, ZC3XX_R004_FRAMEWIDTHLOW},3569 {0xa0, 0x00, ZC3XX_R005_FRAMEHEIGHTHIGH},3570 {0xa0, 0x90, ZC3XX_R006_FRAMEHEIGHTLOW},3571/* System */3572 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},3573/* Sream and Sensor specific */3574 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},3575 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},3576/* Sensor Interface */3577 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},3578/* Window inside sensor array */3579 {0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},3580 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},3581 {0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},3582 {0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},3583 {0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},3584/* Init the sensor */3585 {0xaa, 0x02, 0x0004},3586 {0xaa, 0x08, 0x0000},3587 {0xaa, 0x09, 0x0005},3588 {0xaa, 0x0a, 0x0002},3589 {0xaa, 0x0b, 0x0002},3590 {0xaa, 0x0c, 0x0005},3591 {0xaa, 0x0d, 0x0000},3592 {0xaa, 0x0e, 0x0002},3593 {0xaa, 0x14, 0x0081},3594/* Other registers */3595 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},3596/* Frame retrieving */3597 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},3598/* Gains */3599 {0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},3600/* Unknown */3601 {0xa0, 0x00, 0x01ad},3602/* Sharpness */3603 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},3604 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},3605/* Other registers */3606 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3607/* Auto exposure and white balance */3608 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3609/*Dead pixels */3610 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3611/* EEPROM */3612 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3613/* JPEG control */3614 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3615 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},3616 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},3617/* Other registers */3618 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3619/* Auto exposure and white balance */3620 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3621/*Dead pixels */3622 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3623/* EEPROM */3624 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3625/* JPEG control */3626 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3627 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},3628 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},3629 3630 {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */3631 {0xa0, 0xf4, ZC3XX_R10B_RGB01},3632 {0xa0, 0xf4, ZC3XX_R10C_RGB02},3633 {0xa0, 0xf4, ZC3XX_R10D_RGB10},3634 {0xa0, 0x58, ZC3XX_R10E_RGB11},3635 {0xa0, 0xf4, ZC3XX_R10F_RGB12},3636 {0xa0, 0xf4, ZC3XX_R110_RGB20},3637 {0xa0, 0xf4, ZC3XX_R111_RGB21},3638 {0xa0, 0x58, ZC3XX_R112_RGB22},3639/* Auto correction */3640 {0xa0, 0x03, ZC3XX_R181_WINXSTART},3641 {0xa0, 0x08, ZC3XX_R182_WINXWIDTH},3642 {0xa0, 0x16, ZC3XX_R183_WINXCENTER},3643 {0xa0, 0x03, ZC3XX_R184_WINYSTART},3644 {0xa0, 0x05, ZC3XX_R185_WINYWIDTH},3645 {0xa0, 0x14, ZC3XX_R186_WINYCENTER},3646 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},3647/* Auto exposure and white balance */3648 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},3649 {0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},3650 {0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},3651 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},3652 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},3653 {0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},3654 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},3655 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},3656/* sensor on */3657 {0xaa, 0x07, 0x00b1},3658 {0xaa, 0x05, 0x0003},3659 {0xaa, 0x04, 0x0001},3660 {0xaa, 0x03, 0x003b},3661/* Gains */3662 {0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},3663 {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},3664 {0xa0, 0xa0, ZC3XX_R11D_GLOBALGAIN},3665 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},3666/* Auto correction */3667 {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},3668 {0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */3669 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},3670/* Gains */3671 {0xa0, 0x40, ZC3XX_R116_RGAIN},3672 {0xa0, 0x40, ZC3XX_R117_GGAIN},3673 {0xa0, 0x40, ZC3XX_R118_BGAIN},3674 {}3675};3676 3677static const struct usb_action pas106b_Initial[] = { /* 352x288 */3678/* JPEG control */3679 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3680/* Sream and Sensor specific */3681 {0xa0, 0x0f, ZC3XX_R010_CMOSSENSORSELECT},3682/* Picture size */3683 {0xa0, 0x01, ZC3XX_R003_FRAMEWIDTHHIGH},3684 {0xa0, 0x60, ZC3XX_R004_FRAMEWIDTHLOW},3685 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},3686 {0xa0, 0x20, ZC3XX_R006_FRAMEHEIGHTLOW},3687/* System */3688 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},3689/* Sream and Sensor specific */3690 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC},3691 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},3692/* Sensor Interface */3693 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE},3694/* Window inside sensor array */3695 {0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW},3696 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},3697 {0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW},3698 {0xa0, 0x28, ZC3XX_R09C_WINHEIGHTLOW},3699 {0xa0, 0x68, ZC3XX_R09E_WINWIDTHLOW},3700/* Init the sensor */3701 {0xaa, 0x02, 0x0004},3702 {0xaa, 0x08, 0x0000},3703 {0xaa, 0x09, 0x0005},3704 {0xaa, 0x0a, 0x0002},3705 {0xaa, 0x0b, 0x0002},3706 {0xaa, 0x0c, 0x0005},3707 {0xaa, 0x0d, 0x0000},3708 {0xaa, 0x0e, 0x0002},3709 {0xaa, 0x14, 0x0081},3710/* Other registers */3711 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},3712/* Frame retrieving */3713 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},3714/* Gains */3715 {0xa0, 0xa0, ZC3XX_R1A8_DIGITALGAIN},3716/* Unknown */3717 {0xa0, 0x00, 0x01ad},3718/* Sharpness */3719 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},3720 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},3721/* Other registers */3722 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3723/* Auto exposure and white balance */3724 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3725 {0xa0, 0x80, ZC3XX_R18D_YTARGET},3726/*Dead pixels */3727 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3728/* EEPROM */3729 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3730/* JPEG control */3731 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3732 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},3733 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},3734/* Other registers */3735 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},3736/* Auto exposure and white balance */3737 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},3738/*Dead pixels */3739 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},3740/* EEPROM */3741 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},3742/* JPEG control */3743 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3744 {0xa0, 0x08, ZC3XX_R1C6_SHARPNESS00},3745 {0xa0, 0x0f, ZC3XX_R1CB_SHARPNESS05},3746 3747 {0xa0, 0x58, ZC3XX_R10A_RGB00}, /* matrix */3748 {0xa0, 0xf4, ZC3XX_R10B_RGB01},3749 {0xa0, 0xf4, ZC3XX_R10C_RGB02},3750 {0xa0, 0xf4, ZC3XX_R10D_RGB10},3751 {0xa0, 0x58, ZC3XX_R10E_RGB11},3752 {0xa0, 0xf4, ZC3XX_R10F_RGB12},3753 {0xa0, 0xf4, ZC3XX_R110_RGB20},3754 {0xa0, 0xf4, ZC3XX_R111_RGB21},3755 {0xa0, 0x58, ZC3XX_R112_RGB22},3756/* Auto correction */3757 {0xa0, 0x03, ZC3XX_R181_WINXSTART},3758 {0xa0, 0x08, ZC3XX_R182_WINXWIDTH},3759 {0xa0, 0x16, ZC3XX_R183_WINXCENTER},3760 {0xa0, 0x03, ZC3XX_R184_WINYSTART},3761 {0xa0, 0x05, ZC3XX_R185_WINYWIDTH},3762 {0xa0, 0x14, ZC3XX_R186_WINYCENTER},3763 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},3764 3765/* Auto exposure and white balance */3766 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},3767 {0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},3768 {0xa0, 0xb1, ZC3XX_R192_EXPOSURELIMITLOW},3769 3770 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},3771 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},3772 {0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW},3773 3774 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},3775 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},3776/* sensor on */3777 {0xaa, 0x07, 0x00b1},3778 {0xaa, 0x05, 0x0003},3779 {0xaa, 0x04, 0x0001},3780 {0xaa, 0x03, 0x003b},3781/* Gains */3782 {0xa0, 0x20, ZC3XX_R1A9_DIGITALLIMITDIFF},3783 {0xa0, 0x26, ZC3XX_R1AA_DIGITALGAINSTEP},3784 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},3785/* Auto correction */3786 {0xa0, 0x40, ZC3XX_R180_AUTOCORRECTENABLE},3787 {0xa1, 0x01, 0x0180}, /* AutoCorrectEnable */3788 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},3789/* Gains */3790 {0xa0, 0x40, ZC3XX_R116_RGAIN},3791 {0xa0, 0x40, ZC3XX_R117_GGAIN},3792 {0xa0, 0x40, ZC3XX_R118_BGAIN},3793 3794 {0xa0, 0x00, 0x0007}, /* AutoCorrectEnable */3795 {0xa0, 0xff, ZC3XX_R018_FRAMELOST}, /* Frame adjust */3796 {}3797};3798static const struct usb_action pas106b_50HZ[] = {3799 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3800 {0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */3801 {0xa0, 0x54, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,54,cc */3802 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3803 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3804 {0xa0, 0x87, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,87,cc */3805 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */3806 {0xa0, 0x30, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,30,cc */3807 {0xaa, 0x03, 0x0021}, /* 00,03,21,aa */3808 {0xaa, 0x04, 0x000c}, /* 00,04,0c,aa */3809 {0xaa, 0x05, 0x0002}, /* 00,05,02,aa */3810 {0xaa, 0x07, 0x001c}, /* 00,07,1c,aa */3811 {0xa0, 0x04, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,04,cc */3812 {}3813};3814static const struct usb_action pas106b_60HZ[] = {3815 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3816 {0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */3817 {0xa0, 0x2e, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,2e,cc */3818 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3819 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3820 {0xa0, 0x71, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,71,cc */3821 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */3822 {0xa0, 0x30, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,30,cc */3823 {0xaa, 0x03, 0x001c}, /* 00,03,1c,aa */3824 {0xaa, 0x04, 0x0004}, /* 00,04,04,aa */3825 {0xaa, 0x05, 0x0001}, /* 00,05,01,aa */3826 {0xaa, 0x07, 0x00c4}, /* 00,07,c4,aa */3827 {0xa0, 0x04, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,04,cc */3828 {}3829};3830static const struct usb_action pas106b_NoFlicker[] = {3831 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3832 {0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,06,cc */3833 {0xa0, 0x50, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,50,cc */3834 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3835 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3836 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc */3837 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */3838 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */3839 {0xaa, 0x03, 0x0013}, /* 00,03,13,aa */3840 {0xaa, 0x04, 0x0000}, /* 00,04,00,aa */3841 {0xaa, 0x05, 0x0001}, /* 00,05,01,aa */3842 {0xaa, 0x07, 0x0030}, /* 00,07,30,aa */3843 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */3844 {}3845};3846 3847/* from lvWIMv.inf 046d:08a2/:08aa 2007/06/03 */3848static const struct usb_action pas202b_Initial[] = { /* 640x480 */3849 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */3850 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3851 {0xa0, 0x0e, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0e,cc */3852 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, /* 00,02,00,cc */3853 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */3854 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */3855 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */3856 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */3857 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */3858 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */3859 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */3860 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */3861 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */3862 {0xa0, 0x03, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,03,cc */3863 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */3864 {0xa0, 0x03, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,03,cc */3865 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */3866 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e6,cc */3867 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */3868 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */3869 {0xaa, 0x02, 0x0002}, /* 00,02,04,aa --> 02 */3870 {0xaa, 0x07, 0x0006}, /* 00,07,06,aa */3871 {0xaa, 0x08, 0x0002}, /* 00,08,02,aa */3872 {0xaa, 0x09, 0x0006}, /* 00,09,06,aa */3873 {0xaa, 0x0a, 0x0001}, /* 00,0a,01,aa */3874 {0xaa, 0x0b, 0x0001}, /* 00,0b,01,aa */3875 {0xaa, 0x0c, 0x0006},3876 {0xaa, 0x0d, 0x0000}, /* 00,0d,00,aa */3877 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */3878 {0xaa, 0x12, 0x0005}, /* 00,12,05,aa */3879 {0xaa, 0x13, 0x0063}, /* 00,13,63,aa */3880 {0xaa, 0x15, 0x0070}, /* 00,15,70,aa */3881 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,b7,cc */3882 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */3883 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */3884 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */3885 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */3886 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */3887 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */3888 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */3889 {0xa0, 0x70, ZC3XX_R18D_YTARGET}, /* 01,8d,70,cc */3890 {}3891};3892static const struct usb_action pas202b_InitialScale[] = { /* 320x240 */3893 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */3894 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},3895 {0xa0, 0x0e, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,0e,cc */3896 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */3897 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */3898 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */3899 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */3900 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},3901 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */3902 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */3903 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */3904 {0xa0, 0x08, ZC3XX_R08D_COMPABILITYMODE}, /* 00,8d,08,cc */3905 {0xa0, 0x08, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,08,cc */3906 {0xa0, 0x02, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,02,cc */3907 {0xa0, 0x08, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,08,cc */3908 {0xa0, 0x02, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,02,cc */3909 {0xa0, 0x01, ZC3XX_R09B_WINHEIGHTHIGH}, /* 00,9b,01,cc */3910 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},3911 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH}, /* 00,9d,02,cc */3912 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */3913 {0xaa, 0x02, 0x0002}, /* 00,02,02,aa */3914 {0xaa, 0x07, 0x0006}, /* 00,07,06,aa */3915 {0xaa, 0x08, 0x0002}, /* 00,08,02,aa */3916 {0xaa, 0x09, 0x0006}, /* 00,09,06,aa */3917 {0xaa, 0x0a, 0x0001}, /* 00,0a,01,aa */3918 {0xaa, 0x0b, 0x0001}, /* 00,0b,01,aa */3919 {0xaa, 0x0c, 0x0006},3920 {0xaa, 0x0d, 0x0000}, /* 00,0d,00,aa */3921 {0xaa, 0x10, 0x0000}, /* 00,10,00,aa */3922 {0xaa, 0x12, 0x0005}, /* 00,12,05,aa */3923 {0xaa, 0x13, 0x0063}, /* 00,13,63,aa */3924 {0xaa, 0x15, 0x0070}, /* 00,15,70,aa */3925 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,37,cc */3926 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */3927 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */3928 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */3929 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */3930 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */3931 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */3932 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */3933 {0xa0, 0x70, ZC3XX_R18D_YTARGET}, /* 01,8d,70,cc */3934 {0xa0, 0xff, ZC3XX_R097_WINYSTARTHIGH},3935 {0xa0, 0xfe, ZC3XX_R098_WINYSTARTLOW},3936 {}3937};3938static const struct usb_action pas202b_50HZ[] = {3939 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */3940 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */3941 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */3942 {0xaa, 0x20, 0x0002}, /* 00,20,02,aa */3943 {0xaa, 0x21, 0x001b},3944 {0xaa, 0x03, 0x0044}, /* 00,03,44,aa */3945 {0xaa, 0x04, 0x0008},3946 {0xaa, 0x05, 0x001b},3947 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */3948 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */3949 {0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},3950 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */3951 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3952 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},3953 {0xa0, 0x1b, ZC3XX_R192_EXPOSURELIMITLOW},3954 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3955 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3956 {0xa0, 0x4d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,4d,cc */3957 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},3958 {0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},3959 {0xa0, 0x44, ZC3XX_R01D_HSYNC_0}, /* 00,1d,44,cc */3960 {0xa0, 0x6f, ZC3XX_R01E_HSYNC_1}, /* 00,1e,6f,cc */3961 {0xa0, 0xad, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ad,cc */3962 {0xa0, 0xeb, ZC3XX_R020_HSYNC_3}, /* 00,20,eb,cc */3963 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */3964 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */3965 {}3966};3967static const struct usb_action pas202b_50HZScale[] = {3968 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */3969 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */3970 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */3971 {0xaa, 0x20, 0x0004},3972 {0xaa, 0x21, 0x003d},3973 {0xaa, 0x03, 0x0041}, /* 00,03,41,aa */3974 {0xaa, 0x04, 0x0010},3975 {0xaa, 0x05, 0x003d},3976 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */3977 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */3978 {0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},3979 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */3980 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */3981 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},3982 {0xa0, 0x3d, ZC3XX_R192_EXPOSURELIMITLOW},3983 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */3984 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */3985 {0xa0, 0x9b, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,9b,cc */3986 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},3987 {0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},3988 {0xa0, 0x41, ZC3XX_R01D_HSYNC_0}, /* 00,1d,41,cc */3989 {0xa0, 0x6f, ZC3XX_R01E_HSYNC_1}, /* 00,1e,6f,cc */3990 {0xa0, 0xad, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ad,cc */3991 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */3992 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */3993 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */3994 {}3995};3996static const struct usb_action pas202b_60HZ[] = {3997 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */3998 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */3999 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */4000 {0xaa, 0x20, 0x0002}, /* 00,20,02,aa */4001 {0xaa, 0x21, 0x0000}, /* 00,21,00,aa */4002 {0xaa, 0x03, 0x0045}, /* 00,03,45,aa */4003 {0xaa, 0x04, 0x0008}, /* 00,04,08,aa */4004 {0xaa, 0x05, 0x0000}, /* 00,05,00,aa */4005 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */4006 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */4007 {0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},4008 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */4009 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */4010 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},4011 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},4012 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */4013 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */4014 {0xa0, 0x40, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,40,cc */4015 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4016 {0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},4017 {0xa0, 0x45, ZC3XX_R01D_HSYNC_0}, /* 00,1d,45,cc */4018 {0xa0, 0x8e, ZC3XX_R01E_HSYNC_1}, /* 00,1e,8e,cc */4019 {0xa0, 0xc1, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c1,cc */4020 {0xa0, 0xf5, ZC3XX_R020_HSYNC_3}, /* 00,20,f5,cc */4021 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */4022 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */4023 {}4024};4025static const struct usb_action pas202b_60HZScale[] = {4026 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */4027 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */4028 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */4029 {0xaa, 0x20, 0x0004},4030 {0xaa, 0x21, 0x0008},4031 {0xaa, 0x03, 0x0042}, /* 00,03,42,aa */4032 {0xaa, 0x04, 0x0010},4033 {0xaa, 0x05, 0x0008},4034 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */4035 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */4036 {0xa0, 0x1c, ZC3XX_R1A9_DIGITALLIMITDIFF},4037 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc */4038 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */4039 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},4040 {0xa0, 0x08, ZC3XX_R192_EXPOSURELIMITLOW},4041 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */4042 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */4043 {0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,81,cc */4044 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4045 {0xa0, 0x1b, ZC3XX_R18F_AEUNFREEZE},4046 {0xa0, 0x42, ZC3XX_R01D_HSYNC_0}, /* 00,1d,42,cc */4047 {0xa0, 0x6f, ZC3XX_R01E_HSYNC_1}, /* 00,1e,6f,cc */4048 {0xa0, 0xaf, ZC3XX_R01F_HSYNC_2}, /* 00,1f,af,cc */4049 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */4050 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */4051 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */4052 {}4053};4054static const struct usb_action pas202b_NoFlicker[] = {4055 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */4056 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */4057 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */4058 {0xaa, 0x20, 0x0002}, /* 00,20,02,aa */4059 {0xaa, 0x21, 0x0006},4060 {0xaa, 0x03, 0x0040}, /* 00,03,40,aa */4061 {0xaa, 0x04, 0x0008}, /* 00,04,08,aa */4062 {0xaa, 0x05, 0x0006},4063 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */4064 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */4065 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */4066 {0xa0, 0x02, ZC3XX_R191_EXPOSURELIMITMID},4067 {0xa0, 0x06, ZC3XX_R192_EXPOSURELIMITLOW},4068 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */4069 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */4070 {0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},4071 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */4072 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */4073 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */4074 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4075 {0xa0, 0x40, ZC3XX_R01D_HSYNC_0}, /* 00,1d,40,cc */4076 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1}, /* 00,1e,60,cc */4077 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2}, /* 00,1f,90,cc */4078 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */4079 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */4080 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */4081 {}4082};4083static const struct usb_action pas202b_NoFlickerScale[] = {4084 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */4085 {0xa0, 0x20, ZC3XX_R087_EXPTIMEMID}, /* 00,87,20,cc */4086 {0xa0, 0x21, ZC3XX_R088_EXPTIMELOW}, /* 00,88,21,cc */4087 {0xaa, 0x20, 0x0004},4088 {0xaa, 0x21, 0x000c},4089 {0xaa, 0x03, 0x0040}, /* 00,03,40,aa */4090 {0xaa, 0x04, 0x0010},4091 {0xaa, 0x05, 0x000c},4092 {0xaa, 0x0e, 0x0001}, /* 00,0e,01,aa */4093 {0xaa, 0x0f, 0x0000}, /* 00,0f,00,aa */4094 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */4095 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},4096 {0xa0, 0x0c, ZC3XX_R192_EXPOSURELIMITLOW},4097 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */4098 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */4099 {0xa0, 0x02, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,02,cc */4100 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE}, /* 01,8c,10,cc */4101 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,20,cc */4102 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */4103 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4104 {0xa0, 0x40, ZC3XX_R01D_HSYNC_0}, /* 00,1d,40,cc */4105 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1}, /* 00,1e,60,cc */4106 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2}, /* 00,1f,90,cc */4107 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */4108 {0xa0, 0x0f, ZC3XX_R087_EXPTIMEMID}, /* 00,87,0f,cc */4109 {0xa0, 0x0e, ZC3XX_R088_EXPTIMELOW}, /* 00,88,0e,cc */4110 {}4111};4112 4113/* mt9v111 (mi0360soc) and pb0330 from vm30x.inf 0ac8:301b 07/02/13 */4114static const struct usb_action mt9v111_1_Initial[] = { /* 640x480 */4115 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4116 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},4117 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4118 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},4119 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4120 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4121 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4122 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4123 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4124 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4125 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4126 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4127 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4128 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4129 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4130 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4131 {0xdd, 0x00, 0x0200},4132 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4133 {0xaa, 0x01, 0x0001},4134 {0xaa, 0x06, 0x0000},4135 {0xaa, 0x08, 0x0483},4136 {0xaa, 0x01, 0x0004},4137 {0xaa, 0x08, 0x0006},4138 {0xaa, 0x02, 0x0011},4139 {0xaa, 0x03, 0x01e5}, /*jfm: was 01e7*/4140 {0xaa, 0x04, 0x0285}, /*jfm: was 0287*/4141 {0xaa, 0x07, 0x3002},4142 {0xaa, 0x20, 0x5100},4143 {0xaa, 0x35, 0x507f},4144 {0xaa, 0x30, 0x0005},4145 {0xaa, 0x31, 0x0000},4146 {0xaa, 0x58, 0x0078},4147 {0xaa, 0x62, 0x0411},4148 {0xaa, 0x2b, 0x007f},4149 {0xaa, 0x2c, 0x007f}, /*jfm: was 0030*/4150 {0xaa, 0x2d, 0x007f}, /*jfm: was 0030*/4151 {0xaa, 0x2e, 0x007f}, /*jfm: was 0030*/4152 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4153 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},4154 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4155 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4156 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4157 {0xa0, 0x09, 0x01ad}, /*jfm: was 00*/4158 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4159 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4160 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4161 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4162 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4163 {0xa0, 0x6c, ZC3XX_R18D_YTARGET},4164 {0xa0, 0x61, ZC3XX_R116_RGAIN},4165 {0xa0, 0x65, ZC3XX_R118_BGAIN},4166 {}4167};4168static const struct usb_action mt9v111_1_InitialScale[] = { /* 320x240 */4169 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4170 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},4171 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4172 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},4173 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4174 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4175 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4176 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4177 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4178 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4179 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4180 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4181 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4182 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4183 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4184 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4185 {0xdd, 0x00, 0x0200},4186 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4187 {0xaa, 0x01, 0x0001},4188 {0xaa, 0x06, 0x0000},4189 {0xaa, 0x08, 0x0483},4190 {0xaa, 0x01, 0x0004},4191 {0xaa, 0x08, 0x0006},4192 {0xaa, 0x02, 0x0011},4193 {0xaa, 0x03, 0x01e7},4194 {0xaa, 0x04, 0x0287},4195 {0xaa, 0x07, 0x3002},4196 {0xaa, 0x20, 0x5100},4197 {0xaa, 0x35, 0x007f}, /*jfm: was 0050*/4198 {0xaa, 0x30, 0x0005},4199 {0xaa, 0x31, 0x0000},4200 {0xaa, 0x58, 0x0078},4201 {0xaa, 0x62, 0x0411},4202 {0xaa, 0x2b, 0x007f}, /*jfm: was 28*/4203 {0xaa, 0x2c, 0x007f}, /*jfm: was 30*/4204 {0xaa, 0x2d, 0x007f}, /*jfm: was 30*/4205 {0xaa, 0x2e, 0x007f}, /*jfm: was 28*/4206 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4207 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION},4208 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4209 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4210 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4211 {0xa0, 0x09, 0x01ad}, /*jfm: was 00*/4212 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4213 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4214 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4215 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4216 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4217 {0xa0, 0x6c, ZC3XX_R18D_YTARGET},4218 {0xa0, 0x61, ZC3XX_R116_RGAIN},4219 {0xa0, 0x65, ZC3XX_R118_BGAIN},4220 {}4221};4222static const struct usb_action mt9v111_1_AE50HZ[] = {4223 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4224 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4225 {0xbb, 0x00, 0x0562},4226 {0xbb, 0x01, 0x09aa},4227 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4228 {0xa0, 0x03, ZC3XX_R191_EXPOSURELIMITMID},4229 {0xa0, 0x9b, ZC3XX_R192_EXPOSURELIMITLOW},4230 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4231 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4232 {0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW},4233 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4234 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4235 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4236 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4237 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0},4238 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1},4239 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},4240 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4241 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4242 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4243 {}4244};4245static const struct usb_action mt9v111_1_AE50HZScale[] = {4246 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4247 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4248 {0xbb, 0x00, 0x0509},4249 {0xbb, 0x01, 0x0934},4250 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4251 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4252 {0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},4253 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4254 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4255 {0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},4256 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4257 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4258 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4259 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4260 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4261 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4262 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4263 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4264 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4265 {}4266};4267static const struct usb_action mt9v111_1_AE60HZ[] = {4268 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4269 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4270 {0xaa, 0x05, 0x003d},4271 {0xaa, 0x09, 0x016e},4272 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4273 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4274 {0xa0, 0xdd, ZC3XX_R192_EXPOSURELIMITLOW},4275 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4276 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4277 {0xa0, 0x3d, ZC3XX_R197_ANTIFLICKERLOW},4278 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4279 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4280 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4281 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4282 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0},4283 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1},4284 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},4285 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4286 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4287 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4288 {}4289};4290static const struct usb_action mt9v111_1_AE60HZScale[] = {4291 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4292 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4293 {0xbb, 0x00, 0x0509},4294 {0xbb, 0x01, 0x0983},4295 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4296 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4297 {0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},4298 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4299 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4300 {0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},4301 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4302 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4303 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4304 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4305 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4306 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4307 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4308 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4309 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4310 {}4311};4312static const struct usb_action mt9v111_1_AENoFlicker[] = {4313 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4314 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4315 {0xbb, 0x00, 0x0509},4316 {0xbb, 0x01, 0x0960},4317 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4318 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4319 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4320 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4321 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4322 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},4323 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4324 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4325 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4326 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4327 {0xa0, 0x09, ZC3XX_R01D_HSYNC_0},4328 {0xa0, 0x40, ZC3XX_R01E_HSYNC_1},4329 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4330 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4331 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4332 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4333 {}4334};4335static const struct usb_action mt9v111_1_AENoFlickerScale[] = {4336 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4337 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4338 {0xbb, 0x00, 0x0534},4339 {0xbb, 0x02, 0x0960},4340 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4341 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4342 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4343 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4344 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4345 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},4346 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4347 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4348 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4349 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4350 {0xa0, 0x34, ZC3XX_R01D_HSYNC_0},4351 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1},4352 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4353 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4354 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4355 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4356 {}4357};4358/* from usbvm303.inf 0ac8:303b 07/03/25 (3 - tas5130c) */4359static const struct usb_action mt9v111_3_Initial[] = {4360 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4361 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},4362 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4363 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},4364 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4365 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4366 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4367 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4368 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4369 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4370 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4371 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4372 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4373 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4374 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4375 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4376 {0xdd, 0x00, 0x0200},4377 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4378 {0xaa, 0x01, 0x0001}, /* select IFP/SOC registers */4379 {0xaa, 0x06, 0x0000}, /* operating mode control */4380 {0xaa, 0x08, 0x0483}, /* output format control */4381 /* H red first, V red or blue first,4382 * raw Bayer, auto flicker */4383 {0xaa, 0x01, 0x0004}, /* select sensor core registers */4384 {0xaa, 0x08, 0x0006}, /* row start */4385 {0xaa, 0x02, 0x0011}, /* column start */4386 {0xaa, 0x03, 0x01e5}, /* window height - 1 */4387 {0xaa, 0x04, 0x0285}, /* window width - 1 */4388 {0xaa, 0x07, 0x3002}, /* output control */4389 {0xaa, 0x20, 0x1100}, /* read mode: bits 8 & 12 (?) */4390 {0xaa, 0x35, 0x007f}, /* global gain */4391 {0xaa, 0x30, 0x0005},4392 {0xaa, 0x31, 0x0000},4393 {0xaa, 0x58, 0x0078},4394 {0xaa, 0x62, 0x0411},4395 {0xaa, 0x2b, 0x007f}, /* green1 gain */4396 {0xaa, 0x2c, 0x007f}, /* blue gain */4397 {0xaa, 0x2d, 0x007f}, /* red gain */4398 {0xaa, 0x2e, 0x007f}, /* green2 gain */4399 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4400 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},4401 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4402 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4403 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4404 {0xa0, 0x00, 0x01ad},4405 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4406 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4407 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4408 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4409 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4410 {0xa0, 0x80, ZC3XX_R18D_YTARGET},4411 {0xa0, 0x61, ZC3XX_R116_RGAIN},4412 {0xa0, 0x65, ZC3XX_R118_BGAIN},4413 {}4414};4415static const struct usb_action mt9v111_3_InitialScale[] = {4416 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4417 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},4418 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4419 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},4420 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4421 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4422 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4423 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4424 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4425 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4426 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4427 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4428 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4429 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4430 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4431 {0xa0, 0xdc, ZC3XX_R08B_I2CDEVICEADDR},4432 {0xdd, 0x00, 0x0200},4433 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4434 {0xaa, 0x01, 0x0001},4435 {0xaa, 0x06, 0x0000},4436 {0xaa, 0x08, 0x0483},4437 {0xaa, 0x01, 0x0004},4438 {0xaa, 0x08, 0x0006},4439 {0xaa, 0x02, 0x0011},4440 {0xaa, 0x03, 0x01e7},4441 {0xaa, 0x04, 0x0287},4442 {0xaa, 0x07, 0x3002},4443 {0xaa, 0x20, 0x1100},4444 {0xaa, 0x35, 0x007f},4445 {0xaa, 0x30, 0x0005},4446 {0xaa, 0x31, 0x0000},4447 {0xaa, 0x58, 0x0078},4448 {0xaa, 0x62, 0x0411},4449 {0xaa, 0x2b, 0x007f},4450 {0xaa, 0x2c, 0x007f},4451 {0xaa, 0x2d, 0x007f},4452 {0xaa, 0x2e, 0x007f},4453 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4454 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},4455 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4456 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4457 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4458 {0xa0, 0x00, 0x01ad},4459 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4460 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4461 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4462 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4463 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4464 {0xa0, 0x80, ZC3XX_R18D_YTARGET},4465 {0xa0, 0x61, ZC3XX_R116_RGAIN},4466 {0xa0, 0x65, ZC3XX_R118_BGAIN},4467 {}4468};4469static const struct usb_action mt9v111_3_AE50HZ[] = {4470 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4471 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4472 {0xaa, 0x05, 0x0009}, /* horizontal blanking */4473 {0xaa, 0x09, 0x01ce}, /* shutter width */4474 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4475 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4476 {0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},4477 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4478 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4479 {0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},4480 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4481 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4482 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4483 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4484 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4485 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4486 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4487 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4488 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4489 {}4490};4491static const struct usb_action mt9v111_3_AE50HZScale[] = {4492 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4493 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4494 {0xaa, 0x05, 0x0009},4495 {0xaa, 0x09, 0x01ce},4496 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4497 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4498 {0xa0, 0xd2, ZC3XX_R192_EXPOSURELIMITLOW},4499 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4500 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4501 {0xa0, 0x9a, ZC3XX_R197_ANTIFLICKERLOW},4502 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4503 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4504 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4505 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4506 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4507 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4508 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4509 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4510 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4511 {}4512};4513static const struct usb_action mt9v111_3_AE60HZ[] = {4514 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4515 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4516 {0xaa, 0x05, 0x0009},4517 {0xaa, 0x09, 0x0083},4518 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4519 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4520 {0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},4521 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4522 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4523 {0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},4524 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4525 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4526 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4527 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4528 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4529 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4530 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4531 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4532 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4533 {}4534};4535static const struct usb_action mt9v111_3_AE60HZScale[] = {4536 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4537 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4538 {0xaa, 0x05, 0x0009},4539 {0xaa, 0x09, 0x0083},4540 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4541 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4542 {0xa0, 0x8f, ZC3XX_R192_EXPOSURELIMITLOW},4543 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4544 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4545 {0xa0, 0x81, ZC3XX_R197_ANTIFLICKERLOW},4546 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4547 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4548 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4549 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},4550 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4551 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1},4552 {0xa0, 0xf9, ZC3XX_R01F_HSYNC_2},4553 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4554 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4555 {}4556};4557static const struct usb_action mt9v111_3_AENoFlicker[] = {4558 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4559 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4560 {0xaa, 0x05, 0x0034},4561 {0xaa, 0x09, 0x0260},4562 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4563 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4564 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4565 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4566 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4567 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},4568 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4569 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4570 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4571 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4572 {0xa0, 0x34, ZC3XX_R01D_HSYNC_0},4573 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1},4574 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4575 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4576 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4577 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4578 {}4579};4580static const struct usb_action mt9v111_3_AENoFlickerScale[] = {4581 {0xa0, 0x00, ZC3XX_R180_AUTOCORRECTENABLE},4582 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4583 {0xaa, 0x05, 0x0034},4584 {0xaa, 0x09, 0x0260},4585 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4586 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4587 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4588 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4589 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4590 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},4591 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4592 {0xa0, 0x1c, ZC3XX_R18F_AEUNFREEZE},4593 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4594 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4595 {0xa0, 0x34, ZC3XX_R01D_HSYNC_0},4596 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1},4597 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4598 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4599 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4600 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE},4601 {}4602};4603 4604static const struct usb_action pb0330_Initial[] = { /* 640x480 */4605 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4606 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */4607 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4608 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},4609 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4610 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4611 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4612 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4613 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4614 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4615 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4616 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4617 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4618 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4619 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4620 {0xdd, 0x00, 0x0200},4621 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4622 {0xaa, 0x01, 0x0006},4623 {0xaa, 0x02, 0x0011},4624 {0xaa, 0x03, 0x01e5}, /*jfm: was 1e7*/4625 {0xaa, 0x04, 0x0285}, /*jfm: was 0287*/4626 {0xaa, 0x06, 0x0003},4627 {0xaa, 0x07, 0x3002},4628 {0xaa, 0x20, 0x1100},4629 {0xaa, 0x2f, 0xf7b0},4630 {0xaa, 0x30, 0x0005},4631 {0xaa, 0x31, 0x0000},4632 {0xaa, 0x34, 0x0100},4633 {0xaa, 0x35, 0x0060},4634 {0xaa, 0x3d, 0x068f},4635 {0xaa, 0x40, 0x01e0},4636 {0xaa, 0x58, 0x0078},4637 {0xaa, 0x62, 0x0411},4638 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4639 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},4640 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4641 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4642 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4643 {0xa0, 0x09, 0x01ad}, /*jfm: was 00 */4644 {0xa0, 0x15, 0x01ae},4645 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4646 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4647 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4648 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4649 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4650 {0xa0, 0x78, ZC3XX_R18D_YTARGET}, /*jfm: was 6c*/4651 {}4652};4653static const struct usb_action pb0330_InitialScale[] = { /* 320x240 */4654 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},4655 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00 */4656 {0xa0, 0x0a, ZC3XX_R010_CMOSSENSORSELECT},4657 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},4658 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},4659 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},4660 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},4661 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},4662 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},4663 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4664 {0xa0, 0x07, ZC3XX_R012_VIDEOCONTROLFUNC},4665 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW},4666 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW},4667 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW},4668 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW},4669 {0xdd, 0x00, 0x0200},4670 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4671 {0xaa, 0x01, 0x0006},4672 {0xaa, 0x02, 0x0011},4673 {0xaa, 0x03, 0x01e7},4674 {0xaa, 0x04, 0x0287},4675 {0xaa, 0x06, 0x0003},4676 {0xaa, 0x07, 0x3002},4677 {0xaa, 0x20, 0x1100},4678 {0xaa, 0x2f, 0xf7b0},4679 {0xaa, 0x30, 0x0005},4680 {0xaa, 0x31, 0x0000},4681 {0xaa, 0x34, 0x0100},4682 {0xaa, 0x35, 0x0060},4683 {0xaa, 0x3d, 0x068f},4684 {0xaa, 0x40, 0x01e0},4685 {0xaa, 0x58, 0x0078},4686 {0xaa, 0x62, 0x0411},4687 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID},4688 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},4689 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},4690 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},4691 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},4692 {0xa0, 0x09, 0x01ad},4693 {0xa0, 0x15, 0x01ae},4694 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},4695 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},4696 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},4697 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},4698 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN},4699 {0xa0, 0x78, ZC3XX_R18D_YTARGET}, /*jfm: was 6c*/4700 {}4701};4702static const struct usb_action pb0330_50HZ[] = {4703 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4704 {0xbb, 0x00, 0x055c},4705 {0xbb, 0x01, 0x09aa},4706 {0xbb, 0x00, 0x1001},4707 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4708 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4709 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4710 {0xa0, 0xc4, ZC3XX_R192_EXPOSURELIMITLOW},4711 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4712 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4713 {0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW},4714 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4715 {0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},4716 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4717 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4718 {0xa0, 0x5c, ZC3XX_R01D_HSYNC_0},4719 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1},4720 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2},4721 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4722 {}4723};4724static const struct usb_action pb0330_50HZScale[] = {4725 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4726 {0xbb, 0x00, 0x0566},4727 {0xbb, 0x02, 0x09b2},4728 {0xbb, 0x00, 0x1002},4729 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4730 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4731 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4732 {0xa0, 0x8c, ZC3XX_R192_EXPOSURELIMITLOW},4733 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4734 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4735 {0xa0, 0x8a, ZC3XX_R197_ANTIFLICKERLOW},4736 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4737 {0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},4738 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4739 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4740 {0xa0, 0xd7, ZC3XX_R01D_HSYNC_0},4741 {0xa0, 0xf0, ZC3XX_R01E_HSYNC_1},4742 {0xa0, 0xf8, ZC3XX_R01F_HSYNC_2},4743 {0xa0, 0xff, ZC3XX_R020_HSYNC_3},4744 {}4745};4746static const struct usb_action pb0330_60HZ[] = {4747 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4748 {0xbb, 0x00, 0x0535},4749 {0xbb, 0x01, 0x0974},4750 {0xbb, 0x00, 0x1001},4751 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4752 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4753 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4754 {0xa0, 0xfe, ZC3XX_R192_EXPOSURELIMITLOW},4755 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4756 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4757 {0xa0, 0x3e, ZC3XX_R197_ANTIFLICKERLOW},4758 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4759 {0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},4760 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4761 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4762 {0xa0, 0x35, ZC3XX_R01D_HSYNC_0},4763 {0xa0, 0x50, ZC3XX_R01E_HSYNC_1},4764 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4765 {0xa0, 0xd0, ZC3XX_R020_HSYNC_3},4766 {}4767};4768static const struct usb_action pb0330_60HZScale[] = {4769 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4770 {0xbb, 0x00, 0x0535},4771 {0xbb, 0x02, 0x096c},4772 {0xbb, 0x00, 0x1002},4773 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4774 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4775 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4776 {0xa0, 0xc0, ZC3XX_R192_EXPOSURELIMITLOW},4777 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4778 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4779 {0xa0, 0x7c, ZC3XX_R197_ANTIFLICKERLOW},4780 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE},4781 {0xa0, 0x1a, ZC3XX_R18F_AEUNFREEZE},4782 {0xa0, 0x14, ZC3XX_R1A9_DIGITALLIMITDIFF},4783 {0xa0, 0x66, ZC3XX_R1AA_DIGITALGAINSTEP},4784 {0xa0, 0x35, ZC3XX_R01D_HSYNC_0},4785 {0xa0, 0x50, ZC3XX_R01E_HSYNC_1},4786 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4787 {0xa0, 0xd0, ZC3XX_R020_HSYNC_3},4788 {}4789};4790static const struct usb_action pb0330_NoFlicker[] = {4791 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4792 {0xbb, 0x00, 0x0509},4793 {0xbb, 0x02, 0x0940},4794 {0xbb, 0x00, 0x1002},4795 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4796 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4797 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4798 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4799 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4800 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4801 {0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},4802 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},4803 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},4804 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4805 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4806 {0xa0, 0x09, ZC3XX_R01D_HSYNC_0},4807 {0xa0, 0x40, ZC3XX_R01E_HSYNC_1},4808 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4809 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4810 {}4811};4812static const struct usb_action pb0330_NoFlickerScale[] = {4813 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS},4814 {0xbb, 0x00, 0x0535},4815 {0xbb, 0x01, 0x0980},4816 {0xbb, 0x00, 0x1001},4817 {0xa0, 0x60, ZC3XX_R11D_GLOBALGAIN},4818 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH},4819 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},4820 {0xa0, 0xf0, ZC3XX_R192_EXPOSURELIMITLOW},4821 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},4822 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},4823 {0xa0, 0x01, ZC3XX_R197_ANTIFLICKERLOW},4824 {0xa0, 0x10, ZC3XX_R18C_AEFREEZE},4825 {0xa0, 0x20, ZC3XX_R18F_AEUNFREEZE},4826 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF},4827 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP},4828 {0xa0, 0x35, ZC3XX_R01D_HSYNC_0},4829 {0xa0, 0x60, ZC3XX_R01E_HSYNC_1},4830 {0xa0, 0x90, ZC3XX_R01F_HSYNC_2},4831 {0xa0, 0xe0, ZC3XX_R020_HSYNC_3},4832 {}4833};4834 4835/* from oem9.inf */4836static const struct usb_action po2030_Initial[] = { /* 640x480 */4837 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */4838 {0xa0, 0x04, ZC3XX_R002_CLOCKSELECT}, /* 00,02,04,cc */4839 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */4840 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */4841 {0xa0, 0x04, ZC3XX_R080_HBLANKHIGH}, /* 00,80,04,cc */4842 {0xa0, 0x05, ZC3XX_R081_HBLANKLOW}, /* 00,81,05,cc */4843 {0xa0, 0x16, ZC3XX_R083_RGAINADDR}, /* 00,83,16,cc */4844 {0xa0, 0x18, ZC3XX_R085_BGAINADDR}, /* 00,85,18,cc */4845 {0xa0, 0x1a, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,1a,cc */4846 {0xa0, 0x1b, ZC3XX_R087_EXPTIMEMID}, /* 00,87,1b,cc */4847 {0xa0, 0x1c, ZC3XX_R088_EXPTIMELOW}, /* 00,88,1c,cc */4848 {0xa0, 0xee, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,ee,cc */4849 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */4850 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */4851 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */4852 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */4853 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */4854 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */4855 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */4856 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */4857 {0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */4858 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */4859 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */4860 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */4861 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */4862 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e6,cc */4863 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc */4864 {0xaa, 0x09, 0x00ce}, /* 00,09,ce,aa */4865 {0xaa, 0x0b, 0x0005}, /* 00,0b,05,aa */4866 {0xaa, 0x0d, 0x0054}, /* 00,0d,54,aa */4867 {0xaa, 0x0f, 0x00eb}, /* 00,0f,eb,aa */4868 {0xaa, 0x87, 0x0000}, /* 00,87,00,aa */4869 {0xaa, 0x88, 0x0004}, /* 00,88,04,aa */4870 {0xaa, 0x89, 0x0000}, /* 00,89,00,aa */4871 {0xaa, 0x8a, 0x0005}, /* 00,8a,05,aa */4872 {0xaa, 0x13, 0x0003}, /* 00,13,03,aa */4873 {0xaa, 0x16, 0x0040}, /* 00,16,40,aa */4874 {0xaa, 0x18, 0x0040}, /* 00,18,40,aa */4875 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */4876 {0xaa, 0x29, 0x00e8}, /* 00,29,e8,aa */4877 {0xaa, 0x45, 0x0045}, /* 00,45,45,aa */4878 {0xaa, 0x50, 0x00ed}, /* 00,50,ed,aa */4879 {0xaa, 0x51, 0x0025}, /* 00,51,25,aa */4880 {0xaa, 0x52, 0x0042}, /* 00,52,42,aa */4881 {0xaa, 0x53, 0x002f}, /* 00,53,2f,aa */4882 {0xaa, 0x79, 0x0025}, /* 00,79,25,aa */4883 {0xaa, 0x7b, 0x0000}, /* 00,7b,00,aa */4884 {0xaa, 0x7e, 0x0025}, /* 00,7e,25,aa */4885 {0xaa, 0x7f, 0x0025}, /* 00,7f,25,aa */4886 {0xaa, 0x21, 0x0000}, /* 00,21,00,aa */4887 {0xaa, 0x33, 0x0036}, /* 00,33,36,aa */4888 {0xaa, 0x36, 0x0060}, /* 00,36,60,aa */4889 {0xaa, 0x37, 0x0008}, /* 00,37,08,aa */4890 {0xaa, 0x3b, 0x0031}, /* 00,3b,31,aa */4891 {0xaa, 0x44, 0x000f}, /* 00,44,0f,aa */4892 {0xaa, 0x58, 0x0002}, /* 00,58,02,aa */4893 {0xaa, 0x66, 0x00c0}, /* 00,66,c0,aa */4894 {0xaa, 0x67, 0x0044}, /* 00,67,44,aa */4895 {0xaa, 0x6b, 0x00a0}, /* 00,6b,a0,aa */4896 {0xaa, 0x6c, 0x0054}, /* 00,6c,54,aa */4897 {0xaa, 0xd6, 0x0007}, /* 00,d6,07,aa */4898 {0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,f7,cc */4899 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */4900 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */4901 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */4902 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */4903 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */4904 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */4905 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */4906 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */4907 {0xa0, 0x7a, ZC3XX_R116_RGAIN}, /* 01,16,7a,cc */4908 {0xa0, 0x4a, ZC3XX_R118_BGAIN}, /* 01,18,4a,cc */4909 {}4910};4911 4912/* from oem9.inf */4913static const struct usb_action po2030_InitialScale[] = { /* 320x240 */4914 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc */4915 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, /* 00,02,10,cc */4916 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc */4917 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc */4918 {0xa0, 0x04, ZC3XX_R080_HBLANKHIGH}, /* 00,80,04,cc */4919 {0xa0, 0x05, ZC3XX_R081_HBLANKLOW}, /* 00,81,05,cc */4920 {0xa0, 0x16, ZC3XX_R083_RGAINADDR}, /* 00,83,16,cc */4921 {0xa0, 0x18, ZC3XX_R085_BGAINADDR}, /* 00,85,18,cc */4922 {0xa0, 0x1a, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,1a,cc */4923 {0xa0, 0x1b, ZC3XX_R087_EXPTIMEMID}, /* 00,87,1b,cc */4924 {0xa0, 0x1c, ZC3XX_R088_EXPTIMELOW}, /* 00,88,1c,cc */4925 {0xa0, 0xee, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,ee,cc */4926 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING}, /* 00,08,03,cc */4927 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc */4928 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc */4929 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc */4930 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc */4931 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc */4932 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc */4933 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */4934 {0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */4935 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc */4936 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc */4937 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc */4938 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc */4939 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e8,cc */4940 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc */4941 {0xaa, 0x09, 0x00cc}, /* 00,09,cc,aa */4942 {0xaa, 0x0b, 0x0005}, /* 00,0b,05,aa */4943 {0xaa, 0x0d, 0x0058}, /* 00,0d,58,aa */4944 {0xaa, 0x0f, 0x00ed}, /* 00,0f,ed,aa */4945 {0xaa, 0x87, 0x0000}, /* 00,87,00,aa */4946 {0xaa, 0x88, 0x0004}, /* 00,88,04,aa */4947 {0xaa, 0x89, 0x0000}, /* 00,89,00,aa */4948 {0xaa, 0x8a, 0x0005}, /* 00,8a,05,aa */4949 {0xaa, 0x13, 0x0003}, /* 00,13,03,aa */4950 {0xaa, 0x16, 0x0040}, /* 00,16,40,aa */4951 {0xaa, 0x18, 0x0040}, /* 00,18,40,aa */4952 {0xaa, 0x1d, 0x0002}, /* 00,1d,02,aa */4953 {0xaa, 0x29, 0x00e8}, /* 00,29,e8,aa */4954 {0xaa, 0x45, 0x0045}, /* 00,45,45,aa */4955 {0xaa, 0x50, 0x00ed}, /* 00,50,ed,aa */4956 {0xaa, 0x51, 0x0025}, /* 00,51,25,aa */4957 {0xaa, 0x52, 0x0042}, /* 00,52,42,aa */4958 {0xaa, 0x53, 0x002f}, /* 00,53,2f,aa */4959 {0xaa, 0x79, 0x0025}, /* 00,79,25,aa */4960 {0xaa, 0x7b, 0x0000}, /* 00,7b,00,aa */4961 {0xaa, 0x7e, 0x0025}, /* 00,7e,25,aa */4962 {0xaa, 0x7f, 0x0025}, /* 00,7f,25,aa */4963 {0xaa, 0x21, 0x0000}, /* 00,21,00,aa */4964 {0xaa, 0x33, 0x0036}, /* 00,33,36,aa */4965 {0xaa, 0x36, 0x0060}, /* 00,36,60,aa */4966 {0xaa, 0x37, 0x0008}, /* 00,37,08,aa */4967 {0xaa, 0x3b, 0x0031}, /* 00,3b,31,aa */4968 {0xaa, 0x44, 0x000f}, /* 00,44,0f,aa */4969 {0xaa, 0x58, 0x0002}, /* 00,58,02,aa */4970 {0xaa, 0x66, 0x00c0}, /* 00,66,c0,aa */4971 {0xaa, 0x67, 0x0044}, /* 00,67,44,aa */4972 {0xaa, 0x6b, 0x00a0}, /* 00,6b,a0,aa */4973 {0xaa, 0x6c, 0x0054}, /* 00,6c,54,aa */4974 {0xaa, 0xd6, 0x0007}, /* 00,d6,07,aa */4975 {0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,f7,cc */4976 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc */4977 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc */4978 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS}, /* 01,89,06,cc */4979 {0xa0, 0x00, 0x01ad}, /* 01,ad,00,cc */4980 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc */4981 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc */4982 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc */4983 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc */4984 {0xa0, 0x7a, ZC3XX_R116_RGAIN}, /* 01,16,7a,cc */4985 {0xa0, 0x4a, ZC3XX_R118_BGAIN}, /* 01,18,4a,cc */4986 {}4987};4988 4989static const struct usb_action po2030_50HZ[] = {4990 {0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */4991 {0xaa, 0x1a, 0x0001}, /* 00,1a,01,aa */4992 {0xaa, 0x1b, 0x000a}, /* 00,1b,0a,aa */4993 {0xaa, 0x1c, 0x00b0}, /* 00,1c,b0,aa */4994 {0xa0, 0x05, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,05,cc */4995 {0xa0, 0x35, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,35,cc */4996 {0xa0, 0x70, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,70,cc */4997 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */4998 {0xa0, 0x85, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,85,cc */4999 {0xa0, 0x58, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,58,cc */5000 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */5001 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */5002 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */5003 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */5004 {0xa0, 0x22, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,22,cc */5005 {0xa0, 0x88, ZC3XX_R18D_YTARGET}, /* 01,8d,88,cc */5006 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc */5007 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */5008 {}5009};5010 5011static const struct usb_action po2030_60HZ[] = {5012 {0xaa, 0x8d, 0x0008}, /* 00,8d,08,aa */5013 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */5014 {0xaa, 0x1b, 0x00de}, /* 00,1b,de,aa */5015 {0xaa, 0x1c, 0x0040}, /* 00,1c,40,aa */5016 {0xa0, 0x08, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,08,cc */5017 {0xa0, 0xae, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,ae,cc */5018 {0xa0, 0x80, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,80,cc */5019 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */5020 {0xa0, 0x6f, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,6f,cc */5021 {0xa0, 0x20, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,20,cc */5022 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0c,cc */5023 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,18,cc */5024 {0xa0, 0x60, ZC3XX_R1A8_DIGITALGAIN}, /* 01,a8,60,cc */5025 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc */5026 {0xa0, 0x22, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,22,cc */5027 {0xa0, 0x88, ZC3XX_R18D_YTARGET}, /* 01,8d,88,cc */5028 /* win: 01,8d,80 */5029 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc */5030 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc */5031 {}5032};5033 5034static const struct usb_action po2030_NoFlicker[] = {5035 {0xa0, 0x02, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,02,cc */5036 {0xaa, 0x8d, 0x000d}, /* 00,8d,0d,aa */5037 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa */5038 {0xaa, 0x1b, 0x0002}, /* 00,1b,02,aa */5039 {0xaa, 0x1c, 0x0078}, /* 00,1c,78,aa */5040 {0xaa, 0x46, 0x0000}, /* 00,46,00,aa */5041 {0xaa, 0x15, 0x0000}, /* 00,15,00,aa */5042 {}5043};5044 5045static const struct usb_action tas5130c_InitialScale[] = { /* 320x240 */5046 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},5047 {0xa0, 0x50, ZC3XX_R002_CLOCKSELECT},5048 {0xa0, 0x03, ZC3XX_R008_CLOCKSETTING},5049 {0xa0, 0x02, ZC3XX_R010_CMOSSENSORSELECT},5050 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},5051 {0xa0, 0x00, ZC3XX_R001_SYSTEMOPERATING},5052 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},5053 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},5054 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},5055 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},5056 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},5057 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},5058 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},5059 5060 {0xa0, 0x04, ZC3XX_R098_WINYSTARTLOW},5061 {0xa0, 0x0f, ZC3XX_R09A_WINXSTARTLOW},5062 {0xa0, 0x04, ZC3XX_R11A_FIRSTYLOW},5063 {0xa0, 0x0f, ZC3XX_R11C_FIRSTXLOW},5064 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW},5065 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},5066 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW},5067 {0xa0, 0x06, ZC3XX_R08D_COMPABILITYMODE},5068 {0xa0, 0xf7, ZC3XX_R101_SENSORCORRECTION},5069 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},5070 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},5071 {0xa0, 0x70, ZC3XX_R18D_YTARGET},5072 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},5073 {0xa0, 0x00, 0x01ad},5074 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},5075 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},5076 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},5077 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},5078 {0xa0, 0x07, ZC3XX_R0A5_EXPOSUREGAIN},5079 {0xa0, 0x02, ZC3XX_R0A6_EXPOSUREBLACKLVL},5080 {}5081};5082static const struct usb_action tas5130c_Initial[] = { /* 640x480 */5083 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL},5084 {0xa0, 0x40, ZC3XX_R002_CLOCKSELECT},5085 {0xa0, 0x00, ZC3XX_R008_CLOCKSETTING},5086 {0xa0, 0x02, ZC3XX_R010_CMOSSENSORSELECT},5087 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},5088 {0xa0, 0x00, ZC3XX_R001_SYSTEMOPERATING},5089 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC},5090 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING},5091 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC},5092 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH},5093 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW},5094 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH},5095 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW},5096 {0xa0, 0x05, ZC3XX_R098_WINYSTARTLOW},5097 {0xa0, 0x0f, ZC3XX_R09A_WINXSTARTLOW},5098 {0xa0, 0x05, ZC3XX_R11A_FIRSTYLOW},5099 {0xa0, 0x0f, ZC3XX_R11C_FIRSTXLOW},5100 {0xa0, 0xe6, ZC3XX_R09C_WINHEIGHTLOW},5101 {0xa0, 0x02, ZC3XX_R09D_WINWIDTHHIGH},5102 {0xa0, 0x86, ZC3XX_R09E_WINWIDTHLOW},5103 {0xa0, 0x06, ZC3XX_R08D_COMPABILITYMODE},5104 {0xa0, 0x37, ZC3XX_R101_SENSORCORRECTION},5105 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE},5106 {0xa0, 0x06, ZC3XX_R189_AWBSTATUS},5107 {0xa0, 0x70, ZC3XX_R18D_YTARGET},5108 {0xa0, 0x50, ZC3XX_R1A8_DIGITALGAIN},5109 {0xa0, 0x00, 0x01ad},5110 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE},5111 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05},5112 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE},5113 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS},5114 {0xa0, 0x07, ZC3XX_R0A5_EXPOSUREGAIN},5115 {0xa0, 0x02, ZC3XX_R0A6_EXPOSUREBLACKLVL},5116 {}5117};5118static const struct usb_action tas5130c_50HZ[] = {5119 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5120 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5121 {0xaa, 0xa4, 0x0063}, /* 00,a4,63,aa */5122 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5123 {0xa0, 0x63, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,63,cc */5124 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5125 {0xa0, 0x04, ZC3XX_R191_EXPOSURELIMITMID},5126 {0xa0, 0xfe, ZC3XX_R192_EXPOSURELIMITLOW},5127 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */5128 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */5129 {0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,47,cc */5130 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5131 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5132 {0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},5133 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},5134 {0xa0, 0xd3, ZC3XX_R01D_HSYNC_0}, /* 00,1d,d3,cc */5135 {0xa0, 0xda, ZC3XX_R01E_HSYNC_1}, /* 00,1e,da,cc */5136 {0xa0, 0xea, ZC3XX_R01F_HSYNC_2}, /* 00,1f,ea,cc */5137 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5138 {0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */5139 {0xa0, 0x4c, ZC3XX_R0A0_MAXXLOW},5140 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5141 {}5142};5143static const struct usb_action tas5130c_50HZScale[] = {5144 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5145 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5146 {0xaa, 0xa4, 0x0077}, /* 00,a4,77,aa */5147 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5148 {0xa0, 0x77, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,77,cc */5149 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5150 {0xa0, 0x07, ZC3XX_R191_EXPOSURELIMITMID},5151 {0xa0, 0xd0, ZC3XX_R192_EXPOSURELIMITLOW},5152 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */5153 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */5154 {0xa0, 0x7d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,7d,cc */5155 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5156 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5157 {0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},5158 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},5159 {0xa0, 0xf0, ZC3XX_R01D_HSYNC_0}, /* 00,1d,f0,cc */5160 {0xa0, 0xf4, ZC3XX_R01E_HSYNC_1}, /* 00,1e,f4,cc */5161 {0xa0, 0xf8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,f8,cc */5162 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5163 {0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */5164 {0xa0, 0xc0, ZC3XX_R0A0_MAXXLOW},5165 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5166 {}5167};5168static const struct usb_action tas5130c_60HZ[] = {5169 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5170 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5171 {0xaa, 0xa4, 0x0036}, /* 00,a4,36,aa */5172 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5173 {0xa0, 0x36, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,36,cc */5174 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5175 {0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},5176 {0xa0, 0x54, ZC3XX_R192_EXPOSURELIMITLOW},5177 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */5178 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */5179 {0xa0, 0x3e, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,3e,cc */5180 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5181 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5182 {0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},5183 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},5184 {0xa0, 0xca, ZC3XX_R01D_HSYNC_0}, /* 00,1d,ca,cc */5185 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */5186 {0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */5187 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5188 {0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */5189 {0xa0, 0x28, ZC3XX_R0A0_MAXXLOW},5190 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5191 {}5192};5193static const struct usb_action tas5130c_60HZScale[] = {5194 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5195 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5196 {0xaa, 0xa4, 0x0077}, /* 00,a4,77,aa */5197 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5198 {0xa0, 0x77, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,77,cc */5199 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5200 {0xa0, 0x09, ZC3XX_R191_EXPOSURELIMITMID},5201 {0xa0, 0x47, ZC3XX_R192_EXPOSURELIMITLOW},5202 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc */5203 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc */5204 {0xa0, 0x7d, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,7d,cc */5205 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5206 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5207 {0xa0, 0x08, ZC3XX_R1A9_DIGITALLIMITDIFF},5208 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP},5209 {0xa0, 0xc8, ZC3XX_R01D_HSYNC_0}, /* 00,1d,c8,cc */5210 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */5211 {0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */5212 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5213 {0xa0, 0x03, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,03,cc */5214 {0xa0, 0x20, ZC3XX_R0A0_MAXXLOW},5215 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5216 {}5217};5218static const struct usb_action tas5130c_NoFlicker[] = {5219 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5220 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5221 {0xaa, 0xa4, 0x0040}, /* 00,a4,40,aa */5222 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5223 {0xa0, 0x40, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,40,cc */5224 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5225 {0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID},5226 {0xa0, 0xa0, ZC3XX_R192_EXPOSURELIMITLOW},5227 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},5228 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},5229 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},5230 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5231 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5232 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */5233 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */5234 {0xa0, 0xbc, ZC3XX_R01D_HSYNC_0}, /* 00,1d,bc,cc */5235 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */5236 {0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */5237 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5238 {0xa0, 0x02, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,02,cc */5239 {0xa0, 0xf0, ZC3XX_R0A0_MAXXLOW},5240 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5241 {}5242};5243 5244static const struct usb_action tas5130c_NoFlickerScale[] = {5245 {0xa0, 0x00, ZC3XX_R019_AUTOADJUSTFPS}, /* 00,19,00,cc */5246 {0xaa, 0xa3, 0x0001}, /* 00,a3,01,aa */5247 {0xaa, 0xa4, 0x0090}, /* 00,a4,90,aa */5248 {0xa0, 0x01, ZC3XX_R0A3_EXPOSURETIMEHIGH}, /* 00,a3,01,cc */5249 {0xa0, 0x90, ZC3XX_R0A4_EXPOSURETIMELOW}, /* 00,a4,90,cc */5250 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc */5251 {0xa0, 0x0a, ZC3XX_R191_EXPOSURELIMITMID},5252 {0xa0, 0x00, ZC3XX_R192_EXPOSURELIMITLOW},5253 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH},5254 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID},5255 {0xa0, 0x04, ZC3XX_R197_ANTIFLICKERLOW},5256 {0xa0, 0x0c, ZC3XX_R18C_AEFREEZE},5257 {0xa0, 0x18, ZC3XX_R18F_AEUNFREEZE},5258 {0xa0, 0x00, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,00,cc */5259 {0xa0, 0x00, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,00,cc */5260 {0xa0, 0xbc, ZC3XX_R01D_HSYNC_0}, /* 00,1d,bc,cc */5261 {0xa0, 0xd0, ZC3XX_R01E_HSYNC_1}, /* 00,1e,d0,cc */5262 {0xa0, 0xe0, ZC3XX_R01F_HSYNC_2}, /* 00,1f,e0,cc */5263 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc */5264 {0xa0, 0x02, ZC3XX_R09F_MAXXHIGH}, /* 00,9f,02,cc */5265 {0xa0, 0xf0, ZC3XX_R0A0_MAXXLOW},5266 {0xa0, 0x50, ZC3XX_R11D_GLOBALGAIN},5267 {}5268};5269 5270/* from usbvm305.inf 0ac8:305b 07/06/15 (3 - tas5130c) */5271static const struct usb_action gc0303_Initial[] = {5272 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc, */5273 {0xa0, 0x02, ZC3XX_R008_CLOCKSETTING}, /* 00,08,02,cc, */5274 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc, */5275 {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT},5276 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc, */5277 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc, */5278 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc, */5279 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc, */5280 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc, */5281 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc, */5282 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc, */5283 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc, */5284 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc, */5285 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc, */5286 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc, */5287 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc, */5288 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e6,cc,5289 * 6<->8 */5290 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,86,cc,5291 * 6<->8 */5292 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID}, /* 00,87,10,cc, */5293 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc, */5294 {0xaa, 0x01, 0x0000},5295 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa, */5296 {0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa, */5297 {0xaa, 0x1b, 0x0000},5298 {0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,82,cc, */5299 {0xa0, 0x83, ZC3XX_R087_EXPTIMEMID}, /* 00,87,83,cc, */5300 {0xa0, 0x84, ZC3XX_R088_EXPTIMELOW}, /* 00,88,84,cc, */5301 {0xaa, 0x05, 0x0010}, /* 00,05,10,aa, */5302 {0xaa, 0x0a, 0x0002},5303 {0xaa, 0x0b, 0x0000},5304 {0xaa, 0x0c, 0x0002},5305 {0xaa, 0x0d, 0x0000},5306 {0xaa, 0x0e, 0x0002},5307 {0xaa, 0x0f, 0x0000},5308 {0xaa, 0x10, 0x0002},5309 {0xaa, 0x11, 0x0000},5310 {0xaa, 0x16, 0x0001}, /* 00,16,01,aa, */5311 {0xaa, 0x17, 0x00e8}, /* 00,17,e6,aa, (e6 -> e8) */5312 {0xaa, 0x18, 0x0002}, /* 00,18,02,aa, */5313 {0xaa, 0x19, 0x0088}, /* 00,19,86,aa, */5314 {0xaa, 0x20, 0x0020}, /* 00,20,20,aa, */5315 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,b7,cc, */5316 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc, */5317 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc, */5318 {0xa0, 0x76, ZC3XX_R189_AWBSTATUS}, /* 01,89,76,cc, */5319 {0xa0, 0x09, 0x01ad}, /* 01,ad,09,cc, */5320 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc, */5321 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc, */5322 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc, */5323 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc, */5324 {0xa0, 0x58, ZC3XX_R1A8_DIGITALGAIN},5325 {0xa0, 0x61, ZC3XX_R116_RGAIN}, /* 01,16,61,cc, */5326 {0xa0, 0x65, ZC3XX_R118_BGAIN}, /* 01,18,65,cc */5327 {0xaa, 0x1b, 0x0000},5328 {}5329};5330 5331static const struct usb_action gc0303_InitialScale[] = {5332 {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, /* 00,00,01,cc, */5333 {0xa0, 0x02, ZC3XX_R008_CLOCKSETTING}, /* 00,08,02,cc, */5334 {0xa0, 0x01, ZC3XX_R010_CMOSSENSORSELECT}, /* 00,10,01,cc, */5335 {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT},5336 {0xa0, 0x02, ZC3XX_R003_FRAMEWIDTHHIGH}, /* 00,03,02,cc, */5337 {0xa0, 0x80, ZC3XX_R004_FRAMEWIDTHLOW}, /* 00,04,80,cc, */5338 {0xa0, 0x01, ZC3XX_R005_FRAMEHEIGHTHIGH}, /* 00,05,01,cc, */5339 {0xa0, 0xe0, ZC3XX_R006_FRAMEHEIGHTLOW}, /* 00,06,e0,cc, */5340 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc, */5341 {0xa0, 0x01, ZC3XX_R001_SYSTEMOPERATING}, /* 00,01,01,cc, */5342 {0xa0, 0x03, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,03,cc, */5343 {0xa0, 0x01, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,01,cc, */5344 {0xa0, 0x00, ZC3XX_R098_WINYSTARTLOW}, /* 00,98,00,cc, */5345 {0xa0, 0x00, ZC3XX_R09A_WINXSTARTLOW}, /* 00,9a,00,cc, */5346 {0xa0, 0x00, ZC3XX_R11A_FIRSTYLOW}, /* 01,1a,00,cc, */5347 {0xa0, 0x00, ZC3XX_R11C_FIRSTXLOW}, /* 01,1c,00,cc, */5348 {0xa0, 0xe8, ZC3XX_R09C_WINHEIGHTLOW}, /* 00,9c,e8,cc,5349 * 8<->6 */5350 {0xa0, 0x88, ZC3XX_R09E_WINWIDTHLOW}, /* 00,9e,88,cc,5351 * 8<->6 */5352 {0xa0, 0x10, ZC3XX_R087_EXPTIMEMID}, /* 00,87,10,cc, */5353 {0xa0, 0x98, ZC3XX_R08B_I2CDEVICEADDR}, /* 00,8b,98,cc, */5354 {0xaa, 0x01, 0x0000},5355 {0xaa, 0x1a, 0x0000}, /* 00,1a,00,aa, */5356 {0xaa, 0x1c, 0x0017}, /* 00,1c,17,aa, */5357 {0xaa, 0x1b, 0x0000},5358 {0xa0, 0x82, ZC3XX_R086_EXPTIMEHIGH}, /* 00,86,82,cc, */5359 {0xa0, 0x83, ZC3XX_R087_EXPTIMEMID}, /* 00,87,83,cc, */5360 {0xa0, 0x84, ZC3XX_R088_EXPTIMELOW}, /* 00,88,84,cc, */5361 {0xaa, 0x05, 0x0010}, /* 00,05,10,aa, */5362 {0xaa, 0x0a, 0x0001},5363 {0xaa, 0x0b, 0x0000},5364 {0xaa, 0x0c, 0x0001},5365 {0xaa, 0x0d, 0x0000},5366 {0xaa, 0x0e, 0x0001},5367 {0xaa, 0x0f, 0x0000},5368 {0xaa, 0x10, 0x0001},5369 {0xaa, 0x11, 0x0000},5370 {0xaa, 0x16, 0x0001}, /* 00,16,01,aa, */5371 {0xaa, 0x17, 0x00e8}, /* 00,17,e6,aa (e6 -> e8) */5372 {0xaa, 0x18, 0x0002}, /* 00,18,02,aa, */5373 {0xaa, 0x19, 0x0088}, /* 00,19,88,aa, */5374 {0xa0, 0xb7, ZC3XX_R101_SENSORCORRECTION}, /* 01,01,b7,cc, */5375 {0xa0, 0x05, ZC3XX_R012_VIDEOCONTROLFUNC}, /* 00,12,05,cc, */5376 {0xa0, 0x0d, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0d,cc, */5377 {0xa0, 0x76, ZC3XX_R189_AWBSTATUS}, /* 01,89,76,cc, */5378 {0xa0, 0x09, 0x01ad}, /* 01,ad,09,cc, */5379 {0xa0, 0x03, ZC3XX_R1C5_SHARPNESSMODE}, /* 01,c5,03,cc, */5380 {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, /* 01,cb,13,cc, */5381 {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, /* 02,50,08,cc, */5382 {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, /* 03,01,08,cc, */5383 {0xa0, 0x58, ZC3XX_R1A8_DIGITALGAIN},5384 {0xa0, 0x61, ZC3XX_R116_RGAIN}, /* 01,16,61,cc, */5385 {0xa0, 0x65, ZC3XX_R118_BGAIN}, /* 01,18,65,cc */5386 {0xaa, 0x1b, 0x0000},5387 {}5388};5389static const struct usb_action gc0303_50HZ[] = {5390 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5391 {0xaa, 0x83, 0x0001}, /* 00,83,01,aa */5392 {0xaa, 0x84, 0x0063},5393 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc, */5394 {0xa0, 0x06, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,0d,cc, */5395 {0xa0, 0xa8, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,50,cc, */5396 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc, */5397 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc, */5398 {0xa0, 0x47, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,47,cc, */5399 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc, */5400 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc, */5401 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc, */5402 {0xa0, 0x48, ZC3XX_R1AA_DIGITALGAINSTEP},5403 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc, */5404 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc, */5405 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc, */5406 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc, */5407 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc, */5408 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc, */5409 {0xa0, 0x7f, ZC3XX_R18D_YTARGET},5410 {}5411};5412 5413static const struct usb_action gc0303_50HZScale[] = {5414 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5415 {0xaa, 0x83, 0x0003}, /* 00,83,03,aa */5416 {0xaa, 0x84, 0x0054}, /* 00,84,54,aa */5417 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc, */5418 {0xa0, 0x0d, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,0d,cc, */5419 {0xa0, 0x50, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,50,cc, */5420 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc, */5421 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc, */5422 {0xa0, 0x8e, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,8e,cc, */5423 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc, */5424 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc, */5425 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc, */5426 {0xa0, 0x48, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc, */5427 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc, */5428 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc, */5429 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc, */5430 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc, */5431 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc, */5432 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc, */5433 {0xa0, 0x7f, ZC3XX_R18D_YTARGET},5434 {}5435};5436 5437static const struct usb_action gc0303_60HZ[] = {5438 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5439 {0xaa, 0x83, 0x0000},5440 {0xaa, 0x84, 0x003b},5441 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc, */5442 {0xa0, 0x05, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,91,05,cc, */5443 {0xa0, 0x88, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,92,88,cc, */5444 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc, */5445 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc, */5446 {0xa0, 0x3b, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,3b,cc, */5447 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc, */5448 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc, */5449 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,a9,10,cc, */5450 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,aa,24,cc, */5451 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc, */5452 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc, */5453 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc, */5454 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc, */5455 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc, */5456 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc, */5457 {0xa0, 0x80, ZC3XX_R18D_YTARGET},5458 {}5459};5460 5461static const struct usb_action gc0303_60HZScale[] = {5462 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5463 {0xaa, 0x83, 0x0000},5464 {0xaa, 0x84, 0x0076},5465 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc, */5466 {0xa0, 0x0b, ZC3XX_R191_EXPOSURELIMITMID}, /* 01,1,0b,cc, */5467 {0xa0, 0x10, ZC3XX_R192_EXPOSURELIMITLOW}, /* 01,2,10,cc, */5468 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,5,00,cc, */5469 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,6,00,cc, */5470 {0xa0, 0x76, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,7,76,cc, */5471 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,c,0e,cc, */5472 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,f,15,cc, */5473 {0xa0, 0x10, ZC3XX_R1A9_DIGITALLIMITDIFF}, /* 01,9,10,cc, */5474 {0xa0, 0x24, ZC3XX_R1AA_DIGITALGAINSTEP}, /* 01,a,24,cc, */5475 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,d,62,cc, */5476 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,e,90,cc, */5477 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,f,c8,cc, */5478 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,0,ff,cc, */5479 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,d,58,cc, */5480 {0xa0, 0x42, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,42,cc, */5481 {0xa0, 0x80, ZC3XX_R18D_YTARGET},5482 {}5483};5484 5485static const struct usb_action gc0303_NoFlicker[] = {5486 {0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0c,cc, */5487 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5488 {0xaa, 0x83, 0x0000}, /* 00,83,00,aa */5489 {0xaa, 0x84, 0x0020}, /* 00,84,20,aa */5490 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,0,00,cc, */5491 {0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID},5492 {0xa0, 0x48, ZC3XX_R192_EXPOSURELIMITLOW},5493 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc, */5494 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc, */5495 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc, */5496 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc, */5497 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc, */5498 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc, */5499 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc, */5500 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc, */5501 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc, */5502 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc, */5503 {0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,03,cc */5504 {}5505};5506 5507static const struct usb_action gc0303_NoFlickerScale[] = {5508 {0xa0, 0x0c, ZC3XX_R100_OPERATIONMODE}, /* 01,00,0c,cc, */5509 {0xaa, 0x82, 0x0000}, /* 00,82,00,aa */5510 {0xaa, 0x83, 0x0000}, /* 00,83,00,aa */5511 {0xaa, 0x84, 0x0020}, /* 00,84,20,aa */5512 {0xa0, 0x00, ZC3XX_R190_EXPOSURELIMITHIGH}, /* 01,90,00,cc, */5513 {0xa0, 0x00, ZC3XX_R191_EXPOSURELIMITMID},5514 {0xa0, 0x48, ZC3XX_R192_EXPOSURELIMITLOW},5515 {0xa0, 0x00, ZC3XX_R195_ANTIFLICKERHIGH}, /* 01,95,00,cc, */5516 {0xa0, 0x00, ZC3XX_R196_ANTIFLICKERMID}, /* 01,96,00,cc, */5517 {0xa0, 0x10, ZC3XX_R197_ANTIFLICKERLOW}, /* 01,97,10,cc, */5518 {0xa0, 0x0e, ZC3XX_R18C_AEFREEZE}, /* 01,8c,0e,cc, */5519 {0xa0, 0x15, ZC3XX_R18F_AEUNFREEZE}, /* 01,8f,15,cc, */5520 {0xa0, 0x62, ZC3XX_R01D_HSYNC_0}, /* 00,1d,62,cc, */5521 {0xa0, 0x90, ZC3XX_R01E_HSYNC_1}, /* 00,1e,90,cc, */5522 {0xa0, 0xc8, ZC3XX_R01F_HSYNC_2}, /* 00,1f,c8,cc, */5523 {0xa0, 0xff, ZC3XX_R020_HSYNC_3}, /* 00,20,ff,cc, */5524 {0xa0, 0x58, ZC3XX_R11D_GLOBALGAIN}, /* 01,1d,58,cc, */5525 {0xa0, 0x03, ZC3XX_R180_AUTOCORRECTENABLE}, /* 01,80,03,cc */5526 {}5527};5528 5529static u8 reg_r(struct gspca_dev *gspca_dev,5530 u16 index)5531{5532 int ret;5533 5534 if (gspca_dev->usb_err < 0)5535 return 0;5536 ret = usb_control_msg(gspca_dev->dev,5537 usb_rcvctrlpipe(gspca_dev->dev, 0),5538 0xa1,5539 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,5540 0x01, /* value */5541 index, gspca_dev->usb_buf, 1,5542 500);5543 if (ret < 0) {5544 pr_err("reg_r err %d\n", ret);5545 gspca_dev->usb_err = ret;5546 return 0;5547 }5548 return gspca_dev->usb_buf[0];5549}5550 5551static void reg_w(struct gspca_dev *gspca_dev,5552 u8 value,5553 u16 index)5554{5555 int ret;5556 5557 if (gspca_dev->usb_err < 0)5558 return;5559 ret = usb_control_msg(gspca_dev->dev,5560 usb_sndctrlpipe(gspca_dev->dev, 0),5561 0xa0,5562 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,5563 value, index, NULL, 0,5564 500);5565 if (ret < 0) {5566 pr_err("reg_w_i err %d\n", ret);5567 gspca_dev->usb_err = ret;5568 }5569}5570 5571static u16 i2c_read(struct gspca_dev *gspca_dev,5572 u8 reg)5573{5574 u8 retbyte;5575 u16 retval;5576 5577 if (gspca_dev->usb_err < 0)5578 return 0;5579 reg_w(gspca_dev, reg, 0x0092);5580 reg_w(gspca_dev, 0x02, 0x0090); /* <- read command */5581 msleep(20);5582 retbyte = reg_r(gspca_dev, 0x0091); /* read status */5583 if (retbyte != 0x00)5584 pr_err("i2c_r status error %02x\n", retbyte);5585 retval = reg_r(gspca_dev, 0x0095); /* read Lowbyte */5586 retval |= reg_r(gspca_dev, 0x0096) << 8; /* read Hightbyte */5587 return retval;5588}5589 5590static u8 i2c_write(struct gspca_dev *gspca_dev,5591 u8 reg,5592 u8 valL,5593 u8 valH)5594{5595 u8 retbyte;5596 5597 if (gspca_dev->usb_err < 0)5598 return 0;5599 reg_w(gspca_dev, reg, 0x92);5600 reg_w(gspca_dev, valL, 0x93);5601 reg_w(gspca_dev, valH, 0x94);5602 reg_w(gspca_dev, 0x01, 0x90); /* <- write command */5603 msleep(1);5604 retbyte = reg_r(gspca_dev, 0x0091); /* read status */5605 if (retbyte != 0x00)5606 pr_err("i2c_w status error %02x\n", retbyte);5607 return retbyte;5608}5609 5610static void usb_exchange(struct gspca_dev *gspca_dev,5611 const struct usb_action *action)5612{5613 while (action->req) {5614 switch (action->req) {5615 case 0xa0: /* write register */5616 reg_w(gspca_dev, action->val, action->idx);5617 break;5618 case 0xa1: /* read status */5619 reg_r(gspca_dev, action->idx);5620 break;5621 case 0xaa:5622 i2c_write(gspca_dev,5623 action->val, /* reg */5624 action->idx & 0xff, /* valL */5625 action->idx >> 8); /* valH */5626 break;5627 case 0xbb:5628 i2c_write(gspca_dev,5629 action->idx >> 8, /* reg */5630 action->idx & 0xff, /* valL */5631 action->val); /* valH */5632 break;5633 default:5634/* case 0xdd: * delay */5635 msleep(action->idx);5636 break;5637 }5638 action++;5639 msleep(1);5640 }5641}5642 5643static void setmatrix(struct gspca_dev *gspca_dev)5644{5645 struct sd *sd = (struct sd *) gspca_dev;5646 int i;5647 const u8 *matrix;5648 static const u8 adcm2700_matrix[9] =5649/* {0x66, 0xed, 0xed, 0xed, 0x66, 0xed, 0xed, 0xed, 0x66}; */5650/*ms-win*/5651 {0x74, 0xed, 0xed, 0xed, 0x74, 0xed, 0xed, 0xed, 0x74};5652 static const u8 gc0305_matrix[9] =5653 {0x50, 0xf8, 0xf8, 0xf8, 0x50, 0xf8, 0xf8, 0xf8, 0x50};5654 static const u8 ov7620_matrix[9] =5655 {0x58, 0xf4, 0xf4, 0xf4, 0x58, 0xf4, 0xf4, 0xf4, 0x58};5656 static const u8 pas202b_matrix[9] =5657 {0x4c, 0xf5, 0xff, 0xf9, 0x51, 0xf5, 0xfb, 0xed, 0x5f};5658 static const u8 po2030_matrix[9] =5659 {0x60, 0xf0, 0xf0, 0xf0, 0x60, 0xf0, 0xf0, 0xf0, 0x60};5660 static const u8 tas5130c_matrix[9] =5661 {0x68, 0xec, 0xec, 0xec, 0x68, 0xec, 0xec, 0xec, 0x68};5662 static const u8 gc0303_matrix[9] =5663 {0x6c, 0xea, 0xea, 0xea, 0x6c, 0xea, 0xea, 0xea, 0x6c};5664 static const u8 *matrix_tb[SENSOR_MAX] = {5665 [SENSOR_ADCM2700] = adcm2700_matrix,5666 [SENSOR_CS2102] = ov7620_matrix,5667 [SENSOR_CS2102K] = NULL,5668 [SENSOR_GC0303] = gc0303_matrix,5669 [SENSOR_GC0305] = gc0305_matrix,5670 [SENSOR_HDCS2020] = NULL,5671 [SENSOR_HV7131B] = NULL,5672 [SENSOR_HV7131R] = po2030_matrix,5673 [SENSOR_ICM105A] = po2030_matrix,5674 [SENSOR_MC501CB] = NULL,5675 [SENSOR_MT9V111_1] = gc0305_matrix,5676 [SENSOR_MT9V111_3] = gc0305_matrix,5677 [SENSOR_OV7620] = ov7620_matrix,5678 [SENSOR_OV7630C] = NULL,5679 [SENSOR_PAS106] = NULL,5680 [SENSOR_PAS202B] = pas202b_matrix,5681 [SENSOR_PB0330] = gc0305_matrix,5682 [SENSOR_PO2030] = po2030_matrix,5683 [SENSOR_TAS5130C] = tas5130c_matrix,5684 };5685 5686 matrix = matrix_tb[sd->sensor];5687 if (matrix == NULL)5688 return; /* matrix already loaded */5689 for (i = 0; i < ARRAY_SIZE(ov7620_matrix); i++)5690 reg_w(gspca_dev, matrix[i], 0x010a + i);5691}5692 5693static void setsharpness(struct gspca_dev *gspca_dev, s32 val)5694{5695 static const u8 sharpness_tb[][2] = {5696 {0x02, 0x03},5697 {0x04, 0x07},5698 {0x08, 0x0f},5699 {0x10, 0x1e}5700 };5701 5702 reg_w(gspca_dev, sharpness_tb[val][0], 0x01c6);5703 reg_r(gspca_dev, 0x01c8);5704 reg_r(gspca_dev, 0x01c9);5705 reg_r(gspca_dev, 0x01ca);5706 reg_w(gspca_dev, sharpness_tb[val][1], 0x01cb);5707}5708 5709static void setcontrast(struct gspca_dev *gspca_dev,5710 s32 gamma, s32 brightness, s32 contrast)5711{5712 const u8 *Tgamma;5713 int g, i, adj, gp1, gp2;5714 u8 gr[16];5715 static const u8 delta_b[16] = /* delta for brightness */5716 {0x50, 0x38, 0x2d, 0x28, 0x24, 0x21, 0x1e, 0x1d,5717 0x1d, 0x1b, 0x1b, 0x1b, 0x19, 0x18, 0x18, 0x18};5718 static const u8 delta_c[16] = /* delta for contrast */5719 {0x2c, 0x1a, 0x12, 0x0c, 0x0a, 0x06, 0x06, 0x06,5720 0x04, 0x06, 0x04, 0x04, 0x03, 0x03, 0x02, 0x02};5721 static const u8 gamma_tb[6][16] = {5722 {0x00, 0x00, 0x03, 0x0d, 0x1b, 0x2e, 0x45, 0x5f,5723 0x79, 0x93, 0xab, 0xc1, 0xd4, 0xe5, 0xf3, 0xff},5724 {0x01, 0x0c, 0x1f, 0x3a, 0x53, 0x6d, 0x85, 0x9c,5725 0xb0, 0xc2, 0xd1, 0xde, 0xe9, 0xf2, 0xf9, 0xff},5726 {0x04, 0x16, 0x30, 0x4e, 0x68, 0x81, 0x98, 0xac,5727 0xbe, 0xcd, 0xda, 0xe4, 0xed, 0xf5, 0xfb, 0xff},5728 {0x13, 0x38, 0x59, 0x79, 0x92, 0xa7, 0xb9, 0xc8,5729 0xd4, 0xdf, 0xe7, 0xee, 0xf4, 0xf9, 0xfc, 0xff},5730 {0x20, 0x4b, 0x6e, 0x8d, 0xa3, 0xb5, 0xc5, 0xd2,5731 0xdc, 0xe5, 0xec, 0xf2, 0xf6, 0xfa, 0xfd, 0xff},5732 {0x24, 0x44, 0x64, 0x84, 0x9d, 0xb2, 0xc4, 0xd3,5733 0xe0, 0xeb, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xff},5734 };5735 5736 Tgamma = gamma_tb[gamma - 1];5737 5738 contrast -= 128; /* -128 / 127 */5739 brightness -= 128; /* -128 / 92 */5740 adj = 0;5741 gp1 = gp2 = 0;5742 for (i = 0; i < 16; i++) {5743 g = Tgamma[i] + delta_b[i] * brightness / 2565744 - delta_c[i] * contrast / 256 - adj / 2;5745 if (g > 0xff)5746 g = 0xff;5747 else if (g < 0)5748 g = 0;5749 reg_w(gspca_dev, g, 0x0120 + i); /* gamma */5750 if (contrast > 0)5751 adj--;5752 else if (contrast < 0)5753 adj++;5754 if (i > 1)5755 gr[i - 1] = (g - gp2) / 2;5756 else if (i != 0)5757 gr[0] = gp1 == 0 ? 0 : (g - gp1);5758 gp2 = gp1;5759 gp1 = g;5760 }5761 gr[15] = (0xff - gp2) / 2;5762 for (i = 0; i < 16; i++)5763 reg_w(gspca_dev, gr[i], 0x0130 + i); /* gradient */5764}5765 5766static s32 getexposure(struct gspca_dev *gspca_dev)5767{5768 struct sd *sd = (struct sd *) gspca_dev;5769 5770 switch (sd->sensor) {5771 case SENSOR_HV7131R:5772 return (i2c_read(gspca_dev, 0x25) << 9)5773 | (i2c_read(gspca_dev, 0x26) << 1)5774 | (i2c_read(gspca_dev, 0x27) >> 7);5775 case SENSOR_OV7620:5776 return i2c_read(gspca_dev, 0x10);5777 default:5778 return -1;5779 }5780}5781 5782static void setexposure(struct gspca_dev *gspca_dev, s32 val)5783{5784 struct sd *sd = (struct sd *) gspca_dev;5785 5786 switch (sd->sensor) {5787 case SENSOR_HV7131R:5788 i2c_write(gspca_dev, 0x25, val >> 9, 0x00);5789 i2c_write(gspca_dev, 0x26, val >> 1, 0x00);5790 i2c_write(gspca_dev, 0x27, val << 7, 0x00);5791 break;5792 case SENSOR_OV7620:5793 i2c_write(gspca_dev, 0x10, val, 0x00);5794 break;5795 }5796}5797 5798static void setquality(struct gspca_dev *gspca_dev)5799{5800 struct sd *sd = (struct sd *) gspca_dev;5801 jpeg_set_qual(sd->jpeg_hdr, jpeg_qual[sd->reg08 >> 1]);5802 reg_w(gspca_dev, sd->reg08, ZC3XX_R008_CLOCKSETTING);5803}5804 5805/* Matches the sensor's internal frame rate to the lighting frequency.5806 * Valid frequencies are:5807 * 50Hz, for European and Asian lighting (default)5808 * 60Hz, for American lighting5809 * 0 = No Flicker (for outdoor usage)5810 */5811static void setlightfreq(struct gspca_dev *gspca_dev, s32 val)5812{5813 struct sd *sd = (struct sd *) gspca_dev;5814 int i, mode;5815 const struct usb_action *zc3_freq;5816 static const struct usb_action *freq_tb[SENSOR_MAX][6] = {5817 [SENSOR_ADCM2700] = {5818 adcm2700_NoFlicker, adcm2700_NoFlicker,5819 adcm2700_50HZ, adcm2700_50HZ,5820 adcm2700_60HZ, adcm2700_60HZ},5821 [SENSOR_CS2102] = {5822 cs2102_NoFlicker, cs2102_NoFlickerScale,5823 cs2102_50HZ, cs2102_50HZScale,5824 cs2102_60HZ, cs2102_60HZScale},5825 [SENSOR_CS2102K] = {5826 cs2102_NoFlicker, cs2102_NoFlickerScale,5827 NULL, NULL, /* currently disabled */5828 NULL, NULL},5829 [SENSOR_GC0303] = {5830 gc0303_NoFlicker, gc0303_NoFlickerScale,5831 gc0303_50HZ, gc0303_50HZScale,5832 gc0303_60HZ, gc0303_60HZScale},5833 [SENSOR_GC0305] = {5834 gc0305_NoFlicker, gc0305_NoFlicker,5835 gc0305_50HZ, gc0305_50HZ,5836 gc0305_60HZ, gc0305_60HZ},5837 [SENSOR_HDCS2020] = {5838 hdcs2020_NoFlicker, hdcs2020_NoFlicker,5839 hdcs2020_50HZ, hdcs2020_50HZ,5840 hdcs2020_60HZ, hdcs2020_60HZ},5841 [SENSOR_HV7131B] = {5842 hv7131b_NoFlicker, hv7131b_NoFlickerScale,5843 hv7131b_50HZ, hv7131b_50HZScale,5844 hv7131b_60HZ, hv7131b_60HZScale},5845 [SENSOR_HV7131R] = {5846 hv7131r_NoFlicker, hv7131r_NoFlickerScale,5847 hv7131r_50HZ, hv7131r_50HZScale,5848 hv7131r_60HZ, hv7131r_60HZScale},5849 [SENSOR_ICM105A] = {5850 icm105a_NoFlicker, icm105a_NoFlickerScale,5851 icm105a_50HZ, icm105a_50HZScale,5852 icm105a_60HZ, icm105a_60HZScale},5853 [SENSOR_MC501CB] = {5854 mc501cb_NoFlicker, mc501cb_NoFlickerScale,5855 mc501cb_50HZ, mc501cb_50HZScale,5856 mc501cb_60HZ, mc501cb_60HZScale},5857 [SENSOR_MT9V111_1] = {5858 mt9v111_1_AENoFlicker, mt9v111_1_AENoFlickerScale,5859 mt9v111_1_AE50HZ, mt9v111_1_AE50HZScale,5860 mt9v111_1_AE60HZ, mt9v111_1_AE60HZScale},5861 [SENSOR_MT9V111_3] = {5862 mt9v111_3_AENoFlicker, mt9v111_3_AENoFlickerScale,5863 mt9v111_3_AE50HZ, mt9v111_3_AE50HZScale,5864 mt9v111_3_AE60HZ, mt9v111_3_AE60HZScale},5865 [SENSOR_OV7620] = {5866 ov7620_NoFlicker, ov7620_NoFlicker,5867 ov7620_50HZ, ov7620_50HZ,5868 ov7620_60HZ, ov7620_60HZ},5869 [SENSOR_OV7630C] = {5870 NULL, NULL,5871 NULL, NULL,5872 NULL, NULL},5873 [SENSOR_PAS106] = {5874 pas106b_NoFlicker, pas106b_NoFlicker,5875 pas106b_50HZ, pas106b_50HZ,5876 pas106b_60HZ, pas106b_60HZ},5877 [SENSOR_PAS202B] = {5878 pas202b_NoFlicker, pas202b_NoFlickerScale,5879 pas202b_50HZ, pas202b_50HZScale,5880 pas202b_60HZ, pas202b_60HZScale},5881 [SENSOR_PB0330] = {5882 pb0330_NoFlicker, pb0330_NoFlickerScale,5883 pb0330_50HZ, pb0330_50HZScale,5884 pb0330_60HZ, pb0330_60HZScale},5885 [SENSOR_PO2030] = {5886 po2030_NoFlicker, po2030_NoFlicker,5887 po2030_50HZ, po2030_50HZ,5888 po2030_60HZ, po2030_60HZ},5889 [SENSOR_TAS5130C] = {5890 tas5130c_NoFlicker, tas5130c_NoFlickerScale,5891 tas5130c_50HZ, tas5130c_50HZScale,5892 tas5130c_60HZ, tas5130c_60HZScale},5893 };5894 5895 i = val * 2;5896 mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;5897 if (mode)5898 i++; /* 320x240 */5899 zc3_freq = freq_tb[sd->sensor][i];5900 if (zc3_freq == NULL)5901 return;5902 usb_exchange(gspca_dev, zc3_freq);5903 switch (sd->sensor) {5904 case SENSOR_GC0305:5905 if (mode /* if 320x240 */5906 && val == 1) /* and 50Hz */5907 reg_w(gspca_dev, 0x85, 0x018d);5908 /* win: 0x80, 0x018d */5909 break;5910 case SENSOR_OV7620:5911 if (!mode) { /* if 640x480 */5912 if (val != 0) /* and filter */5913 reg_w(gspca_dev, 0x40, 0x0002);5914 else5915 reg_w(gspca_dev, 0x44, 0x0002);5916 }5917 break;5918 case SENSOR_PAS202B:5919 reg_w(gspca_dev, 0x00, 0x01a7);5920 break;5921 }5922}5923 5924static void setautogain(struct gspca_dev *gspca_dev, s32 val)5925{5926 struct sd *sd = (struct sd *) gspca_dev;5927 5928 if (sd->sensor == SENSOR_OV7620)5929 i2c_write(gspca_dev, 0x13, val ? 0xa3 : 0x80, 0x00);5930 else5931 reg_w(gspca_dev, val ? 0x42 : 0x02, 0x0180);5932}5933 5934/*5935 * Update the transfer parameters.5936 * This function is executed from a work queue.5937 */5938static void transfer_update(struct work_struct *work)5939{5940 struct sd *sd = container_of(work, struct sd, work);5941 struct gspca_dev *gspca_dev = &sd->gspca_dev;5942 int change, good;5943 u8 reg07, reg11;5944 5945 /* reg07 gets set to 0 by sd_start before starting us */5946 reg07 = 0;5947 5948 good = 0;5949 while (1) {5950 msleep(100);5951 5952 /* To protect gspca_dev->usb_buf and gspca_dev->usb_err */5953 mutex_lock(&gspca_dev->usb_lock);5954#ifdef CONFIG_PM5955 if (gspca_dev->frozen)5956 break;5957#endif5958 if (!gspca_dev->present || !gspca_dev->streaming)5959 break;5960 5961 /* Bit 0 of register 11 indicates FIFO overflow */5962 gspca_dev->usb_err = 0;5963 reg11 = reg_r(gspca_dev, 0x0011);5964 if (gspca_dev->usb_err)5965 break;5966 5967 change = reg11 & 0x01;5968 if (change) { /* overflow */5969 good = 0;5970 5971 if (reg07 == 0) /* Bit Rate Control not enabled? */5972 reg07 = 0x32; /* Allow 98 bytes / unit */5973 else if (reg07 > 2)5974 reg07 -= 2; /* Decrease allowed bytes / unit */5975 else5976 change = 0;5977 } else { /* no overflow */5978 good++;5979 if (good >= 10) {5980 good = 0;5981 if (reg07) { /* BRC enabled? */5982 change = 1;5983 if (reg07 < 0x32)5984 reg07 += 2;5985 else5986 reg07 = 0;5987 }5988 }5989 }5990 if (change) {5991 gspca_dev->usb_err = 0;5992 reg_w(gspca_dev, reg07, 0x0007);5993 if (gspca_dev->usb_err)5994 break;5995 }5996 mutex_unlock(&gspca_dev->usb_lock);5997 }5998 5999 /* Something went wrong. Unlock and return */6000 mutex_unlock(&gspca_dev->usb_lock);6001}6002 6003static void send_unknown(struct gspca_dev *gspca_dev, int sensor)6004{6005 reg_w(gspca_dev, 0x01, 0x0000); /* bridge reset */6006 switch (sensor) {6007 case SENSOR_PAS106:6008 reg_w(gspca_dev, 0x03, 0x003a);6009 reg_w(gspca_dev, 0x0c, 0x003b);6010 reg_w(gspca_dev, 0x08, 0x0038);6011 break;6012 case SENSOR_ADCM2700:6013 case SENSOR_GC0305:6014 case SENSOR_OV7620:6015 case SENSOR_MT9V111_1:6016 case SENSOR_MT9V111_3:6017 case SENSOR_PB0330:6018 case SENSOR_PO2030:6019 reg_w(gspca_dev, 0x0d, 0x003a);6020 reg_w(gspca_dev, 0x02, 0x003b);6021 reg_w(gspca_dev, 0x00, 0x0038);6022 break;6023 case SENSOR_HV7131R:6024 case SENSOR_PAS202B:6025 reg_w(gspca_dev, 0x03, 0x003b);6026 reg_w(gspca_dev, 0x0c, 0x003a);6027 reg_w(gspca_dev, 0x0b, 0x0039);6028 if (sensor == SENSOR_PAS202B)6029 reg_w(gspca_dev, 0x0b, 0x0038);6030 break;6031 }6032}6033 6034/* start probe 2 wires */6035static void start_2wr_probe(struct gspca_dev *gspca_dev, int sensor)6036{6037 reg_w(gspca_dev, 0x01, 0x0000);6038 reg_w(gspca_dev, sensor, 0x0010);6039 reg_w(gspca_dev, 0x01, 0x0001);6040 reg_w(gspca_dev, 0x03, 0x0012);6041 reg_w(gspca_dev, 0x01, 0x0012);6042/* msleep(2); */6043}6044 6045static int sif_probe(struct gspca_dev *gspca_dev)6046{6047 u16 checkword;6048 6049 start_2wr_probe(gspca_dev, 0x0f); /* PAS106 */6050 reg_w(gspca_dev, 0x08, 0x008d);6051 msleep(150);6052 checkword = ((i2c_read(gspca_dev, 0x00) & 0x0f) << 4)6053 | ((i2c_read(gspca_dev, 0x01) & 0xf0) >> 4);6054 gspca_dbg(gspca_dev, D_PROBE, "probe sif 0x%04x\n", checkword);6055 if (checkword == 0x0007) {6056 send_unknown(gspca_dev, SENSOR_PAS106);6057 return 0x0f; /* PAS106 */6058 }6059 return -1;6060}6061 6062static int vga_2wr_probe(struct gspca_dev *gspca_dev)6063{6064 u16 retword;6065 6066 start_2wr_probe(gspca_dev, 0x00); /* HV7131B */6067 i2c_write(gspca_dev, 0x01, 0xaa, 0x00);6068 retword = i2c_read(gspca_dev, 0x01);6069 if (retword != 0)6070 return 0x00; /* HV7131B */6071 6072 start_2wr_probe(gspca_dev, 0x04); /* CS2102 */6073 i2c_write(gspca_dev, 0x01, 0xaa, 0x00);6074 retword = i2c_read(gspca_dev, 0x01);6075 if (retword != 0)6076 return 0x04; /* CS2102 */6077 6078 start_2wr_probe(gspca_dev, 0x06); /* OmniVision */6079 reg_w(gspca_dev, 0x08, 0x008d);6080 i2c_write(gspca_dev, 0x11, 0xaa, 0x00);6081 retword = i2c_read(gspca_dev, 0x11);6082 if (retword != 0) {6083 /* (should have returned 0xaa) --> Omnivision? */6084 /* reg_r 0x10 -> 0x06 --> */6085 goto ov_check;6086 }6087 6088 start_2wr_probe(gspca_dev, 0x08); /* HDCS2020 */6089 i2c_write(gspca_dev, 0x1c, 0x00, 0x00);6090 i2c_write(gspca_dev, 0x15, 0xaa, 0x00);6091 retword = i2c_read(gspca_dev, 0x15);6092 if (retword != 0)6093 return 0x08; /* HDCS2020 */6094 6095 start_2wr_probe(gspca_dev, 0x0a); /* PB0330 */6096 i2c_write(gspca_dev, 0x07, 0xaa, 0xaa);6097 retword = i2c_read(gspca_dev, 0x07);6098 if (retword != 0)6099 return 0x0a; /* PB0330 */6100 retword = i2c_read(gspca_dev, 0x03);6101 if (retword != 0)6102 return 0x0a; /* PB0330 ?? */6103 retword = i2c_read(gspca_dev, 0x04);6104 if (retword != 0)6105 return 0x0a; /* PB0330 ?? */6106 6107 start_2wr_probe(gspca_dev, 0x0c); /* ICM105A */6108 i2c_write(gspca_dev, 0x01, 0x11, 0x00);6109 retword = i2c_read(gspca_dev, 0x01);6110 if (retword != 0)6111 return 0x0c; /* ICM105A */6112 6113 start_2wr_probe(gspca_dev, 0x0e); /* PAS202BCB */6114 reg_w(gspca_dev, 0x08, 0x008d);6115 i2c_write(gspca_dev, 0x03, 0xaa, 0x00);6116 msleep(50);6117 retword = i2c_read(gspca_dev, 0x03);6118 if (retword != 0) {6119 send_unknown(gspca_dev, SENSOR_PAS202B);6120 return 0x0e; /* PAS202BCB */6121 }6122 6123 start_2wr_probe(gspca_dev, 0x02); /* TAS5130C */6124 i2c_write(gspca_dev, 0x01, 0xaa, 0x00);6125 retword = i2c_read(gspca_dev, 0x01);6126 if (retword != 0)6127 return 0x02; /* TAS5130C */6128ov_check:6129 reg_r(gspca_dev, 0x0010); /* ?? */6130 reg_r(gspca_dev, 0x0010);6131 6132 reg_w(gspca_dev, 0x01, 0x0000);6133 reg_w(gspca_dev, 0x01, 0x0001);6134 reg_w(gspca_dev, 0x06, 0x0010); /* OmniVision */6135 reg_w(gspca_dev, 0xa1, 0x008b);6136 reg_w(gspca_dev, 0x08, 0x008d);6137 msleep(500);6138 reg_w(gspca_dev, 0x01, 0x0012);6139 i2c_write(gspca_dev, 0x12, 0x80, 0x00); /* sensor reset */6140 retword = i2c_read(gspca_dev, 0x0a) << 8;6141 retword |= i2c_read(gspca_dev, 0x0b);6142 gspca_dbg(gspca_dev, D_PROBE, "probe 2wr ov vga 0x%04x\n", retword);6143 switch (retword) {6144 case 0x7631: /* OV7630C */6145 reg_w(gspca_dev, 0x06, 0x0010);6146 break;6147 case 0x7620: /* OV7620 */6148 case 0x7648: /* OV7648 */6149 break;6150 default:6151 return -1; /* not OmniVision */6152 }6153 return retword;6154}6155 6156struct sensor_by_chipset_revision {6157 u16 revision;6158 u8 internal_sensor_id;6159};6160static const struct sensor_by_chipset_revision chipset_revision_sensor[] = {6161 {0xc000, 0x12}, /* TAS5130C */6162 {0xc001, 0x13}, /* MT9V111 */6163 {0xe001, 0x13},6164 {0x8001, 0x13},6165 {0x8000, 0x14}, /* CS2102K */6166 {0x8400, 0x15}, /* MT9V111 */6167 {0xe400, 0x15},6168};6169 6170static int vga_3wr_probe(struct gspca_dev *gspca_dev)6171{6172 struct sd *sd = (struct sd *) gspca_dev;6173 int i;6174 u16 retword;6175 6176/*fixme: lack of 8b=b3 (11,12)-> 10, 8b=e0 (14,15,16)-> 12 found in gspcav1*/6177 reg_w(gspca_dev, 0x02, 0x0010);6178 reg_r(gspca_dev, 0x0010);6179 reg_w(gspca_dev, 0x01, 0x0000);6180 reg_w(gspca_dev, 0x00, 0x0010);6181 reg_w(gspca_dev, 0x01, 0x0001);6182 reg_w(gspca_dev, 0x91, 0x008b);6183 reg_w(gspca_dev, 0x03, 0x0012);6184 reg_w(gspca_dev, 0x01, 0x0012);6185 reg_w(gspca_dev, 0x05, 0x0012);6186 retword = i2c_read(gspca_dev, 0x14);6187 if (retword != 0)6188 return 0x11; /* HV7131R */6189 retword = i2c_read(gspca_dev, 0x15);6190 if (retword != 0)6191 return 0x11; /* HV7131R */6192 retword = i2c_read(gspca_dev, 0x16);6193 if (retword != 0)6194 return 0x11; /* HV7131R */6195 6196 reg_w(gspca_dev, 0x02, 0x0010);6197 retword = reg_r(gspca_dev, 0x000b) << 8;6198 retword |= reg_r(gspca_dev, 0x000a);6199 gspca_dbg(gspca_dev, D_PROBE, "probe 3wr vga 1 0x%04x\n", retword);6200 reg_r(gspca_dev, 0x0010);6201 if ((retword & 0xff00) == 0x6400)6202 return 0x02; /* TAS5130C */6203 for (i = 0; i < ARRAY_SIZE(chipset_revision_sensor); i++) {6204 if (chipset_revision_sensor[i].revision == retword) {6205 sd->chip_revision = retword;6206 send_unknown(gspca_dev, SENSOR_PB0330);6207 return chipset_revision_sensor[i].internal_sensor_id;6208 }6209 }6210 6211 reg_w(gspca_dev, 0x01, 0x0000); /* check PB0330 */6212 reg_w(gspca_dev, 0x01, 0x0001);6213 reg_w(gspca_dev, 0xdd, 0x008b);6214 reg_w(gspca_dev, 0x0a, 0x0010);6215 reg_w(gspca_dev, 0x03, 0x0012);6216 reg_w(gspca_dev, 0x01, 0x0012);6217 retword = i2c_read(gspca_dev, 0x00);6218 if (retword != 0) {6219 gspca_dbg(gspca_dev, D_PROBE, "probe 3wr vga type 0a\n");6220 return 0x0a; /* PB0330 */6221 }6222 6223 /* probe gc0303 / gc0305 */6224 reg_w(gspca_dev, 0x01, 0x0000);6225 reg_w(gspca_dev, 0x01, 0x0001);6226 reg_w(gspca_dev, 0x98, 0x008b);6227 reg_w(gspca_dev, 0x01, 0x0010);6228 reg_w(gspca_dev, 0x03, 0x0012);6229 msleep(2);6230 reg_w(gspca_dev, 0x01, 0x0012);6231 retword = i2c_read(gspca_dev, 0x00);6232 if (retword != 0) {6233 gspca_dbg(gspca_dev, D_PROBE, "probe 3wr vga type %02x\n",6234 retword);6235 if (retword == 0x0011) /* gc0303 */6236 return 0x0303;6237 if (retword == 0x0029) /* gc0305 */6238 send_unknown(gspca_dev, SENSOR_GC0305);6239 return retword;6240 }6241 6242 reg_w(gspca_dev, 0x01, 0x0000); /* check OmniVision */6243 reg_w(gspca_dev, 0x01, 0x0001);6244 reg_w(gspca_dev, 0xa1, 0x008b);6245 reg_w(gspca_dev, 0x08, 0x008d);6246 reg_w(gspca_dev, 0x06, 0x0010);6247 reg_w(gspca_dev, 0x01, 0x0012);6248 reg_w(gspca_dev, 0x05, 0x0012);6249 if (i2c_read(gspca_dev, 0x1c) == 0x007f /* OV7610 - manufacturer ID */6250 && i2c_read(gspca_dev, 0x1d) == 0x00a2) {6251 send_unknown(gspca_dev, SENSOR_OV7620);6252 return 0x06; /* OmniVision confirm ? */6253 }6254 6255 reg_w(gspca_dev, 0x01, 0x0000);6256 reg_w(gspca_dev, 0x00, 0x0002);6257 reg_w(gspca_dev, 0x01, 0x0010);6258 reg_w(gspca_dev, 0x01, 0x0001);6259 reg_w(gspca_dev, 0xee, 0x008b);6260 reg_w(gspca_dev, 0x03, 0x0012);6261 reg_w(gspca_dev, 0x01, 0x0012);6262 reg_w(gspca_dev, 0x05, 0x0012);6263 retword = i2c_read(gspca_dev, 0x00) << 8; /* ID 0 */6264 retword |= i2c_read(gspca_dev, 0x01); /* ID 1 */6265 gspca_dbg(gspca_dev, D_PROBE, "probe 3wr vga 2 0x%04x\n", retword);6266 if (retword == 0x2030) {6267 u8 retbyte;6268 6269 retbyte = i2c_read(gspca_dev, 0x02); /* revision number */6270 gspca_dbg(gspca_dev, D_PROBE, "sensor PO2030 rev 0x%02x\n",6271 retbyte);6272 6273 send_unknown(gspca_dev, SENSOR_PO2030);6274 return retword;6275 }6276 6277 reg_w(gspca_dev, 0x01, 0x0000);6278 reg_w(gspca_dev, 0x0a, 0x0010);6279 reg_w(gspca_dev, 0xd3, 0x008b);6280 reg_w(gspca_dev, 0x01, 0x0001);6281 reg_w(gspca_dev, 0x03, 0x0012);6282 reg_w(gspca_dev, 0x01, 0x0012);6283 reg_w(gspca_dev, 0x05, 0x0012);6284 reg_w(gspca_dev, 0xd3, 0x008b);6285 retword = i2c_read(gspca_dev, 0x01);6286 if (retword != 0) {6287 gspca_dbg(gspca_dev, D_PROBE, "probe 3wr vga type 0a ? ret: %04x\n",6288 retword);6289 return 0x16; /* adcm2700 (6100/6200) */6290 }6291 return -1;6292}6293 6294static int zcxx_probeSensor(struct gspca_dev *gspca_dev)6295{6296 struct sd *sd = (struct sd *) gspca_dev;6297 int sensor;6298 6299 switch (sd->sensor) {6300 case SENSOR_MC501CB:6301 return -1; /* don't probe */6302 case SENSOR_GC0303:6303 /* may probe but with no write in reg 0x0010 */6304 return -1; /* don't probe */6305 case SENSOR_PAS106:6306 sensor = sif_probe(gspca_dev);6307 if (sensor >= 0)6308 return sensor;6309 break;6310 }6311 sensor = vga_2wr_probe(gspca_dev);6312 if (sensor >= 0)6313 return sensor;6314 return vga_3wr_probe(gspca_dev);6315}6316 6317/* this function is called at probe time */6318static int sd_config(struct gspca_dev *gspca_dev,6319 const struct usb_device_id *id)6320{6321 struct sd *sd = (struct sd *) gspca_dev;6322 6323 if (id->idProduct == 0x301b)6324 sd->bridge = BRIDGE_ZC301;6325 else6326 sd->bridge = BRIDGE_ZC303;6327 6328 /* define some sensors from the vendor/product */6329 sd->sensor = id->driver_info;6330 6331 sd->reg08 = REG08_DEF;6332 6333 INIT_WORK(&sd->work, transfer_update);6334 6335 return 0;6336}6337 6338static int zcxx_g_volatile_ctrl(struct v4l2_ctrl *ctrl)6339{6340 struct gspca_dev *gspca_dev =6341 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);6342 struct sd *sd = (struct sd *)gspca_dev;6343 6344 switch (ctrl->id) {6345 case V4L2_CID_AUTOGAIN:6346 gspca_dev->usb_err = 0;6347 if (ctrl->val && sd->exposure && gspca_dev->streaming)6348 sd->exposure->val = getexposure(gspca_dev);6349 return gspca_dev->usb_err;6350 }6351 return -EINVAL;6352}6353 6354static int zcxx_s_ctrl(struct v4l2_ctrl *ctrl)6355{6356 struct gspca_dev *gspca_dev =6357 container_of(ctrl->handler, struct gspca_dev, ctrl_handler);6358 struct sd *sd = (struct sd *)gspca_dev;6359 int i, qual;6360 6361 gspca_dev->usb_err = 0;6362 6363 if (ctrl->id == V4L2_CID_JPEG_COMPRESSION_QUALITY) {6364 qual = sd->reg08 >> 1;6365 6366 for (i = 0; i < ARRAY_SIZE(jpeg_qual); i++) {6367 if (ctrl->val <= jpeg_qual[i])6368 break;6369 }6370 if (i == ARRAY_SIZE(jpeg_qual) || (i > 0 && i == qual && ctrl->val < jpeg_qual[i]))6371 i--;6372 6373 /* With high quality settings we need max bandwidth */6374 if (i >= 2 && gspca_dev->streaming &&6375 !gspca_dev->cam.needs_full_bandwidth)6376 return -EBUSY;6377 6378 sd->reg08 = (i << 1) | 1;6379 ctrl->val = jpeg_qual[i];6380 }6381 6382 if (!gspca_dev->streaming)6383 return 0;6384 6385 switch (ctrl->id) {6386 /* gamma/brightness/contrast cluster */6387 case V4L2_CID_GAMMA:6388 setcontrast(gspca_dev, sd->gamma->val,6389 sd->brightness->val, sd->contrast->val);6390 break;6391 /* autogain/exposure cluster */6392 case V4L2_CID_AUTOGAIN:6393 setautogain(gspca_dev, ctrl->val);6394 if (!gspca_dev->usb_err && !ctrl->val && sd->exposure)6395 setexposure(gspca_dev, sd->exposure->val);6396 break;6397 case V4L2_CID_POWER_LINE_FREQUENCY:6398 setlightfreq(gspca_dev, ctrl->val);6399 break;6400 case V4L2_CID_SHARPNESS:6401 setsharpness(gspca_dev, ctrl->val);6402 break;6403 case V4L2_CID_JPEG_COMPRESSION_QUALITY:6404 setquality(gspca_dev);6405 break;6406 }6407 return gspca_dev->usb_err;6408}6409 6410static const struct v4l2_ctrl_ops zcxx_ctrl_ops = {6411 .g_volatile_ctrl = zcxx_g_volatile_ctrl,6412 .s_ctrl = zcxx_s_ctrl,6413};6414 6415static int sd_init_controls(struct gspca_dev *gspca_dev)6416{6417 struct sd *sd = (struct sd *)gspca_dev;6418 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;6419 static const u8 gamma[SENSOR_MAX] = {6420 [SENSOR_ADCM2700] = 4,6421 [SENSOR_CS2102] = 4,6422 [SENSOR_CS2102K] = 5,6423 [SENSOR_GC0303] = 3,6424 [SENSOR_GC0305] = 4,6425 [SENSOR_HDCS2020] = 4,6426 [SENSOR_HV7131B] = 4,6427 [SENSOR_HV7131R] = 4,6428 [SENSOR_ICM105A] = 4,6429 [SENSOR_MC501CB] = 4,6430 [SENSOR_MT9V111_1] = 4,6431 [SENSOR_MT9V111_3] = 4,6432 [SENSOR_OV7620] = 3,6433 [SENSOR_OV7630C] = 4,6434 [SENSOR_PAS106] = 4,6435 [SENSOR_PAS202B] = 4,6436 [SENSOR_PB0330] = 4,6437 [SENSOR_PO2030] = 4,6438 [SENSOR_TAS5130C] = 3,6439 };6440 6441 gspca_dev->vdev.ctrl_handler = hdl;6442 v4l2_ctrl_handler_init(hdl, 8);6443 sd->brightness = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6444 V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);6445 sd->contrast = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6446 V4L2_CID_CONTRAST, 0, 255, 1, 128);6447 sd->gamma = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6448 V4L2_CID_GAMMA, 1, 6, 1, gamma[sd->sensor]);6449 if (sd->sensor == SENSOR_HV7131R)6450 sd->exposure = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6451 V4L2_CID_EXPOSURE, 0x30d, 0x493e, 1, 0x927);6452 else if (sd->sensor == SENSOR_OV7620)6453 sd->exposure = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6454 V4L2_CID_EXPOSURE, 0, 255, 1, 0x41);6455 sd->autogain = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6456 V4L2_CID_AUTOGAIN, 0, 1, 1, 1);6457 if (sd->sensor != SENSOR_OV7630C)6458 sd->plfreq = v4l2_ctrl_new_std_menu(hdl, &zcxx_ctrl_ops,6459 V4L2_CID_POWER_LINE_FREQUENCY,6460 V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,6461 V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);6462 sd->sharpness = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6463 V4L2_CID_SHARPNESS, 0, 3, 1,6464 sd->sensor == SENSOR_PO2030 ? 0 : 2);6465 sd->jpegqual = v4l2_ctrl_new_std(hdl, &zcxx_ctrl_ops,6466 V4L2_CID_JPEG_COMPRESSION_QUALITY,6467 jpeg_qual[0], jpeg_qual[ARRAY_SIZE(jpeg_qual) - 1], 1,6468 jpeg_qual[REG08_DEF >> 1]);6469 if (hdl->error) {6470 pr_err("Could not initialize controls\n");6471 return hdl->error;6472 }6473 v4l2_ctrl_cluster(3, &sd->gamma);6474 if (sd->sensor == SENSOR_HV7131R || sd->sensor == SENSOR_OV7620)6475 v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, true);6476 return 0;6477}6478 6479/* this function is called at probe and resume time */6480static int sd_init(struct gspca_dev *gspca_dev)6481{6482 struct sd *sd = (struct sd *) gspca_dev;6483 struct cam *cam;6484 int sensor;6485 static const u8 mode_tb[SENSOR_MAX] = {6486 [SENSOR_ADCM2700] = 2,6487 [SENSOR_CS2102] = 1,6488 [SENSOR_CS2102K] = 1,6489 [SENSOR_GC0303] = 1,6490 [SENSOR_GC0305] = 1,6491 [SENSOR_HDCS2020] = 1,6492 [SENSOR_HV7131B] = 1,6493 [SENSOR_HV7131R] = 1,6494 [SENSOR_ICM105A] = 1,6495 [SENSOR_MC501CB] = 2,6496 [SENSOR_MT9V111_1] = 1,6497 [SENSOR_MT9V111_3] = 1,6498 [SENSOR_OV7620] = 2,6499 [SENSOR_OV7630C] = 1,6500 [SENSOR_PAS106] = 0,6501 [SENSOR_PAS202B] = 1,6502 [SENSOR_PB0330] = 1,6503 [SENSOR_PO2030] = 1,6504 [SENSOR_TAS5130C] = 1,6505 };6506 6507 sensor = zcxx_probeSensor(gspca_dev);6508 if (sensor >= 0)6509 gspca_dbg(gspca_dev, D_PROBE, "probe sensor -> %04x\n", sensor);6510 if ((unsigned) force_sensor < SENSOR_MAX) {6511 sd->sensor = force_sensor;6512 gspca_dbg(gspca_dev, D_PROBE, "sensor forced to %d\n",6513 force_sensor);6514 } else {6515 switch (sensor) {6516 case -1:6517 switch (sd->sensor) {6518 case SENSOR_MC501CB:6519 gspca_dbg(gspca_dev, D_PROBE, "Sensor MC501CB\n");6520 break;6521 case SENSOR_GC0303:6522 gspca_dbg(gspca_dev, D_PROBE, "Sensor GC0303\n");6523 break;6524 default:6525 pr_warn("Unknown sensor - set to TAS5130C\n");6526 sd->sensor = SENSOR_TAS5130C;6527 }6528 break;6529 case 0:6530 /* check the sensor type */6531 sensor = i2c_read(gspca_dev, 0x00);6532 gspca_dbg(gspca_dev, D_PROBE, "Sensor hv7131 type %d\n",6533 sensor);6534 switch (sensor) {6535 case 0: /* hv7131b */6536 case 1: /* hv7131e */6537 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor HV7131B\n");6538 sd->sensor = SENSOR_HV7131B;6539 break;6540 default:6541/* case 2: * hv7131r */6542 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor HV7131R\n");6543 sd->sensor = SENSOR_HV7131R;6544 break;6545 }6546 break;6547 case 0x02:6548 gspca_dbg(gspca_dev, D_PROBE, "Sensor TAS5130C\n");6549 sd->sensor = SENSOR_TAS5130C;6550 break;6551 case 0x04:6552 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor CS2102\n");6553 sd->sensor = SENSOR_CS2102;6554 break;6555 case 0x08:6556 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor HDCS2020\n");6557 sd->sensor = SENSOR_HDCS2020;6558 break;6559 case 0x0a:6560 gspca_dbg(gspca_dev, D_PROBE,6561 "Find Sensor PB0330. Chip revision %x\n",6562 sd->chip_revision);6563 sd->sensor = SENSOR_PB0330;6564 break;6565 case 0x0c:6566 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor ICM105A\n");6567 sd->sensor = SENSOR_ICM105A;6568 break;6569 case 0x0e:6570 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor PAS202B\n");6571 sd->sensor = SENSOR_PAS202B;6572 break;6573 case 0x0f:6574 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor PAS106\n");6575 sd->sensor = SENSOR_PAS106;6576 break;6577 case 0x10:6578 case 0x12:6579 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor TAS5130C\n");6580 sd->sensor = SENSOR_TAS5130C;6581 break;6582 case 0x11:6583 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor HV7131R\n");6584 sd->sensor = SENSOR_HV7131R;6585 break;6586 case 0x13:6587 case 0x15:6588 gspca_dbg(gspca_dev, D_PROBE,6589 "Sensor MT9V111. Chip revision %04x\n",6590 sd->chip_revision);6591 sd->sensor = sd->bridge == BRIDGE_ZC3016592 ? SENSOR_MT9V111_16593 : SENSOR_MT9V111_3;6594 break;6595 case 0x14:6596 gspca_dbg(gspca_dev, D_PROBE,6597 "Find Sensor CS2102K?. Chip revision %x\n",6598 sd->chip_revision);6599 sd->sensor = SENSOR_CS2102K;6600 break;6601 case 0x16:6602 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor ADCM2700\n");6603 sd->sensor = SENSOR_ADCM2700;6604 break;6605 case 0x29:6606 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor GC0305\n");6607 sd->sensor = SENSOR_GC0305;6608 break;6609 case 0x0303:6610 gspca_dbg(gspca_dev, D_PROBE, "Sensor GC0303\n");6611 sd->sensor = SENSOR_GC0303;6612 break;6613 case 0x2030:6614 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor PO2030\n");6615 sd->sensor = SENSOR_PO2030;6616 break;6617 case 0x7620:6618 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor OV7620\n");6619 sd->sensor = SENSOR_OV7620;6620 break;6621 case 0x7631:6622 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor OV7630C\n");6623 sd->sensor = SENSOR_OV7630C;6624 break;6625 case 0x7648:6626 gspca_dbg(gspca_dev, D_PROBE, "Find Sensor OV7648\n");6627 sd->sensor = SENSOR_OV7620; /* same sensor (?) */6628 break;6629 default:6630 pr_err("Unknown sensor %04x\n", sensor);6631 return -EINVAL;6632 }6633 }6634 if (sensor < 0x20) {6635 if (sensor == -1 || sensor == 0x10 || sensor == 0x12)6636 reg_w(gspca_dev, 0x02, 0x0010);6637 reg_r(gspca_dev, 0x0010);6638 }6639 6640 cam = &gspca_dev->cam;6641 switch (mode_tb[sd->sensor]) {6642 case 0:6643 cam->cam_mode = sif_mode;6644 cam->nmodes = ARRAY_SIZE(sif_mode);6645 break;6646 case 1:6647 cam->cam_mode = vga_mode;6648 cam->nmodes = ARRAY_SIZE(vga_mode);6649 break;6650 default:6651/* case 2: */6652 cam->cam_mode = broken_vga_mode;6653 cam->nmodes = ARRAY_SIZE(broken_vga_mode);6654 break;6655 }6656 6657 /* switch off the led */6658 reg_w(gspca_dev, 0x01, 0x0000);6659 return gspca_dev->usb_err;6660}6661 6662static int sd_pre_start(struct gspca_dev *gspca_dev)6663{6664 struct sd *sd = (struct sd *) gspca_dev;6665 gspca_dev->cam.needs_full_bandwidth = (sd->reg08 >= 4) ? 1 : 0;6666 return 0;6667}6668 6669static int sd_start(struct gspca_dev *gspca_dev)6670{6671 struct sd *sd = (struct sd *) gspca_dev;6672 int mode;6673 static const struct usb_action *init_tb[SENSOR_MAX][2] = {6674 [SENSOR_ADCM2700] =6675 {adcm2700_Initial, adcm2700_InitialScale},6676 [SENSOR_CS2102] =6677 {cs2102_Initial, cs2102_InitialScale},6678 [SENSOR_CS2102K] =6679 {cs2102K_Initial, cs2102K_InitialScale},6680 [SENSOR_GC0303] =6681 {gc0303_Initial, gc0303_InitialScale},6682 [SENSOR_GC0305] =6683 {gc0305_Initial, gc0305_InitialScale},6684 [SENSOR_HDCS2020] =6685 {hdcs2020_Initial, hdcs2020_InitialScale},6686 [SENSOR_HV7131B] =6687 {hv7131b_Initial, hv7131b_InitialScale},6688 [SENSOR_HV7131R] =6689 {hv7131r_Initial, hv7131r_InitialScale},6690 [SENSOR_ICM105A] =6691 {icm105a_Initial, icm105a_InitialScale},6692 [SENSOR_MC501CB] =6693 {mc501cb_Initial, mc501cb_InitialScale},6694 [SENSOR_MT9V111_1] =6695 {mt9v111_1_Initial, mt9v111_1_InitialScale},6696 [SENSOR_MT9V111_3] =6697 {mt9v111_3_Initial, mt9v111_3_InitialScale},6698 [SENSOR_OV7620] =6699 {ov7620_Initial, ov7620_InitialScale},6700 [SENSOR_OV7630C] =6701 {ov7630c_Initial, ov7630c_InitialScale},6702 [SENSOR_PAS106] =6703 {pas106b_Initial, pas106b_InitialScale},6704 [SENSOR_PAS202B] =6705 {pas202b_Initial, pas202b_InitialScale},6706 [SENSOR_PB0330] =6707 {pb0330_Initial, pb0330_InitialScale},6708 [SENSOR_PO2030] =6709 {po2030_Initial, po2030_InitialScale},6710 [SENSOR_TAS5130C] =6711 {tas5130c_Initial, tas5130c_InitialScale},6712 };6713 6714 /* create the JPEG header */6715 jpeg_define(sd->jpeg_hdr, gspca_dev->pixfmt.height,6716 gspca_dev->pixfmt.width,6717 0x21); /* JPEG 422 */6718 6719 mode = gspca_dev->cam.cam_mode[gspca_dev->curr_mode].priv;6720 switch (sd->sensor) {6721 case SENSOR_HV7131R:6722 zcxx_probeSensor(gspca_dev);6723 break;6724 case SENSOR_PAS106:6725 usb_exchange(gspca_dev, pas106b_Initial_com);6726 break;6727 }6728 usb_exchange(gspca_dev, init_tb[sd->sensor][mode]);6729 6730 switch (sd->sensor) {6731 case SENSOR_ADCM2700:6732 case SENSOR_GC0305:6733 case SENSOR_OV7620:6734 case SENSOR_PO2030:6735 case SENSOR_TAS5130C:6736 case SENSOR_GC0303:6737/* msleep(100); * ?? */6738 reg_r(gspca_dev, 0x0002); /* --> 0x40 */6739 reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */6740 reg_w(gspca_dev, 0x15, 0x01ae);6741 if (sd->sensor == SENSOR_TAS5130C)6742 break;6743 reg_w(gspca_dev, 0x0d, 0x003a);6744 reg_w(gspca_dev, 0x02, 0x003b);6745 reg_w(gspca_dev, 0x00, 0x0038);6746 break;6747 case SENSOR_HV7131R:6748 case SENSOR_PAS202B:6749 reg_w(gspca_dev, 0x03, 0x003b);6750 reg_w(gspca_dev, 0x0c, 0x003a);6751 reg_w(gspca_dev, 0x0b, 0x0039);6752 if (sd->sensor == SENSOR_HV7131R)6753 reg_w(gspca_dev, 0x50, ZC3XX_R11D_GLOBALGAIN);6754 break;6755 }6756 6757 setmatrix(gspca_dev);6758 switch (sd->sensor) {6759 case SENSOR_ADCM2700:6760 case SENSOR_OV7620:6761 reg_r(gspca_dev, 0x0008);6762 reg_w(gspca_dev, 0x00, 0x0008);6763 break;6764 case SENSOR_PAS202B:6765 case SENSOR_GC0305:6766 case SENSOR_HV7131R:6767 case SENSOR_TAS5130C:6768 reg_r(gspca_dev, 0x0008);6769 fallthrough;6770 case SENSOR_PO2030:6771 reg_w(gspca_dev, 0x03, 0x0008);6772 break;6773 }6774 setsharpness(gspca_dev, v4l2_ctrl_g_ctrl(sd->sharpness));6775 6776 /* set the gamma tables when not set */6777 switch (sd->sensor) {6778 case SENSOR_CS2102K: /* gamma set in xxx_Initial */6779 case SENSOR_HDCS2020:6780 case SENSOR_OV7630C:6781 break;6782 default:6783 setcontrast(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma),6784 v4l2_ctrl_g_ctrl(sd->brightness),6785 v4l2_ctrl_g_ctrl(sd->contrast));6786 break;6787 }6788 setmatrix(gspca_dev); /* one more time? */6789 switch (sd->sensor) {6790 case SENSOR_OV7620:6791 case SENSOR_PAS202B:6792 reg_r(gspca_dev, 0x0180); /* from win */6793 reg_w(gspca_dev, 0x00, 0x0180);6794 break;6795 }6796 setquality(gspca_dev);6797 /* Start with BRC disabled, transfer_update will enable it if needed */6798 reg_w(gspca_dev, 0x00, 0x0007);6799 if (sd->plfreq)6800 setlightfreq(gspca_dev, v4l2_ctrl_g_ctrl(sd->plfreq));6801 6802 switch (sd->sensor) {6803 case SENSOR_ADCM2700:6804 reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */6805 reg_w(gspca_dev, 0x15, 0x01ae);6806 reg_w(gspca_dev, 0x02, 0x0180);6807 /* ms-win + */6808 reg_w(gspca_dev, 0x40, 0x0117);6809 break;6810 case SENSOR_HV7131R:6811 setexposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure));6812 reg_w(gspca_dev, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN);6813 break;6814 case SENSOR_GC0305:6815 case SENSOR_TAS5130C:6816 reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */6817 reg_w(gspca_dev, 0x15, 0x01ae);6818 fallthrough;6819 case SENSOR_PAS202B:6820 case SENSOR_PO2030:6821/* reg_w(gspca_dev, 0x40, ZC3XX_R117_GGAIN); in win traces */6822 reg_r(gspca_dev, 0x0180);6823 break;6824 case SENSOR_OV7620:6825 reg_w(gspca_dev, 0x09, 0x01ad);6826 reg_w(gspca_dev, 0x15, 0x01ae);6827 i2c_read(gspca_dev, 0x13); /*fixme: returns 0xa3 */6828 i2c_write(gspca_dev, 0x13, 0xa3, 0x00);6829 /*fixme: returned value to send? */6830 reg_w(gspca_dev, 0x40, 0x0117);6831 reg_r(gspca_dev, 0x0180);6832 break;6833 }6834 6835 setautogain(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain));6836 6837 if (gspca_dev->usb_err < 0)6838 return gspca_dev->usb_err;6839 6840 /* Start the transfer parameters update thread */6841 schedule_work(&sd->work);6842 6843 return 0;6844}6845 6846/* called on streamoff with alt==0 and on disconnect */6847/* the usb_lock is held at entry - restore on exit */6848static void sd_stop0(struct gspca_dev *gspca_dev)6849{6850 struct sd *sd = (struct sd *) gspca_dev;6851 6852 mutex_unlock(&gspca_dev->usb_lock);6853 flush_work(&sd->work);6854 mutex_lock(&gspca_dev->usb_lock);6855 if (!gspca_dev->present)6856 return;6857 send_unknown(gspca_dev, sd->sensor);6858}6859 6860static void sd_pkt_scan(struct gspca_dev *gspca_dev,6861 u8 *data,6862 int len)6863{6864 struct sd *sd = (struct sd *) gspca_dev;6865 6866 /* check the JPEG end of frame */6867 if (len >= 36868 && data[len - 3] == 0xff && data[len - 2] == 0xd9) {6869/*fixme: what does the last byte mean?*/6870 gspca_frame_add(gspca_dev, LAST_PACKET,6871 data, len - 1);6872 return;6873 }6874 6875 /* check the JPEG start of a frame */6876 if (data[0] == 0xff && data[1] == 0xd8) {6877 /* put the JPEG header in the new frame */6878 gspca_frame_add(gspca_dev, FIRST_PACKET,6879 sd->jpeg_hdr, JPEG_HDR_SZ);6880 6881 /* remove the webcam's header:6882 * ff d8 ff fe 00 0e 00 00 ss ss 00 01 ww ww hh hh pp pp6883 * - 'ss ss' is the frame sequence number (BE)6884 * - 'ww ww' and 'hh hh' are the window dimensions (BE)6885 * - 'pp pp' is the packet sequence number (BE)6886 */6887 data += 18;6888 len -= 18;6889 }6890 gspca_frame_add(gspca_dev, INTER_PACKET, data, len);6891}6892 6893static int sd_set_jcomp(struct gspca_dev *gspca_dev,6894 const struct v4l2_jpegcompression *jcomp)6895{6896 struct sd *sd = (struct sd *) gspca_dev;6897 6898 return v4l2_ctrl_s_ctrl(sd->jpegqual, jcomp->quality);6899}6900 6901static int sd_get_jcomp(struct gspca_dev *gspca_dev,6902 struct v4l2_jpegcompression *jcomp)6903{6904 struct sd *sd = (struct sd *) gspca_dev;6905 6906 memset(jcomp, 0, sizeof *jcomp);6907 jcomp->quality = v4l2_ctrl_g_ctrl(sd->jpegqual);6908 jcomp->jpeg_markers = V4L2_JPEG_MARKER_DHT6909 | V4L2_JPEG_MARKER_DQT;6910 return 0;6911}6912 6913#if IS_ENABLED(CONFIG_INPUT)6914static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,6915 u8 *data, /* interrupt packet data */6916 int len) /* interrupt packet length */6917{6918 if (len == 8 && data[4] == 1) {6919 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);6920 input_sync(gspca_dev->input_dev);6921 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);6922 input_sync(gspca_dev->input_dev);6923 }6924 6925 return 0;6926}6927#endif6928 6929static const struct sd_desc sd_desc = {6930 .name = KBUILD_MODNAME,6931 .config = sd_config,6932 .init = sd_init,6933 .init_controls = sd_init_controls,6934 .isoc_init = sd_pre_start,6935 .start = sd_start,6936 .stop0 = sd_stop0,6937 .pkt_scan = sd_pkt_scan,6938 .get_jcomp = sd_get_jcomp,6939 .set_jcomp = sd_set_jcomp,6940#if IS_ENABLED(CONFIG_INPUT)6941 .int_pkt_scan = sd_int_pkt_scan,6942#endif6943};6944 6945static const struct usb_device_id device_table[] = {6946 {USB_DEVICE(0x03f0, 0x1b07)},6947 {USB_DEVICE(0x041e, 0x041e)},6948 {USB_DEVICE(0x041e, 0x4017)},6949 {USB_DEVICE(0x041e, 0x401c), .driver_info = SENSOR_PAS106},6950 {USB_DEVICE(0x041e, 0x401e)},6951 {USB_DEVICE(0x041e, 0x401f)},6952 {USB_DEVICE(0x041e, 0x4022)},6953 {USB_DEVICE(0x041e, 0x4029)},6954 {USB_DEVICE(0x041e, 0x4034), .driver_info = SENSOR_PAS106},6955 {USB_DEVICE(0x041e, 0x4035), .driver_info = SENSOR_PAS106},6956 {USB_DEVICE(0x041e, 0x4036)},6957 {USB_DEVICE(0x041e, 0x403a)},6958 {USB_DEVICE(0x041e, 0x4051), .driver_info = SENSOR_GC0303},6959 {USB_DEVICE(0x041e, 0x4053), .driver_info = SENSOR_GC0303},6960 {USB_DEVICE(0x0458, 0x7007)},6961 {USB_DEVICE(0x0458, 0x700c)},6962 {USB_DEVICE(0x0458, 0x700f)},6963 {USB_DEVICE(0x0461, 0x0a00)},6964 {USB_DEVICE(0x046d, 0x089d), .driver_info = SENSOR_MC501CB},6965 {USB_DEVICE(0x046d, 0x08a0)},6966 {USB_DEVICE(0x046d, 0x08a1)},6967 {USB_DEVICE(0x046d, 0x08a2)},6968 {USB_DEVICE(0x046d, 0x08a3)},6969 {USB_DEVICE(0x046d, 0x08a6)},6970 {USB_DEVICE(0x046d, 0x08a7)},6971 {USB_DEVICE(0x046d, 0x08a9)},6972 {USB_DEVICE(0x046d, 0x08aa)},6973 {USB_DEVICE(0x046d, 0x08ac)},6974 {USB_DEVICE(0x046d, 0x08ad)},6975 {USB_DEVICE(0x046d, 0x08ae)},6976 {USB_DEVICE(0x046d, 0x08af)},6977 {USB_DEVICE(0x046d, 0x08b9)},6978 {USB_DEVICE(0x046d, 0x08d7)},6979 {USB_DEVICE(0x046d, 0x08d8)},6980 {USB_DEVICE(0x046d, 0x08d9)},6981 {USB_DEVICE(0x046d, 0x08da)},6982 {USB_DEVICE(0x046d, 0x08dd), .driver_info = SENSOR_MC501CB},6983 {USB_DEVICE(0x0471, 0x0325), .driver_info = SENSOR_PAS106},6984 {USB_DEVICE(0x0471, 0x0326), .driver_info = SENSOR_PAS106},6985 {USB_DEVICE(0x0471, 0x032d), .driver_info = SENSOR_PAS106},6986 {USB_DEVICE(0x0471, 0x032e), .driver_info = SENSOR_PAS106},6987 {USB_DEVICE(0x055f, 0xc005)},6988 {USB_DEVICE(0x055f, 0xd003)},6989 {USB_DEVICE(0x055f, 0xd004)},6990 {USB_DEVICE(0x0698, 0x2003)},6991 {USB_DEVICE(0x0ac8, 0x0301), .driver_info = SENSOR_PAS106},6992 {USB_DEVICE(0x0ac8, 0x0302), .driver_info = SENSOR_PAS106},6993 {USB_DEVICE(0x0ac8, 0x301b)},6994 {USB_DEVICE(0x0ac8, 0x303b)},6995 {USB_DEVICE(0x0ac8, 0x305b)},6996 {USB_DEVICE(0x0ac8, 0x307b)},6997 {USB_DEVICE(0x10fd, 0x0128)},6998 {USB_DEVICE(0x10fd, 0x804d)},6999 {USB_DEVICE(0x10fd, 0x8050)},7000 {} /* end of entry */7001};7002MODULE_DEVICE_TABLE(usb, device_table);7003 7004/* -- device connect -- */7005static int sd_probe(struct usb_interface *intf,7006 const struct usb_device_id *id)7007{7008 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),7009 THIS_MODULE);7010}7011 7012/* USB driver */7013static struct usb_driver sd_driver = {7014 .name = KBUILD_MODNAME,7015 .id_table = device_table,7016 .probe = sd_probe,7017 .disconnect = gspca_disconnect,7018#ifdef CONFIG_PM7019 .suspend = gspca_suspend,7020 .resume = gspca_resume,7021 .reset_resume = gspca_resume,7022#endif7023};7024 7025module_usb_driver(sd_driver);7026 7027module_param(force_sensor, int, 0644);7028MODULE_PARM_DESC(force_sensor,7029 "Force sensor. Only for experts!!!");7030