/drivers/media/video/gspca/sonixj.c
C | 3115 lines | 2582 code | 218 blank | 315 comment | 197 complexity | a3e7656da81cae8cfe5226b4f8068b60 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
Large files files are truncated, but you can click here to view the full file
1/* 2 * Sonix sn9c102p sn9c105 sn9c120 (jpeg) subdriver 3 * 4 * Copyright (C) 2009-2010 Jean-Fran??ois Moine <http://moinejf.free.fr> 5 * Copyright (C) 2005 Michel Xhaard mxhaard@magic.fr 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 */ 21 22#define MODULE_NAME "sonixj" 23 24#include <linux/input.h> 25#include "gspca.h" 26#include "jpeg.h" 27 28MODULE_AUTHOR("Jean-Fran??ois Moine <http://moinejf.free.fr>"); 29MODULE_DESCRIPTION("GSPCA/SONIX JPEG USB Camera Driver"); 30MODULE_LICENSE("GPL"); 31 32/* controls */ 33enum e_ctrl { 34 BRIGHTNESS, 35 CONTRAST, 36 COLORS, 37 BLUE, 38 RED, 39 GAMMA, 40 AUTOGAIN, 41 HFLIP, 42 VFLIP, 43 SHARPNESS, 44 ILLUM, 45 FREQ, 46 NCTRLS /* number of controls */ 47}; 48 49/* specific webcam descriptor */ 50struct sd { 51 struct gspca_dev gspca_dev; /* !! must be the first item */ 52 53 struct gspca_ctrl ctrls[NCTRLS]; 54 55 atomic_t avg_lum; 56 u32 exposure; 57 58 struct work_struct work; 59 struct workqueue_struct *work_thread; 60 61 u32 pktsz; /* (used by pkt_scan) */ 62 u16 npkt; 63 s8 nchg; 64 s8 short_mark; 65 66 u8 quality; /* image quality */ 67#define QUALITY_MIN 25 68#define QUALITY_MAX 90 69#define QUALITY_DEF 70 70 71 u8 reg01; 72 u8 reg17; 73 u8 reg18; 74 u8 flags; 75 76 s8 ag_cnt; 77#define AG_CNT_START 13 78 79 u8 bridge; 80#define BRIDGE_SN9C102P 0 81#define BRIDGE_SN9C105 1 82#define BRIDGE_SN9C110 2 83#define BRIDGE_SN9C120 3 84 u8 sensor; /* Type of image sensor chip */ 85 u8 i2c_addr; 86 87 u8 jpeg_hdr[JPEG_HDR_SZ]; 88}; 89enum sensors { 90 SENSOR_ADCM1700, 91 SENSOR_GC0307, 92 SENSOR_HV7131R, 93 SENSOR_MI0360, 94 SENSOR_MI0360B, 95 SENSOR_MO4000, 96 SENSOR_MT9V111, 97 SENSOR_OM6802, 98 SENSOR_OV7630, 99 SENSOR_OV7648, 100 SENSOR_OV7660, 101 SENSOR_PO1030, 102 SENSOR_PO2030N, 103 SENSOR_SOI768, 104 SENSOR_SP80708, 105}; 106 107static void qual_upd(struct work_struct *work); 108 109/* device flags */ 110#define F_PDN_INV 0x01 /* inverse pin S_PWR_DN / sn_xxx tables */ 111#define F_ILLUM 0x02 /* presence of illuminator */ 112 113/* sn9c1xx definitions */ 114/* register 0x01 */ 115#define S_PWR_DN 0x01 /* sensor power down */ 116#define S_PDN_INV 0x02 /* inverse pin S_PWR_DN */ 117#define V_TX_EN 0x04 /* video transfer enable */ 118#define LED 0x08 /* output to pin LED */ 119#define SCL_SEL_OD 0x20 /* open-drain mode */ 120#define SYS_SEL_48M 0x40 /* system clock 0: 24MHz, 1: 48MHz */ 121/* register 0x17 */ 122#define MCK_SIZE_MASK 0x1f /* sensor master clock */ 123#define SEN_CLK_EN 0x20 /* enable sensor clock */ 124#define DEF_EN 0x80 /* defect pixel by 0: soft, 1: hard */ 125 126/* V4L2 controls supported by the driver */ 127static void setbrightness(struct gspca_dev *gspca_dev); 128static void setcontrast(struct gspca_dev *gspca_dev); 129static void setcolors(struct gspca_dev *gspca_dev); 130static void setredblue(struct gspca_dev *gspca_dev); 131static void setgamma(struct gspca_dev *gspca_dev); 132static void setautogain(struct gspca_dev *gspca_dev); 133static void sethvflip(struct gspca_dev *gspca_dev); 134static void setsharpness(struct gspca_dev *gspca_dev); 135static void setillum(struct gspca_dev *gspca_dev); 136static void setfreq(struct gspca_dev *gspca_dev); 137 138static const struct ctrl sd_ctrls[NCTRLS] = { 139[BRIGHTNESS] = { 140 { 141 .id = V4L2_CID_BRIGHTNESS, 142 .type = V4L2_CTRL_TYPE_INTEGER, 143 .name = "Brightness", 144 .minimum = 0, 145 .maximum = 0xff, 146 .step = 1, 147 .default_value = 0x80, 148 }, 149 .set_control = setbrightness 150 }, 151[CONTRAST] = { 152 { 153 .id = V4L2_CID_CONTRAST, 154 .type = V4L2_CTRL_TYPE_INTEGER, 155 .name = "Contrast", 156 .minimum = 0, 157#define CONTRAST_MAX 127 158 .maximum = CONTRAST_MAX, 159 .step = 1, 160 .default_value = 63, 161 }, 162 .set_control = setcontrast 163 }, 164[COLORS] = { 165 { 166 .id = V4L2_CID_SATURATION, 167 .type = V4L2_CTRL_TYPE_INTEGER, 168 .name = "Saturation", 169 .minimum = 0, 170 .maximum = 40, 171 .step = 1, 172#define COLORS_DEF 25 173 .default_value = COLORS_DEF, 174 }, 175 .set_control = setcolors 176 }, 177[BLUE] = { 178 { 179 .id = V4L2_CID_BLUE_BALANCE, 180 .type = V4L2_CTRL_TYPE_INTEGER, 181 .name = "Blue Balance", 182 .minimum = 24, 183 .maximum = 40, 184 .step = 1, 185 .default_value = 32, 186 }, 187 .set_control = setredblue 188 }, 189[RED] = { 190 { 191 .id = V4L2_CID_RED_BALANCE, 192 .type = V4L2_CTRL_TYPE_INTEGER, 193 .name = "Red Balance", 194 .minimum = 24, 195 .maximum = 40, 196 .step = 1, 197 .default_value = 32, 198 }, 199 .set_control = setredblue 200 }, 201[GAMMA] = { 202 { 203 .id = V4L2_CID_GAMMA, 204 .type = V4L2_CTRL_TYPE_INTEGER, 205 .name = "Gamma", 206 .minimum = 0, 207 .maximum = 40, 208 .step = 1, 209#define GAMMA_DEF 20 210 .default_value = GAMMA_DEF, 211 }, 212 .set_control = setgamma 213 }, 214[AUTOGAIN] = { 215 { 216 .id = V4L2_CID_AUTOGAIN, 217 .type = V4L2_CTRL_TYPE_BOOLEAN, 218 .name = "Auto Gain", 219 .minimum = 0, 220 .maximum = 1, 221 .step = 1, 222 .default_value = 1 223 }, 224 .set_control = setautogain 225 }, 226[HFLIP] = { 227 { 228 .id = V4L2_CID_HFLIP, 229 .type = V4L2_CTRL_TYPE_BOOLEAN, 230 .name = "Mirror", 231 .minimum = 0, 232 .maximum = 1, 233 .step = 1, 234 .default_value = 0, 235 }, 236 .set_control = sethvflip 237 }, 238[VFLIP] = { 239 { 240 .id = V4L2_CID_VFLIP, 241 .type = V4L2_CTRL_TYPE_BOOLEAN, 242 .name = "Vflip", 243 .minimum = 0, 244 .maximum = 1, 245 .step = 1, 246 .default_value = 0, 247 }, 248 .set_control = sethvflip 249 }, 250[SHARPNESS] = { 251 { 252 .id = V4L2_CID_SHARPNESS, 253 .type = V4L2_CTRL_TYPE_INTEGER, 254 .name = "Sharpness", 255 .minimum = 0, 256 .maximum = 255, 257 .step = 1, 258 .default_value = 90, 259 }, 260 .set_control = setsharpness 261 }, 262[ILLUM] = { 263 { 264 .id = V4L2_CID_ILLUMINATORS_1, 265 .type = V4L2_CTRL_TYPE_BOOLEAN, 266 .name = "Illuminator / infrared", 267 .minimum = 0, 268 .maximum = 1, 269 .step = 1, 270 .default_value = 0, 271 }, 272 .set_control = setillum 273 }, 274/* ov7630/ov7648/ov7660 only */ 275[FREQ] = { 276 { 277 .id = V4L2_CID_POWER_LINE_FREQUENCY, 278 .type = V4L2_CTRL_TYPE_MENU, 279 .name = "Light frequency filter", 280 .minimum = 0, 281 .maximum = 2, /* 0: 0, 1: 50Hz, 2:60Hz */ 282 .step = 1, 283 .default_value = 1, 284 }, 285 .set_control = setfreq 286 }, 287}; 288 289/* table of the disabled controls */ 290static const __u32 ctrl_dis[] = { 291[SENSOR_ADCM1700] = (1 << AUTOGAIN) | 292 (1 << HFLIP) | 293 (1 << VFLIP) | 294 (1 << FREQ), 295 296[SENSOR_GC0307] = (1 << HFLIP) | 297 (1 << VFLIP) | 298 (1 << FREQ), 299 300[SENSOR_HV7131R] = (1 << HFLIP) | 301 (1 << FREQ), 302 303[SENSOR_MI0360] = (1 << HFLIP) | 304 (1 << VFLIP) | 305 (1 << FREQ), 306 307[SENSOR_MI0360B] = (1 << HFLIP) | 308 (1 << VFLIP) | 309 (1 << FREQ), 310 311[SENSOR_MO4000] = (1 << HFLIP) | 312 (1 << VFLIP) | 313 (1 << FREQ), 314 315[SENSOR_MT9V111] = (1 << HFLIP) | 316 (1 << VFLIP) | 317 (1 << FREQ), 318 319[SENSOR_OM6802] = (1 << HFLIP) | 320 (1 << VFLIP) | 321 (1 << FREQ), 322 323[SENSOR_OV7630] = (1 << HFLIP), 324 325[SENSOR_OV7648] = (1 << HFLIP), 326 327[SENSOR_OV7660] = (1 << AUTOGAIN) | 328 (1 << HFLIP) | 329 (1 << VFLIP), 330 331[SENSOR_PO1030] = (1 << AUTOGAIN) | 332 (1 << HFLIP) | 333 (1 << VFLIP) | 334 (1 << FREQ), 335 336[SENSOR_PO2030N] = (1 << AUTOGAIN) | 337 (1 << FREQ), 338 339[SENSOR_SOI768] = (1 << AUTOGAIN) | 340 (1 << HFLIP) | 341 (1 << VFLIP) | 342 (1 << FREQ), 343 344[SENSOR_SP80708] = (1 << AUTOGAIN) | 345 (1 << HFLIP) | 346 (1 << VFLIP) | 347 (1 << FREQ), 348}; 349 350static const struct v4l2_pix_format cif_mode[] = { 351 {352, 288, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 352 .bytesperline = 352, 353 .sizeimage = 352 * 288 * 4 / 8 + 590, 354 .colorspace = V4L2_COLORSPACE_JPEG, 355 .priv = 0}, 356}; 357static const struct v4l2_pix_format vga_mode[] = { 358 {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 359 .bytesperline = 160, 360 .sizeimage = 160 * 120 * 4 / 8 + 590, 361 .colorspace = V4L2_COLORSPACE_JPEG, 362 .priv = 2}, 363 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 364 .bytesperline = 320, 365 .sizeimage = 320 * 240 * 3 / 8 + 590, 366 .colorspace = V4L2_COLORSPACE_JPEG, 367 .priv = 1}, 368 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 369 .bytesperline = 640, 370 /* Note 3 / 8 is not large enough, not even 5 / 8 is ?! */ 371 .sizeimage = 640 * 480 * 3 / 4 + 590, 372 .colorspace = V4L2_COLORSPACE_JPEG, 373 .priv = 0}, 374}; 375 376static const u8 sn_adcm1700[0x1c] = { 377/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 378 0x00, 0x43, 0x60, 0x00, 0x1a, 0x00, 0x00, 0x00, 379/* reg8 reg9 rega regb regc regd rege regf */ 380 0x80, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 381/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 382 0x03, 0x00, 0x05, 0x01, 0x05, 0x16, 0x12, 0x42, 383/* reg18 reg19 reg1a reg1b */ 384 0x06, 0x00, 0x00, 0x00 385}; 386 387static const u8 sn_gc0307[0x1c] = { 388/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 389 0x00, 0x61, 0x62, 0x00, 0x1a, 0x00, 0x00, 0x00, 390/* reg8 reg9 rega regb regc regd rege regf */ 391 0x80, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 392/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 393 0x03, 0x00, 0x03, 0x01, 0x08, 0x28, 0x1e, 0x02, 394/* reg18 reg19 reg1a reg1b */ 395 0x06, 0x00, 0x00, 0x00 396}; 397 398static const u8 sn_hv7131[0x1c] = { 399/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 400 0x00, 0x03, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20, 401/* reg8 reg9 rega regb regc regd rege regf */ 402 0x81, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 403/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 404 0x03, 0x00, 0x00, 0x01, 0x03, 0x28, 0x1e, 0x41, 405/* reg18 reg19 reg1a reg1b */ 406 0x0a, 0x00, 0x00, 0x00 407}; 408 409static const u8 sn_mi0360[0x1c] = { 410/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 411 0x00, 0x63, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20, 412/* reg8 reg9 rega regb regc regd rege regf */ 413 0x81, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 414/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 415 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x61, 416/* reg18 reg19 reg1a reg1b */ 417 0x06, 0x00, 0x00, 0x00 418}; 419 420static const u8 sn_mi0360b[0x1c] = { 421/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 422 0x00, 0x61, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 423/* reg8 reg9 rega regb regc regd rege regf */ 424 0x81, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 425/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 426 0x03, 0x00, 0x00, 0x02, 0x0a, 0x28, 0x1e, 0x40, 427/* reg18 reg19 reg1a reg1b */ 428 0x06, 0x00, 0x00, 0x00 429}; 430 431static const u8 sn_mo4000[0x1c] = { 432/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 433 0x00, 0x23, 0x60, 0x00, 0x1a, 0x00, 0x20, 0x18, 434/* reg8 reg9 rega regb regc regd rege regf */ 435 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 436/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 437 0x03, 0x00, 0x0b, 0x0f, 0x14, 0x28, 0x1e, 0x40, 438/* reg18 reg19 reg1a reg1b */ 439 0x08, 0x00, 0x00, 0x00 440}; 441 442static const u8 sn_mt9v111[0x1c] = { 443/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 444 0x00, 0x61, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20, 445/* reg8 reg9 rega regb regc regd rege regf */ 446 0x81, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 447/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 448 0x03, 0x00, 0x00, 0x02, 0x1c, 0x28, 0x1e, 0x40, 449/* reg18 reg19 reg1a reg1b */ 450 0x06, 0x00, 0x00, 0x00 451}; 452 453static const u8 sn_om6802[0x1c] = { 454/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 455 0x00, 0x23, 0x72, 0x00, 0x1a, 0x20, 0x20, 0x19, 456/* reg8 reg9 rega regb regc regd rege regf */ 457 0x80, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 458/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 459 0x03, 0x00, 0x51, 0x01, 0x00, 0x28, 0x1e, 0x40, 460/* reg18 reg19 reg1a reg1b */ 461 0x05, 0x00, 0x00, 0x00 462}; 463 464static const u8 sn_ov7630[0x1c] = { 465/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 466 0x00, 0x21, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 467/* reg8 reg9 rega regb regc regd rege regf */ 468 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 469/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 470 0x03, 0x00, 0x04, 0x01, 0x0a, 0x28, 0x1e, 0xc2, 471/* reg18 reg19 reg1a reg1b */ 472 0x0b, 0x00, 0x00, 0x00 473}; 474 475static const u8 sn_ov7648[0x1c] = { 476/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 477 0x00, 0x63, 0x40, 0x00, 0x1a, 0x20, 0x20, 0x20, 478/* reg8 reg9 rega regb regc regd rege regf */ 479 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 480/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 481 0x03, 0x00, 0x00, 0x01, 0x00, 0x28, 0x1e, 0x00, 482/* reg18 reg19 reg1a reg1b */ 483 0x0b, 0x00, 0x00, 0x00 484}; 485 486static const u8 sn_ov7660[0x1c] = { 487/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 488 0x00, 0x61, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 489/* reg8 reg9 rega regb regc regd rege regf */ 490 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 491/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 492 0x03, 0x00, 0x01, 0x01, 0x08, 0x28, 0x1e, 0x20, 493/* reg18 reg19 reg1a reg1b */ 494 0x07, 0x00, 0x00, 0x00 495}; 496 497static const u8 sn_po1030[0x1c] = { 498/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 499 0x00, 0x21, 0x62, 0x00, 0x1a, 0x20, 0x20, 0x20, 500/* reg8 reg9 rega regb regc regd rege regf */ 501 0x81, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 502/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 503 0x03, 0x00, 0x00, 0x06, 0x06, 0x28, 0x1e, 0x00, 504/* reg18 reg19 reg1a reg1b */ 505 0x07, 0x00, 0x00, 0x00 506}; 507 508static const u8 sn_po2030n[0x1c] = { 509/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 510 0x00, 0x63, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 511/* reg8 reg9 rega regb regc regd rege regf */ 512 0x81, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 513/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 514 0x03, 0x00, 0x00, 0x01, 0x14, 0x28, 0x1e, 0x00, 515/* reg18 reg19 reg1a reg1b */ 516 0x07, 0x00, 0x00, 0x00 517}; 518 519static const u8 sn_soi768[0x1c] = { 520/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 521 0x00, 0x21, 0x40, 0x00, 0x1a, 0x00, 0x00, 0x00, 522/* reg8 reg9 rega regb regc regd rege regf */ 523 0x81, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 524/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 525 0x03, 0x00, 0x00, 0x01, 0x08, 0x28, 0x1e, 0x00, 526/* reg18 reg19 reg1a reg1b */ 527 0x07, 0x00, 0x00, 0x00 528}; 529 530static const u8 sn_sp80708[0x1c] = { 531/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */ 532 0x00, 0x63, 0x60, 0x00, 0x1a, 0x20, 0x20, 0x20, 533/* reg8 reg9 rega regb regc regd rege regf */ 534 0x81, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 535/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */ 536 0x03, 0x00, 0x00, 0x03, 0x04, 0x28, 0x1e, 0x00, 537/* reg18 reg19 reg1a reg1b */ 538 0x07, 0x00, 0x00, 0x00 539}; 540 541/* sequence specific to the sensors - !! index = SENSOR_xxx */ 542static const u8 *sn_tb[] = { 543[SENSOR_ADCM1700] = sn_adcm1700, 544[SENSOR_GC0307] = sn_gc0307, 545[SENSOR_HV7131R] = sn_hv7131, 546[SENSOR_MI0360] = sn_mi0360, 547[SENSOR_MI0360B] = sn_mi0360b, 548[SENSOR_MO4000] = sn_mo4000, 549[SENSOR_MT9V111] = sn_mt9v111, 550[SENSOR_OM6802] = sn_om6802, 551[SENSOR_OV7630] = sn_ov7630, 552[SENSOR_OV7648] = sn_ov7648, 553[SENSOR_OV7660] = sn_ov7660, 554[SENSOR_PO1030] = sn_po1030, 555[SENSOR_PO2030N] = sn_po2030n, 556[SENSOR_SOI768] = sn_soi768, 557[SENSOR_SP80708] = sn_sp80708, 558}; 559 560/* default gamma table */ 561static const u8 gamma_def[17] = { 562 0x00, 0x2d, 0x46, 0x5a, 0x6c, 0x7c, 0x8b, 0x99, 563 0xa6, 0xb2, 0xbf, 0xca, 0xd5, 0xe0, 0xeb, 0xf5, 0xff 564}; 565/* gamma for sensor ADCM1700 */ 566static const u8 gamma_spec_0[17] = { 567 0x0f, 0x39, 0x5a, 0x74, 0x86, 0x95, 0xa6, 0xb4, 568 0xbd, 0xc4, 0xcc, 0xd4, 0xd5, 0xde, 0xe4, 0xed, 0xf5 569}; 570/* gamma for sensors HV7131R and MT9V111 */ 571static const u8 gamma_spec_1[17] = { 572 0x08, 0x3a, 0x52, 0x65, 0x75, 0x83, 0x91, 0x9d, 573 0xa9, 0xb4, 0xbe, 0xc8, 0xd2, 0xdb, 0xe4, 0xed, 0xf5 574}; 575/* gamma for sensor GC0307 */ 576static const u8 gamma_spec_2[17] = { 577 0x14, 0x37, 0x50, 0x6a, 0x7c, 0x8d, 0x9d, 0xab, 578 0xb5, 0xbf, 0xc2, 0xcb, 0xd1, 0xd6, 0xdb, 0xe1, 0xeb 579}; 580/* gamma for sensor SP80708 */ 581static const u8 gamma_spec_3[17] = { 582 0x0a, 0x2d, 0x4e, 0x68, 0x7d, 0x8f, 0x9f, 0xab, 583 0xb7, 0xc2, 0xcc, 0xd3, 0xd8, 0xde, 0xe2, 0xe5, 0xe6 584}; 585 586/* color matrix and offsets */ 587static const u8 reg84[] = { 588 0x14, 0x00, 0x27, 0x00, 0x07, 0x00, /* YR YG YB gains */ 589 0xe8, 0x0f, 0xda, 0x0f, 0x40, 0x00, /* UR UG UB */ 590 0x3e, 0x00, 0xcd, 0x0f, 0xf7, 0x0f, /* VR VG VB */ 591 0x00, 0x00, 0x00 /* YUV offsets */ 592}; 593 594#define DELAY 0xdd 595 596static const u8 adcm1700_sensor_init[][8] = { 597 {0xa0, 0x51, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x10}, 598 {0xb0, 0x51, 0x04, 0x08, 0x00, 0x00, 0x00, 0x10}, /* reset */ 599 {DELAY, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 600 {0xb0, 0x51, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10}, 601 {DELAY, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 602 {0xb0, 0x51, 0x0c, 0xe0, 0x2e, 0x00, 0x00, 0x10}, 603 {0xb0, 0x51, 0x10, 0x02, 0x02, 0x00, 0x00, 0x10}, 604 {0xb0, 0x51, 0x14, 0x0e, 0x0e, 0x00, 0x00, 0x10}, 605 {0xb0, 0x51, 0x1c, 0x00, 0x80, 0x00, 0x00, 0x10}, 606 {0xb0, 0x51, 0x20, 0x01, 0x00, 0x00, 0x00, 0x10}, 607 {DELAY, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 608 {0xb0, 0x51, 0x04, 0x04, 0x00, 0x00, 0x00, 0x10}, 609 {DELAY, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 610 {0xb0, 0x51, 0x04, 0x01, 0x00, 0x00, 0x00, 0x10}, 611 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10}, 612 {0xb0, 0x51, 0x14, 0x01, 0x00, 0x00, 0x00, 0x10}, 613 {0xb0, 0x51, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10}, 614 {} 615}; 616static const u8 adcm1700_sensor_param1[][8] = { 617 {0xb0, 0x51, 0x26, 0xf9, 0x01, 0x00, 0x00, 0x10}, /* exposure? */ 618 {0xd0, 0x51, 0x1e, 0x8e, 0x8e, 0x8e, 0x8e, 0x10}, 619 620 {0xa0, 0x51, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x10}, 621 {0xb0, 0x51, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10}, 622 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10}, 623 {0xb0, 0x51, 0x32, 0x00, 0x72, 0x00, 0x00, 0x10}, 624 {0xd0, 0x51, 0x1e, 0xbe, 0xd7, 0xe8, 0xbe, 0x10}, /* exposure? */ 625 626 {0xa0, 0x51, 0xfe, 0x01, 0x00, 0x00, 0x00, 0x10}, 627 {0xb0, 0x51, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10}, 628 {0xa0, 0x51, 0xfe, 0x10, 0x00, 0x00, 0x00, 0x10}, 629 {0xb0, 0x51, 0x32, 0x00, 0xa2, 0x00, 0x00, 0x10}, 630 {} 631}; 632static const u8 gc0307_sensor_init[][8] = { 633 {0xa0, 0x21, 0x43, 0x00, 0x00, 0x00, 0x00, 0x10}, 634 {0xa0, 0x21, 0x44, 0xa2, 0x00, 0x00, 0x00, 0x10}, 635 {0xa0, 0x21, 0x01, 0x6a, 0x00, 0x00, 0x00, 0x10}, 636 {0xa0, 0x21, 0x02, 0x70, 0x00, 0x00, 0x00, 0x10}, 637 {0xa0, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, 638 {0xa0, 0x21, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10}, 639 {0xa0, 0x21, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10}, 640 {0xa0, 0x21, 0x11, 0x05, 0x00, 0x00, 0x00, 0x10}, 641 {0xa0, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10}, 642 {0xa0, 0x21, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10}, 643 {0xa0, 0x21, 0x07, 0x00, 0x00, 0x00, 0x00, 0x10}, 644 {0xa0, 0x21, 0x08, 0x02, 0x00, 0x00, 0x00, 0x10}, 645 {0xa0, 0x21, 0x09, 0x01, 0x00, 0x00, 0x00, 0x10}, 646 {0xa0, 0x21, 0x0a, 0xe8, 0x00, 0x00, 0x00, 0x10}, 647 {0xa0, 0x21, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x10}, 648 {0xa0, 0x21, 0x0c, 0x80, 0x00, 0x00, 0x00, 0x10}, 649 {0xa0, 0x21, 0x0d, 0x22, 0x00, 0x00, 0x00, 0x10}, 650 {0xa0, 0x21, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x10}, 651 {0xa0, 0x21, 0x0f, 0xb2, 0x00, 0x00, 0x00, 0x10}, 652 {0xa0, 0x21, 0x12, 0x70, 0x00, 0x00, 0x00, 0x10}, 653 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*delay 10ms*/ 654 {0xa0, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 0x10}, 655 {0xa0, 0x21, 0x15, 0xb8, 0x00, 0x00, 0x00, 0x10}, 656 {0xa0, 0x21, 0x16, 0x13, 0x00, 0x00, 0x00, 0x10}, 657 {0xa0, 0x21, 0x17, 0x52, 0x00, 0x00, 0x00, 0x10}, 658 {0xa0, 0x21, 0x18, 0x50, 0x00, 0x00, 0x00, 0x10}, 659 {0xa0, 0x21, 0x1e, 0x0d, 0x00, 0x00, 0x00, 0x10}, 660 {0xa0, 0x21, 0x1f, 0x32, 0x00, 0x00, 0x00, 0x10}, 661 {0xa0, 0x21, 0x61, 0x90, 0x00, 0x00, 0x00, 0x10}, 662 {0xa0, 0x21, 0x63, 0x70, 0x00, 0x00, 0x00, 0x10}, 663 {0xa0, 0x21, 0x65, 0x98, 0x00, 0x00, 0x00, 0x10}, 664 {0xa0, 0x21, 0x67, 0x90, 0x00, 0x00, 0x00, 0x10}, 665 {0xa0, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10}, 666 {0xa0, 0x21, 0x04, 0x96, 0x00, 0x00, 0x00, 0x10}, 667 {0xa0, 0x21, 0x45, 0x27, 0x00, 0x00, 0x00, 0x10}, 668 {0xa0, 0x21, 0x47, 0x2c, 0x00, 0x00, 0x00, 0x10}, 669 {0xa0, 0x21, 0x43, 0x47, 0x00, 0x00, 0x00, 0x10}, 670 {0xa0, 0x21, 0x44, 0xd8, 0x00, 0x00, 0x00, 0x10}, 671 {} 672}; 673static const u8 gc0307_sensor_param1[][8] = { 674 {0xa0, 0x21, 0x68, 0x13, 0x00, 0x00, 0x00, 0x10}, 675 {0xd0, 0x21, 0x61, 0x80, 0x00, 0x80, 0x00, 0x10}, 676 {0xc0, 0x21, 0x65, 0x80, 0x00, 0x80, 0x00, 0x10}, 677 {0xc0, 0x21, 0x63, 0xa0, 0x00, 0xa6, 0x00, 0x10}, 678/*param3*/ 679 {0xa0, 0x21, 0x01, 0x6e, 0x00, 0x00, 0x00, 0x10}, 680 {0xa0, 0x21, 0x02, 0x88, 0x00, 0x00, 0x00, 0x10}, 681 {} 682}; 683 684static const u8 hv7131r_sensor_init[][8] = { 685 {0xc1, 0x11, 0x01, 0x08, 0x01, 0x00, 0x00, 0x10}, 686 {0xb1, 0x11, 0x34, 0x17, 0x7f, 0x00, 0x00, 0x10}, 687 {0xd1, 0x11, 0x40, 0xff, 0x7f, 0x7f, 0x7f, 0x10}, 688/* {0x91, 0x11, 0x44, 0x00, 0x00, 0x00, 0x00, 0x10}, */ 689 {0xd1, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, 690 {0xd1, 0x11, 0x14, 0x01, 0xe2, 0x02, 0x82, 0x10}, 691/* {0x91, 0x11, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10}, */ 692 693 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10}, 694 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10}, 695 {0xc1, 0x11, 0x25, 0x00, 0x61, 0xa8, 0x00, 0x10}, 696 {0xa1, 0x11, 0x30, 0x22, 0x00, 0x00, 0x00, 0x10}, 697 {0xc1, 0x11, 0x31, 0x20, 0x2e, 0x20, 0x00, 0x10}, 698 {0xc1, 0x11, 0x25, 0x00, 0xc3, 0x50, 0x00, 0x10}, 699 {0xa1, 0x11, 0x30, 0x07, 0x00, 0x00, 0x00, 0x10}, /* gain14 */ 700 {0xc1, 0x11, 0x31, 0x10, 0x10, 0x10, 0x00, 0x10}, /* r g b 101a10 */ 701 702 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10}, 703 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, 704 {0xa1, 0x11, 0x21, 0xd0, 0x00, 0x00, 0x00, 0x10}, 705 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10}, 706 {0xa1, 0x11, 0x23, 0x09, 0x00, 0x00, 0x00, 0x10}, 707 708 {0xa1, 0x11, 0x01, 0x08, 0x00, 0x00, 0x00, 0x10}, 709 {0xa1, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, 710 {0xa1, 0x11, 0x21, 0xd0, 0x00, 0x00, 0x00, 0x10}, 711 {0xa1, 0x11, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10}, 712 {0xa1, 0x11, 0x23, 0x10, 0x00, 0x00, 0x00, 0x10}, 713 {0xa1, 0x11, 0x01, 0x18, 0x00, 0x00, 0x00, 0x10}, 714 /* set sensor clock */ 715 {} 716}; 717static const u8 mi0360_sensor_init[][8] = { 718 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10}, 719 {0xb1, 0x5d, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10}, 720 {0xb1, 0x5d, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10}, 721 {0xd1, 0x5d, 0x01, 0x00, 0x08, 0x00, 0x16, 0x10}, 722 {0xd1, 0x5d, 0x03, 0x01, 0xe2, 0x02, 0x82, 0x10}, 723 {0xd1, 0x5d, 0x05, 0x00, 0x09, 0x00, 0x53, 0x10}, 724 {0xb1, 0x5d, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x10}, 725 {0xd1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10}, 726 {0xd1, 0x5d, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10}, 727 {0xd1, 0x5d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10}, 728 {0xd1, 0x5d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, 729 {0xd1, 0x5d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10}, 730 {0xd1, 0x5d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10}, 731 {0xd1, 0x5d, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, 732 {0xd1, 0x5d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10}, 733 {0xd1, 0x5d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x10}, 734 {0xd1, 0x5d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10}, 735 {0xb1, 0x5d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10}, 736 {0xd1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10}, 737 {0xd1, 0x5d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10}, 738 {0xd1, 0x5d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10}, 739 {0xd1, 0x5d, 0x26, 0x00, 0x00, 0x00, 0x24, 0x10}, 740 {0xd1, 0x5d, 0x2f, 0xf7, 0xB0, 0x00, 0x04, 0x10}, 741 {0xd1, 0x5d, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10}, 742 {0xd1, 0x5d, 0x33, 0x00, 0x00, 0x01, 0x00, 0x10}, 743 {0xb1, 0x5d, 0x3d, 0x06, 0x8f, 0x00, 0x00, 0x10}, 744 {0xd1, 0x5d, 0x40, 0x01, 0xe0, 0x00, 0xd1, 0x10}, 745 {0xb1, 0x5d, 0x44, 0x00, 0x82, 0x00, 0x00, 0x10}, 746 {0xd1, 0x5d, 0x58, 0x00, 0x78, 0x00, 0x43, 0x10}, 747 {0xd1, 0x5d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x10}, 748 {0xd1, 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x10}, 749 {0xd1, 0x5d, 0x5e, 0x00, 0x00, 0xa3, 0x1d, 0x10}, 750 {0xb1, 0x5d, 0x62, 0x04, 0x11, 0x00, 0x00, 0x10}, 751 752 {0xb1, 0x5d, 0x20, 0x91, 0x01, 0x00, 0x00, 0x10}, 753 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10}, 754 {0xb1, 0x5d, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10}, 755 {0xd1, 0x5d, 0x2b, 0x00, 0xa0, 0x00, 0xb0, 0x10}, 756 {0xd1, 0x5d, 0x2d, 0x00, 0xa0, 0x00, 0xa0, 0x10}, 757 758 {0xb1, 0x5d, 0x0a, 0x00, 0x02, 0x00, 0x00, 0x10}, /* sensor clck ?2 */ 759 {0xb1, 0x5d, 0x06, 0x00, 0x30, 0x00, 0x00, 0x10}, 760 {0xb1, 0x5d, 0x05, 0x00, 0x0a, 0x00, 0x00, 0x10}, 761 {0xb1, 0x5d, 0x09, 0x02, 0x35, 0x00, 0x00, 0x10}, /* exposure 2 */ 762 763 {0xd1, 0x5d, 0x2b, 0x00, 0xb9, 0x00, 0xe3, 0x10}, 764 {0xd1, 0x5d, 0x2d, 0x00, 0x5f, 0x00, 0xb9, 0x10}, /* 42 */ 765/* {0xb1, 0x5d, 0x35, 0x00, 0x67, 0x00, 0x00, 0x10}, * gain orig */ 766/* {0xb1, 0x5d, 0x35, 0x00, 0x20, 0x00, 0x00, 0x10}, * gain */ 767 {0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10}, /* update */ 768 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10}, /* sensor on */ 769 {} 770}; 771static const u8 mi0360b_sensor_init[][8] = { 772 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10}, 773 {0xb1, 0x5d, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10}, 774 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*delay 20ms*/ 775 {0xb1, 0x5d, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10}, 776 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*delay 20ms*/ 777 {0xd1, 0x5d, 0x01, 0x00, 0x08, 0x00, 0x16, 0x10}, 778 {0xd1, 0x5d, 0x03, 0x01, 0xe2, 0x02, 0x82, 0x10}, 779 {0xd1, 0x5d, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10}, 780 {0xb1, 0x5d, 0x0d, 0x00, 0x02, 0x00, 0x00, 0x10}, 781 {0xd1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10}, 782 {0xd1, 0x5d, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10}, 783 {0xd1, 0x5d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10}, 784 {0xd1, 0x5d, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, 785 {0xd1, 0x5d, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10}, 786 {0xd1, 0x5d, 0x14, 0x00, 0x00, 0x00, 0x00, 0x10}, 787 {0xd1, 0x5d, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, 788 {0xd1, 0x5d, 0x18, 0x00, 0x00, 0x00, 0x00, 0x10}, 789 {0xd1, 0x5d, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x10}, 790 {0xd1, 0x5d, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x10}, 791 {0xb1, 0x5d, 0x32, 0x00, 0x00, 0x00, 0x00, 0x10}, 792 {0xd1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10}, 793 {0xd1, 0x5d, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10}, 794 {0xd1, 0x5d, 0x24, 0x00, 0x00, 0x00, 0x00, 0x10}, 795 {0xd1, 0x5d, 0x26, 0x00, 0x00, 0x00, 0x24, 0x10}, 796 {0xd1, 0x5d, 0x2f, 0xf7, 0xb0, 0x00, 0x04, 0x10}, 797 {0xd1, 0x5d, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10}, 798 {0xd1, 0x5d, 0x33, 0x00, 0x00, 0x01, 0x00, 0x10}, 799 {0xb1, 0x5d, 0x3d, 0x06, 0x8f, 0x00, 0x00, 0x10}, 800 {0xd1, 0x5d, 0x40, 0x01, 0xe0, 0x00, 0xd1, 0x10}, 801 {0xb1, 0x5d, 0x44, 0x00, 0x82, 0x00, 0x00, 0x10}, 802 {0xd1, 0x5d, 0x58, 0x00, 0x78, 0x00, 0x43, 0x10}, 803 {0xd1, 0x5d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x10}, 804 {0xd1, 0x5d, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x10}, 805 {0xd1, 0x5d, 0x5e, 0x00, 0x00, 0xa3, 0x1d, 0x10}, 806 {0xb1, 0x5d, 0x62, 0x04, 0x11, 0x00, 0x00, 0x10}, 807 808 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10}, 809 {0xb1, 0x5d, 0x20, 0x11, 0x01, 0x00, 0x00, 0x10}, 810 {0xb1, 0x5d, 0x09, 0x00, 0x64, 0x00, 0x00, 0x10}, 811 {0xd1, 0x5d, 0x2b, 0x00, 0x33, 0x00, 0xa0, 0x10}, 812 {0xd1, 0x5d, 0x2d, 0x00, 0xa0, 0x00, 0x33, 0x10}, 813 {} 814}; 815static const u8 mi0360b_sensor_param1[][8] = { 816 {0xb1, 0x5d, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10}, 817 {0xb1, 0x5d, 0x06, 0x00, 0x53, 0x00, 0x00, 0x10}, 818 {0xb1, 0x5d, 0x05, 0x00, 0x09, 0x00, 0x00, 0x10}, 819 {0xb1, 0x5d, 0x09, 0x02, 0x35, 0x00, 0x00, 0x10}, /* exposure 2 */ 820 821 {0xd1, 0x5d, 0x2b, 0x00, 0xd1, 0x01, 0xc9, 0x10}, 822 {0xd1, 0x5d, 0x2d, 0x00, 0xed, 0x00, 0xd1, 0x10}, 823 {0xb1, 0x5d, 0x07, 0x00, 0x03, 0x00, 0x00, 0x10}, /* update */ 824 {0xb1, 0x5d, 0x07, 0x00, 0x02, 0x00, 0x00, 0x10}, /* sensor on */ 825 {} 826}; 827static const u8 mo4000_sensor_init[][8] = { 828 {0xa1, 0x21, 0x01, 0x02, 0x00, 0x00, 0x00, 0x10}, 829 {0xa1, 0x21, 0x02, 0x00, 0x00, 0x00, 0x00, 0x10}, 830 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10}, 831 {0xa1, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00, 0x10}, 832 {0xa1, 0x21, 0x05, 0x00, 0x00, 0x00, 0x00, 0x10}, 833 {0xa1, 0x21, 0x05, 0x04, 0x00, 0x00, 0x00, 0x10}, 834 {0xa1, 0x21, 0x06, 0x80, 0x00, 0x00, 0x00, 0x10}, 835 {0xa1, 0x21, 0x06, 0x81, 0x00, 0x00, 0x00, 0x10}, 836 {0xa1, 0x21, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x10}, 837 {0xa1, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10}, 838 {0xa1, 0x21, 0x11, 0x20, 0x00, 0x00, 0x00, 0x10}, 839 {0xa1, 0x21, 0x11, 0x30, 0x00, 0x00, 0x00, 0x10}, 840 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10}, 841 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10}, 842 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10}, 843 {0xa1, 0x21, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10}, 844 {0xa1, 0x21, 0x0f, 0x20, 0x00, 0x00, 0x00, 0x10}, 845 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10}, 846 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}, 847 {0xa1, 0x21, 0x11, 0x38, 0x00, 0x00, 0x00, 0x10}, 848 {} 849}; 850static const u8 mt9v111_sensor_init[][8] = { 851 {0xb1, 0x5c, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x10}, /* reset? */ 852 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 853 {0xb1, 0x5c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x10}, 854 {0xb1, 0x5c, 0x01, 0x00, 0x01, 0x00, 0x00, 0x10}, /* IFP select */ 855 {0xb1, 0x5c, 0x08, 0x04, 0x80, 0x00, 0x00, 0x10}, /* output fmt ctrl */ 856 {0xb1, 0x5c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10}, /* op mode ctrl */ 857 {0xb1, 0x5c, 0x01, 0x00, 0x04, 0x00, 0x00, 0x10}, /* sensor select */ 858 {0xb1, 0x5c, 0x08, 0x00, 0x08, 0x00, 0x00, 0x10}, /* row start */ 859 {0xb1, 0x5c, 0x02, 0x00, 0x16, 0x00, 0x00, 0x10}, /* col start */ 860 {0xb1, 0x5c, 0x03, 0x01, 0xe7, 0x00, 0x00, 0x10}, /* window height */ 861 {0xb1, 0x5c, 0x04, 0x02, 0x87, 0x00, 0x00, 0x10}, /* window width */ 862 {0xb1, 0x5c, 0x07, 0x30, 0x02, 0x00, 0x00, 0x10}, /* output ctrl */ 863 {0xb1, 0x5c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x10}, /* shutter delay */ 864 {0xb1, 0x5c, 0x12, 0x00, 0xb0, 0x00, 0x00, 0x10}, /* zoom col start */ 865 {0xb1, 0x5c, 0x13, 0x00, 0x7c, 0x00, 0x00, 0x10}, /* zoom row start */ 866 {0xb1, 0x5c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* digital zoom */ 867 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, /* read mode */ 868 {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, 869 {} 870}; 871static const u8 mt9v111_sensor_param1[][8] = { 872 {0xd1, 0x5c, 0x2b, 0x00, 0x33, 0x00, 0xad, 0x10}, /* G1 and B gains */ 873 {0xd1, 0x5c, 0x2d, 0x00, 0xad, 0x00, 0x33, 0x10}, /* R and G2 gains */ 874 {0xb1, 0x5c, 0x06, 0x00, 0x40, 0x00, 0x00, 0x10}, /* vert blanking */ 875 {0xb1, 0x5c, 0x05, 0x00, 0x09, 0x00, 0x00, 0x10}, /* horiz blanking */ 876 {0xb1, 0x5c, 0x35, 0x01, 0xc0, 0x00, 0x00, 0x10}, /* global gain */ 877 {} 878}; 879static const u8 om6802_init0[2][8] = { 880/*fixme: variable*/ 881 {0xa0, 0x34, 0x29, 0x0e, 0x00, 0x00, 0x00, 0x10}, 882 {0xa0, 0x34, 0x23, 0xb0, 0x00, 0x00, 0x00, 0x10}, 883}; 884static const u8 om6802_sensor_init[][8] = { 885 {0xa0, 0x34, 0xdf, 0x6d, 0x00, 0x00, 0x00, 0x10}, 886 /* factory mode */ 887 {0xa0, 0x34, 0xdd, 0x18, 0x00, 0x00, 0x00, 0x10}, 888 /* output raw RGB */ 889 {0xa0, 0x34, 0x5a, 0xc0, 0x00, 0x00, 0x00, 0x10}, 890/* {0xa0, 0x34, 0xfb, 0x11, 0x00, 0x00, 0x00, 0x10}, */ 891 {0xa0, 0x34, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x10}, 892 /* auto-exposure speed (0) / white balance mode (auto RGB) */ 893/* {0xa0, 0x34, 0xf1, 0x02, 0x00, 0x00, 0x00, 0x10}, 894 * set color mode */ 895/* {0xa0, 0x34, 0xfe, 0x5b, 0x00, 0x00, 0x00, 0x10}, 896 * max AGC value in AE */ 897/* {0xa0, 0x34, 0xe5, 0x00, 0x00, 0x00, 0x00, 0x10}, 898 * preset AGC */ 899/* {0xa0, 0x34, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x10}, 900 * preset brightness */ 901/* {0xa0, 0x34, 0xe7, 0x00, 0x00, 0x00, 0x00, 0x10}, 902 * preset contrast */ 903/* {0xa0, 0x34, 0xe8, 0x31, 0x00, 0x00, 0x00, 0x10}, 904 * preset gamma */ 905 {0xa0, 0x34, 0xe9, 0x0f, 0x00, 0x00, 0x00, 0x10}, 906 /* luminance mode (0x4f -> AutoExpo on) */ 907 {0xa0, 0x34, 0xe4, 0xff, 0x00, 0x00, 0x00, 0x10}, 908 /* preset shutter */ 909/* {0xa0, 0x34, 0xef, 0x00, 0x00, 0x00, 0x00, 0x10}, 910 * auto frame rate */ 911/* {0xa0, 0x34, 0xfb, 0xee, 0x00, 0x00, 0x00, 0x10}, */ 912 {0xa0, 0x34, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x10}, 913 {} 914}; 915static const u8 om6802_sensor_param1[][8] = { 916 {0xa0, 0x34, 0x71, 0x84, 0x00, 0x00, 0x00, 0x10}, 917 {0xa0, 0x34, 0x72, 0x05, 0x00, 0x00, 0x00, 0x10}, 918 {0xa0, 0x34, 0x68, 0x80, 0x00, 0x00, 0x00, 0x10}, 919 {0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10}, 920 {} 921}; 922static const u8 ov7630_sensor_init[][8] = { 923 {0xa1, 0x21, 0x76, 0x01, 0x00, 0x00, 0x00, 0x10}, 924 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10}, 925 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 926 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10}, 927 {0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10}, 928 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 929 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10}, 930/* win: i2c_r from 00 to 80 */ 931 {0xd1, 0x21, 0x03, 0x80, 0x10, 0x20, 0x80, 0x10}, 932 {0xb1, 0x21, 0x0c, 0x20, 0x20, 0x00, 0x00, 0x10}, 933/* HDG: 0x11 was 0x00 change to 0x01 for better exposure (15 fps instead of 30) 934 0x13 was 0xc0 change to 0xc3 for auto gain and exposure */ 935 {0xd1, 0x21, 0x11, 0x01, 0x48, 0xc3, 0x00, 0x10}, 936 {0xb1, 0x21, 0x15, 0x80, 0x03, 0x00, 0x00, 0x10}, 937 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10}, 938 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10}, 939 {0xd1, 0x21, 0x1f, 0x00, 0x80, 0x80, 0x80, 0x10}, 940 {0xd1, 0x21, 0x23, 0xde, 0x10, 0x8a, 0xa0, 0x10}, 941 {0xc1, 0x21, 0x27, 0xca, 0xa2, 0x74, 0x00, 0x10}, 942 {0xd1, 0x21, 0x2a, 0x88, 0x00, 0x88, 0x01, 0x10}, 943 {0xc1, 0x21, 0x2e, 0x80, 0x00, 0x18, 0x00, 0x10}, 944 {0xa1, 0x21, 0x21, 0x08, 0x00, 0x00, 0x00, 0x10}, 945 {0xa1, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10}, 946 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10}, 947 {0xb1, 0x21, 0x32, 0xc2, 0x08, 0x00, 0x00, 0x10}, 948 {0xb1, 0x21, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x10}, 949 {0xd1, 0x21, 0x60, 0x05, 0x40, 0x12, 0x57, 0x10}, 950 {0xa1, 0x21, 0x64, 0x73, 0x00, 0x00, 0x00, 0x10}, 951 {0xd1, 0x21, 0x65, 0x00, 0x55, 0x01, 0xac, 0x10}, 952 {0xa1, 0x21, 0x69, 0x38, 0x00, 0x00, 0x00, 0x10}, 953 {0xd1, 0x21, 0x6f, 0x1f, 0x01, 0x00, 0x10, 0x10}, 954 {0xd1, 0x21, 0x73, 0x50, 0x20, 0x02, 0x01, 0x10}, 955 {0xd1, 0x21, 0x77, 0xf3, 0x90, 0x98, 0x98, 0x10}, 956 {0xc1, 0x21, 0x7b, 0x00, 0x4c, 0xf7, 0x00, 0x10}, 957 {0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10}, 958 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10}, 959 {} 960}; 961static const u8 ov7630_sensor_param1[][8] = { 962 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10}, 963 {0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10}, 964/*fixme: + 0x12, 0x04*/ 965/* {0xa1, 0x21, 0x75, 0x82, 0x00, 0x00, 0x00, 0x10}, * COMN 966 * set by setvflip */ 967 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10}, 968 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}, 969 {0xb1, 0x21, 0x01, 0x80, 0x80, 0x00, 0x00, 0x10}, 970/* */ 971/* {0xa1, 0x21, 0x2a, 0x88, 0x00, 0x00, 0x00, 0x10}, * set by setfreq */ 972/* {0xa1, 0x21, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x10}, * set by setfreq */ 973/* */ 974 {0xa1, 0x21, 0x10, 0x83, 0x00, 0x00, 0x00, 0x10}, 975/* {0xb1, 0x21, 0x01, 0x88, 0x70, 0x00, 0x00, 0x10}, */ 976 {} 977}; 978 979static const u8 ov7648_sensor_init[][8] = { 980 {0xa1, 0x21, 0x76, 0x00, 0x00, 0x00, 0x00, 0x10}, 981 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset */ 982 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 983 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10}, 984 {0xd1, 0x21, 0x03, 0xa4, 0x30, 0x88, 0x00, 0x10}, 985 {0xb1, 0x21, 0x11, 0x80, 0x08, 0x00, 0x00, 0x10}, 986 {0xc1, 0x21, 0x13, 0xa0, 0x04, 0x84, 0x00, 0x10}, 987 {0xd1, 0x21, 0x17, 0x1a, 0x02, 0xba, 0xf4, 0x10}, 988 {0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10}, 989 {0xd1, 0x21, 0x1f, 0x41, 0xc0, 0x80, 0x80, 0x10}, 990 {0xd1, 0x21, 0x23, 0xde, 0xa0, 0x80, 0x32, 0x10}, 991 {0xd1, 0x21, 0x27, 0xfe, 0xa0, 0x00, 0x91, 0x10}, 992 {0xd1, 0x21, 0x2b, 0x00, 0x88, 0x85, 0x80, 0x10}, 993 {0xc1, 0x21, 0x2f, 0x9c, 0x00, 0xc4, 0x00, 0x10}, 994 {0xd1, 0x21, 0x60, 0xa6, 0x60, 0x88, 0x12, 0x10}, 995 {0xd1, 0x21, 0x64, 0x88, 0x00, 0x00, 0x94, 0x10}, 996 {0xd1, 0x21, 0x68, 0x7a, 0x0c, 0x00, 0x00, 0x10}, 997 {0xd1, 0x21, 0x6c, 0x11, 0x33, 0x22, 0x00, 0x10}, 998 {0xd1, 0x21, 0x70, 0x11, 0x00, 0x10, 0x50, 0x10}, 999 {0xd1, 0x21, 0x74, 0x20, 0x06, 0x00, 0xb5, 0x10}, 1000 {0xd1, 0x21, 0x78, 0x8a, 0x00, 0x00, 0x00, 0x10}, 1001 {0xb1, 0x21, 0x7c, 0x00, 0x43, 0x00, 0x00, 0x10}, 1002 1003 {0xd1, 0x21, 0x21, 0x86, 0x00, 0xde, 0xa0, 0x10}, 1004/* {0xd1, 0x21, 0x25, 0x80, 0x32, 0xfe, 0xa0, 0x10}, jfm done */ 1005/* {0xd1, 0x21, 0x29, 0x00, 0x91, 0x00, 0x88, 0x10}, jfm done */ 1006/* {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10}, set by setfreq */ 1007 {} 1008}; 1009static const u8 ov7648_sensor_param1[][8] = { 1010/* {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1011/* {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, * COMN 1012 * set by setvflip */ 1013 {0xa1, 0x21, 0x19, 0x02, 0x00, 0x00, 0x00, 0x10}, 1014 {0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10}, 1015/* {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1016/* {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}, * GAIN - def */ 1017/* {0xb1, 0x21, 0x01, 0x6c, 0x6c, 0x00, 0x00, 0x10}, * B R - def: 80 */ 1018/*...*/ 1019 {0xa1, 0x21, 0x11, 0x81, 0x00, 0x00, 0x00, 0x10}, /* CLKRC */ 1020/* {0xa1, 0x21, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1021/* {0xa1, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1022/* {0xa1, 0x21, 0x2a, 0x91, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1023/* {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, jfm done */ 1024/* {0xb1, 0x21, 0x01, 0x64, 0x84, 0x00, 0x00, 0x10}, * B R - def: 80 */ 1025 1026 {} 1027}; 1028 1029static const u8 ov7660_sensor_init[][8] = { 1030 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset SCCB */ 1031 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 1032 {0xa1, 0x21, 0x12, 0x05, 0x00, 0x00, 0x00, 0x10}, 1033 /* Outformat = rawRGB */ 1034 {0xa1, 0x21, 0x13, 0xb8, 0x00, 0x00, 0x00, 0x10}, /* init COM8 */ 1035 {0xd1, 0x21, 0x00, 0x01, 0x74, 0x92, 0x00, 0x10}, 1036 /* GAIN BLUE RED VREF */ 1037 {0xd1, 0x21, 0x04, 0x00, 0x7d, 0x62, 0x00, 0x10}, 1038 /* COM 1 BAVE GEAVE AECHH */ 1039 {0xb1, 0x21, 0x08, 0x83, 0x01, 0x00, 0x00, 0x10}, /* RAVE COM2 */ 1040 {0xd1, 0x21, 0x0c, 0x00, 0x08, 0x04, 0x4f, 0x10}, /* COM 3 4 5 6 */ 1041 {0xd1, 0x21, 0x10, 0x7f, 0x40, 0x05, 0xff, 0x10}, 1042 /* AECH CLKRC COM7 COM8 */ 1043 {0xc1, 0x21, 0x14, 0x2c, 0x00, 0x02, 0x00, 0x10}, /* COM9 COM10 */ 1044 {0xd1, 0x21, 0x17, 0x10, 0x60, 0x02, 0x7b, 0x10}, 1045 /* HSTART HSTOP VSTRT VSTOP */ 1046 {0xa1, 0x21, 0x1b, 0x02, 0x00, 0x00, 0x00, 0x10}, /* PSHFT */ 1047 {0xb1, 0x21, 0x1e, 0x01, 0x0e, 0x00, 0x00, 0x10}, /* MVFP LAEC */ 1048 {0xd1, 0x21, 0x20, 0x07, 0x07, 0x07, 0x07, 0x10}, 1049 /* BOS GBOS GROS ROS (BGGR offset) */ 1050/* {0xd1, 0x21, 0x24, 0x68, 0x58, 0xd4, 0x80, 0x10}, */ 1051 {0xd1, 0x21, 0x24, 0x78, 0x68, 0xd4, 0x80, 0x10}, 1052 /* AEW AEB VPT BBIAS */ 1053 {0xd1, 0x21, 0x28, 0x80, 0x30, 0x00, 0x00, 0x10}, 1054 /* GbBIAS RSVD EXHCH EXHCL */ 1055 {0xd1, 0x21, 0x2c, 0x80, 0x00, 0x00, 0x62, 0x10}, 1056 /* RBIAS ADVFL ASDVFH YAVE */ 1057 {0xc1, 0x21, 0x30, 0x08, 0x30, 0xb4, 0x00, 0x10}, 1058 /* HSYST HSYEN HREF */ 1059 {0xd1, 0x21, 0x33, 0x00, 0x07, 0x84, 0x00, 0x10}, /* reserved */ 1060 {0xd1, 0x21, 0x37, 0x0c, 0x02, 0x43, 0x00, 0x10}, 1061 /* ADC ACOM OFON TSLB */ 1062 {0xd1, 0x21, 0x3b, 0x02, 0x6c, 0x19, 0x0e, 0x10}, 1063 /* COM11 COM12 COM13 COM14 */ 1064 {0xd1, 0x21, 0x3f, 0x41, 0xc1, 0x22, 0x08, 0x10}, 1065 /* EDGE COM15 COM16 COM17 */ 1066 {0xd1, 0x21, 0x43, 0xf0, 0x10, 0x78, 0xa8, 0x10}, /* reserved */ 1067 {0xd1, 0x21, 0x47, 0x60, 0x80, 0x00, 0x00, 0x10}, /* reserved */ 1068 {0xd1, 0x21, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x10}, /* reserved */ 1069 {0xd1, 0x21, 0x4f, 0x46, 0x36, 0x0f, 0x17, 0x10}, /* MTX 1 2 3 4 */ 1070 {0xd1, 0x21, 0x53, 0x7f, 0x96, 0x40, 0x40, 0x10}, /* MTX 5 6 7 8 */ 1071 {0xb1, 0x21, 0x57, 0x40, 0x0f, 0x00, 0x00, 0x10}, /* MTX9 MTXS */ 1072 {0xd1, 0x21, 0x59, 0xba, 0x9a, 0x22, 0xb9, 0x10}, /* reserved */ 1073 {0xd1, 0x21, 0x5d, 0x9b, 0x10, 0xf0, 0x05, 0x10}, /* reserved */ 1074 {0xa1, 0x21, 0x61, 0x60, 0x00, 0x00, 0x00, 0x10}, /* reserved */ 1075 {0xd1, 0x21, 0x62, 0x00, 0x00, 0x50, 0x30, 0x10}, 1076 /* LCC1 LCC2 LCC3 LCC4 */ 1077 {0xa1, 0x21, 0x66, 0x00, 0x00, 0x00, 0x00, 0x10}, /* LCC5 */ 1078 {0xd1, 0x21, 0x67, 0x80, 0x7a, 0x90, 0x80, 0x10}, /* MANU */ 1079 {0xa1, 0x21, 0x6b, 0x0a, 0x00, 0x00, 0x00, 0x10}, 1080 /* band gap reference [0:3] DBLV */ 1081 {0xd1, 0x21, 0x6c, 0x30, 0x48, 0x80, 0x74, 0x10}, /* gamma curve */ 1082 {0xd1, 0x21, 0x70, 0x64, 0x60, 0x5c, 0x58, 0x10}, /* gamma curve */ 1083 {0xd1, 0x21, 0x74, 0x54, 0x4c, 0x40, 0x38, 0x10}, /* gamma curve */ 1084 {0xd1, 0x21, 0x78, 0x34, 0x30, 0x2f, 0x2b, 0x10}, /* gamma curve */ 1085 {0xd1, 0x21, 0x7c, 0x03, 0x07, 0x17, 0x34, 0x10}, /* gamma curve */ 1086 {0xd1, 0x21, 0x80, 0x41, 0x4d, 0x58, 0x63, 0x10}, /* gamma curve */ 1087 {0xd1, 0x21, 0x84, 0x6e, 0x77, 0x87, 0x95, 0x10}, /* gamma curve */ 1088 {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */ 1089 {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */ 1090 {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */ 1091/* not in all ms-win traces*/ 1092 {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, 1093 {} 1094}; 1095static const u8 ov7660_sensor_param1[][8] = { 1096 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */ 1097 /* bits[3..0]reserved */ 1098 {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, 1099 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10}, 1100 /* VREF vertical frame ctrl */ 1101 {0xa1, 0x21, 0x03, 0x00, 0x00, 0x00, 0x00, 0x10}, 1102 {0xa1, 0x21, 0x10, 0x20, 0x00, 0x00, 0x00, 0x10}, /* AECH 0x20 */ 1103 {0xa1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, /* ADVFL */ 1104 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* ADVFH */ 1105 {0xa1, 0x21, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10}, /* GAIN */ 1106/* {0xb1, 0x21, 0x01, 0x78, 0x78, 0x00, 0x00, 0x10}, * BLUE */ 1107/****** (some exchanges in the win trace) ******/ 1108/*fixme:param2*/ 1109 {0xa1, 0x21, 0x93, 0x00, 0x00, 0x00, 0x00, 0x10},/* dummy line hight */ 1110 {0xa1, 0x21, 0x92, 0x25, 0x00, 0x00, 0x00, 0x10}, /* dummy line low */ 1111 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCH */ 1112 {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCL */ 1113/* {0xa1, 0x21, 0x02, 0x90, 0x00, 0x00, 0x00, 0x10}, * RED */ 1114/****** (some exchanges in the win trace) ******/ 1115/******!! startsensor KO if changed !!****/ 1116/*fixme: param3*/ 1117 {0xa1, 0x21, 0x93, 0x01, 0x00, 0x00, 0x00, 0x10}, 1118 {0xa1, 0x21, 0x92, 0xff, 0x00, 0x00, 0x00, 0x10}, 1119 {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, 1120 {0xa1, 0x21, 0x2b, 0xc3, 0x00, 0x00, 0x00, 0x10}, 1121 {} 1122}; 1123 1124static const u8 po1030_sensor_init[][8] = { 1125/* the sensor registers are described in m5602/m5602_po1030.h */ 1126 {0xa1, 0x6e, 0x3f, 0x20, 0x00, 0x00, 0x00, 0x10}, /* sensor reset */ 1127 {DELAY, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 20ms */ 1128 {0xa1, 0x6e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x10}, 1129 {0xa1, 0x6e, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x10}, 1130 {0xd1, 0x6e, 0x04, 0x02, 0xb1, 0x02, 0x39, 0x10}, 1131 {0xd1, 0x6e, 0x08, 0x00, 0x01, 0x00, 0x00, 0x10}, 1132 {0xd1, 0x6e, 0x0c, 0x02, 0x7f, 0x01, 0xe0, 0x10}, 1133 {0xd1, 0x6e, 0x12, 0x03, 0x02, 0x00, 0x03, 0x10}, 1134 {0xd1, 0x6e, 0x16, 0x85, 0x40, 0x4a, 0x40, 0x10}, /* r/g1/b/g2 gains */ 1135 {0xc1, 0x6e, 0x1a, 0x00, 0x80, 0x00, 0x00, 0x10}, 1136 {0xd1, 0x6e, 0x1d, 0x08, 0x03, 0x00, 0x00, 0x10}, 1137 {0xd1, 0x6e, 0x23, 0x00, 0xb0, 0x00, 0x94, 0x10}, 1138 {0xd1, 0x6e, 0x27, 0x58, 0x00, 0x00, 0x00, 0x10}, 1139 {0xb1, 0x6e, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, 1140 {0xd1, 0x6e, 0x2d, 0x14, 0x35, 0x61, 0x84, 0x10}, /* gamma corr */ 1141 {0xd1, 0x6e, 0x31, 0xa2, 0xbd, 0xd8, 0xff, 0x10}, 1142 {0xd1, 0x6e, 0x35, 0x06, 0x1e, 0x12, 0x02, 0x10}, /* color matrix */ 1143 {0xd1, 0x6e, 0x39, 0xaa, 0x53, 0x37, 0xd5, 0x10}, 1144 {0xa1, 0x6e, 0x3d, 0xf2, 0x00, 0x00, 0x00, 0x10}, 1145 {0xd1, 0x6e, 0x3e, 0x00, 0x00, 0x80, 0x03, 0x10}, 1146 {0xd1, 0x6e, 0x42, 0x03, 0x00, 0x00, 0x00, 0x10}, 1147 {0xc1, 0x6e, 0x46, 0x00, 0x80, 0x80, 0x00, 0x10}, 1148 {0xd1, 0x6e, 0x4b, 0x02, 0xef, 0x08, 0xcd, 0x10}, 1149 {0xd1, 0x6e, 0x4f, 0x00, 0xd0, 0x00, 0xa0, 0x10}, 1150 {0xd1, 0x6e, 0x53, 0x01, 0xaa, 0x01, 0x40, 0x10}, 1151 {0xd1, 0x6e, 0x5a, 0x50, 0x04, 0x30, 0x03, 0x10}, /* raw rgb bayer */ 1152 {0xa1, 0x6e, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x10}, 1153 {0xd1, 0x6e, 0x5f, 0x10, 0x40, 0xff, 0x00, 0x10}, 1154 1155 {0xd1, 0x6e, 0x63, 0x40, 0x40, 0x00, 0x00, 0x10}, 1156 {0xd1, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x10}, 1157 {0xd1, 0x6e, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x10}, 1158 {0xd1, 0x6e, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x10}, 1159 {0xc1, 0x6e, 0x73, 0x10, 0x80, 0xeb, 0x00, 0x10}, 1160 {} 1161}; 1162static const u8 po1030_sensor_param1[][8] = { 1163/* from ms-win traces - these values change with auto gain/expo/wb.. */ 1164 {0xa1, 0x6e, 0x1e, 0x03, 0x00, 0x00, 0x00, 0x10}, 1165 {0xa1, 0x6e, 0x1e, 0x03, 0x00, 0x00, 0x00, 0x10}, 1166/* mean values */ 1167 {0xc1, 0x6e, 0x1a, 0x02, 0xd4, 0xa4, 0x00, 0x10}, /* integlines */ 1168 {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10}, /* global gain */ 1169 {0xc1, 0x6e, 0x16, 0x40, 0x40, 0x40, 0x00, 0x10}, /* r/g1/b gains */ 1170 1171 {0xa1, 0x6e, 0x1d, 0x08, 0x00, 0x00, 0x00, 0x10}, /* control1 */ 1172 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10}, /* frameheight */ 1173 {0xa1, 0x6e, 0x07, 0xd5, 0x00, 0x00, 0x00, 0x10}, 1174/* {0xc1, 0x6e, 0x16, 0x49, 0x40, 0x45, 0x00, 0x10}, */ 1175 {} 1176}; 1177 1178static const u8 po2030n_sensor_init[][8] = { 1179 {0xa1, 0x6e, 0x1e, 0x1a, 0x00, 0x00, 0x00, 0x10}, 1180 {0xa1, 0x6e, 0x1f, 0x99, 0x00, 0x00, 0x00, 0x10}, 1181 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 10ms */ 1182 {0xa1, 0x6e, 0x1e, 0x0a, 0x00, 0x00, 0x00, 0x10}, 1183 {0xa1, 0x6e, 0x1f, 0x19, 0x00, 0x00, 0x00, 0x10}, 1184 {DELAY, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 10ms */ 1185 {0xa1, 0x6e, 0x20, 0x44, 0x00, 0x00, 0x00, 0x10}, 1186 {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10}, 1187 {0xa1, 0x6e, 0x05, 0x70, 0x00, 0x00, 0x00, 0x10}, 1188 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10}, 1189 {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10}, 1190 {0xd1, 0x6e, 0x08, 0x00, 0xd0, 0x00, 0x08, 0x10}, 1191 {0xd1, 0x6e, 0x0c, 0x03, 0x50, 0x01, 0xe8, 0x10}, 1192 {0xd1, 0x6e, 0x1d, 0x20, 0x0a, 0x19, 0x44, 0x10}, 1193 {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10}, 1194 {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x00, 0x10}, 1195 {0xd1, 0x6e, 0x29, 0x00, 0x00, 0x00, 0x00, 0x10}, 1196 {0xd1, 0x6e, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1197 {0xd1, 0x6e, 0x31, 0x00, 0x00, 0x00, 0x00, 0x10}, 1198 {0xd1, 0x6e, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10}, 1199 {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x00, 0x00, 0x10}, 1200 {0xd1, 0x6e, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1201 {0xd1, 0x6e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x10}, 1202 {0xd1, 0x6e, 0x45, 0x00, 0x00, 0x00, 0x00, 0x10}, 1203 {0xd1, 0x6e, 0x49, 0x00, 0x00, 0x00, 0x00, 0x10}, 1204 {0xd1, 0x6e, 0x4d, 0x00, 0x00, 0x00, 0xed, 0x10}, 1205 {0xd1, 0x6e, 0x51, 0x17, 0x4a, 0x2f, 0xc0, 0x10}, 1206 {0xd1, 0x6e, 0x55, 0x00, 0x00, 0x00, 0x00, 0x10}, 1207 {0xd1, 0x6e, 0x59, 0x00, 0x00, 0x00, 0x00, 0x10}, 1208 {0xd1, 0x6e, 0x5d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1209 {0xd1, 0x6e, 0x61, 0x00, 0x00, 0x00, 0x00, 0x10}, 1210 {0xd1, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x00, 0x10}, 1211 {0xd1, 0x6e, 0x69, 0x00, 0x00, 0x00, 0x00, 0x10}, 1212 {0xd1, 0x6e, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1213 {0xd1, 0x6e, 0x71, 0x00, 0x00, 0x00, 0x00, 0x10}, 1214 {0xd1, 0x6e, 0x75, 0x00, 0x00, 0x00, 0x00, 0x10}, 1215 {0xd1, 0x6e, 0x79, 0x00, 0x00, 0x00, 0x00, 0x10}, 1216 {0xd1, 0x6e, 0x7d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1217 {0xd1, 0x6e, 0x81, 0x00, 0x00, 0x00, 0x00, 0x10}, 1218 {0xd1, 0x6e, 0x85, 0x00, 0x00, 0x00, 0x08, 0x10}, 1219 {0xd1, 0x6e, 0x89, 0x01, 0xe8, 0x00, 0x01, 0x10}, 1220 {0xa1, 0x6e, 0x8d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1221 {0xd1, 0x6e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x10}, 1222 {0xd1, 0x6e, 0x25, 0x00, 0x00, 0x00, 0x01, 0x10}, 1223 {0xd1, 0x6e, 0x29, 0xe6, 0x00, 0xbd, 0x03, 0x10}, 1224 {0xd1, 0x6e, 0x2d, 0x41, 0x38, 0x68, 0x40, 0x10}, 1225 {0xd1, 0x6e, 0x31, 0x2b, 0x00, 0x36, 0x00, 0x10}, 1226 {0xd1, 0x6e, 0x35, 0x30, 0x30, 0x08, 0x00, 0x10}, 1227 {0xd1, 0x6e, 0x39, 0x00, 0x00, 0x33, 0x06, 0x10}, 1228 {0xb1, 0x6e, 0x3d, 0x06, 0x02, 0x00, 0x00, 0x10}, 1229 {} 1230}; 1231static const u8 po2030n_sensor_param1[][8] = { 1232 {0xa1, 0x6e, 0x1a, 0x01, 0x00, 0x00, 0x00, 0x10}, 1233 {DELAY, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 8ms */ 1234 {0xa1, 0x6e, 0x1b, 0xf4, 0x00, 0x00, 0x00, 0x10}, 1235 {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10}, 1236 {0xd1, 0x6e, 0x16, 0x50, 0x40, 0x49, 0x40, 0x10}, 1237/*param2*/ 1238 {0xa1, 0x6e, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1239 {0xa1, 0x6e, 0x04, 0x03, 0x00, 0x00, 0x00, 0x10}, 1240 {0xa1, 0x6e, 0x05, 0x6f, 0x00, 0x00, 0x00, 0x10}, 1241 {0xa1, 0x6e, 0x06, 0x02, 0x00, 0x00, 0x00, 0x10}, 1242 {0xa1, 0x6e, 0x07, 0x25, 0x00, 0x00, 0x00, 0x10}, 1243 {0xa1, 0x6e, 0x15, 0x04, 0x00, 0x00, 0x00, 0x10}, 1244 {0xc1, 0x6e, 0x16, 0x52, 0x40, 0x48, 0x00, 0x10}, 1245/*after start*/ 1246 {0xa1, 0x6e, 0x15, 0x0f, 0x00, 0x00, 0x00, 0x10}, 1247 {DELAY, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 5ms */ 1248 {0xa1, 0x6e, 0x1a, 0x05, 0x00, 0x00, 0x00, 0x10}, 1249 {DELAY, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 5ms */ 1250 {0xa1, 0x6e, 0x1b, 0x53, 0x00, 0x00, 0x00, 0x10}, 1251 {} 1252}; 1253 1254static const u8 soi768_sensor_init[][8] = { 1255 {0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset */ 1256 {DELAY, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* delay 96ms */ 1257 {0xa1, 0x21, 0x12, 0x00, 0x00, 0x00, 0x00, 0x10}, 1258 {0xa1, 0x21, 0x13, 0x80, 0x00, 0x00, 0x00, 0x10}, 1259 {0xa1, 0x21, 0x0f, 0x03, 0x00, 0x00, 0x00, 0x10}, 1260 {0xa1, 0x21, 0x19, 0x00, 0x00, 0x00, 0x00, 0x10}, 1261 {} 1262}; 1263static const u8 soi768_sensor_param1[][8] = { 1264 {0xa1, 0x21, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10}, 1265 {0xa1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, 1266 {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10}, 1267 {0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}, 1268 {0xb1, 0x21, 0x01, 0x7f, 0x7f, 0x00, 0x00, 0x10}, 1269/* */ 1270/* {0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10}, */ 1271/* {0xa1, 0x21, 0x2d, 0x25, 0x00, 0x00, 0x00, 0x10}, */ 1272 {0xa1, 0x21, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10}, 1273/* {0xb1, 0x21, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x10}, */ 1274 {0xa1, 0x21, 0x02, 0x8d, 0x00, 0x00, 0x00, 0x10}, 1275/* the next sequence should be used for auto gain */ 1276 {0xa1, 0x21, 0x00, 0x07, 0x00, 0x00, 0x00, 0x10}, 1277 /* global gain ? : 07 - change with 0x15 at the end */ 1278 {0xa1, 0x21, 0x10, 0x3f, 0x00, 0x00, 0x00, 0x10}, /* ???? : 063f */ 1279 {0xa1, 0x21, 0x04, 0x06, 0x00, 0x00, 0x00, 0x10}, 1280 {0xb1, 0x21, 0x2d, 0x00, 0x02, 0x00, 0x00, 0x10}, 1281 /* exposure ? : 0200 - change with 0x1e at the end */ 1282 {} 1283}; 1284 1285static const u8 sp80708_sensor_init[][8] = { 1286 {0xa1, 0x18, 0x06, 0xf9, 0x00, 0x00, 0x00, 0x10}, 1287 {0xa1, 0x18, 0x09, 0x1f, 0x00, 0x00, 0x00, 0x10}, 1288 {0xa1, 0x18, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x10}, 1289 {0xa1, 0x18, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0x10}, 1290 {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10}, 1291 {0xa1, 0x18, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x10}, 1292 {0xa1, 0x18, 0x10, 0x40, 0x00, 0x00, 0x00, 0x10}, 1293 {0xa1, 0x18, 0x11, 0x4e, 0x00, 0x00, 0x00, 0x10}, 1294 {0xa1, 0x18, 0x12, 0x53, 0x00, 0x00, 0x00, 0x10}, 1295 {0xa1, 0x18, 0x15, 0x80, 0x00, 0x00, 0x00, 0x10}, 1296 {0xa1, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x10}, 1297 {0xa1, 0x18, 0x19, 0x18, 0x00, 0x00, 0x00, 0x10}, 1298 {0xa1, 0x18, 0x1a, 0x10, 0x00, 0x00, 0x00, 0x10}, 1299 {0xa1, 0x18, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x10}, 1300 {0xa1, 0x18, 0x1c, 0x28, 0x00, 0x00, 0x00, 0x10}, 1301 {0xa1, 0x18, 0x1d, 0x02, 0x00, 0x00, 0x00, 0x10}, 1302 {0xa1, 0x18, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x10}, 1303 {0xa1, 0x18, 0x26, 0x04, 0x00, 0x00, 0x00, 0x10}, 1304 {0xa1, 0x18, 0x27, 0x1e, 0x00, 0x00, 0x00, 0x10}, 1305 {0xa1, 0x18, 0x28, 0x5a, 0x00, 0x00, 0x00, 0x10}, 1306 {0xa1, 0x18, 0x29, 0x28, 0x00, 0x00, 0x00, 0x10}, 1307 {0xa1, 0x18, 0x2a, 0x78, 0x00, 0x00, 0x00, 0x10}, 1308 {0xa1, 0x18, 0x2b, 0x01, 0x00, 0x00, 0x00, 0x10}, 1309 {0xa1, 0x18, 0x2c, 0xf7, 0x00, 0x00, 0x00, 0x10}, 1310 {0xa1, 0x18, 0x2d, 0x2d, 0x00, 0x00, 0x00, 0x10}, 1311 {0xa1, 0x18, 0x2e, 0xd5, 0x00, 0x00, 0x00, 0x10}, 1312 {0xa1, 0x18, 0x39, 0x42, 0x00, 0x00, 0x00, 0x10}, 1313 {0xa1, 0x18, 0x3a, 0x67, 0…
Large files files are truncated, but you can click here to view the full file