1 /* 2 * Sonix sn9c201 sn9c202 library 3 * 4 * Copyright (C) 2012 Jean-Francois Moine <http://moinejf.free.fr> 5 * Copyright (C) 2008-2009 microdia project <microdia@googlegroups.com> 6 * Copyright (C) 2009 Brian Johnson <brijohn@gmail.com> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 */ 18 19 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 20 21 #include <linux/input.h> 22 23 #include "gspca.h" 24 #include "jpeg.h" 25 26 #include <linux/dmi.h> 27 28 MODULE_AUTHOR("Brian Johnson <brijohn@gmail.com>, microdia project <microdia@googlegroups.com>"); 29 MODULE_DESCRIPTION("GSPCA/SN9C20X USB Camera Driver"); 30 MODULE_LICENSE("GPL"); 31 32 /* 33 * Pixel format private data 34 */ 35 #define SCALE_MASK 0x0f 36 #define SCALE_160x120 0 37 #define SCALE_320x240 1 38 #define SCALE_640x480 2 39 #define SCALE_1280x1024 3 40 #define MODE_RAW 0x10 41 #define MODE_JPEG 0x20 42 #define MODE_SXGA 0x80 43 44 #define SENSOR_OV9650 0 45 #define SENSOR_OV9655 1 46 #define SENSOR_SOI968 2 47 #define SENSOR_OV7660 3 48 #define SENSOR_OV7670 4 49 #define SENSOR_MT9V011 5 50 #define SENSOR_MT9V111 6 51 #define SENSOR_MT9V112 7 52 #define SENSOR_MT9M001 8 53 #define SENSOR_MT9M111 9 54 #define SENSOR_MT9M112 10 55 #define SENSOR_HV7131R 11 56 #define SENSOR_MT9VPRB 12 57 58 /* camera flags */ 59 #define HAS_NO_BUTTON 0x1 60 #define LED_REVERSE 0x2 /* some cameras unset gpio to turn on leds */ 61 #define FLIP_DETECT 0x4 62 63 /* specific webcam descriptor */ 64 struct sd { 65 struct gspca_dev gspca_dev; 66 67 struct { /* color control cluster */ 68 struct v4l2_ctrl *brightness; 69 struct v4l2_ctrl *contrast; 70 struct v4l2_ctrl *saturation; 71 struct v4l2_ctrl *hue; 72 }; 73 struct { /* blue/red balance control cluster */ 74 struct v4l2_ctrl *blue; 75 struct v4l2_ctrl *red; 76 }; 77 struct { /* h/vflip control cluster */ 78 struct v4l2_ctrl *hflip; 79 struct v4l2_ctrl *vflip; 80 }; 81 struct v4l2_ctrl *gamma; 82 struct { /* autogain and exposure or gain control cluster */ 83 struct v4l2_ctrl *autogain; 84 struct v4l2_ctrl *exposure; 85 struct v4l2_ctrl *gain; 86 }; 87 struct v4l2_ctrl *jpegqual; 88 89 struct work_struct work; 90 91 u32 pktsz; /* (used by pkt_scan) */ 92 u16 npkt; 93 s8 nchg; 94 u8 fmt; /* (used for JPEG QTAB update */ 95 96 #define MIN_AVG_LUM 80 97 #define MAX_AVG_LUM 130 98 atomic_t avg_lum; 99 u8 old_step; 100 u8 older_step; 101 u8 exposure_step; 102 103 u8 i2c_addr; 104 u8 i2c_intf; 105 u8 sensor; 106 u8 hstart; 107 u8 vstart; 108 109 u8 jpeg_hdr[JPEG_HDR_SZ]; 110 111 u8 flags; 112 }; 113 114 static void qual_upd(struct work_struct *work); 115 116 struct i2c_reg_u8 { 117 u8 reg; 118 u8 val; 119 }; 120 121 struct i2c_reg_u16 { 122 u8 reg; 123 u16 val; 124 }; 125 126 static const struct dmi_system_id flip_dmi_table[] = { 127 { 128 .ident = "MSI MS-1034", 129 .matches = { 130 DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT'L CO.,LTD."), 131 DMI_MATCH(DMI_PRODUCT_NAME, "MS-1034"), 132 DMI_MATCH(DMI_PRODUCT_VERSION, "0341") 133 } 134 }, 135 { 136 .ident = "MSI MS-1632", 137 .matches = { 138 DMI_MATCH(DMI_BOARD_VENDOR, "MSI"), 139 DMI_MATCH(DMI_BOARD_NAME, "MS-1632") 140 } 141 }, 142 { 143 .ident = "MSI MS-1633X", 144 .matches = { 145 DMI_MATCH(DMI_BOARD_VENDOR, "MSI"), 146 DMI_MATCH(DMI_BOARD_NAME, "MS-1633X") 147 } 148 }, 149 { 150 .ident = "MSI MS-1635X", 151 .matches = { 152 DMI_MATCH(DMI_BOARD_VENDOR, "MSI"), 153 DMI_MATCH(DMI_BOARD_NAME, "MS-1635X") 154 } 155 }, 156 { 157 .ident = "ASUSTeK W7J", 158 .matches = { 159 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer Inc."), 160 DMI_MATCH(DMI_BOARD_NAME, "W7J ") 161 } 162 }, 163 {} 164 }; 165 166 static const struct v4l2_pix_format vga_mode[] = { 167 {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 168 .bytesperline = 160, 169 .sizeimage = 160 * 120 * 4 / 8 + 590, 170 .colorspace = V4L2_COLORSPACE_JPEG, 171 .priv = SCALE_160x120 | MODE_JPEG}, 172 {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 173 .bytesperline = 160, 174 .sizeimage = 160 * 120, 175 .colorspace = V4L2_COLORSPACE_SRGB, 176 .priv = SCALE_160x120 | MODE_RAW}, 177 {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 178 .bytesperline = 160, 179 .sizeimage = 240 * 120, 180 .colorspace = V4L2_COLORSPACE_SRGB, 181 .priv = SCALE_160x120}, 182 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 183 .bytesperline = 320, 184 .sizeimage = 320 * 240 * 4 / 8 + 590, 185 .colorspace = V4L2_COLORSPACE_JPEG, 186 .priv = SCALE_320x240 | MODE_JPEG}, 187 {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 188 .bytesperline = 320, 189 .sizeimage = 320 * 240 , 190 .colorspace = V4L2_COLORSPACE_SRGB, 191 .priv = SCALE_320x240 | MODE_RAW}, 192 {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 193 .bytesperline = 320, 194 .sizeimage = 480 * 240 , 195 .colorspace = V4L2_COLORSPACE_SRGB, 196 .priv = SCALE_320x240}, 197 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 198 .bytesperline = 640, 199 .sizeimage = 640 * 480 * 4 / 8 + 590, 200 .colorspace = V4L2_COLORSPACE_JPEG, 201 .priv = SCALE_640x480 | MODE_JPEG}, 202 {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 203 .bytesperline = 640, 204 .sizeimage = 640 * 480, 205 .colorspace = V4L2_COLORSPACE_SRGB, 206 .priv = SCALE_640x480 | MODE_RAW}, 207 {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 208 .bytesperline = 640, 209 .sizeimage = 960 * 480, 210 .colorspace = V4L2_COLORSPACE_SRGB, 211 .priv = SCALE_640x480}, 212 }; 213 214 static const struct v4l2_pix_format sxga_mode[] = { 215 {160, 120, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 216 .bytesperline = 160, 217 .sizeimage = 160 * 120 * 4 / 8 + 590, 218 .colorspace = V4L2_COLORSPACE_JPEG, 219 .priv = SCALE_160x120 | MODE_JPEG}, 220 {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 221 .bytesperline = 160, 222 .sizeimage = 160 * 120, 223 .colorspace = V4L2_COLORSPACE_SRGB, 224 .priv = SCALE_160x120 | MODE_RAW}, 225 {160, 120, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 226 .bytesperline = 160, 227 .sizeimage = 240 * 120, 228 .colorspace = V4L2_COLORSPACE_SRGB, 229 .priv = SCALE_160x120}, 230 {320, 240, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 231 .bytesperline = 320, 232 .sizeimage = 320 * 240 * 4 / 8 + 590, 233 .colorspace = V4L2_COLORSPACE_JPEG, 234 .priv = SCALE_320x240 | MODE_JPEG}, 235 {320, 240, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 236 .bytesperline = 320, 237 .sizeimage = 320 * 240 , 238 .colorspace = V4L2_COLORSPACE_SRGB, 239 .priv = SCALE_320x240 | MODE_RAW}, 240 {320, 240, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 241 .bytesperline = 320, 242 .sizeimage = 480 * 240 , 243 .colorspace = V4L2_COLORSPACE_SRGB, 244 .priv = SCALE_320x240}, 245 {640, 480, V4L2_PIX_FMT_JPEG, V4L2_FIELD_NONE, 246 .bytesperline = 640, 247 .sizeimage = 640 * 480 * 4 / 8 + 590, 248 .colorspace = V4L2_COLORSPACE_JPEG, 249 .priv = SCALE_640x480 | MODE_JPEG}, 250 {640, 480, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 251 .bytesperline = 640, 252 .sizeimage = 640 * 480, 253 .colorspace = V4L2_COLORSPACE_SRGB, 254 .priv = SCALE_640x480 | MODE_RAW}, 255 {640, 480, V4L2_PIX_FMT_SN9C20X_I420, V4L2_FIELD_NONE, 256 .bytesperline = 640, 257 .sizeimage = 960 * 480, 258 .colorspace = V4L2_COLORSPACE_SRGB, 259 .priv = SCALE_640x480}, 260 {1280, 1024, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE, 261 .bytesperline = 1280, 262 .sizeimage = 1280 * 1024, 263 .colorspace = V4L2_COLORSPACE_SRGB, 264 .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA}, 265 }; 266 267 static const struct v4l2_pix_format mono_mode[] = { 268 {160, 120, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE, 269 .bytesperline = 160, 270 .sizeimage = 160 * 120, 271 .colorspace = V4L2_COLORSPACE_SRGB, 272 .priv = SCALE_160x120 | MODE_RAW}, 273 {320, 240, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE, 274 .bytesperline = 320, 275 .sizeimage = 320 * 240 , 276 .colorspace = V4L2_COLORSPACE_SRGB, 277 .priv = SCALE_320x240 | MODE_RAW}, 278 {640, 480, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE, 279 .bytesperline = 640, 280 .sizeimage = 640 * 480, 281 .colorspace = V4L2_COLORSPACE_SRGB, 282 .priv = SCALE_640x480 | MODE_RAW}, 283 {1280, 1024, V4L2_PIX_FMT_GREY, V4L2_FIELD_NONE, 284 .bytesperline = 1280, 285 .sizeimage = 1280 * 1024, 286 .colorspace = V4L2_COLORSPACE_SRGB, 287 .priv = SCALE_1280x1024 | MODE_RAW | MODE_SXGA}, 288 }; 289 290 static const s16 hsv_red_x[] = { 291 41, 44, 46, 48, 50, 52, 54, 56, 292 58, 60, 62, 64, 66, 68, 70, 72, 293 74, 76, 78, 80, 81, 83, 85, 87, 294 88, 90, 92, 93, 95, 97, 98, 100, 295 101, 102, 104, 105, 107, 108, 109, 110, 296 112, 113, 114, 115, 116, 117, 118, 119, 297 120, 121, 122, 123, 123, 124, 125, 125, 298 126, 127, 127, 128, 128, 129, 129, 129, 299 130, 130, 130, 130, 131, 131, 131, 131, 300 131, 131, 131, 131, 130, 130, 130, 130, 301 129, 129, 129, 128, 128, 127, 127, 126, 302 125, 125, 124, 123, 122, 122, 121, 120, 303 119, 118, 117, 116, 115, 114, 112, 111, 304 110, 109, 107, 106, 105, 103, 102, 101, 305 99, 98, 96, 94, 93, 91, 90, 88, 306 86, 84, 83, 81, 79, 77, 75, 74, 307 72, 70, 68, 66, 64, 62, 60, 58, 308 56, 54, 52, 49, 47, 45, 43, 41, 309 39, 36, 34, 32, 30, 28, 25, 23, 310 21, 19, 16, 14, 12, 9, 7, 5, 311 3, 0, -1, -3, -6, -8, -10, -12, 312 -15, -17, -19, -22, -24, -26, -28, -30, 313 -33, -35, -37, -39, -41, -44, -46, -48, 314 -50, -52, -54, -56, -58, -60, -62, -64, 315 -66, -68, -70, -72, -74, -76, -78, -80, 316 -81, -83, -85, -87, -88, -90, -92, -93, 317 -95, -97, -98, -100, -101, -102, -104, -105, 318 -107, -108, -109, -110, -112, -113, -114, -115, 319 -116, -117, -118, -119, -120, -121, -122, -123, 320 -123, -124, -125, -125, -126, -127, -127, -128, 321 -128, -128, -128, -128, -128, -128, -128, -128, 322 -128, -128, -128, -128, -128, -128, -128, -128, 323 -128, -128, -128, -128, -128, -128, -128, -128, 324 -128, -127, -127, -126, -125, -125, -124, -123, 325 -122, -122, -121, -120, -119, -118, -117, -116, 326 -115, -114, -112, -111, -110, -109, -107, -106, 327 -105, -103, -102, -101, -99, -98, -96, -94, 328 -93, -91, -90, -88, -86, -84, -83, -81, 329 -79, -77, -75, -74, -72, -70, -68, -66, 330 -64, -62, -60, -58, -56, -54, -52, -49, 331 -47, -45, -43, -41, -39, -36, -34, -32, 332 -30, -28, -25, -23, -21, -19, -16, -14, 333 -12, -9, -7, -5, -3, 0, 1, 3, 334 6, 8, 10, 12, 15, 17, 19, 22, 335 24, 26, 28, 30, 33, 35, 37, 39, 41 336 }; 337 338 static const s16 hsv_red_y[] = { 339 82, 80, 78, 76, 74, 73, 71, 69, 340 67, 65, 63, 61, 58, 56, 54, 52, 341 50, 48, 46, 44, 41, 39, 37, 35, 342 32, 30, 28, 26, 23, 21, 19, 16, 343 14, 12, 10, 7, 5, 3, 0, -1, 344 -3, -6, -8, -10, -13, -15, -17, -19, 345 -22, -24, -26, -29, -31, -33, -35, -38, 346 -40, -42, -44, -46, -48, -51, -53, -55, 347 -57, -59, -61, -63, -65, -67, -69, -71, 348 -73, -75, -77, -79, -81, -82, -84, -86, 349 -88, -89, -91, -93, -94, -96, -98, -99, 350 -101, -102, -104, -105, -106, -108, -109, -110, 351 -112, -113, -114, -115, -116, -117, -119, -120, 352 -120, -121, -122, -123, -124, -125, -126, -126, 353 -127, -128, -128, -128, -128, -128, -128, -128, 354 -128, -128, -128, -128, -128, -128, -128, -128, 355 -128, -128, -128, -128, -128, -128, -128, -128, 356 -128, -128, -128, -128, -128, -128, -128, -128, 357 -127, -127, -126, -125, -125, -124, -123, -122, 358 -121, -120, -119, -118, -117, -116, -115, -114, 359 -113, -111, -110, -109, -107, -106, -105, -103, 360 -102, -100, -99, -97, -96, -94, -92, -91, 361 -89, -87, -85, -84, -82, -80, -78, -76, 362 -74, -73, -71, -69, -67, -65, -63, -61, 363 -58, -56, -54, -52, -50, -48, -46, -44, 364 -41, -39, -37, -35, -32, -30, -28, -26, 365 -23, -21, -19, -16, -14, -12, -10, -7, 366 -5, -3, 0, 1, 3, 6, 8, 10, 367 13, 15, 17, 19, 22, 24, 26, 29, 368 31, 33, 35, 38, 40, 42, 44, 46, 369 48, 51, 53, 55, 57, 59, 61, 63, 370 65, 67, 69, 71, 73, 75, 77, 79, 371 81, 82, 84, 86, 88, 89, 91, 93, 372 94, 96, 98, 99, 101, 102, 104, 105, 373 106, 108, 109, 110, 112, 113, 114, 115, 374 116, 117, 119, 120, 120, 121, 122, 123, 375 124, 125, 126, 126, 127, 128, 128, 129, 376 129, 130, 130, 131, 131, 131, 131, 132, 377 132, 132, 132, 132, 132, 132, 132, 132, 378 132, 132, 132, 131, 131, 131, 130, 130, 379 130, 129, 129, 128, 127, 127, 126, 125, 380 125, 124, 123, 122, 121, 120, 119, 118, 381 117, 116, 115, 114, 113, 111, 110, 109, 382 107, 106, 105, 103, 102, 100, 99, 97, 383 96, 94, 92, 91, 89, 87, 85, 84, 82 384 }; 385 386 static const s16 hsv_green_x[] = { 387 -124, -124, -125, -125, -125, -125, -125, -125, 388 -125, -126, -126, -125, -125, -125, -125, -125, 389 -125, -124, -124, -124, -123, -123, -122, -122, 390 -121, -121, -120, -120, -119, -118, -117, -117, 391 -116, -115, -114, -113, -112, -111, -110, -109, 392 -108, -107, -105, -104, -103, -102, -100, -99, 393 -98, -96, -95, -93, -92, -91, -89, -87, 394 -86, -84, -83, -81, -79, -77, -76, -74, 395 -72, -70, -69, -67, -65, -63, -61, -59, 396 -57, -55, -53, -51, -49, -47, -45, -43, 397 -41, -39, -37, -35, -33, -30, -28, -26, 398 -24, -22, -20, -18, -15, -13, -11, -9, 399 -7, -4, -2, 0, 1, 3, 6, 8, 400 10, 12, 14, 17, 19, 21, 23, 25, 401 27, 29, 32, 34, 36, 38, 40, 42, 402 44, 46, 48, 50, 52, 54, 56, 58, 403 60, 62, 64, 66, 68, 70, 71, 73, 404 75, 77, 78, 80, 82, 83, 85, 87, 405 88, 90, 91, 93, 94, 96, 97, 98, 406 100, 101, 102, 104, 105, 106, 107, 108, 407 109, 111, 112, 113, 113, 114, 115, 116, 408 117, 118, 118, 119, 120, 120, 121, 122, 409 122, 123, 123, 124, 124, 124, 125, 125, 410 125, 125, 125, 125, 125, 126, 126, 125, 411 125, 125, 125, 125, 125, 124, 124, 124, 412 123, 123, 122, 122, 121, 121, 120, 120, 413 119, 118, 117, 117, 116, 115, 114, 113, 414 112, 111, 110, 109, 108, 107, 105, 104, 415 103, 102, 100, 99, 98, 96, 95, 93, 416 92, 91, 89, 87, 86, 84, 83, 81, 417 79, 77, 76, 74, 72, 70, 69, 67, 418 65, 63, 61, 59, 57, 55, 53, 51, 419 49, 47, 45, 43, 41, 39, 37, 35, 420 33, 30, 28, 26, 24, 22, 20, 18, 421 15, 13, 11, 9, 7, 4, 2, 0, 422 -1, -3, -6, -8, -10, -12, -14, -17, 423 -19, -21, -23, -25, -27, -29, -32, -34, 424 -36, -38, -40, -42, -44, -46, -48, -50, 425 -52, -54, -56, -58, -60, -62, -64, -66, 426 -68, -70, -71, -73, -75, -77, -78, -80, 427 -82, -83, -85, -87, -88, -90, -91, -93, 428 -94, -96, -97, -98, -100, -101, -102, -104, 429 -105, -106, -107, -108, -109, -111, -112, -113, 430 -113, -114, -115, -116, -117, -118, -118, -119, 431 -120, -120, -121, -122, -122, -123, -123, -124, -124 432 }; 433 434 static const s16 hsv_green_y[] = { 435 -100, -99, -98, -97, -95, -94, -93, -91, 436 -90, -89, -87, -86, -84, -83, -81, -80, 437 -78, -76, -75, -73, -71, -70, -68, -66, 438 -64, -63, -61, -59, -57, -55, -53, -51, 439 -49, -48, -46, -44, -42, -40, -38, -36, 440 -34, -32, -30, -27, -25, -23, -21, -19, 441 -17, -15, -13, -11, -9, -7, -4, -2, 442 0, 1, 3, 5, 7, 9, 11, 14, 443 16, 18, 20, 22, 24, 26, 28, 30, 444 32, 34, 36, 38, 40, 42, 44, 46, 445 48, 50, 52, 54, 56, 58, 59, 61, 446 63, 65, 67, 68, 70, 72, 74, 75, 447 77, 78, 80, 82, 83, 85, 86, 88, 448 89, 90, 92, 93, 95, 96, 97, 98, 449 100, 101, 102, 103, 104, 105, 106, 107, 450 108, 109, 110, 111, 112, 112, 113, 114, 451 115, 115, 116, 116, 117, 117, 118, 118, 452 119, 119, 119, 120, 120, 120, 120, 120, 453 121, 121, 121, 121, 121, 121, 120, 120, 454 120, 120, 120, 119, 119, 119, 118, 118, 455 117, 117, 116, 116, 115, 114, 114, 113, 456 112, 111, 111, 110, 109, 108, 107, 106, 457 105, 104, 103, 102, 100, 99, 98, 97, 458 95, 94, 93, 91, 90, 89, 87, 86, 459 84, 83, 81, 80, 78, 76, 75, 73, 460 71, 70, 68, 66, 64, 63, 61, 59, 461 57, 55, 53, 51, 49, 48, 46, 44, 462 42, 40, 38, 36, 34, 32, 30, 27, 463 25, 23, 21, 19, 17, 15, 13, 11, 464 9, 7, 4, 2, 0, -1, -3, -5, 465 -7, -9, -11, -14, -16, -18, -20, -22, 466 -24, -26, -28, -30, -32, -34, -36, -38, 467 -40, -42, -44, -46, -48, -50, -52, -54, 468 -56, -58, -59, -61, -63, -65, -67, -68, 469 -70, -72, -74, -75, -77, -78, -80, -82, 470 -83, -85, -86, -88, -89, -90, -92, -93, 471 -95, -96, -97, -98, -100, -101, -102, -103, 472 -104, -105, -106, -107, -108, -109, -110, -111, 473 -112, -112, -113, -114, -115, -115, -116, -116, 474 -117, -117, -118, -118, -119, -119, -119, -120, 475 -120, -120, -120, -120, -121, -121, -121, -121, 476 -121, -121, -120, -120, -120, -120, -120, -119, 477 -119, -119, -118, -118, -117, -117, -116, -116, 478 -115, -114, -114, -113, -112, -111, -111, -110, 479 -109, -108, -107, -106, -105, -104, -103, -102, -100 480 }; 481 482 static const s16 hsv_blue_x[] = { 483 112, 113, 114, 114, 115, 116, 117, 117, 484 118, 118, 119, 119, 120, 120, 120, 121, 485 121, 121, 122, 122, 122, 122, 122, 122, 486 122, 122, 122, 122, 122, 122, 121, 121, 487 121, 120, 120, 120, 119, 119, 118, 118, 488 117, 116, 116, 115, 114, 113, 113, 112, 489 111, 110, 109, 108, 107, 106, 105, 104, 490 103, 102, 100, 99, 98, 97, 95, 94, 491 93, 91, 90, 88, 87, 85, 84, 82, 492 80, 79, 77, 76, 74, 72, 70, 69, 493 67, 65, 63, 61, 60, 58, 56, 54, 494 52, 50, 48, 46, 44, 42, 40, 38, 495 36, 34, 32, 30, 28, 26, 24, 22, 496 19, 17, 15, 13, 11, 9, 7, 5, 497 2, 0, -1, -3, -5, -7, -9, -12, 498 -14, -16, -18, -20, -22, -24, -26, -28, 499 -31, -33, -35, -37, -39, -41, -43, -45, 500 -47, -49, -51, -53, -54, -56, -58, -60, 501 -62, -64, -66, -67, -69, -71, -73, -74, 502 -76, -78, -79, -81, -83, -84, -86, -87, 503 -89, -90, -92, -93, -94, -96, -97, -98, 504 -99, -101, -102, -103, -104, -105, -106, -107, 505 -108, -109, -110, -111, -112, -113, -114, -114, 506 -115, -116, -117, -117, -118, -118, -119, -119, 507 -120, -120, -120, -121, -121, -121, -122, -122, 508 -122, -122, -122, -122, -122, -122, -122, -122, 509 -122, -122, -121, -121, -121, -120, -120, -120, 510 -119, -119, -118, -118, -117, -116, -116, -115, 511 -114, -113, -113, -112, -111, -110, -109, -108, 512 -107, -106, -105, -104, -103, -102, -100, -99, 513 -98, -97, -95, -94, -93, -91, -90, -88, 514 -87, -85, -84, -82, -80, -79, -77, -76, 515 -74, -72, -70, -69, -67, -65, -63, -61, 516 -60, -58, -56, -54, -52, -50, -48, -46, 517 -44, -42, -40, -38, -36, -34, -32, -30, 518 -28, -26, -24, -22, -19, -17, -15, -13, 519 -11, -9, -7, -5, -2, 0, 1, 3, 520 5, 7, 9, 12, 14, 16, 18, 20, 521 22, 24, 26, 28, 31, 33, 35, 37, 522 39, 41, 43, 45, 47, 49, 51, 53, 523 54, 56, 58, 60, 62, 64, 66, 67, 524 69, 71, 73, 74, 76, 78, 79, 81, 525 83, 84, 86, 87, 89, 90, 92, 93, 526 94, 96, 97, 98, 99, 101, 102, 103, 527 104, 105, 106, 107, 108, 109, 110, 111, 112 528 }; 529 530 static const s16 hsv_blue_y[] = { 531 -11, -13, -15, -17, -19, -21, -23, -25, 532 -27, -29, -31, -33, -35, -37, -39, -41, 533 -43, -45, -46, -48, -50, -52, -54, -55, 534 -57, -59, -61, -62, -64, -66, -67, -69, 535 -71, -72, -74, -75, -77, -78, -80, -81, 536 -83, -84, -86, -87, -88, -90, -91, -92, 537 -93, -95, -96, -97, -98, -99, -100, -101, 538 -102, -103, -104, -105, -106, -106, -107, -108, 539 -109, -109, -110, -111, -111, -112, -112, -113, 540 -113, -114, -114, -114, -115, -115, -115, -115, 541 -116, -116, -116, -116, -116, -116, -116, -116, 542 -116, -115, -115, -115, -115, -114, -114, -114, 543 -113, -113, -112, -112, -111, -111, -110, -110, 544 -109, -108, -108, -107, -106, -105, -104, -103, 545 -102, -101, -100, -99, -98, -97, -96, -95, 546 -94, -93, -91, -90, -89, -88, -86, -85, 547 -84, -82, -81, -79, -78, -76, -75, -73, 548 -71, -70, -68, -67, -65, -63, -62, -60, 549 -58, -56, -55, -53, -51, -49, -47, -45, 550 -44, -42, -40, -38, -36, -34, -32, -30, 551 -28, -26, -24, -22, -20, -18, -16, -14, 552 -12, -10, -8, -6, -4, -2, 0, 1, 553 3, 5, 7, 9, 11, 13, 15, 17, 554 19, 21, 23, 25, 27, 29, 31, 33, 555 35, 37, 39, 41, 43, 45, 46, 48, 556 50, 52, 54, 55, 57, 59, 61, 62, 557 64, 66, 67, 69, 71, 72, 74, 75, 558 77, 78, 80, 81, 83, 84, 86, 87, 559 88, 90, 91, 92, 93, 95, 96, 97, 560 98, 99, 100, 101, 102, 103, 104, 105, 561 106, 106, 107, 108, 109, 109, 110, 111, 562 111, 112, 112, 113, 113, 114, 114, 114, 563 115, 115, 115, 115, 116, 116, 116, 116, 564 116, 116, 116, 116, 116, 115, 115, 115, 565 115, 114, 114, 114, 113, 113, 112, 112, 566 111, 111, 110, 110, 109, 108, 108, 107, 567 106, 105, 104, 103, 102, 101, 100, 99, 568 98, 97, 96, 95, 94, 93, 91, 90, 569 89, 88, 86, 85, 84, 82, 81, 79, 570 78, 76, 75, 73, 71, 70, 68, 67, 571 65, 63, 62, 60, 58, 56, 55, 53, 572 51, 49, 47, 45, 44, 42, 40, 38, 573 36, 34, 32, 30, 28, 26, 24, 22, 574 20, 18, 16, 14, 12, 10, 8, 6, 575 4, 2, 0, -1, -3, -5, -7, -9, -11 576 }; 577 578 static const u16 bridge_init[][2] = { 579 {0x1000, 0x78}, {0x1001, 0x40}, {0x1002, 0x1c}, 580 {0x1020, 0x80}, {0x1061, 0x01}, {0x1067, 0x40}, 581 {0x1068, 0x30}, {0x1069, 0x20}, {0x106a, 0x10}, 582 {0x106b, 0x08}, {0x1188, 0x87}, {0x11a1, 0x00}, 583 {0x11a2, 0x00}, {0x11a3, 0x6a}, {0x11a4, 0x50}, 584 {0x11ab, 0x00}, {0x11ac, 0x00}, {0x11ad, 0x50}, 585 {0x11ae, 0x3c}, {0x118a, 0x04}, {0x0395, 0x04}, 586 {0x11b8, 0x3a}, {0x118b, 0x0e}, {0x10f7, 0x05}, 587 {0x10f8, 0x14}, {0x10fa, 0xff}, {0x10f9, 0x00}, 588 {0x11ba, 0x0a}, {0x11a5, 0x2d}, {0x11a6, 0x2d}, 589 {0x11a7, 0x3a}, {0x11a8, 0x05}, {0x11a9, 0x04}, 590 {0x11aa, 0x3f}, {0x11af, 0x28}, {0x11b0, 0xd8}, 591 {0x11b1, 0x14}, {0x11b2, 0xec}, {0x11b3, 0x32}, 592 {0x11b4, 0xdd}, {0x11b5, 0x32}, {0x11b6, 0xdd}, 593 {0x10e0, 0x2c}, {0x11bc, 0x40}, {0x11bd, 0x01}, 594 {0x11be, 0xf0}, {0x11bf, 0x00}, {0x118c, 0x1f}, 595 {0x118d, 0x1f}, {0x118e, 0x1f}, {0x118f, 0x1f}, 596 {0x1180, 0x01}, {0x1181, 0x00}, {0x1182, 0x01}, 597 {0x1183, 0x00}, {0x1184, 0x50}, {0x1185, 0x80}, 598 {0x1007, 0x00} 599 }; 600 601 /* Gain = (bit[3:0] / 16 + 1) * (bit[4] + 1) * (bit[5] + 1) * (bit[6] + 1) */ 602 static const u8 ov_gain[] = { 603 0x00 /* 1x */, 0x04 /* 1.25x */, 0x08 /* 1.5x */, 0x0c /* 1.75x */, 604 0x10 /* 2x */, 0x12 /* 2.25x */, 0x14 /* 2.5x */, 0x16 /* 2.75x */, 605 0x18 /* 3x */, 0x1a /* 3.25x */, 0x1c /* 3.5x */, 0x1e /* 3.75x */, 606 0x30 /* 4x */, 0x31 /* 4.25x */, 0x32 /* 4.5x */, 0x33 /* 4.75x */, 607 0x34 /* 5x */, 0x35 /* 5.25x */, 0x36 /* 5.5x */, 0x37 /* 5.75x */, 608 0x38 /* 6x */, 0x39 /* 6.25x */, 0x3a /* 6.5x */, 0x3b /* 6.75x */, 609 0x3c /* 7x */, 0x3d /* 7.25x */, 0x3e /* 7.5x */, 0x3f /* 7.75x */, 610 0x70 /* 8x */ 611 }; 612 613 /* Gain = (bit[8] + 1) * (bit[7] + 1) * (bit[6:0] * 0.03125) */ 614 static const u16 micron1_gain[] = { 615 /* 1x 1.25x 1.5x 1.75x */ 616 0x0020, 0x0028, 0x0030, 0x0038, 617 /* 2x 2.25x 2.5x 2.75x */ 618 0x00a0, 0x00a4, 0x00a8, 0x00ac, 619 /* 3x 3.25x 3.5x 3.75x */ 620 0x00b0, 0x00b4, 0x00b8, 0x00bc, 621 /* 4x 4.25x 4.5x 4.75x */ 622 0x00c0, 0x00c4, 0x00c8, 0x00cc, 623 /* 5x 5.25x 5.5x 5.75x */ 624 0x00d0, 0x00d4, 0x00d8, 0x00dc, 625 /* 6x 6.25x 6.5x 6.75x */ 626 0x00e0, 0x00e4, 0x00e8, 0x00ec, 627 /* 7x 7.25x 7.5x 7.75x */ 628 0x00f0, 0x00f4, 0x00f8, 0x00fc, 629 /* 8x */ 630 0x01c0 631 }; 632 633 /* mt9m001 sensor uses a different gain formula then other micron sensors */ 634 /* Gain = (bit[6] + 1) * (bit[5-0] * 0.125) */ 635 static const u16 micron2_gain[] = { 636 /* 1x 1.25x 1.5x 1.75x */ 637 0x0008, 0x000a, 0x000c, 0x000e, 638 /* 2x 2.25x 2.5x 2.75x */ 639 0x0010, 0x0012, 0x0014, 0x0016, 640 /* 3x 3.25x 3.5x 3.75x */ 641 0x0018, 0x001a, 0x001c, 0x001e, 642 /* 4x 4.25x 4.5x 4.75x */ 643 0x0020, 0x0051, 0x0052, 0x0053, 644 /* 5x 5.25x 5.5x 5.75x */ 645 0x0054, 0x0055, 0x0056, 0x0057, 646 /* 6x 6.25x 6.5x 6.75x */ 647 0x0058, 0x0059, 0x005a, 0x005b, 648 /* 7x 7.25x 7.5x 7.75x */ 649 0x005c, 0x005d, 0x005e, 0x005f, 650 /* 8x */ 651 0x0060 652 }; 653 654 /* Gain = .5 + bit[7:0] / 16 */ 655 static const u8 hv7131r_gain[] = { 656 0x08 /* 1x */, 0x0c /* 1.25x */, 0x10 /* 1.5x */, 0x14 /* 1.75x */, 657 0x18 /* 2x */, 0x1c /* 2.25x */, 0x20 /* 2.5x */, 0x24 /* 2.75x */, 658 0x28 /* 3x */, 0x2c /* 3.25x */, 0x30 /* 3.5x */, 0x34 /* 3.75x */, 659 0x38 /* 4x */, 0x3c /* 4.25x */, 0x40 /* 4.5x */, 0x44 /* 4.75x */, 660 0x48 /* 5x */, 0x4c /* 5.25x */, 0x50 /* 5.5x */, 0x54 /* 5.75x */, 661 0x58 /* 6x */, 0x5c /* 6.25x */, 0x60 /* 6.5x */, 0x64 /* 6.75x */, 662 0x68 /* 7x */, 0x6c /* 7.25x */, 0x70 /* 7.5x */, 0x74 /* 7.75x */, 663 0x78 /* 8x */ 664 }; 665 666 static const struct i2c_reg_u8 soi968_init[] = { 667 {0x0c, 0x00}, {0x0f, 0x1f}, 668 {0x11, 0x80}, {0x38, 0x52}, {0x1e, 0x00}, 669 {0x33, 0x08}, {0x35, 0x8c}, {0x36, 0x0c}, 670 {0x37, 0x04}, {0x45, 0x04}, {0x47, 0xff}, 671 {0x3e, 0x00}, {0x3f, 0x00}, {0x3b, 0x20}, 672 {0x3a, 0x96}, {0x3d, 0x0a}, {0x14, 0x8e}, 673 {0x13, 0x8b}, {0x12, 0x40}, {0x17, 0x13}, 674 {0x18, 0x63}, {0x19, 0x01}, {0x1a, 0x79}, 675 {0x32, 0x24}, {0x03, 0x00}, {0x11, 0x40}, 676 {0x2a, 0x10}, {0x2b, 0xe0}, {0x10, 0x32}, 677 {0x00, 0x00}, {0x01, 0x80}, {0x02, 0x80}, 678 }; 679 680 static const struct i2c_reg_u8 ov7660_init[] = { 681 {0x0e, 0x80}, {0x0d, 0x08}, {0x0f, 0xc3}, 682 {0x04, 0xc3}, {0x10, 0x40}, {0x11, 0x40}, 683 {0x12, 0x05}, {0x13, 0xba}, {0x14, 0x2a}, 684 /* HDG Set hstart and hstop, datasheet default 0x11, 0x61, using 685 0x10, 0x61 and sd->hstart, vstart = 3, fixes ugly colored borders */ 686 {0x17, 0x10}, {0x18, 0x61}, 687 {0x37, 0x0f}, {0x38, 0x02}, {0x39, 0x43}, 688 {0x3a, 0x00}, {0x69, 0x90}, {0x2d, 0x00}, 689 {0x2e, 0x00}, {0x01, 0x78}, {0x02, 0x50}, 690 }; 691 692 static const struct i2c_reg_u8 ov7670_init[] = { 693 {0x11, 0x80}, {0x3a, 0x04}, {0x12, 0x01}, 694 {0x32, 0xb6}, {0x03, 0x0a}, {0x0c, 0x00}, {0x3e, 0x00}, 695 {0x70, 0x3a}, {0x71, 0x35}, {0x72, 0x11}, {0x73, 0xf0}, 696 {0xa2, 0x02}, {0x13, 0xe0}, {0x00, 0x00}, {0x10, 0x00}, 697 {0x0d, 0x40}, {0x14, 0x28}, {0xa5, 0x05}, {0xab, 0x07}, 698 {0x24, 0x95}, {0x25, 0x33}, {0x26, 0xe3}, {0x9f, 0x75}, 699 {0xa0, 0x65}, {0xa1, 0x0b}, {0xa6, 0xd8}, {0xa7, 0xd8}, 700 {0xa8, 0xf0}, {0xa9, 0x90}, {0xaa, 0x94}, {0x13, 0xe5}, 701 {0x0e, 0x61}, {0x0f, 0x4b}, {0x16, 0x02}, {0x1e, 0x27}, 702 {0x21, 0x02}, {0x22, 0x91}, {0x29, 0x07}, {0x33, 0x0b}, 703 {0x35, 0x0b}, {0x37, 0x1d}, {0x38, 0x71}, {0x39, 0x2a}, 704 {0x3c, 0x78}, {0x4d, 0x40}, {0x4e, 0x20}, {0x69, 0x00}, 705 {0x74, 0x19}, {0x8d, 0x4f}, {0x8e, 0x00}, {0x8f, 0x00}, 706 {0x90, 0x00}, {0x91, 0x00}, {0x96, 0x00}, {0x9a, 0x80}, 707 {0xb0, 0x84}, {0xb1, 0x0c}, {0xb2, 0x0e}, {0xb3, 0x82}, 708 {0xb8, 0x0a}, {0x43, 0x0a}, {0x44, 0xf0}, {0x45, 0x20}, 709 {0x46, 0x7d}, {0x47, 0x29}, {0x48, 0x4a}, {0x59, 0x8c}, 710 {0x5a, 0xa5}, {0x5b, 0xde}, {0x5c, 0x96}, {0x5d, 0x66}, 711 {0x5e, 0x10}, {0x6c, 0x0a}, {0x6d, 0x55}, {0x6e, 0x11}, 712 {0x6f, 0x9e}, {0x6a, 0x40}, {0x01, 0x40}, {0x02, 0x40}, 713 {0x13, 0xe7}, {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x02}, 714 {0x52, 0x1d}, {0x53, 0x56}, {0x54, 0x73}, {0x55, 0x0a}, 715 {0x56, 0x55}, {0x57, 0x80}, {0x58, 0x9e}, {0x41, 0x08}, 716 {0x3f, 0x02}, {0x75, 0x03}, {0x76, 0x63}, {0x4c, 0x04}, 717 {0x77, 0x06}, {0x3d, 0x02}, {0x4b, 0x09}, {0xc9, 0x30}, 718 {0x41, 0x08}, {0x56, 0x48}, {0x34, 0x11}, {0xa4, 0x88}, 719 {0x96, 0x00}, {0x97, 0x30}, {0x98, 0x20}, {0x99, 0x30}, 720 {0x9a, 0x84}, {0x9b, 0x29}, {0x9c, 0x03}, {0x9d, 0x99}, 721 {0x9e, 0x7f}, {0x78, 0x04}, {0x79, 0x01}, {0xc8, 0xf0}, 722 {0x79, 0x0f}, {0xc8, 0x00}, {0x79, 0x10}, {0xc8, 0x7e}, 723 {0x79, 0x0a}, {0xc8, 0x80}, {0x79, 0x0b}, {0xc8, 0x01}, 724 {0x79, 0x0c}, {0xc8, 0x0f}, {0x79, 0x0d}, {0xc8, 0x20}, 725 {0x79, 0x09}, {0xc8, 0x80}, {0x79, 0x02}, {0xc8, 0xc0}, 726 {0x79, 0x03}, {0xc8, 0x40}, {0x79, 0x05}, {0xc8, 0x30}, 727 {0x79, 0x26}, {0x62, 0x20}, {0x63, 0x00}, {0x64, 0x06}, 728 {0x65, 0x00}, {0x66, 0x05}, {0x94, 0x05}, {0x95, 0x0a}, 729 {0x17, 0x13}, {0x18, 0x01}, {0x19, 0x02}, {0x1a, 0x7a}, 730 {0x46, 0x59}, {0x47, 0x30}, {0x58, 0x9a}, {0x59, 0x84}, 731 {0x5a, 0x91}, {0x5b, 0x57}, {0x5c, 0x75}, {0x5d, 0x6d}, 732 {0x5e, 0x13}, {0x64, 0x07}, {0x94, 0x07}, {0x95, 0x0d}, 733 {0xa6, 0xdf}, {0xa7, 0xdf}, {0x48, 0x4d}, {0x51, 0x00}, 734 {0x6b, 0x0a}, {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, 735 {0x92, 0x00}, {0x93, 0x00}, {0x55, 0x0a}, {0x56, 0x60}, 736 {0x4f, 0x6e}, {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, 737 {0x53, 0x56}, {0x54, 0x73}, {0x58, 0x9a}, {0x4f, 0x6e}, 738 {0x50, 0x70}, {0x51, 0x00}, {0x52, 0x1d}, {0x53, 0x56}, 739 {0x54, 0x73}, {0x58, 0x9a}, {0x3f, 0x01}, {0x7b, 0x03}, 740 {0x7c, 0x09}, {0x7d, 0x16}, {0x7e, 0x38}, {0x7f, 0x47}, 741 {0x80, 0x53}, {0x81, 0x5e}, {0x82, 0x6a}, {0x83, 0x74}, 742 {0x84, 0x80}, {0x85, 0x8c}, {0x86, 0x9b}, {0x87, 0xb2}, 743 {0x88, 0xcc}, {0x89, 0xe5}, {0x7a, 0x24}, {0x3b, 0x00}, 744 {0x9f, 0x76}, {0xa0, 0x65}, {0x13, 0xe2}, {0x6b, 0x0a}, 745 {0x11, 0x80}, {0x2a, 0x00}, {0x2b, 0x00}, {0x92, 0x00}, 746 {0x93, 0x00}, 747 }; 748 749 static const struct i2c_reg_u8 ov9650_init[] = { 750 {0x00, 0x00}, {0x01, 0x78}, 751 {0x02, 0x78}, {0x03, 0x36}, {0x04, 0x03}, 752 {0x05, 0x00}, {0x06, 0x00}, {0x08, 0x00}, 753 {0x09, 0x01}, {0x0c, 0x00}, {0x0d, 0x00}, 754 {0x0e, 0xa0}, {0x0f, 0x52}, {0x10, 0x7c}, 755 {0x11, 0x80}, {0x12, 0x45}, {0x13, 0xc2}, 756 {0x14, 0x2e}, {0x15, 0x00}, {0x16, 0x07}, 757 {0x17, 0x24}, {0x18, 0xc5}, {0x19, 0x00}, 758 {0x1a, 0x3c}, {0x1b, 0x00}, {0x1e, 0x04}, 759 {0x1f, 0x00}, {0x24, 0x78}, {0x25, 0x68}, 760 {0x26, 0xd4}, {0x27, 0x80}, {0x28, 0x80}, 761 {0x29, 0x30}, {0x2a, 0x00}, {0x2b, 0x00}, 762 {0x2c, 0x80}, {0x2d, 0x00}, {0x2e, 0x00}, 763 {0x2f, 0x00}, {0x30, 0x08}, {0x31, 0x30}, 764 {0x32, 0x84}, {0x33, 0xe2}, {0x34, 0xbf}, 765 {0x35, 0x81}, {0x36, 0xf9}, {0x37, 0x00}, 766 {0x38, 0x93}, {0x39, 0x50}, {0x3a, 0x01}, 767 {0x3b, 0x01}, {0x3c, 0x73}, {0x3d, 0x19}, 768 {0x3e, 0x0b}, {0x3f, 0x80}, {0x40, 0xc1}, 769 {0x41, 0x00}, {0x42, 0x08}, {0x67, 0x80}, 770 {0x68, 0x80}, {0x69, 0x40}, {0x6a, 0x00}, 771 {0x6b, 0x0a}, {0x8b, 0x06}, {0x8c, 0x20}, 772 {0x8d, 0x00}, {0x8e, 0x00}, {0x8f, 0xdf}, 773 {0x92, 0x00}, {0x93, 0x00}, {0x94, 0x88}, 774 {0x95, 0x88}, {0x96, 0x04}, {0xa1, 0x00}, 775 {0xa5, 0x80}, {0xa8, 0x80}, {0xa9, 0xb8}, 776 {0xaa, 0x92}, {0xab, 0x0a}, 777 }; 778 779 static const struct i2c_reg_u8 ov9655_init[] = { 780 {0x0e, 0x61}, {0x11, 0x80}, {0x13, 0xba}, 781 {0x14, 0x2e}, {0x16, 0x24}, {0x1e, 0x04}, {0x27, 0x08}, 782 {0x28, 0x08}, {0x29, 0x15}, {0x2c, 0x08}, {0x34, 0x3d}, 783 {0x35, 0x00}, {0x38, 0x12}, {0x0f, 0x42}, {0x39, 0x57}, 784 {0x3a, 0x00}, {0x3b, 0xcc}, {0x3c, 0x0c}, {0x3d, 0x19}, 785 {0x3e, 0x0c}, {0x3f, 0x01}, {0x41, 0x40}, {0x42, 0x80}, 786 {0x45, 0x46}, {0x46, 0x62}, {0x47, 0x2a}, {0x48, 0x3c}, 787 {0x4a, 0xf0}, {0x4b, 0xdc}, {0x4c, 0xdc}, {0x4d, 0xdc}, 788 {0x4e, 0xdc}, {0x6c, 0x04}, {0x6f, 0x9e}, {0x70, 0x05}, 789 {0x71, 0x78}, {0x77, 0x02}, {0x8a, 0x23}, {0x90, 0x7e}, 790 {0x91, 0x7c}, {0x9f, 0x6e}, {0xa0, 0x6e}, {0xa5, 0x68}, 791 {0xa6, 0x60}, {0xa8, 0xc1}, {0xa9, 0xfa}, {0xaa, 0x92}, 792 {0xab, 0x04}, {0xac, 0x80}, {0xad, 0x80}, {0xae, 0x80}, 793 {0xaf, 0x80}, {0xb2, 0xf2}, {0xb3, 0x20}, {0xb5, 0x00}, 794 {0xb6, 0xaf}, {0xbb, 0xae}, {0xbc, 0x44}, {0xbd, 0x44}, 795 {0xbe, 0x3b}, {0xbf, 0x3a}, {0xc1, 0xc8}, {0xc2, 0x01}, 796 {0xc4, 0x00}, {0xc6, 0x85}, {0xc7, 0x81}, {0xc9, 0xe0}, 797 {0xca, 0xe8}, {0xcc, 0xd8}, {0xcd, 0x93}, {0x2d, 0x00}, 798 {0x2e, 0x00}, {0x01, 0x80}, {0x02, 0x80}, {0x12, 0x61}, 799 {0x36, 0xfa}, {0x8c, 0x8d}, {0xc0, 0xaa}, {0x69, 0x0a}, 800 {0x03, 0x09}, {0x17, 0x16}, {0x18, 0x6e}, {0x19, 0x01}, 801 {0x1a, 0x3e}, {0x32, 0x09}, {0x2a, 0x10}, {0x2b, 0x0a}, 802 {0x92, 0x00}, {0x93, 0x00}, {0xa1, 0x00}, {0x10, 0x7c}, 803 {0x04, 0x03}, {0x00, 0x13}, 804 }; 805 806 static const struct i2c_reg_u16 mt9v112_init[] = { 807 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0020}, 808 {0x34, 0xc019}, {0x0a, 0x0011}, {0x0b, 0x000b}, 809 {0x20, 0x0703}, {0x35, 0x2022}, {0xf0, 0x0001}, 810 {0x05, 0x0000}, {0x06, 0x340c}, {0x3b, 0x042a}, 811 {0x3c, 0x0400}, {0xf0, 0x0002}, {0x2e, 0x0c58}, 812 {0x5b, 0x0001}, {0xc8, 0x9f0b}, {0xf0, 0x0001}, 813 {0x9b, 0x5300}, {0xf0, 0x0000}, {0x2b, 0x0020}, 814 {0x2c, 0x002a}, {0x2d, 0x0032}, {0x2e, 0x0020}, 815 {0x09, 0x01dc}, {0x01, 0x000c}, {0x02, 0x0020}, 816 {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c}, 817 {0x05, 0x0098}, {0x20, 0x0703}, {0x09, 0x01f2}, 818 {0x2b, 0x00a0}, {0x2c, 0x00a0}, {0x2d, 0x00a0}, 819 {0x2e, 0x00a0}, {0x01, 0x000c}, {0x02, 0x0020}, 820 {0x03, 0x01e0}, {0x04, 0x0280}, {0x06, 0x000c}, 821 {0x05, 0x0098}, {0x09, 0x01c1}, {0x2b, 0x00ae}, 822 {0x2c, 0x00ae}, {0x2d, 0x00ae}, {0x2e, 0x00ae}, 823 }; 824 825 static const struct i2c_reg_u16 mt9v111_init[] = { 826 {0x01, 0x0004}, {0x0d, 0x0001}, {0x0d, 0x0000}, 827 {0x01, 0x0001}, {0x05, 0x0004}, {0x2d, 0xe0a0}, 828 {0x2e, 0x0c64}, {0x2f, 0x0064}, {0x06, 0x600e}, 829 {0x08, 0x0480}, {0x01, 0x0004}, {0x02, 0x0016}, 830 {0x03, 0x01e7}, {0x04, 0x0287}, {0x05, 0x0004}, 831 {0x06, 0x002d}, {0x07, 0x3002}, {0x08, 0x0008}, 832 {0x0e, 0x0008}, {0x20, 0x0000} 833 }; 834 835 static const struct i2c_reg_u16 mt9v011_init[] = { 836 {0x07, 0x0002}, {0x0d, 0x0001}, {0x0d, 0x0000}, 837 {0x01, 0x0008}, {0x02, 0x0016}, {0x03, 0x01e1}, 838 {0x04, 0x0281}, {0x05, 0x0083}, {0x06, 0x0006}, 839 {0x0d, 0x0002}, {0x0a, 0x0000}, {0x0b, 0x0000}, 840 {0x0c, 0x0000}, {0x0d, 0x0000}, {0x0e, 0x0000}, 841 {0x0f, 0x0000}, {0x10, 0x0000}, {0x11, 0x0000}, 842 {0x12, 0x0000}, {0x13, 0x0000}, {0x14, 0x0000}, 843 {0x15, 0x0000}, {0x16, 0x0000}, {0x17, 0x0000}, 844 {0x18, 0x0000}, {0x19, 0x0000}, {0x1a, 0x0000}, 845 {0x1b, 0x0000}, {0x1c, 0x0000}, {0x1d, 0x0000}, 846 {0x32, 0x0000}, {0x20, 0x1101}, {0x21, 0x0000}, 847 {0x22, 0x0000}, {0x23, 0x0000}, {0x24, 0x0000}, 848 {0x25, 0x0000}, {0x26, 0x0000}, {0x27, 0x0024}, 849 {0x2f, 0xf7b0}, {0x30, 0x0005}, {0x31, 0x0000}, 850 {0x32, 0x0000}, {0x33, 0x0000}, {0x34, 0x0100}, 851 {0x3d, 0x068f}, {0x40, 0x01e0}, {0x41, 0x00d1}, 852 {0x44, 0x0082}, {0x5a, 0x0000}, {0x5b, 0x0000}, 853 {0x5c, 0x0000}, {0x5d, 0x0000}, {0x5e, 0x0000}, 854 {0x5f, 0xa31d}, {0x62, 0x0611}, {0x0a, 0x0000}, 855 {0x06, 0x0029}, {0x05, 0x0009}, {0x20, 0x1101}, 856 {0x20, 0x1101}, {0x09, 0x0064}, {0x07, 0x0003}, 857 {0x2b, 0x0033}, {0x2c, 0x00a0}, {0x2d, 0x00a0}, 858 {0x2e, 0x0033}, {0x07, 0x0002}, {0x06, 0x0000}, 859 {0x06, 0x0029}, {0x05, 0x0009}, 860 }; 861 862 static const struct i2c_reg_u16 mt9m001_init[] = { 863 {0x0d, 0x0001}, 864 {0x0d, 0x0000}, 865 {0x04, 0x0500}, /* hres = 1280 */ 866 {0x03, 0x0400}, /* vres = 1024 */ 867 {0x20, 0x1100}, 868 {0x06, 0x0010}, 869 {0x2b, 0x0024}, 870 {0x2e, 0x0024}, 871 {0x35, 0x0024}, 872 {0x2d, 0x0020}, 873 {0x2c, 0x0020}, 874 {0x09, 0x0ad4}, 875 {0x35, 0x0057}, 876 }; 877 878 static const struct i2c_reg_u16 mt9m111_init[] = { 879 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008}, 880 {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300}, 881 {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e}, 882 {0xf0, 0x0000}, 883 }; 884 885 static const struct i2c_reg_u16 mt9m112_init[] = { 886 {0xf0, 0x0000}, {0x0d, 0x0021}, {0x0d, 0x0008}, 887 {0xf0, 0x0001}, {0x3a, 0x4300}, {0x9b, 0x4300}, 888 {0x06, 0x708e}, {0xf0, 0x0002}, {0x2e, 0x0a1e}, 889 {0xf0, 0x0000}, 890 }; 891 892 static const struct i2c_reg_u8 hv7131r_init[] = { 893 {0x02, 0x08}, {0x02, 0x00}, {0x01, 0x08}, 894 {0x02, 0x00}, {0x20, 0x00}, {0x21, 0xd0}, 895 {0x22, 0x00}, {0x23, 0x09}, {0x01, 0x08}, 896 {0x01, 0x08}, {0x01, 0x08}, {0x25, 0x07}, 897 {0x26, 0xc3}, {0x27, 0x50}, {0x30, 0x62}, 898 {0x31, 0x10}, {0x32, 0x06}, {0x33, 0x10}, 899 {0x20, 0x00}, {0x21, 0xd0}, {0x22, 0x00}, 900 {0x23, 0x09}, {0x01, 0x08}, 901 }; 902 903 static void reg_r(struct gspca_dev *gspca_dev, u16 reg, u16 length) 904 { 905 struct usb_device *dev = gspca_dev->dev; 906 int result; 907 908 if (gspca_dev->usb_err < 0) 909 return; 910 result = usb_control_msg(dev, usb_rcvctrlpipe(dev, 0), 911 0x00, 912 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 913 reg, 914 0x00, 915 gspca_dev->usb_buf, 916 length, 917 500); 918 if (unlikely(result < 0 || result != length)) { 919 pr_err("Read register %02x failed %d\n", reg, result); 920 gspca_dev->usb_err = result; 921 } 922 } 923 924 static void reg_w(struct gspca_dev *gspca_dev, u16 reg, 925 const u8 *buffer, int length) 926 { 927 struct usb_device *dev = gspca_dev->dev; 928 int result; 929 930 if (gspca_dev->usb_err < 0) 931 return; 932 memcpy(gspca_dev->usb_buf, buffer, length); 933 result = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 934 0x08, 935 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE, 936 reg, 937 0x00, 938 gspca_dev->usb_buf, 939 length, 940 500); 941 if (unlikely(result < 0 || result != length)) { 942 pr_err("Write register %02x failed %d\n", reg, result); 943 gspca_dev->usb_err = result; 944 } 945 } 946 947 static void reg_w1(struct gspca_dev *gspca_dev, u16 reg, const u8 value) 948 { 949 reg_w(gspca_dev, reg, &value, 1); 950 } 951 952 static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buffer) 953 { 954 int i; 955 956 reg_w(gspca_dev, 0x10c0, buffer, 8); 957 for (i = 0; i < 5; i++) { 958 reg_r(gspca_dev, 0x10c0, 1); 959 if (gspca_dev->usb_err < 0) 960 return; 961 if (gspca_dev->usb_buf[0] & 0x04) { 962 if (gspca_dev->usb_buf[0] & 0x08) { 963 pr_err("i2c_w error\n"); 964 gspca_dev->usb_err = -EIO; 965 } 966 return; 967 } 968 msleep(10); 969 } 970 pr_err("i2c_w reg %02x no response\n", buffer[2]); 971 /* gspca_dev->usb_err = -EIO; fixme: may occur */ 972 } 973 974 static void i2c_w1(struct gspca_dev *gspca_dev, u8 reg, u8 val) 975 { 976 struct sd *sd = (struct sd *) gspca_dev; 977 u8 row[8]; 978 979 /* 980 * from the point of view of the bridge, the length 981 * includes the address 982 */ 983 row[0] = sd->i2c_intf | (2 << 4); 984 row[1] = sd->i2c_addr; 985 row[2] = reg; 986 row[3] = val; 987 row[4] = 0x00; 988 row[5] = 0x00; 989 row[6] = 0x00; 990 row[7] = 0x10; 991 992 i2c_w(gspca_dev, row); 993 } 994 995 static void i2c_w1_buf(struct gspca_dev *gspca_dev, 996 const struct i2c_reg_u8 *buf, int sz) 997 { 998 while (--sz >= 0) { 999 i2c_w1(gspca_dev, buf->reg, buf->val); 1000 buf++; 1001 } 1002 } 1003 1004 static void i2c_w2(struct gspca_dev *gspca_dev, u8 reg, u16 val) 1005 { 1006 struct sd *sd = (struct sd *) gspca_dev; 1007 u8 row[8]; 1008 1009 /* 1010 * from the point of view of the bridge, the length 1011 * includes the address 1012 */ 1013 row[0] = sd->i2c_intf | (3 << 4); 1014 row[1] = sd->i2c_addr; 1015 row[2] = reg; 1016 row[3] = val >> 8; 1017 row[4] = val; 1018 row[5] = 0x00; 1019 row[6] = 0x00; 1020 row[7] = 0x10; 1021 1022 i2c_w(gspca_dev, row); 1023 } 1024 1025 static void i2c_w2_buf(struct gspca_dev *gspca_dev, 1026 const struct i2c_reg_u16 *buf, int sz) 1027 { 1028 while (--sz >= 0) { 1029 i2c_w2(gspca_dev, buf->reg, buf->val); 1030 buf++; 1031 } 1032 } 1033 1034 static void i2c_r1(struct gspca_dev *gspca_dev, u8 reg, u8 *val) 1035 { 1036 struct sd *sd = (struct sd *) gspca_dev; 1037 u8 row[8]; 1038 1039 row[0] = sd->i2c_intf | (1 << 4); 1040 row[1] = sd->i2c_addr; 1041 row[2] = reg; 1042 row[3] = 0; 1043 row[4] = 0; 1044 row[5] = 0; 1045 row[6] = 0; 1046 row[7] = 0x10; 1047 i2c_w(gspca_dev, row); 1048 row[0] = sd->i2c_intf | (1 << 4) | 0x02; 1049 row[2] = 0; 1050 i2c_w(gspca_dev, row); 1051 reg_r(gspca_dev, 0x10c2, 5); 1052 *val = gspca_dev->usb_buf[4]; 1053 } 1054 1055 static void i2c_r2(struct gspca_dev *gspca_dev, u8 reg, u16 *val) 1056 { 1057 struct sd *sd = (struct sd *) gspca_dev; 1058 u8 row[8]; 1059 1060 row[0] = sd->i2c_intf | (1 << 4); 1061 row[1] = sd->i2c_addr; 1062 row[2] = reg; 1063 row[3] = 0; 1064 row[4] = 0; 1065 row[5] = 0; 1066 row[6] = 0; 1067 row[7] = 0x10; 1068 i2c_w(gspca_dev, row); 1069 row[0] = sd->i2c_intf | (2 << 4) | 0x02; 1070 row[2] = 0; 1071 i2c_w(gspca_dev, row); 1072 reg_r(gspca_dev, 0x10c2, 5); 1073 *val = (gspca_dev->usb_buf[3] << 8) | gspca_dev->usb_buf[4]; 1074 } 1075 1076 static void ov9650_init_sensor(struct gspca_dev *gspca_dev) 1077 { 1078 u16 id; 1079 struct sd *sd = (struct sd *) gspca_dev; 1080 1081 i2c_r2(gspca_dev, 0x1c, &id); 1082 if (gspca_dev->usb_err < 0) 1083 return; 1084 1085 if (id != 0x7fa2) { 1086 pr_err("sensor id for ov9650 doesn't match (0x%04x)\n", id); 1087 gspca_dev->usb_err = -ENODEV; 1088 return; 1089 } 1090 1091 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ 1092 msleep(200); 1093 i2c_w1_buf(gspca_dev, ov9650_init, ARRAY_SIZE(ov9650_init)); 1094 if (gspca_dev->usb_err < 0) 1095 pr_err("OV9650 sensor initialization failed\n"); 1096 sd->hstart = 1; 1097 sd->vstart = 7; 1098 } 1099 1100 static void ov9655_init_sensor(struct gspca_dev *gspca_dev) 1101 { 1102 struct sd *sd = (struct sd *) gspca_dev; 1103 1104 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ 1105 msleep(200); 1106 i2c_w1_buf(gspca_dev, ov9655_init, ARRAY_SIZE(ov9655_init)); 1107 if (gspca_dev->usb_err < 0) 1108 pr_err("OV9655 sensor initialization failed\n"); 1109 1110 sd->hstart = 1; 1111 sd->vstart = 2; 1112 } 1113 1114 static void soi968_init_sensor(struct gspca_dev *gspca_dev) 1115 { 1116 struct sd *sd = (struct sd *) gspca_dev; 1117 1118 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ 1119 msleep(200); 1120 i2c_w1_buf(gspca_dev, soi968_init, ARRAY_SIZE(soi968_init)); 1121 if (gspca_dev->usb_err < 0) 1122 pr_err("SOI968 sensor initialization failed\n"); 1123 1124 sd->hstart = 60; 1125 sd->vstart = 11; 1126 } 1127 1128 static void ov7660_init_sensor(struct gspca_dev *gspca_dev) 1129 { 1130 struct sd *sd = (struct sd *) gspca_dev; 1131 1132 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ 1133 msleep(200); 1134 i2c_w1_buf(gspca_dev, ov7660_init, ARRAY_SIZE(ov7660_init)); 1135 if (gspca_dev->usb_err < 0) 1136 pr_err("OV7660 sensor initialization failed\n"); 1137 sd->hstart = 3; 1138 sd->vstart = 3; 1139 } 1140 1141 static void ov7670_init_sensor(struct gspca_dev *gspca_dev) 1142 { 1143 struct sd *sd = (struct sd *) gspca_dev; 1144 1145 i2c_w1(gspca_dev, 0x12, 0x80); /* sensor reset */ 1146 msleep(200); 1147 i2c_w1_buf(gspca_dev, ov7670_init, ARRAY_SIZE(ov7670_init)); 1148 if (gspca_dev->usb_err < 0) 1149 pr_err("OV7670 sensor initialization failed\n"); 1150 1151 sd->hstart = 0; 1152 sd->vstart = 1; 1153 } 1154 1155 static void mt9v_init_sensor(struct gspca_dev *gspca_dev) 1156 { 1157 struct sd *sd = (struct sd *) gspca_dev; 1158 u16 value; 1159 1160 sd->i2c_addr = 0x5d; 1161 i2c_r2(gspca_dev, 0xff, &value); 1162 if (gspca_dev->usb_err >= 0 1163 && value == 0x8243) { 1164 i2c_w2_buf(gspca_dev, mt9v011_init, ARRAY_SIZE(mt9v011_init)); 1165 if (gspca_dev->usb_err < 0) { 1166 pr_err("MT9V011 sensor initialization failed\n"); 1167 return; 1168 } 1169 sd->hstart = 2; 1170 sd->vstart = 2; 1171 sd->sensor = SENSOR_MT9V011; 1172 pr_info("MT9V011 sensor detected\n"); 1173 return; 1174 } 1175 1176 gspca_dev->usb_err = 0; 1177 sd->i2c_addr = 0x5c; 1178 i2c_w2(gspca_dev, 0x01, 0x0004); 1179 i2c_r2(gspca_dev, 0xff, &value); 1180 if (gspca_dev->usb_err >= 0 1181 && value == 0x823a) { 1182 i2c_w2_buf(gspca_dev, mt9v111_init, ARRAY_SIZE(mt9v111_init)); 1183 if (gspca_dev->usb_err < 0) { 1184 pr_err("MT9V111 sensor initialization failed\n"); 1185 return; 1186 } 1187 sd->hstart = 2; 1188 sd->vstart = 2; 1189 sd->sensor = SENSOR_MT9V111; 1190 pr_info("MT9V111 sensor detected\n"); 1191 return; 1192 } 1193 1194 gspca_dev->usb_err = 0; 1195 sd->i2c_addr = 0x5d; 1196 i2c_w2(gspca_dev, 0xf0, 0x0000); 1197 if (gspca_dev->usb_err < 0) { 1198 gspca_dev->usb_err = 0; 1199 sd->i2c_addr = 0x48; 1200 i2c_w2(gspca_dev, 0xf0, 0x0000); 1201 } 1202 i2c_r2(gspca_dev, 0x00, &value); 1203 if (gspca_dev->usb_err >= 0 1204 && value == 0x1229) { 1205 i2c_w2_buf(gspca_dev, mt9v112_init, ARRAY_SIZE(mt9v112_init)); 1206 if (gspca_dev->usb_err < 0) { 1207 pr_err("MT9V112 sensor initialization failed\n"); 1208 return; 1209 } 1210 sd->hstart = 6; 1211 sd->vstart = 2; 1212 sd->sensor = SENSOR_MT9V112; 1213 pr_info("MT9V112 sensor detected\n"); 1214 return; 1215 } 1216 1217 gspca_dev->usb_err = -ENODEV; 1218 } 1219 1220 static void mt9m112_init_sensor(struct gspca_dev *gspca_dev) 1221 { 1222 struct sd *sd = (struct sd *) gspca_dev; 1223 1224 i2c_w2_buf(gspca_dev, mt9m112_init, ARRAY_SIZE(mt9m112_init)); 1225 if (gspca_dev->usb_err < 0) 1226 pr_err("MT9M112 sensor initialization failed\n"); 1227 1228 sd->hstart = 0; 1229 sd->vstart = 2; 1230 } 1231 1232 static void mt9m111_init_sensor(struct gspca_dev *gspca_dev) 1233 { 1234 struct sd *sd = (struct sd *) gspca_dev; 1235 1236 i2c_w2_buf(gspca_dev, mt9m111_init, ARRAY_SIZE(mt9m111_init)); 1237 if (gspca_dev->usb_err < 0) 1238 pr_err("MT9M111 sensor initialization failed\n"); 1239 1240 sd->hstart = 0; 1241 sd->vstart = 2; 1242 } 1243 1244 static void mt9m001_init_sensor(struct gspca_dev *gspca_dev) 1245 { 1246 struct sd *sd = (struct sd *) gspca_dev; 1247 u16 id; 1248 1249 i2c_r2(gspca_dev, 0x00, &id); 1250 if (gspca_dev->usb_err < 0) 1251 return; 1252 1253 /* must be 0x8411 or 0x8421 for colour sensor and 8431 for bw */ 1254 switch (id) { 1255 case 0x8411: 1256 case 0x8421: 1257 pr_info("MT9M001 color sensor detected\n"); 1258 break; 1259 case 0x8431: 1260 pr_info("MT9M001 mono sensor detected\n"); 1261 break; 1262 default: 1263 pr_err("No MT9M001 chip detected, ID = %x\n\n", id); 1264 gspca_dev->usb_err = -ENODEV; 1265 return; 1266 } 1267 1268 i2c_w2_buf(gspca_dev, mt9m001_init, ARRAY_SIZE(mt9m001_init)); 1269 if (gspca_dev->usb_err < 0) 1270 pr_err("MT9M001 sensor initialization failed\n"); 1271 1272 sd->hstart = 1; 1273 sd->vstart = 1; 1274 } 1275 1276 static void hv7131r_init_sensor(struct gspca_dev *gspca_dev) 1277 { 1278 struct sd *sd = (struct sd *) gspca_dev; 1279 1280 i2c_w1_buf(gspca_dev, hv7131r_init, ARRAY_SIZE(hv7131r_init)); 1281 if (gspca_dev->usb_err < 0) 1282 pr_err("HV7131R Sensor initialization failed\n"); 1283 1284 sd->hstart = 0; 1285 sd->vstart = 1; 1286 } 1287 1288 static void set_cmatrix(struct gspca_dev *gspca_dev, 1289 s32 brightness, s32 contrast, s32 satur, s32 hue) 1290 { 1291 s32 hue_coord, hue_index = 180 + hue; 1292 u8 cmatrix[21]; 1293 1294 memset(cmatrix, 0, sizeof(cmatrix)); 1295 cmatrix[2] = (contrast * 0x25 / 0x100) + 0x26; 1296 cmatrix[0] = 0x13 + (cmatrix[2] - 0x26) * 0x13 / 0x25; 1297 cmatrix[4] = 0x07 + (cmatrix[2] - 0x26) * 0x07 / 0x25; 1298 cmatrix[18] = brightness - 0x80; 1299 1300 hue_coord = (hsv_red_x[hue_index] * satur) >> 8; 1301 cmatrix[6] = hue_coord; 1302 cmatrix[7] = (hue_coord >> 8) & 0x0f; 1303 1304 hue_coord = (hsv_red_y[hue_index] * satur) >> 8; 1305 cmatrix[8] = hue_coord; 1306 cmatrix[9] = (hue_coord >> 8) & 0x0f; 1307 1308 hue_coord = (hsv_green_x[hue_index] * satur) >> 8; 1309 cmatrix[10] = hue_coord; 1310 cmatrix[11] = (hue_coord >> 8) & 0x0f; 1311 1312 hue_coord = (hsv_green_y[hue_index] * satur) >> 8; 1313 cmatrix[12] = hue_coord; 1314 cmatrix[13] = (hue_coord >> 8) & 0x0f; 1315 1316 hue_coord = (hsv_blue_x[hue_index] * satur) >> 8; 1317 cmatrix[14] = hue_coord; 1318 cmatrix[15] = (hue_coord >> 8) & 0x0f; 1319 1320 hue_coord = (hsv_blue_y[hue_index] * satur) >> 8; 1321 cmatrix[16] = hue_coord; 1322 cmatrix[17] = (hue_coord >> 8) & 0x0f; 1323 1324 reg_w(gspca_dev, 0x10e1, cmatrix, 21); 1325 } 1326 1327 static void set_gamma(struct gspca_dev *gspca_dev, s32 val) 1328 { 1329 u8 gamma[17]; 1330 u8 gval = val * 0xb8 / 0x100; 1331 1332 gamma[0] = 0x0a; 1333 gamma[1] = 0x13 + (gval * (0xcb - 0x13) / 0xb8); 1334 gamma[2] = 0x25 + (gval * (0xee - 0x25) / 0xb8); 1335 gamma[3] = 0x37 + (gval * (0xfa - 0x37) / 0xb8); 1336 gamma[4] = 0x45 + (gval * (0xfc - 0x45) / 0xb8); 1337 gamma[5] = 0x55 + (gval * (0xfb - 0x55) / 0xb8); 1338 gamma[6] = 0x65 + (gval * (0xfc - 0x65) / 0xb8); 1339 gamma[7] = 0x74 + (gval * (0xfd - 0x74) / 0xb8); 1340 gamma[8] = 0x83 + (gval * (0xfe - 0x83) / 0xb8); 1341 gamma[9] = 0x92 + (gval * (0xfc - 0x92) / 0xb8); 1342 gamma[10] = 0xa1 + (gval * (0xfc - 0xa1) / 0xb8); 1343 gamma[11] = 0xb0 + (gval * (0xfc - 0xb0) / 0xb8); 1344 gamma[12] = 0xbf + (gval * (0xfb - 0xbf) / 0xb8); 1345 gamma[13] = 0xce + (gval * (0xfb - 0xce) / 0xb8); 1346 gamma[14] = 0xdf + (gval * (0xfd - 0xdf) / 0xb8); 1347 gamma[15] = 0xea + (gval * (0xf9 - 0xea) / 0xb8); 1348 gamma[16] = 0xf5; 1349 1350 reg_w(gspca_dev, 0x1190, gamma, 17); 1351 } 1352 1353 static void set_redblue(struct gspca_dev *gspca_dev, s32 blue, s32 red) 1354 { 1355 reg_w1(gspca_dev, 0x118c, red); 1356 reg_w1(gspca_dev, 0x118f, blue); 1357 } 1358 1359 static void set_hvflip(struct gspca_dev *gspca_dev, s32 hflip, s32 vflip) 1360 { 1361 u8 value, tslb; 1362 u16 value2; 1363 struct sd *sd = (struct sd *) gspca_dev; 1364 1365 if ((sd->flags & FLIP_DETECT) && dmi_check_system(flip_dmi_table)) { 1366 hflip = !hflip; 1367 vflip = !vflip; 1368 } 1369 1370 switch (sd->sensor) { 1371 case SENSOR_OV7660: 1372 value = 0x01; 1373 if (hflip) 1374 value |= 0x20; 1375 if (vflip) { 1376 value |= 0x10; 1377 sd->vstart = 2; 1378 } else { 1379 sd->vstart = 3; 1380 } 1381 reg_w1(gspca_dev, 0x1182, sd->vstart); 1382 i2c_w1(gspca_dev, 0x1e, value); 1383 break; 1384 case SENSOR_OV9650: 1385 i2c_r1(gspca_dev, 0x1e, &value); 1386 value &= ~0x30; 1387 tslb = 0x01; 1388 if (hflip) 1389 value |= 0x20; 1390 if (vflip) { 1391 value |= 0x10; 1392 tslb = 0x49; 1393 } 1394 i2c_w1(gspca_dev, 0x1e, value); 1395 i2c_w1(gspca_dev, 0x3a, tslb); 1396 break; 1397 case SENSOR_MT9V111: 1398 case SENSOR_MT9V011: 1399 i2c_r2(gspca_dev, 0x20, &value2); 1400 value2 &= ~0xc0a0; 1401 if (hflip) 1402 value2 |= 0x8080; 1403 if (vflip) 1404 value2 |= 0x4020; 1405 i2c_w2(gspca_dev, 0x20, value2); 1406 break; 1407 case SENSOR_MT9M112: 1408 case SENSOR_MT9M111: 1409 case SENSOR_MT9V112: 1410 i2c_r2(gspca_dev, 0x20, &value2); 1411 value2 &= ~0x0003; 1412 if (hflip) 1413 value2 |= 0x0002; 1414 if (vflip) 1415 value2 |= 0x0001; 1416 i2c_w2(gspca_dev, 0x20, value2); 1417 break; 1418 case SENSOR_HV7131R: 1419 i2c_r1(gspca_dev, 0x01, &value); 1420 value &= ~0x03; 1421 if (vflip) 1422 value |= 0x01; 1423 if (hflip) 1424 value |= 0x02; 1425 i2c_w1(gspca_dev, 0x01, value); 1426 break; 1427 } 1428 } 1429 1430 static void set_exposure(struct gspca_dev *gspca_dev, s32 expo) 1431 { 1432 struct sd *sd = (struct sd *) gspca_dev; 1433 u8 exp[8] = {sd->i2c_intf, sd->i2c_addr, 1434 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}; 1435 int expo2; 1436 1437 if (gspca_dev->streaming) 1438 exp[7] = 0x1e; 1439 1440 switch (sd->sensor) { 1441 case SENSOR_OV7660: 1442 case SENSOR_OV7670: 1443 case SENSOR_OV9655: 1444 case SENSOR_OV9650: 1445 if (expo > 547) 1446 expo2 = 547; 1447 else 1448 expo2 = expo; 1449 exp[0] |= (2 << 4); 1450 exp[2] = 0x10; /* AECH */ 1451 exp[3] = expo2 >> 2; 1452 exp[7] = 0x10; 1453 i2c_w(gspca_dev, exp); 1454 exp[2] = 0x04; /* COM1 */ 1455 exp[3] = expo2 & 0x0003; 1456 exp[7] = 0x10; 1457 i2c_w(gspca_dev, exp); 1458 expo -= expo2; 1459 exp[7] = 0x1e; 1460 exp[0] |= (3 << 4); 1461 exp[2] = 0x2d; /* ADVFL & ADVFH */ 1462 exp[3] = expo; 1463 exp[4] = expo >> 8; 1464 break; 1465 case SENSOR_MT9M001: 1466 case SENSOR_MT9V112: 1467 case SENSOR_MT9V011: 1468 exp[0] |= (3 << 4); 1469 exp[2] = 0x09; 1470 exp[3] = expo >> 8; 1471 exp[4] = expo; 1472 break; 1473 case SENSOR_HV7131R: 1474 exp[0] |= (4 << 4); 1475 exp[2] = 0x25; 1476 exp[3] = expo >> 5; 1477 exp[4] = expo << 3; 1478 exp[5] = 0; 1479 break; 1480 default: 1481 return; 1482 } 1483 i2c_w(gspca_dev, exp); 1484 } 1485 1486 static void set_gain(struct gspca_dev *gspca_dev, s32 g) 1487 { 1488 struct sd *sd = (struct sd *) gspca_dev; 1489 u8 gain[8] = {sd->i2c_intf, sd->i2c_addr, 1490 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}; 1491 1492 if (gspca_dev->streaming) 1493 gain[7] = 0x15; /* or 1d ? */ 1494 1495 switch (sd->sensor) { 1496 case SENSOR_OV7660: 1497 case SENSOR_OV7670: 1498 case SENSOR_SOI968: 1499 case SENSOR_OV9655: 1500 case SENSOR_OV9650: 1501 gain[0] |= (2 << 4); 1502 gain[3] = ov_gain[g]; 1503 break; 1504 case SENSOR_MT9V011: 1505 gain[0] |= (3 << 4); 1506 gain[2] = 0x35; 1507 gain[3] = micron1_gain[g] >> 8; 1508 gain[4] = micron1_gain[g]; 1509 break; 1510 case SENSOR_MT9V112: 1511 gain[0] |= (3 << 4); 1512 gain[2] = 0x2f; 1513 gain[3] = micron1_gain[g] >> 8; 1514 gain[4] = micron1_gain[g]; 1515 break; 1516 case SENSOR_MT9M001: 1517 gain[0] |= (3 << 4); 1518 gain[2] = 0x2f; 1519 gain[3] = micron2_gain[g] >> 8; 1520 gain[4] = micron2_gain[g]; 1521 break; 1522 case SENSOR_HV7131R: 1523 gain[0] |= (2 << 4); 1524 gain[2] = 0x30; 1525 gain[3] = hv7131r_gain[g]; 1526 break; 1527 default: 1528 return; 1529 } 1530 i2c_w(gspca_dev, gain); 1531 } 1532 1533 static void set_quality(struct gspca_dev *gspca_dev, s32 val) 1534 { 1535 struct sd *sd = (struct sd *) gspca_dev; 1536 1537 jpeg_set_qual(sd->jpeg_hdr, val); 1538 reg_w1(gspca_dev, 0x1061, 0x01); /* stop transfer */ 1539 reg_w1(gspca_dev, 0x10e0, sd->fmt | 0x20); /* write QTAB */ 1540 reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64); 1541 reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64); 1542 reg_w1(gspca_dev, 0x1061, 0x03); /* restart transfer */ 1543 reg_w1(gspca_dev, 0x10e0, sd->fmt); 1544 sd->fmt ^= 0x0c; /* invert QTAB use + write */ 1545 reg_w1(gspca_dev, 0x10e0, sd->fmt); 1546 } 1547 1548 #ifdef CONFIG_VIDEO_ADV_DEBUG 1549 static int sd_dbg_g_register(struct gspca_dev *gspca_dev, 1550 struct v4l2_dbg_register *reg) 1551 { 1552 struct sd *sd = (struct sd *) gspca_dev; 1553 1554 reg->size = 1; 1555 switch (reg->match.addr) { 1556 case 0: 1557 if (reg->reg < 0x1000 || reg->reg > 0x11ff) 1558 return -EINVAL; 1559 reg_r(gspca_dev, reg->reg, 1); 1560 reg->val = gspca_dev->usb_buf[0]; 1561 return gspca_dev->usb_err; 1562 case 1: 1563 if (sd->sensor >= SENSOR_MT9V011 && 1564 sd->sensor <= SENSOR_MT9M112) { 1565 i2c_r2(gspca_dev, reg->reg, (u16 *) ®->val); 1566 reg->size = 2; 1567 } else { 1568 i2c_r1(gspca_dev, reg->reg, (u8 *) ®->val); 1569 } 1570 return gspca_dev->usb_err; 1571 } 1572 return -EINVAL; 1573 } 1574 1575 static int sd_dbg_s_register(struct gspca_dev *gspca_dev, 1576 const struct v4l2_dbg_register *reg) 1577 { 1578 struct sd *sd = (struct sd *) gspca_dev; 1579 1580 switch (reg->match.addr) { 1581 case 0: 1582 if (reg->reg < 0x1000 || reg->reg > 0x11ff) 1583 return -EINVAL; 1584 reg_w1(gspca_dev, reg->reg, reg->val); 1585 return gspca_dev->usb_err; 1586 case 1: 1587 if (sd->sensor >= SENSOR_MT9V011 && 1588 sd->sensor <= SENSOR_MT9M112) { 1589 i2c_w2(gspca_dev, reg->reg, reg->val); 1590 } else { 1591 i2c_w1(gspca_dev, reg->reg, reg->val); 1592 } 1593 return gspca_dev->usb_err; 1594 } 1595 return -EINVAL; 1596 } 1597 1598 static int sd_chip_info(struct gspca_dev *gspca_dev, 1599 struct v4l2_dbg_chip_info *chip) 1600 { 1601 if (chip->match.addr > 1) 1602 return -EINVAL; 1603 if (chip->match.addr == 1) 1604 strscpy(chip->name, "sensor", sizeof(chip->name)); 1605 return 0; 1606 } 1607 #endif 1608 1609 static int sd_config(struct gspca_dev *gspca_dev, 1610 const struct usb_device_id *id) 1611 { 1612 struct sd *sd = (struct sd *) gspca_dev; 1613 struct cam *cam; 1614 1615 cam = &gspca_dev->cam; 1616 cam->needs_full_bandwidth = 1; 1617 1618 sd->sensor = id->driver_info >> 8; 1619 sd->i2c_addr = id->driver_info; 1620 sd->flags = id->driver_info >> 16; 1621 sd->i2c_intf = 0x80; /* i2c 100 Kb/s */ 1622 1623 switch (sd->sensor) { 1624 case SENSOR_MT9M112: 1625 case SENSOR_MT9M111: 1626 case SENSOR_OV9650: 1627 case SENSOR_SOI968: 1628 cam->cam_mode = sxga_mode; 1629 cam->nmodes = ARRAY_SIZE(sxga_mode); 1630 break; 1631 case SENSOR_MT9M001: 1632 cam->cam_mode = mono_mode; 1633 cam->nmodes = ARRAY_SIZE(mono_mode); 1634 break; 1635 case SENSOR_HV7131R: 1636 sd->i2c_intf = 0x81; /* i2c 400 Kb/s */ 1637 /* fall through */ 1638 default: 1639 cam->cam_mode = vga_mode; 1640 cam->nmodes = ARRAY_SIZE(vga_mode); 1641 break; 1642 } 1643 1644 sd->old_step = 0; 1645 sd->older_step = 0; 1646 sd->exposure_step = 16; 1647 1648 INIT_WORK(&sd->work, qual_upd); 1649 1650 return 0; 1651 } 1652 1653 static int sd_s_ctrl(struct v4l2_ctrl *ctrl) 1654 { 1655 struct gspca_dev *gspca_dev = 1656 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); 1657 struct sd *sd = (struct sd *)gspca_dev; 1658 1659 gspca_dev->usb_err = 0; 1660 1661 if (!gspca_dev->streaming) 1662 return 0; 1663 1664 switch (ctrl->id) { 1665 /* color control cluster */ 1666 case V4L2_CID_BRIGHTNESS: 1667 set_cmatrix(gspca_dev, sd->brightness->val, 1668 sd->contrast->val, sd->saturation->val, sd->hue->val); 1669 break; 1670 case V4L2_CID_GAMMA: 1671 set_gamma(gspca_dev, ctrl->val); 1672 break; 1673 /* blue/red balance cluster */ 1674 case V4L2_CID_BLUE_BALANCE: 1675 set_redblue(gspca_dev, sd->blue->val, sd->red->val); 1676 break; 1677 /* h/vflip cluster */ 1678 case V4L2_CID_HFLIP: 1679 set_hvflip(gspca_dev, sd->hflip->val, sd->vflip->val); 1680 break; 1681 /* standalone exposure control */ 1682 case V4L2_CID_EXPOSURE: 1683 set_exposure(gspca_dev, ctrl->val); 1684 break; 1685 /* standalone gain control */ 1686 case V4L2_CID_GAIN: 1687 set_gain(gspca_dev, ctrl->val); 1688 break; 1689 /* autogain + exposure or gain control cluster */ 1690 case V4L2_CID_AUTOGAIN: 1691 if (sd->sensor == SENSOR_SOI968) 1692 set_gain(gspca_dev, sd->gain->val); 1693 else 1694 set_exposure(gspca_dev, sd->exposure->val); 1695 break; 1696 case V4L2_CID_JPEG_COMPRESSION_QUALITY: 1697 set_quality(gspca_dev, ctrl->val); 1698 break; 1699 } 1700 return gspca_dev->usb_err; 1701 } 1702 1703 static const struct v4l2_ctrl_ops sd_ctrl_ops = { 1704 .s_ctrl = sd_s_ctrl, 1705 }; 1706 1707 static int sd_init_controls(struct gspca_dev *gspca_dev) 1708 { 1709 struct sd *sd = (struct sd *) gspca_dev; 1710 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 1711 1712 gspca_dev->vdev.ctrl_handler = hdl; 1713 v4l2_ctrl_handler_init(hdl, 13); 1714 1715 sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1716 V4L2_CID_BRIGHTNESS, 0, 255, 1, 127); 1717 sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1718 V4L2_CID_CONTRAST, 0, 255, 1, 127); 1719 sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1720 V4L2_CID_SATURATION, 0, 255, 1, 127); 1721 sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1722 V4L2_CID_HUE, -180, 180, 1, 0); 1723 1724 sd->gamma = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1725 V4L2_CID_GAMMA, 0, 255, 1, 0x10); 1726 1727 sd->blue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1728 V4L2_CID_BLUE_BALANCE, 0, 127, 1, 0x28); 1729 sd->red = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1730 V4L2_CID_RED_BALANCE, 0, 127, 1, 0x28); 1731 1732 if (sd->sensor != SENSOR_OV9655 && sd->sensor != SENSOR_SOI968 && 1733 sd->sensor != SENSOR_OV7670 && sd->sensor != SENSOR_MT9M001 && 1734 sd->sensor != SENSOR_MT9VPRB) { 1735 sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1736 V4L2_CID_HFLIP, 0, 1, 1, 0); 1737 sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1738 V4L2_CID_VFLIP, 0, 1, 1, 0); 1739 } 1740 1741 if (sd->sensor != SENSOR_SOI968 && sd->sensor != SENSOR_MT9VPRB && 1742 sd->sensor != SENSOR_MT9M112 && sd->sensor != SENSOR_MT9M111 && 1743 sd->sensor != SENSOR_MT9V111) 1744 sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1745 V4L2_CID_EXPOSURE, 0, 0x1780, 1, 0x33); 1746 1747 if (sd->sensor != SENSOR_MT9VPRB && sd->sensor != SENSOR_MT9M112 && 1748 sd->sensor != SENSOR_MT9M111 && sd->sensor != SENSOR_MT9V111) { 1749 sd->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1750 V4L2_CID_GAIN, 0, 28, 1, 0); 1751 sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1752 V4L2_CID_AUTOGAIN, 0, 1, 1, 1); 1753 } 1754 1755 sd->jpegqual = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 1756 V4L2_CID_JPEG_COMPRESSION_QUALITY, 50, 90, 1, 80); 1757 if (hdl->error) { 1758 pr_err("Could not initialize controls\n"); 1759 return hdl->error; 1760 } 1761 1762 v4l2_ctrl_cluster(4, &sd->brightness); 1763 v4l2_ctrl_cluster(2, &sd->blue); 1764 if (sd->hflip) 1765 v4l2_ctrl_cluster(2, &sd->hflip); 1766 if (sd->autogain) { 1767 if (sd->sensor == SENSOR_SOI968) 1768 /* this sensor doesn't have the exposure control and 1769 autogain is clustered with gain instead. This works 1770 because sd->exposure == NULL. */ 1771 v4l2_ctrl_auto_cluster(3, &sd->autogain, 0, false); 1772 else 1773 /* Otherwise autogain is clustered with exposure. */ 1774 v4l2_ctrl_auto_cluster(2, &sd->autogain, 0, false); 1775 } 1776 return 0; 1777 } 1778 1779 static int sd_init(struct gspca_dev *gspca_dev) 1780 { 1781 struct sd *sd = (struct sd *) gspca_dev; 1782 int i; 1783 u8 value; 1784 u8 i2c_init[9] = { 1785 0x80, sd->i2c_addr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03 1786 }; 1787 1788 for (i = 0; i < ARRAY_SIZE(bridge_init); i++) { 1789 value = bridge_init[i][1]; 1790 reg_w(gspca_dev, bridge_init[i][0], &value, 1); 1791 if (gspca_dev->usb_err < 0) { 1792 pr_err("Device initialization failed\n"); 1793 return gspca_dev->usb_err; 1794 } 1795 } 1796 1797 if (sd->flags & LED_REVERSE) 1798 reg_w1(gspca_dev, 0x1006, 0x00); 1799 else 1800 reg_w1(gspca_dev, 0x1006, 0x20); 1801 1802 reg_w(gspca_dev, 0x10c0, i2c_init, 9); 1803 if (gspca_dev->usb_err < 0) { 1804 pr_err("Device initialization failed\n"); 1805 return gspca_dev->usb_err; 1806 } 1807 1808 switch (sd->sensor) { 1809 case SENSOR_OV9650: 1810 ov9650_init_sensor(gspca_dev); 1811 if (gspca_dev->usb_err < 0) 1812 break; 1813 pr_info("OV9650 sensor detected\n"); 1814 break; 1815 case SENSOR_OV9655: 1816 ov9655_init_sensor(gspca_dev); 1817 if (gspca_dev->usb_err < 0) 1818 break; 1819 pr_info("OV9655 sensor detected\n"); 1820 break; 1821 case SENSOR_SOI968: 1822 soi968_init_sensor(gspca_dev); 1823 if (gspca_dev->usb_err < 0) 1824 break; 1825 pr_info("SOI968 sensor detected\n"); 1826 break; 1827 case SENSOR_OV7660: 1828 ov7660_init_sensor(gspca_dev); 1829 if (gspca_dev->usb_err < 0) 1830 break; 1831 pr_info("OV7660 sensor detected\n"); 1832 break; 1833 case SENSOR_OV7670: 1834 ov7670_init_sensor(gspca_dev); 1835 if (gspca_dev->usb_err < 0) 1836 break; 1837 pr_info("OV7670 sensor detected\n"); 1838 break; 1839 case SENSOR_MT9VPRB: 1840 mt9v_init_sensor(gspca_dev); 1841 if (gspca_dev->usb_err < 0) 1842 break; 1843 pr_info("MT9VPRB sensor detected\n"); 1844 break; 1845 case SENSOR_MT9M111: 1846 mt9m111_init_sensor(gspca_dev); 1847 if (gspca_dev->usb_err < 0) 1848 break; 1849 pr_info("MT9M111 sensor detected\n"); 1850 break; 1851 case SENSOR_MT9M112: 1852 mt9m112_init_sensor(gspca_dev); 1853 if (gspca_dev->usb_err < 0) 1854 break; 1855 pr_info("MT9M112 sensor detected\n"); 1856 break; 1857 case SENSOR_MT9M001: 1858 mt9m001_init_sensor(gspca_dev); 1859 if (gspca_dev->usb_err < 0) 1860 break; 1861 break; 1862 case SENSOR_HV7131R: 1863 hv7131r_init_sensor(gspca_dev); 1864 if (gspca_dev->usb_err < 0) 1865 break; 1866 pr_info("HV7131R sensor detected\n"); 1867 break; 1868 default: 1869 pr_err("Unsupported sensor\n"); 1870 gspca_dev->usb_err = -ENODEV; 1871 } 1872 return gspca_dev->usb_err; 1873 } 1874 1875 static void configure_sensor_output(struct gspca_dev *gspca_dev, int mode) 1876 { 1877 struct sd *sd = (struct sd *) gspca_dev; 1878 u8 value; 1879 1880 switch (sd->sensor) { 1881 case SENSOR_SOI968: 1882 if (mode & MODE_SXGA) { 1883 i2c_w1(gspca_dev, 0x17, 0x1d); 1884 i2c_w1(gspca_dev, 0x18, 0xbd); 1885 i2c_w1(gspca_dev, 0x19, 0x01); 1886 i2c_w1(gspca_dev, 0x1a, 0x81); 1887 i2c_w1(gspca_dev, 0x12, 0x00); 1888 sd->hstart = 140; 1889 sd->vstart = 19; 1890 } else { 1891 i2c_w1(gspca_dev, 0x17, 0x13); 1892 i2c_w1(gspca_dev, 0x18, 0x63); 1893 i2c_w1(gspca_dev, 0x19, 0x01); 1894 i2c_w1(gspca_dev, 0x1a, 0x79); 1895 i2c_w1(gspca_dev, 0x12, 0x40); 1896 sd->hstart = 60; 1897 sd->vstart = 11; 1898 } 1899 break; 1900 case SENSOR_OV9650: 1901 if (mode & MODE_SXGA) { 1902 i2c_w1(gspca_dev, 0x17, 0x1b); 1903 i2c_w1(gspca_dev, 0x18, 0xbc); 1904 i2c_w1(gspca_dev, 0x19, 0x01); 1905 i2c_w1(gspca_dev, 0x1a, 0x82); 1906 i2c_r1(gspca_dev, 0x12, &value); 1907 i2c_w1(gspca_dev, 0x12, value & 0x07); 1908 } else { 1909 i2c_w1(gspca_dev, 0x17, 0x24); 1910 i2c_w1(gspca_dev, 0x18, 0xc5); 1911 i2c_w1(gspca_dev, 0x19, 0x00); 1912 i2c_w1(gspca_dev, 0x1a, 0x3c); 1913 i2c_r1(gspca_dev, 0x12, &value); 1914 i2c_w1(gspca_dev, 0x12, (value & 0x7) | 0x40); 1915 } 1916 break; 1917 case SENSOR_MT9M112: 1918 case SENSOR_MT9M111: 1919 if (mode & MODE_SXGA) { 1920 i2c_w2(gspca_dev, 0xf0, 0x0002); 1921 i2c_w2(gspca_dev, 0xc8, 0x970b); 1922 i2c_w2(gspca_dev, 0xf0, 0x0000); 1923 } else { 1924 i2c_w2(gspca_dev, 0xf0, 0x0002); 1925 i2c_w2(gspca_dev, 0xc8, 0x8000); 1926 i2c_w2(gspca_dev, 0xf0, 0x0000); 1927 } 1928 break; 1929 } 1930 } 1931 1932 static int sd_isoc_init(struct gspca_dev *gspca_dev) 1933 { 1934 struct usb_interface *intf; 1935 u32 flags = gspca_dev->cam.cam_mode[(int)gspca_dev->curr_mode].priv; 1936 1937 /* 1938 * When using the SN9C20X_I420 fmt the sn9c20x needs more bandwidth 1939 * than our regular bandwidth calculations reserve, so we force the 1940 * use of a specific altsetting when using the SN9C20X_I420 fmt. 1941 */ 1942 if (!(flags & (MODE_RAW | MODE_JPEG))) { 1943 intf = usb_ifnum_to_if(gspca_dev->dev, gspca_dev->iface); 1944 1945 if (intf->num_altsetting != 9) { 1946 pr_warn("sn9c20x camera with unknown number of alt settings (%d), please report!\n", 1947 intf->num_altsetting); 1948 gspca_dev->alt = intf->num_altsetting; 1949 return 0; 1950 } 1951 1952 switch (gspca_dev->pixfmt.width) { 1953 case 160: /* 160x120 */ 1954 gspca_dev->alt = 2; 1955 break; 1956 case 320: /* 320x240 */ 1957 gspca_dev->alt = 6; 1958 break; 1959 default: /* >= 640x480 */ 1960 gspca_dev->alt = 9; 1961 break; 1962 } 1963 } 1964 1965 return 0; 1966 } 1967 1968 #define HW_WIN(mode, hstart, vstart) \ 1969 ((const u8 []){hstart, 0, vstart, 0, \ 1970 (mode & MODE_SXGA ? 1280 >> 4 : 640 >> 4), \ 1971 (mode & MODE_SXGA ? 1024 >> 3 : 480 >> 3)}) 1972 1973 #define CLR_WIN(width, height) \ 1974 ((const u8 [])\ 1975 {0, width >> 2, 0, height >> 1,\ 1976 ((width >> 10) & 0x01) | ((height >> 8) & 0x6)}) 1977 1978 static int sd_start(struct gspca_dev *gspca_dev) 1979 { 1980 struct sd *sd = (struct sd *) gspca_dev; 1981 int mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; 1982 int width = gspca_dev->pixfmt.width; 1983 int height = gspca_dev->pixfmt.height; 1984 u8 fmt, scale = 0; 1985 1986 jpeg_define(sd->jpeg_hdr, height, width, 1987 0x21); 1988 jpeg_set_qual(sd->jpeg_hdr, v4l2_ctrl_g_ctrl(sd->jpegqual)); 1989 1990 if (mode & MODE_RAW) 1991 fmt = 0x2d; 1992 else if (mode & MODE_JPEG) 1993 fmt = 0x24; 1994 else 1995 fmt = 0x2f; /* YUV 420 */ 1996 sd->fmt = fmt; 1997 1998 switch (mode & SCALE_MASK) { 1999 case SCALE_1280x1024: 2000 scale = 0xc0; 2001 pr_info("Set 1280x1024\n"); 2002 break; 2003 case SCALE_640x480: 2004 scale = 0x80; 2005 pr_info("Set 640x480\n"); 2006 break; 2007 case SCALE_320x240: 2008 scale = 0x90; 2009 pr_info("Set 320x240\n"); 2010 break; 2011 case SCALE_160x120: 2012 scale = 0xa0; 2013 pr_info("Set 160x120\n"); 2014 break; 2015 } 2016 2017 configure_sensor_output(gspca_dev, mode); 2018 reg_w(gspca_dev, 0x1100, &sd->jpeg_hdr[JPEG_QT0_OFFSET], 64); 2019 reg_w(gspca_dev, 0x1140, &sd->jpeg_hdr[JPEG_QT1_OFFSET], 64); 2020 reg_w(gspca_dev, 0x10fb, CLR_WIN(width, height), 5); 2021 reg_w(gspca_dev, 0x1180, HW_WIN(mode, sd->hstart, sd->vstart), 6); 2022 reg_w1(gspca_dev, 0x1189, scale); 2023 reg_w1(gspca_dev, 0x10e0, fmt); 2024 2025 set_cmatrix(gspca_dev, v4l2_ctrl_g_ctrl(sd->brightness), 2026 v4l2_ctrl_g_ctrl(sd->contrast), 2027 v4l2_ctrl_g_ctrl(sd->saturation), 2028 v4l2_ctrl_g_ctrl(sd->hue)); 2029 set_gamma(gspca_dev, v4l2_ctrl_g_ctrl(sd->gamma)); 2030 set_redblue(gspca_dev, v4l2_ctrl_g_ctrl(sd->blue), 2031 v4l2_ctrl_g_ctrl(sd->red)); 2032 if (sd->gain) 2033 set_gain(gspca_dev, v4l2_ctrl_g_ctrl(sd->gain)); 2034 if (sd->exposure) 2035 set_exposure(gspca_dev, v4l2_ctrl_g_ctrl(sd->exposure)); 2036 if (sd->hflip) 2037 set_hvflip(gspca_dev, v4l2_ctrl_g_ctrl(sd->hflip), 2038 v4l2_ctrl_g_ctrl(sd->vflip)); 2039 2040 reg_w1(gspca_dev, 0x1007, 0x20); 2041 reg_w1(gspca_dev, 0x1061, 0x03); 2042 2043 /* if JPEG, prepare the compression quality update */ 2044 if (mode & MODE_JPEG) { 2045 sd->pktsz = sd->npkt = 0; 2046 sd->nchg = 0; 2047 } 2048 2049 return gspca_dev->usb_err; 2050 } 2051 2052 static void sd_stopN(struct gspca_dev *gspca_dev) 2053 { 2054 reg_w1(gspca_dev, 0x1007, 0x00); 2055 reg_w1(gspca_dev, 0x1061, 0x01); 2056 } 2057 2058 /* called on streamoff with alt==0 and on disconnect */ 2059 /* the usb_lock is held at entry - restore on exit */ 2060 static void sd_stop0(struct gspca_dev *gspca_dev) 2061 { 2062 struct sd *sd = (struct sd *) gspca_dev; 2063 2064 mutex_unlock(&gspca_dev->usb_lock); 2065 flush_work(&sd->work); 2066 mutex_lock(&gspca_dev->usb_lock); 2067 } 2068 2069 static void do_autoexposure(struct gspca_dev *gspca_dev, u16 avg_lum) 2070 { 2071 struct sd *sd = (struct sd *) gspca_dev; 2072 s32 cur_exp = v4l2_ctrl_g_ctrl(sd->exposure); 2073 s32 max = sd->exposure->maximum - sd->exposure_step; 2074 s32 min = sd->exposure->minimum + sd->exposure_step; 2075 s16 new_exp; 2076 2077 /* 2078 * some hardcoded values are present 2079 * like those for maximal/minimal exposure 2080 * and exposure steps 2081 */ 2082 if (avg_lum < MIN_AVG_LUM) { 2083 if (cur_exp > max) 2084 return; 2085 2086 new_exp = cur_exp + sd->exposure_step; 2087 if (new_exp > max) 2088 new_exp = max; 2089 if (new_exp < min) 2090 new_exp = min; 2091 v4l2_ctrl_s_ctrl(sd->exposure, new_exp); 2092 2093 sd->older_step = sd->old_step; 2094 sd->old_step = 1; 2095 2096 if (sd->old_step ^ sd->older_step) 2097 sd->exposure_step /= 2; 2098 else 2099 sd->exposure_step += 2; 2100 } 2101 if (avg_lum > MAX_AVG_LUM) { 2102 if (cur_exp < min) 2103 return; 2104 new_exp = cur_exp - sd->exposure_step; 2105 if (new_exp > max) 2106 new_exp = max; 2107 if (new_exp < min) 2108 new_exp = min; 2109 v4l2_ctrl_s_ctrl(sd->exposure, new_exp); 2110 sd->older_step = sd->old_step; 2111 sd->old_step = 0; 2112 2113 if (sd->old_step ^ sd->older_step) 2114 sd->exposure_step /= 2; 2115 else 2116 sd->exposure_step += 2; 2117 } 2118 } 2119 2120 static void do_autogain(struct gspca_dev *gspca_dev, u16 avg_lum) 2121 { 2122 struct sd *sd = (struct sd *) gspca_dev; 2123 s32 cur_gain = v4l2_ctrl_g_ctrl(sd->gain); 2124 2125 if (avg_lum < MIN_AVG_LUM && cur_gain < sd->gain->maximum) 2126 v4l2_ctrl_s_ctrl(sd->gain, cur_gain + 1); 2127 if (avg_lum > MAX_AVG_LUM && cur_gain > sd->gain->minimum) 2128 v4l2_ctrl_s_ctrl(sd->gain, cur_gain - 1); 2129 } 2130 2131 static void sd_dqcallback(struct gspca_dev *gspca_dev) 2132 { 2133 struct sd *sd = (struct sd *) gspca_dev; 2134 int avg_lum; 2135 2136 if (sd->autogain == NULL || !v4l2_ctrl_g_ctrl(sd->autogain)) 2137 return; 2138 2139 avg_lum = atomic_read(&sd->avg_lum); 2140 if (sd->sensor == SENSOR_SOI968) 2141 do_autogain(gspca_dev, avg_lum); 2142 else 2143 do_autoexposure(gspca_dev, avg_lum); 2144 } 2145 2146 /* JPEG quality update */ 2147 /* This function is executed from a work queue. */ 2148 static void qual_upd(struct work_struct *work) 2149 { 2150 struct sd *sd = container_of(work, struct sd, work); 2151 struct gspca_dev *gspca_dev = &sd->gspca_dev; 2152 s32 qual = v4l2_ctrl_g_ctrl(sd->jpegqual); 2153 2154 /* To protect gspca_dev->usb_buf and gspca_dev->usb_err */ 2155 mutex_lock(&gspca_dev->usb_lock); 2156 gspca_dbg(gspca_dev, D_STREAM, "qual_upd %d%%\n", qual); 2157 gspca_dev->usb_err = 0; 2158 set_quality(gspca_dev, qual); 2159 mutex_unlock(&gspca_dev->usb_lock); 2160 } 2161 2162 #if IS_ENABLED(CONFIG_INPUT) 2163 static int sd_int_pkt_scan(struct gspca_dev *gspca_dev, 2164 u8 *data, /* interrupt packet */ 2165 int len) /* interrupt packet length */ 2166 { 2167 struct sd *sd = (struct sd *) gspca_dev; 2168 2169 if (!(sd->flags & HAS_NO_BUTTON) && len == 1) { 2170 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); 2171 input_sync(gspca_dev->input_dev); 2172 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); 2173 input_sync(gspca_dev->input_dev); 2174 return 0; 2175 } 2176 return -EINVAL; 2177 } 2178 #endif 2179 2180 /* check the JPEG compression */ 2181 static void transfer_check(struct gspca_dev *gspca_dev, 2182 u8 *data) 2183 { 2184 struct sd *sd = (struct sd *) gspca_dev; 2185 int new_qual, r; 2186 2187 new_qual = 0; 2188 2189 /* if USB error, discard the frame and decrease the quality */ 2190 if (data[6] & 0x08) { /* USB FIFO full */ 2191 gspca_dev->last_packet_type = DISCARD_PACKET; 2192 new_qual = -5; 2193 } else { 2194 2195 /* else, compute the filling rate and a new JPEG quality */ 2196 r = (sd->pktsz * 100) / 2197 (sd->npkt * 2198 gspca_dev->urb[0]->iso_frame_desc[0].length); 2199 if (r >= 85) 2200 new_qual = -3; 2201 else if (r < 75) 2202 new_qual = 2; 2203 } 2204 if (new_qual != 0) { 2205 sd->nchg += new_qual; 2206 if (sd->nchg < -6 || sd->nchg >= 12) { 2207 /* Note: we are in interrupt context, so we can't 2208 use v4l2_ctrl_g/s_ctrl here. Access the value 2209 directly instead. */ 2210 s32 curqual = sd->jpegqual->cur.val; 2211 sd->nchg = 0; 2212 new_qual += curqual; 2213 if (new_qual < sd->jpegqual->minimum) 2214 new_qual = sd->jpegqual->minimum; 2215 else if (new_qual > sd->jpegqual->maximum) 2216 new_qual = sd->jpegqual->maximum; 2217 if (new_qual != curqual) { 2218 sd->jpegqual->cur.val = new_qual; 2219 schedule_work(&sd->work); 2220 } 2221 } 2222 } else { 2223 sd->nchg = 0; 2224 } 2225 sd->pktsz = sd->npkt = 0; 2226 } 2227 2228 static void sd_pkt_scan(struct gspca_dev *gspca_dev, 2229 u8 *data, /* isoc packet */ 2230 int len) /* iso packet length */ 2231 { 2232 struct sd *sd = (struct sd *) gspca_dev; 2233 int avg_lum, is_jpeg; 2234 static const u8 frame_header[] = { 2235 0xff, 0xff, 0x00, 0xc4, 0xc4, 0x96 2236 }; 2237 2238 is_jpeg = (sd->fmt & 0x03) == 0; 2239 if (len >= 64 && memcmp(data, frame_header, 6) == 0) { 2240 avg_lum = ((data[35] >> 2) & 3) | 2241 (data[20] << 2) | 2242 (data[19] << 10); 2243 avg_lum += ((data[35] >> 4) & 3) | 2244 (data[22] << 2) | 2245 (data[21] << 10); 2246 avg_lum += ((data[35] >> 6) & 3) | 2247 (data[24] << 2) | 2248 (data[23] << 10); 2249 avg_lum += (data[36] & 3) | 2250 (data[26] << 2) | 2251 (data[25] << 10); 2252 avg_lum += ((data[36] >> 2) & 3) | 2253 (data[28] << 2) | 2254 (data[27] << 10); 2255 avg_lum += ((data[36] >> 4) & 3) | 2256 (data[30] << 2) | 2257 (data[29] << 10); 2258 avg_lum += ((data[36] >> 6) & 3) | 2259 (data[32] << 2) | 2260 (data[31] << 10); 2261 avg_lum += ((data[44] >> 4) & 3) | 2262 (data[34] << 2) | 2263 (data[33] << 10); 2264 avg_lum >>= 9; 2265 atomic_set(&sd->avg_lum, avg_lum); 2266 2267 if (is_jpeg) 2268 transfer_check(gspca_dev, data); 2269 2270 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 2271 len -= 64; 2272 if (len == 0) 2273 return; 2274 data += 64; 2275 } 2276 if (gspca_dev->last_packet_type == LAST_PACKET) { 2277 if (is_jpeg) { 2278 gspca_frame_add(gspca_dev, FIRST_PACKET, 2279 sd->jpeg_hdr, JPEG_HDR_SZ); 2280 gspca_frame_add(gspca_dev, INTER_PACKET, 2281 data, len); 2282 } else { 2283 gspca_frame_add(gspca_dev, FIRST_PACKET, 2284 data, len); 2285 } 2286 } else { 2287 /* if JPEG, count the packets and their size */ 2288 if (is_jpeg) { 2289 sd->npkt++; 2290 sd->pktsz += len; 2291 } 2292 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 2293 } 2294 } 2295 2296 /* sub-driver description */ 2297 static const struct sd_desc sd_desc = { 2298 .name = KBUILD_MODNAME, 2299 .config = sd_config, 2300 .init = sd_init, 2301 .init_controls = sd_init_controls, 2302 .isoc_init = sd_isoc_init, 2303 .start = sd_start, 2304 .stopN = sd_stopN, 2305 .stop0 = sd_stop0, 2306 .pkt_scan = sd_pkt_scan, 2307 #if IS_ENABLED(CONFIG_INPUT) 2308 .int_pkt_scan = sd_int_pkt_scan, 2309 #endif 2310 .dq_callback = sd_dqcallback, 2311 #ifdef CONFIG_VIDEO_ADV_DEBUG 2312 .set_register = sd_dbg_s_register, 2313 .get_register = sd_dbg_g_register, 2314 .get_chip_info = sd_chip_info, 2315 #endif 2316 }; 2317 2318 #define SN9C20X(sensor, i2c_addr, flags) \ 2319 .driver_info = ((flags & 0xff) << 16) \ 2320 | (SENSOR_ ## sensor << 8) \ 2321 | (i2c_addr) 2322 2323 static const struct usb_device_id device_table[] = { 2324 {USB_DEVICE(0x0c45, 0x6240), SN9C20X(MT9M001, 0x5d, 0)}, 2325 {USB_DEVICE(0x0c45, 0x6242), SN9C20X(MT9M111, 0x5d, 0)}, 2326 {USB_DEVICE(0x0c45, 0x6248), SN9C20X(OV9655, 0x30, 0)}, 2327 {USB_DEVICE(0x0c45, 0x624c), SN9C20X(MT9M112, 0x5d, 0)}, 2328 {USB_DEVICE(0x0c45, 0x624e), SN9C20X(SOI968, 0x30, LED_REVERSE)}, 2329 {USB_DEVICE(0x0c45, 0x624f), SN9C20X(OV9650, 0x30, 2330 (FLIP_DETECT | HAS_NO_BUTTON))}, 2331 {USB_DEVICE(0x0c45, 0x6251), SN9C20X(OV9650, 0x30, 0)}, 2332 {USB_DEVICE(0x0c45, 0x6253), SN9C20X(OV9650, 0x30, 0)}, 2333 {USB_DEVICE(0x0c45, 0x6260), SN9C20X(OV7670, 0x21, 0)}, 2334 {USB_DEVICE(0x0c45, 0x6270), SN9C20X(MT9VPRB, 0x00, 0)}, 2335 {USB_DEVICE(0x0c45, 0x627b), SN9C20X(OV7660, 0x21, FLIP_DETECT)}, 2336 {USB_DEVICE(0x0c45, 0x627c), SN9C20X(HV7131R, 0x11, 0)}, 2337 {USB_DEVICE(0x0c45, 0x627f), SN9C20X(OV9650, 0x30, 0)}, 2338 {USB_DEVICE(0x0c45, 0x6280), SN9C20X(MT9M001, 0x5d, 0)}, 2339 {USB_DEVICE(0x0c45, 0x6282), SN9C20X(MT9M111, 0x5d, 0)}, 2340 {USB_DEVICE(0x0c45, 0x6288), SN9C20X(OV9655, 0x30, 0)}, 2341 {USB_DEVICE(0x0c45, 0x628c), SN9C20X(MT9M112, 0x5d, 0)}, 2342 {USB_DEVICE(0x0c45, 0x628e), SN9C20X(SOI968, 0x30, 0)}, 2343 {USB_DEVICE(0x0c45, 0x628f), SN9C20X(OV9650, 0x30, 0)}, 2344 {USB_DEVICE(0x0c45, 0x62a0), SN9C20X(OV7670, 0x21, 0)}, 2345 {USB_DEVICE(0x0c45, 0x62b0), SN9C20X(MT9VPRB, 0x00, 0)}, 2346 {USB_DEVICE(0x0c45, 0x62b3), SN9C20X(OV9655, 0x30, LED_REVERSE)}, 2347 {USB_DEVICE(0x0c45, 0x62bb), SN9C20X(OV7660, 0x21, LED_REVERSE)}, 2348 {USB_DEVICE(0x0c45, 0x62bc), SN9C20X(HV7131R, 0x11, 0)}, 2349 {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)}, 2350 {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)}, 2351 {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)}, 2352 {USB_DEVICE(0x0458, 0x7045), SN9C20X(MT9M112, 0x5d, LED_REVERSE)}, 2353 {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)}, 2354 {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)}, 2355 {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)}, 2356 {USB_DEVICE(0xa168, 0x0611), SN9C20X(HV7131R, 0x11, 0)}, 2357 {USB_DEVICE(0xa168, 0x0613), SN9C20X(HV7131R, 0x11, 0)}, 2358 {USB_DEVICE(0xa168, 0x0618), SN9C20X(HV7131R, 0x11, 0)}, 2359 {USB_DEVICE(0xa168, 0x0614), SN9C20X(MT9M111, 0x5d, 0)}, 2360 {USB_DEVICE(0xa168, 0x0615), SN9C20X(MT9M111, 0x5d, 0)}, 2361 {USB_DEVICE(0xa168, 0x0617), SN9C20X(MT9M111, 0x5d, 0)}, 2362 {} 2363 }; 2364 MODULE_DEVICE_TABLE(usb, device_table); 2365 2366 /* -- device connect -- */ 2367 static int sd_probe(struct usb_interface *intf, 2368 const struct usb_device_id *id) 2369 { 2370 return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd), 2371 THIS_MODULE); 2372 } 2373 2374 static struct usb_driver sd_driver = { 2375 .name = KBUILD_MODNAME, 2376 .id_table = device_table, 2377 .probe = sd_probe, 2378 .disconnect = gspca_disconnect, 2379 #ifdef CONFIG_PM 2380 .suspend = gspca_suspend, 2381 .resume = gspca_resume, 2382 .reset_resume = gspca_resume, 2383 #endif 2384 }; 2385 2386 module_usb_driver(sd_driver); 2387