spca561.c (25226B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Sunplus spca561 subdriver 4 * 5 * Copyright (C) 2004 Michel Xhaard mxhaard@magic.fr 6 * 7 * V4L2 by Jean-Francois Moine <http://moinejf.free.fr> 8 */ 9 10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 11 12#define MODULE_NAME "spca561" 13 14#include <linux/input.h> 15#include "gspca.h" 16 17MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>"); 18MODULE_DESCRIPTION("GSPCA/SPCA561 USB Camera Driver"); 19MODULE_LICENSE("GPL"); 20 21#define EXPOSURE_MAX (2047 + 325) 22 23/* specific webcam descriptor */ 24struct sd { 25 struct gspca_dev gspca_dev; /* !! must be the first item */ 26 27 struct { /* hue/contrast control cluster */ 28 struct v4l2_ctrl *contrast; 29 struct v4l2_ctrl *hue; 30 }; 31 struct v4l2_ctrl *autogain; 32 33#define EXPO12A_DEF 3 34 __u8 expo12a; /* expo/gain? for rev 12a */ 35 36 __u8 chip_revision; 37#define Rev012A 0 38#define Rev072A 1 39 40 signed char ag_cnt; 41#define AG_CNT_START 13 42}; 43 44static const struct v4l2_pix_format sif_012a_mode[] = { 45 {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 46 .bytesperline = 160, 47 .sizeimage = 160 * 120, 48 .colorspace = V4L2_COLORSPACE_SRGB, 49 .priv = 3}, 50 {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 51 .bytesperline = 176, 52 .sizeimage = 176 * 144, 53 .colorspace = V4L2_COLORSPACE_SRGB, 54 .priv = 2}, 55 {320, 240, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE, 56 .bytesperline = 320, 57 .sizeimage = 320 * 240 * 4 / 8, 58 .colorspace = V4L2_COLORSPACE_SRGB, 59 .priv = 1}, 60 {352, 288, V4L2_PIX_FMT_SPCA561, V4L2_FIELD_NONE, 61 .bytesperline = 352, 62 .sizeimage = 352 * 288 * 4 / 8, 63 .colorspace = V4L2_COLORSPACE_SRGB, 64 .priv = 0}, 65}; 66 67static const struct v4l2_pix_format sif_072a_mode[] = { 68 {160, 120, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 69 .bytesperline = 160, 70 .sizeimage = 160 * 120, 71 .colorspace = V4L2_COLORSPACE_SRGB, 72 .priv = 3}, 73 {176, 144, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 74 .bytesperline = 176, 75 .sizeimage = 176 * 144, 76 .colorspace = V4L2_COLORSPACE_SRGB, 77 .priv = 2}, 78 {320, 240, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 79 .bytesperline = 320, 80 .sizeimage = 320 * 240, 81 .colorspace = V4L2_COLORSPACE_SRGB, 82 .priv = 1}, 83 {352, 288, V4L2_PIX_FMT_SGBRG8, V4L2_FIELD_NONE, 84 .bytesperline = 352, 85 .sizeimage = 352 * 288, 86 .colorspace = V4L2_COLORSPACE_SRGB, 87 .priv = 0}, 88}; 89 90/* 91 * Initialization data 92 * I'm not very sure how to split initialization from open data 93 * chunks. For now, we'll consider everything as initialization 94 */ 95/* Frame packet header offsets for the spca561 */ 96#define SPCA561_OFFSET_SNAP 1 97#define SPCA561_OFFSET_TYPE 2 98#define SPCA561_OFFSET_COMPRESS 3 99#define SPCA561_OFFSET_FRAMSEQ 4 100#define SPCA561_OFFSET_GPIO 5 101#define SPCA561_OFFSET_USBBUFF 6 102#define SPCA561_OFFSET_WIN2GRAVE 7 103#define SPCA561_OFFSET_WIN2RAVE 8 104#define SPCA561_OFFSET_WIN2BAVE 9 105#define SPCA561_OFFSET_WIN2GBAVE 10 106#define SPCA561_OFFSET_WIN1GRAVE 11 107#define SPCA561_OFFSET_WIN1RAVE 12 108#define SPCA561_OFFSET_WIN1BAVE 13 109#define SPCA561_OFFSET_WIN1GBAVE 14 110#define SPCA561_OFFSET_FREQ 15 111#define SPCA561_OFFSET_VSYNC 16 112#define SPCA561_INDEX_I2C_BASE 0x8800 113#define SPCA561_SNAPBIT 0x20 114#define SPCA561_SNAPCTRL 0x40 115 116static const u16 rev72a_reset[][2] = { 117 {0x0000, 0x8114}, /* Software GPIO output data */ 118 {0x0001, 0x8114}, /* Software GPIO output data */ 119 {0x0000, 0x8112}, /* Some kind of reset */ 120 {} 121}; 122static const __u16 rev72a_init_data1[][2] = { 123 {0x0003, 0x8701}, /* PCLK clock delay adjustment */ 124 {0x0001, 0x8703}, /* HSYNC from cmos inverted */ 125 {0x0011, 0x8118}, /* Enable and conf sensor */ 126 {0x0001, 0x8118}, /* Conf sensor */ 127 {0x0092, 0x8804}, /* I know nothing about these */ 128 {0x0010, 0x8802}, /* 0x88xx registers, so I won't */ 129 {} 130}; 131static const u16 rev72a_init_sensor1[][2] = { 132 {0x0001, 0x000d}, 133 {0x0002, 0x0018}, 134 {0x0004, 0x0165}, 135 {0x0005, 0x0021}, 136 {0x0007, 0x00aa}, 137 {0x0020, 0x1504}, 138 {0x0039, 0x0002}, 139 {0x0035, 0x0010}, 140 {0x0009, 0x1049}, 141 {0x0028, 0x000b}, 142 {0x003b, 0x000f}, 143 {0x003c, 0x0000}, 144 {} 145}; 146static const __u16 rev72a_init_data2[][2] = { 147 {0x0018, 0x8601}, /* Pixel/line selection for color separation */ 148 {0x0000, 0x8602}, /* Optical black level for user setting */ 149 {0x0060, 0x8604}, /* Optical black horizontal offset */ 150 {0x0002, 0x8605}, /* Optical black vertical offset */ 151 {0x0000, 0x8603}, /* Non-automatic optical black level */ 152 {0x0002, 0x865b}, /* Horizontal offset for valid pixels */ 153 {0x0000, 0x865f}, /* Vertical valid pixels window (x2) */ 154 {0x00b0, 0x865d}, /* Horizontal valid pixels window (x2) */ 155 {0x0090, 0x865e}, /* Vertical valid lines window (x2) */ 156 {0x00e0, 0x8406}, /* Memory buffer threshold */ 157 {0x0000, 0x8660}, /* Compensation memory stuff */ 158 {0x0002, 0x8201}, /* Output address for r/w serial EEPROM */ 159 {0x0008, 0x8200}, /* Clear valid bit for serial EEPROM */ 160 {0x0001, 0x8200}, /* OprMode to be executed by hardware */ 161/* from ms-win */ 162 {0x0000, 0x8611}, /* R offset for white balance */ 163 {0x00fd, 0x8612}, /* Gr offset for white balance */ 164 {0x0003, 0x8613}, /* B offset for white balance */ 165 {0x0000, 0x8614}, /* Gb offset for white balance */ 166/* from ms-win */ 167 {0x0035, 0x8651}, /* R gain for white balance */ 168 {0x0040, 0x8652}, /* Gr gain for white balance */ 169 {0x005f, 0x8653}, /* B gain for white balance */ 170 {0x0040, 0x8654}, /* Gb gain for white balance */ 171 {0x0002, 0x8502}, /* Maximum average bit rate stuff */ 172 {0x0011, 0x8802}, 173 174 {0x0087, 0x8700}, /* Set master clock (96Mhz????) */ 175 {0x0081, 0x8702}, /* Master clock output enable */ 176 177 {0x0000, 0x8500}, /* Set image type (352x288 no compression) */ 178 /* Originally was 0x0010 (352x288 compression) */ 179 180 {0x0002, 0x865b}, /* Horizontal offset for valid pixels */ 181 {0x0003, 0x865c}, /* Vertical offset for valid lines */ 182 {} 183}; 184static const u16 rev72a_init_sensor2[][2] = { 185 {0x0003, 0x0121}, 186 {0x0004, 0x0165}, 187 {0x0005, 0x002f}, /* blanking control column */ 188 {0x0006, 0x0000}, /* blanking mode row*/ 189 {0x000a, 0x0002}, 190 {0x0009, 0x1061}, /* setexposure times && pixel clock 191 * 0001 0 | 000 0110 0001 */ 192 {0x0035, 0x0014}, 193 {} 194}; 195 196/******************** QC Express etch2 stuff ********************/ 197static const __u16 Pb100_1map8300[][2] = { 198 /* reg, value */ 199 {0x8320, 0x3304}, 200 201 {0x8303, 0x0125}, /* image area */ 202 {0x8304, 0x0169}, 203 {0x8328, 0x000b}, 204 {0x833c, 0x0001}, /*fixme: win:07*/ 205 206 {0x832f, 0x1904}, /*fixme: was 0419*/ 207 {0x8307, 0x00aa}, 208 {0x8301, 0x0003}, 209 {0x8302, 0x000e}, 210 {} 211}; 212static const __u16 Pb100_2map8300[][2] = { 213 /* reg, value */ 214 {0x8339, 0x0000}, 215 {0x8307, 0x00aa}, 216 {} 217}; 218 219static const __u16 spca561_161rev12A_data1[][2] = { 220 {0x29, 0x8118}, /* Control register (various enable bits) */ 221 {0x08, 0x8114}, /* GPIO: Led off */ 222 {0x0e, 0x8112}, /* 0x0e stream off 0x3e stream on */ 223 {0x00, 0x8102}, /* white balance - new */ 224 {0x92, 0x8804}, 225 {0x04, 0x8802}, /* windows uses 08 */ 226 {} 227}; 228static const __u16 spca561_161rev12A_data2[][2] = { 229 {0x21, 0x8118}, 230 {0x10, 0x8500}, 231 {0x07, 0x8601}, 232 {0x07, 0x8602}, 233 {0x04, 0x8501}, 234 235 {0x07, 0x8201}, /* windows uses 02 */ 236 {0x08, 0x8200}, 237 {0x01, 0x8200}, 238 239 {0x90, 0x8604}, 240 {0x00, 0x8605}, 241 {0xb0, 0x8603}, 242 243 /* sensor gains */ 244 {0x07, 0x8601}, /* white balance - new */ 245 {0x07, 0x8602}, /* white balance - new */ 246 {0x00, 0x8610}, /* *red */ 247 {0x00, 0x8611}, /* 3f *green */ 248 {0x00, 0x8612}, /* green *blue */ 249 {0x00, 0x8613}, /* blue *green */ 250 {0x43, 0x8614}, /* green *red - white balance - was 0x35 */ 251 {0x40, 0x8615}, /* 40 *green - white balance - was 0x35 */ 252 {0x71, 0x8616}, /* 7a *blue - white balance - was 0x35 */ 253 {0x40, 0x8617}, /* 40 *green - white balance - was 0x35 */ 254 255 {0x0c, 0x8620}, /* 0c */ 256 {0xc8, 0x8631}, /* c8 */ 257 {0xc8, 0x8634}, /* c8 */ 258 {0x23, 0x8635}, /* 23 */ 259 {0x1f, 0x8636}, /* 1f */ 260 {0xdd, 0x8637}, /* dd */ 261 {0xe1, 0x8638}, /* e1 */ 262 {0x1d, 0x8639}, /* 1d */ 263 {0x21, 0x863a}, /* 21 */ 264 {0xe3, 0x863b}, /* e3 */ 265 {0xdf, 0x863c}, /* df */ 266 {0xf0, 0x8505}, 267 {0x32, 0x850a}, 268/* {0x99, 0x8700}, * - white balance - new (removed) */ 269 /* HDG we used to do this in stop0, making the init state and the state 270 after a start / stop different, so do this here instead. */ 271 {0x29, 0x8118}, 272 {} 273}; 274 275static void reg_w_val(struct gspca_dev *gspca_dev, __u16 index, __u8 value) 276{ 277 int ret; 278 struct usb_device *dev = gspca_dev->dev; 279 280 ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), 281 0, /* request */ 282 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 283 value, index, NULL, 0, 500); 284 gspca_dbg(gspca_dev, D_USBO, "reg write: 0x%02x:0x%02x\n", 285 index, value); 286 if (ret < 0) 287 pr_err("reg write: error %d\n", ret); 288} 289 290static void write_vector(struct gspca_dev *gspca_dev, 291 const __u16 data[][2]) 292{ 293 int i; 294 295 i = 0; 296 while (data[i][1] != 0) { 297 reg_w_val(gspca_dev, data[i][1], data[i][0]); 298 i++; 299 } 300} 301 302/* read 'len' bytes to gspca_dev->usb_buf */ 303static void reg_r(struct gspca_dev *gspca_dev, 304 __u16 index, __u16 length) 305{ 306 usb_control_msg(gspca_dev->dev, 307 usb_rcvctrlpipe(gspca_dev->dev, 0), 308 0, /* request */ 309 USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 310 0, /* value */ 311 index, gspca_dev->usb_buf, length, 500); 312} 313 314/* write 'len' bytes from gspca_dev->usb_buf */ 315static void reg_w_buf(struct gspca_dev *gspca_dev, 316 __u16 index, __u16 len) 317{ 318 usb_control_msg(gspca_dev->dev, 319 usb_sndctrlpipe(gspca_dev->dev, 0), 320 0, /* request */ 321 USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, 322 0, /* value */ 323 index, gspca_dev->usb_buf, len, 500); 324} 325 326static void i2c_write(struct gspca_dev *gspca_dev, __u16 value, __u16 reg) 327{ 328 int retry = 60; 329 330 reg_w_val(gspca_dev, 0x8801, reg); 331 reg_w_val(gspca_dev, 0x8805, value); 332 reg_w_val(gspca_dev, 0x8800, value >> 8); 333 do { 334 reg_r(gspca_dev, 0x8803, 1); 335 if (!gspca_dev->usb_buf[0]) 336 return; 337 msleep(10); 338 } while (--retry); 339} 340 341static int i2c_read(struct gspca_dev *gspca_dev, __u16 reg, __u8 mode) 342{ 343 int retry = 60; 344 __u8 value; 345 346 reg_w_val(gspca_dev, 0x8804, 0x92); 347 reg_w_val(gspca_dev, 0x8801, reg); 348 reg_w_val(gspca_dev, 0x8802, mode | 0x01); 349 do { 350 reg_r(gspca_dev, 0x8803, 1); 351 if (!gspca_dev->usb_buf[0]) { 352 reg_r(gspca_dev, 0x8800, 1); 353 value = gspca_dev->usb_buf[0]; 354 reg_r(gspca_dev, 0x8805, 1); 355 return ((int) value << 8) | gspca_dev->usb_buf[0]; 356 } 357 msleep(10); 358 } while (--retry); 359 return -1; 360} 361 362static void sensor_mapwrite(struct gspca_dev *gspca_dev, 363 const __u16 (*sensormap)[2]) 364{ 365 while ((*sensormap)[0]) { 366 gspca_dev->usb_buf[0] = (*sensormap)[1]; 367 gspca_dev->usb_buf[1] = (*sensormap)[1] >> 8; 368 reg_w_buf(gspca_dev, (*sensormap)[0], 2); 369 sensormap++; 370 } 371} 372 373static void write_sensor_72a(struct gspca_dev *gspca_dev, 374 const __u16 (*sensor)[2]) 375{ 376 while ((*sensor)[0]) { 377 i2c_write(gspca_dev, (*sensor)[1], (*sensor)[0]); 378 sensor++; 379 } 380} 381 382static void init_161rev12A(struct gspca_dev *gspca_dev) 383{ 384 write_vector(gspca_dev, spca561_161rev12A_data1); 385 sensor_mapwrite(gspca_dev, Pb100_1map8300); 386/*fixme: should be in sd_start*/ 387 write_vector(gspca_dev, spca561_161rev12A_data2); 388 sensor_mapwrite(gspca_dev, Pb100_2map8300); 389} 390 391/* this function is called at probe time */ 392static int sd_config(struct gspca_dev *gspca_dev, 393 const struct usb_device_id *id) 394{ 395 struct sd *sd = (struct sd *) gspca_dev; 396 struct cam *cam; 397 __u16 vendor, product; 398 __u8 data1, data2; 399 400 /* Read frm global register the USB product and vendor IDs, just to 401 * prove that we can communicate with the device. This works, which 402 * confirms at we are communicating properly and that the device 403 * is a 561. */ 404 reg_r(gspca_dev, 0x8104, 1); 405 data1 = gspca_dev->usb_buf[0]; 406 reg_r(gspca_dev, 0x8105, 1); 407 data2 = gspca_dev->usb_buf[0]; 408 vendor = (data2 << 8) | data1; 409 reg_r(gspca_dev, 0x8106, 1); 410 data1 = gspca_dev->usb_buf[0]; 411 reg_r(gspca_dev, 0x8107, 1); 412 data2 = gspca_dev->usb_buf[0]; 413 product = (data2 << 8) | data1; 414 if (vendor != id->idVendor || product != id->idProduct) { 415 gspca_dbg(gspca_dev, D_PROBE, "Bad vendor / product from device\n"); 416 return -EINVAL; 417 } 418 419 cam = &gspca_dev->cam; 420 cam->needs_full_bandwidth = 1; 421 422 sd->chip_revision = id->driver_info; 423 if (sd->chip_revision == Rev012A) { 424 cam->cam_mode = sif_012a_mode; 425 cam->nmodes = ARRAY_SIZE(sif_012a_mode); 426 } else { 427 cam->cam_mode = sif_072a_mode; 428 cam->nmodes = ARRAY_SIZE(sif_072a_mode); 429 } 430 sd->expo12a = EXPO12A_DEF; 431 return 0; 432} 433 434/* this function is called at probe and resume time */ 435static int sd_init_12a(struct gspca_dev *gspca_dev) 436{ 437 gspca_dbg(gspca_dev, D_STREAM, "Chip revision: 012a\n"); 438 init_161rev12A(gspca_dev); 439 return 0; 440} 441static int sd_init_72a(struct gspca_dev *gspca_dev) 442{ 443 gspca_dbg(gspca_dev, D_STREAM, "Chip revision: 072a\n"); 444 write_vector(gspca_dev, rev72a_reset); 445 msleep(200); 446 write_vector(gspca_dev, rev72a_init_data1); 447 write_sensor_72a(gspca_dev, rev72a_init_sensor1); 448 write_vector(gspca_dev, rev72a_init_data2); 449 write_sensor_72a(gspca_dev, rev72a_init_sensor2); 450 reg_w_val(gspca_dev, 0x8112, 0x30); 451 return 0; 452} 453 454static void setbrightness(struct gspca_dev *gspca_dev, s32 val) 455{ 456 struct sd *sd = (struct sd *) gspca_dev; 457 __u16 reg; 458 459 if (sd->chip_revision == Rev012A) 460 reg = 0x8610; 461 else 462 reg = 0x8611; 463 464 reg_w_val(gspca_dev, reg + 0, val); /* R */ 465 reg_w_val(gspca_dev, reg + 1, val); /* Gr */ 466 reg_w_val(gspca_dev, reg + 2, val); /* B */ 467 reg_w_val(gspca_dev, reg + 3, val); /* Gb */ 468} 469 470static void setwhite(struct gspca_dev *gspca_dev, s32 white, s32 contrast) 471{ 472 struct sd *sd = (struct sd *) gspca_dev; 473 __u8 blue, red; 474 __u16 reg; 475 476 /* try to emulate MS-win as possible */ 477 red = 0x20 + white * 3 / 8; 478 blue = 0x90 - white * 5 / 8; 479 if (sd->chip_revision == Rev012A) { 480 reg = 0x8614; 481 } else { 482 reg = 0x8651; 483 red += contrast - 0x20; 484 blue += contrast - 0x20; 485 reg_w_val(gspca_dev, 0x8652, contrast + 0x20); /* Gr */ 486 reg_w_val(gspca_dev, 0x8654, contrast + 0x20); /* Gb */ 487 } 488 reg_w_val(gspca_dev, reg, red); 489 reg_w_val(gspca_dev, reg + 2, blue); 490} 491 492/* rev 12a only */ 493static void setexposure(struct gspca_dev *gspca_dev, s32 val) 494{ 495 int i, expo = 0; 496 497 /* Register 0x8309 controls exposure for the spca561, 498 the basic exposure setting goes from 1-2047, where 1 is completely 499 dark and 2047 is very bright. It not only influences exposure but 500 also the framerate (to allow for longer exposure) from 1 - 300 it 501 only raises the exposure time then from 300 - 600 it halves the 502 framerate to be able to further raise the exposure time and for every 503 300 more it halves the framerate again. This allows for a maximum 504 exposure time of circa 0.2 - 0.25 seconds (30 / (2000/3000) fps). 505 Sometimes this is not enough, the 1-2047 uses bits 0-10, bits 11-12 506 configure a divider for the base framerate which us used at the 507 exposure setting of 1-300. These bits configure the base framerate 508 according to the following formula: fps = 60 / (value + 2) */ 509 510 /* We choose to use the high bits setting the fixed framerate divisor 511 asap, as setting high basic exposure setting without the fixed 512 divider in combination with high gains makes the cam stop */ 513 static const int table[] = { 0, 450, 550, 625, EXPOSURE_MAX }; 514 515 for (i = 0; i < ARRAY_SIZE(table) - 1; i++) { 516 if (val <= table[i + 1]) { 517 expo = val - table[i]; 518 if (i) 519 expo += 300; 520 expo |= i << 11; 521 break; 522 } 523 } 524 525 gspca_dev->usb_buf[0] = expo; 526 gspca_dev->usb_buf[1] = expo >> 8; 527 reg_w_buf(gspca_dev, 0x8309, 2); 528} 529 530/* rev 12a only */ 531static void setgain(struct gspca_dev *gspca_dev, s32 val) 532{ 533 /* gain reg low 6 bits 0-63 gain, bit 6 and 7, both double the 534 sensitivity when set, so 31 + one of them set == 63, and 15 535 with both of them set == 63 */ 536 if (val < 64) 537 gspca_dev->usb_buf[0] = val; 538 else if (val < 128) 539 gspca_dev->usb_buf[0] = (val / 2) | 0x40; 540 else 541 gspca_dev->usb_buf[0] = (val / 4) | 0xc0; 542 543 gspca_dev->usb_buf[1] = 0; 544 reg_w_buf(gspca_dev, 0x8335, 2); 545} 546 547static void setautogain(struct gspca_dev *gspca_dev, s32 val) 548{ 549 struct sd *sd = (struct sd *) gspca_dev; 550 551 if (val) 552 sd->ag_cnt = AG_CNT_START; 553 else 554 sd->ag_cnt = -1; 555} 556 557static int sd_start_12a(struct gspca_dev *gspca_dev) 558{ 559 int mode; 560 static const __u8 Reg8391[8] = 561 {0x92, 0x30, 0x20, 0x00, 0x0c, 0x00, 0x00, 0x00}; 562 563 mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; 564 if (mode <= 1) { 565 /* Use compression on 320x240 and above */ 566 reg_w_val(gspca_dev, 0x8500, 0x10 | mode); 567 } else { 568 /* I couldn't get the compression to work below 320x240 569 * Fortunately at these resolutions the bandwidth 570 * is sufficient to push raw frames at ~20fps */ 571 reg_w_val(gspca_dev, 0x8500, mode); 572 } /* -- qq@kuku.eu.org */ 573 574 gspca_dev->usb_buf[0] = 0xaa; 575 gspca_dev->usb_buf[1] = 0x00; 576 reg_w_buf(gspca_dev, 0x8307, 2); 577 /* clock - lower 0x8X values lead to fps > 30 */ 578 reg_w_val(gspca_dev, 0x8700, 0x8a); 579 /* 0x8f 0x85 0x27 clock */ 580 reg_w_val(gspca_dev, 0x8112, 0x1e | 0x20); 581 reg_w_val(gspca_dev, 0x850b, 0x03); 582 memcpy(gspca_dev->usb_buf, Reg8391, 8); 583 reg_w_buf(gspca_dev, 0x8391, 8); 584 reg_w_buf(gspca_dev, 0x8390, 8); 585 586 /* Led ON (bit 3 -> 0 */ 587 reg_w_val(gspca_dev, 0x8114, 0x00); 588 return 0; 589} 590static int sd_start_72a(struct gspca_dev *gspca_dev) 591{ 592 struct sd *sd = (struct sd *) gspca_dev; 593 int Clck; 594 int mode; 595 596 write_vector(gspca_dev, rev72a_reset); 597 msleep(200); 598 write_vector(gspca_dev, rev72a_init_data1); 599 write_sensor_72a(gspca_dev, rev72a_init_sensor1); 600 601 mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; 602 switch (mode) { 603 default: 604 case 0: 605 Clck = 0x27; /* ms-win 0x87 */ 606 break; 607 case 1: 608 Clck = 0x25; 609 break; 610 case 2: 611 Clck = 0x22; 612 break; 613 case 3: 614 Clck = 0x21; 615 break; 616 } 617 reg_w_val(gspca_dev, 0x8700, Clck); /* 0x27 clock */ 618 reg_w_val(gspca_dev, 0x8702, 0x81); 619 reg_w_val(gspca_dev, 0x8500, mode); /* mode */ 620 write_sensor_72a(gspca_dev, rev72a_init_sensor2); 621 setwhite(gspca_dev, v4l2_ctrl_g_ctrl(sd->hue), 622 v4l2_ctrl_g_ctrl(sd->contrast)); 623/* setbrightness(gspca_dev); * fixme: bad values */ 624 setautogain(gspca_dev, v4l2_ctrl_g_ctrl(sd->autogain)); 625 reg_w_val(gspca_dev, 0x8112, 0x10 | 0x20); 626 return 0; 627} 628 629static void sd_stopN(struct gspca_dev *gspca_dev) 630{ 631 struct sd *sd = (struct sd *) gspca_dev; 632 633 if (sd->chip_revision == Rev012A) { 634 reg_w_val(gspca_dev, 0x8112, 0x0e); 635 /* Led Off (bit 3 -> 1 */ 636 reg_w_val(gspca_dev, 0x8114, 0x08); 637 } else { 638 reg_w_val(gspca_dev, 0x8112, 0x20); 639/* reg_w_val(gspca_dev, 0x8102, 0x00); ?? */ 640 } 641} 642 643static void do_autogain(struct gspca_dev *gspca_dev) 644{ 645 struct sd *sd = (struct sd *) gspca_dev; 646 int expotimes; 647 int pixelclk; 648 int gainG; 649 __u8 R, Gr, Gb, B; 650 int y; 651 __u8 luma_mean = 110; 652 __u8 luma_delta = 20; 653 __u8 spring = 4; 654 655 if (sd->ag_cnt < 0) 656 return; 657 if (--sd->ag_cnt >= 0) 658 return; 659 sd->ag_cnt = AG_CNT_START; 660 661 switch (sd->chip_revision) { 662 case Rev072A: 663 reg_r(gspca_dev, 0x8621, 1); 664 Gr = gspca_dev->usb_buf[0]; 665 reg_r(gspca_dev, 0x8622, 1); 666 R = gspca_dev->usb_buf[0]; 667 reg_r(gspca_dev, 0x8623, 1); 668 B = gspca_dev->usb_buf[0]; 669 reg_r(gspca_dev, 0x8624, 1); 670 Gb = gspca_dev->usb_buf[0]; 671 y = (77 * R + 75 * (Gr + Gb) + 29 * B) >> 8; 672 /* u= (128*B-(43*(Gr+Gb+R))) >> 8; */ 673 /* v= (128*R-(53*(Gr+Gb))-21*B) >> 8; */ 674 675 if (y < luma_mean - luma_delta || 676 y > luma_mean + luma_delta) { 677 expotimes = i2c_read(gspca_dev, 0x09, 0x10); 678 pixelclk = 0x0800; 679 expotimes = expotimes & 0x07ff; 680 gainG = i2c_read(gspca_dev, 0x35, 0x10); 681 682 expotimes += (luma_mean - y) >> spring; 683 gainG += (luma_mean - y) / 50; 684 685 if (gainG > 0x3f) 686 gainG = 0x3f; 687 else if (gainG < 3) 688 gainG = 3; 689 i2c_write(gspca_dev, gainG, 0x35); 690 691 if (expotimes > 0x0256) 692 expotimes = 0x0256; 693 else if (expotimes < 3) 694 expotimes = 3; 695 i2c_write(gspca_dev, expotimes | pixelclk, 0x09); 696 } 697 break; 698 } 699} 700 701static void sd_pkt_scan(struct gspca_dev *gspca_dev, 702 u8 *data, /* isoc packet */ 703 int len) /* iso packet length */ 704{ 705 struct sd *sd = (struct sd *) gspca_dev; 706 707 len--; 708 switch (*data++) { /* sequence number */ 709 case 0: /* start of frame */ 710 gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); 711 712 /* This should never happen */ 713 if (len < 2) { 714 gspca_err(gspca_dev, "Short SOF packet, ignoring\n\n\n\n\n"); 715 gspca_dev->last_packet_type = DISCARD_PACKET; 716 return; 717 } 718 719#if IS_ENABLED(CONFIG_INPUT) 720 if (data[0] & 0x20) { 721 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1); 722 input_sync(gspca_dev->input_dev); 723 input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0); 724 input_sync(gspca_dev->input_dev); 725 } 726#endif 727 728 if (data[1] & 0x10) { 729 /* compressed bayer */ 730 gspca_frame_add(gspca_dev, FIRST_PACKET, data, len); 731 } else { 732 /* raw bayer (with a header, which we skip) */ 733 if (sd->chip_revision == Rev012A) { 734 data += 20; 735 len -= 20; 736 } else { 737 data += 16; 738 len -= 16; 739 } 740 gspca_frame_add(gspca_dev, FIRST_PACKET, data, len); 741 } 742 return; 743 case 0xff: /* drop (empty mpackets) */ 744 return; 745 } 746 gspca_frame_add(gspca_dev, INTER_PACKET, data, len); 747} 748 749static int sd_s_ctrl(struct v4l2_ctrl *ctrl) 750{ 751 struct gspca_dev *gspca_dev = 752 container_of(ctrl->handler, struct gspca_dev, ctrl_handler); 753 struct sd *sd = (struct sd *)gspca_dev; 754 755 gspca_dev->usb_err = 0; 756 757 if (!gspca_dev->streaming) 758 return 0; 759 760 switch (ctrl->id) { 761 case V4L2_CID_BRIGHTNESS: 762 setbrightness(gspca_dev, ctrl->val); 763 break; 764 case V4L2_CID_CONTRAST: 765 /* hue/contrast control cluster for 72a */ 766 setwhite(gspca_dev, sd->hue->val, ctrl->val); 767 break; 768 case V4L2_CID_HUE: 769 /* just plain hue control for 12a */ 770 setwhite(gspca_dev, ctrl->val, 0); 771 break; 772 case V4L2_CID_EXPOSURE: 773 setexposure(gspca_dev, ctrl->val); 774 break; 775 case V4L2_CID_GAIN: 776 setgain(gspca_dev, ctrl->val); 777 break; 778 case V4L2_CID_AUTOGAIN: 779 setautogain(gspca_dev, ctrl->val); 780 break; 781 } 782 return gspca_dev->usb_err; 783} 784 785static const struct v4l2_ctrl_ops sd_ctrl_ops = { 786 .s_ctrl = sd_s_ctrl, 787}; 788 789static int sd_init_controls_12a(struct gspca_dev *gspca_dev) 790{ 791 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 792 793 gspca_dev->vdev.ctrl_handler = hdl; 794 v4l2_ctrl_handler_init(hdl, 3); 795 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 796 V4L2_CID_HUE, 1, 0x7f, 1, 0x40); 797 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 798 V4L2_CID_BRIGHTNESS, -128, 127, 1, 0); 799 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 800 V4L2_CID_EXPOSURE, 1, EXPOSURE_MAX, 1, 700); 801 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 802 V4L2_CID_GAIN, 0, 255, 1, 63); 803 804 if (hdl->error) { 805 pr_err("Could not initialize controls\n"); 806 return hdl->error; 807 } 808 return 0; 809} 810 811static int sd_init_controls_72a(struct gspca_dev *gspca_dev) 812{ 813 struct sd *sd = (struct sd *)gspca_dev; 814 struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler; 815 816 gspca_dev->vdev.ctrl_handler = hdl; 817 v4l2_ctrl_handler_init(hdl, 4); 818 sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 819 V4L2_CID_CONTRAST, 0, 0x3f, 1, 0x20); 820 sd->hue = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 821 V4L2_CID_HUE, 1, 0x7f, 1, 0x40); 822 v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 823 V4L2_CID_BRIGHTNESS, 0, 0x3f, 1, 0x20); 824 sd->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, 825 V4L2_CID_AUTOGAIN, 0, 1, 1, 1); 826 827 if (hdl->error) { 828 pr_err("Could not initialize controls\n"); 829 return hdl->error; 830 } 831 v4l2_ctrl_cluster(2, &sd->contrast); 832 return 0; 833} 834 835/* sub-driver description */ 836static const struct sd_desc sd_desc_12a = { 837 .name = MODULE_NAME, 838 .init_controls = sd_init_controls_12a, 839 .config = sd_config, 840 .init = sd_init_12a, 841 .start = sd_start_12a, 842 .stopN = sd_stopN, 843 .pkt_scan = sd_pkt_scan, 844#if IS_ENABLED(CONFIG_INPUT) 845 .other_input = 1, 846#endif 847}; 848static const struct sd_desc sd_desc_72a = { 849 .name = MODULE_NAME, 850 .init_controls = sd_init_controls_72a, 851 .config = sd_config, 852 .init = sd_init_72a, 853 .start = sd_start_72a, 854 .stopN = sd_stopN, 855 .pkt_scan = sd_pkt_scan, 856 .dq_callback = do_autogain, 857#if IS_ENABLED(CONFIG_INPUT) 858 .other_input = 1, 859#endif 860}; 861static const struct sd_desc *sd_desc[2] = { 862 &sd_desc_12a, 863 &sd_desc_72a 864}; 865 866/* -- module initialisation -- */ 867static const struct usb_device_id device_table[] = { 868 {USB_DEVICE(0x041e, 0x401a), .driver_info = Rev072A}, 869 {USB_DEVICE(0x041e, 0x403b), .driver_info = Rev012A}, 870 {USB_DEVICE(0x0458, 0x7004), .driver_info = Rev072A}, 871 {USB_DEVICE(0x0461, 0x0815), .driver_info = Rev072A}, 872 {USB_DEVICE(0x046d, 0x0928), .driver_info = Rev012A}, 873 {USB_DEVICE(0x046d, 0x0929), .driver_info = Rev012A}, 874 {USB_DEVICE(0x046d, 0x092a), .driver_info = Rev012A}, 875 {USB_DEVICE(0x046d, 0x092b), .driver_info = Rev012A}, 876 {USB_DEVICE(0x046d, 0x092c), .driver_info = Rev012A}, 877 {USB_DEVICE(0x046d, 0x092d), .driver_info = Rev012A}, 878 {USB_DEVICE(0x046d, 0x092e), .driver_info = Rev012A}, 879 {USB_DEVICE(0x046d, 0x092f), .driver_info = Rev012A}, 880 {USB_DEVICE(0x04fc, 0x0561), .driver_info = Rev072A}, 881 {USB_DEVICE(0x060b, 0xa001), .driver_info = Rev072A}, 882 {USB_DEVICE(0x10fd, 0x7e50), .driver_info = Rev072A}, 883 {USB_DEVICE(0xabcd, 0xcdee), .driver_info = Rev072A}, 884 {} 885}; 886 887MODULE_DEVICE_TABLE(usb, device_table); 888 889/* -- device connect -- */ 890static int sd_probe(struct usb_interface *intf, 891 const struct usb_device_id *id) 892{ 893 return gspca_dev_probe(intf, id, 894 sd_desc[id->driver_info], 895 sizeof(struct sd), 896 THIS_MODULE); 897} 898 899static struct usb_driver sd_driver = { 900 .name = MODULE_NAME, 901 .id_table = device_table, 902 .probe = sd_probe, 903 .disconnect = gspca_disconnect, 904#ifdef CONFIG_PM 905 .suspend = gspca_suspend, 906 .resume = gspca_resume, 907 .reset_resume = gspca_resume, 908#endif 909}; 910 911module_usb_driver(sd_driver);