linux/drivers/media/usb/gspca/sonixb.c
<<
>>
Prefs
   1/*
   2 *              sonix sn9c102 (bayer) library
   3 *
   4 * Copyright (C) 2009-2011 Jean-François Moine <http://moinejf.free.fr>
   5 * Copyright (C) 2003 2004 Michel Xhaard mxhaard@magic.fr
   6 * Add Pas106 Stefano Mozzi (C) 2004
   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/* Some documentation on known sonixb registers:
  20
  21Reg     Use
  22sn9c101 / sn9c102:
  230x10    high nibble red gain low nibble blue gain
  240x11    low nibble green gain
  25sn9c103:
  260x05    red gain 0-127
  270x06    blue gain 0-127
  280x07    green gain 0-127
  29all:
  300x08-0x0f i2c / 3wire registers
  310x12    hstart
  320x13    vstart
  330x15    hsize (hsize = register-value * 16)
  340x16    vsize (vsize = register-value * 16)
  350x17    bit 0 toggle compression quality (according to sn9c102 driver)
  360x18    bit 7 enables compression, bit 4-5 set image down scaling:
  37        00 scale 1, 01 scale 1/2, 10, scale 1/4
  380x19    high-nibble is sensor clock divider, changes exposure on sensors which
  39        use a clock generated by the bridge. Some sensors have their own clock.
  400x1c    auto_exposure area (for avg_lum) startx (startx = register-value * 32)
  410x1d    auto_exposure area (for avg_lum) starty (starty = register-value * 32)
  420x1e    auto_exposure area (for avg_lum) stopx (hsize = (0x1e - 0x1c) * 32)
  430x1f    auto_exposure area (for avg_lum) stopy (vsize = (0x1f - 0x1d) * 32)
  44*/
  45
  46#define MODULE_NAME "sonixb"
  47
  48#include <linux/input.h>
  49#include "gspca.h"
  50
  51MODULE_AUTHOR("Jean-François Moine <http://moinejf.free.fr>");
  52MODULE_DESCRIPTION("GSPCA/SN9C102 USB Camera Driver");
  53MODULE_LICENSE("GPL");
  54
  55/* specific webcam descriptor */
  56struct sd {
  57        struct gspca_dev gspca_dev;     /* !! must be the first item */
  58
  59        struct v4l2_ctrl *brightness;
  60        struct v4l2_ctrl *plfreq;
  61
  62        atomic_t avg_lum;
  63        int prev_avg_lum;
  64        int exposure_knee;
  65        int header_read;
  66        u8 header[12]; /* Header without sof marker */
  67
  68        unsigned char autogain_ignore_frames;
  69        unsigned char frames_to_drop;
  70
  71        __u8 bridge;                    /* Type of bridge */
  72#define BRIDGE_101 0
  73#define BRIDGE_102 0 /* We make no difference between 101 and 102 */
  74#define BRIDGE_103 1
  75
  76        __u8 sensor;                    /* Type of image sensor chip */
  77#define SENSOR_HV7131D 0
  78#define SENSOR_HV7131R 1
  79#define SENSOR_OV6650 2
  80#define SENSOR_OV7630 3
  81#define SENSOR_PAS106 4
  82#define SENSOR_PAS202 5
  83#define SENSOR_TAS5110C 6
  84#define SENSOR_TAS5110D 7
  85#define SENSOR_TAS5130CXX 8
  86        __u8 reg11;
  87};
  88
  89typedef const __u8 sensor_init_t[8];
  90
  91struct sensor_data {
  92        const __u8 *bridge_init;
  93        sensor_init_t *sensor_init;
  94        int sensor_init_size;
  95        int flags;
  96        __u8 sensor_addr;
  97};
  98
  99/* sensor_data flags */
 100#define F_SIF           0x01    /* sif or vga */
 101
 102/* priv field of struct v4l2_pix_format flags (do not use low nibble!) */
 103#define MODE_RAW 0x10           /* raw bayer mode */
 104#define MODE_REDUCED_SIF 0x20   /* vga mode (320x240 / 160x120) on sif cam */
 105
 106#define COMP 0xc7               /* 0x87 //0x07 */
 107#define COMP1 0xc9              /* 0x89 //0x09 */
 108
 109#define MCK_INIT 0x63
 110#define MCK_INIT1 0x20          /*fixme: Bayer - 0x50 for JPEG ??*/
 111
 112#define SYS_CLK 0x04
 113
 114#define SENS(bridge, sensor, _flags, _sensor_addr) \
 115{ \
 116        .bridge_init = bridge, \
 117        .sensor_init = sensor, \
 118        .sensor_init_size = sizeof(sensor), \
 119        .flags = _flags, .sensor_addr = _sensor_addr \
 120}
 121
 122/* We calculate the autogain at the end of the transfer of a frame, at this
 123   moment a frame with the old settings is being captured and transmitted. So
 124   if we adjust the gain or exposure we must ignore atleast the next frame for
 125   the new settings to come into effect before doing any other adjustments. */
 126#define AUTOGAIN_IGNORE_FRAMES 1
 127
 128static const struct v4l2_pix_format vga_mode[] = {
 129        {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
 130                .bytesperline = 160,
 131                .sizeimage = 160 * 120,
 132                .colorspace = V4L2_COLORSPACE_SRGB,
 133                .priv = 2 | MODE_RAW},
 134        {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 135                .bytesperline = 160,
 136                .sizeimage = 160 * 120 * 5 / 4,
 137                .colorspace = V4L2_COLORSPACE_SRGB,
 138                .priv = 2},
 139        {320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 140                .bytesperline = 320,
 141                .sizeimage = 320 * 240 * 5 / 4,
 142                .colorspace = V4L2_COLORSPACE_SRGB,
 143                .priv = 1},
 144        {640, 480, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 145                .bytesperline = 640,
 146                .sizeimage = 640 * 480 * 5 / 4,
 147                .colorspace = V4L2_COLORSPACE_SRGB,
 148                .priv = 0},
 149};
 150static const struct v4l2_pix_format sif_mode[] = {
 151        {160, 120, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
 152                .bytesperline = 160,
 153                .sizeimage = 160 * 120,
 154                .colorspace = V4L2_COLORSPACE_SRGB,
 155                .priv = 1 | MODE_RAW | MODE_REDUCED_SIF},
 156        {160, 120, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 157                .bytesperline = 160,
 158                .sizeimage = 160 * 120 * 5 / 4,
 159                .colorspace = V4L2_COLORSPACE_SRGB,
 160                .priv = 1 | MODE_REDUCED_SIF},
 161        {176, 144, V4L2_PIX_FMT_SBGGR8, V4L2_FIELD_NONE,
 162                .bytesperline = 176,
 163                .sizeimage = 176 * 144,
 164                .colorspace = V4L2_COLORSPACE_SRGB,
 165                .priv = 1 | MODE_RAW},
 166        {176, 144, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 167                .bytesperline = 176,
 168                .sizeimage = 176 * 144 * 5 / 4,
 169                .colorspace = V4L2_COLORSPACE_SRGB,
 170                .priv = 1},
 171        {320, 240, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 172                .bytesperline = 320,
 173                .sizeimage = 320 * 240 * 5 / 4,
 174                .colorspace = V4L2_COLORSPACE_SRGB,
 175                .priv = 0 | MODE_REDUCED_SIF},
 176        {352, 288, V4L2_PIX_FMT_SN9C10X, V4L2_FIELD_NONE,
 177                .bytesperline = 352,
 178                .sizeimage = 352 * 288 * 5 / 4,
 179                .colorspace = V4L2_COLORSPACE_SRGB,
 180                .priv = 0},
 181};
 182
 183static const __u8 initHv7131d[] = {
 184        0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
 185        0x00, 0x00,
 186        0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
 187        0x28, 0x1e, 0x60, 0x8e, 0x42,
 188};
 189static const __u8 hv7131d_sensor_init[][8] = {
 190        {0xa0, 0x11, 0x01, 0x04, 0x00, 0x00, 0x00, 0x17},
 191        {0xa0, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x17},
 192        {0xa0, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17},
 193        {0xa0, 0x11, 0x30, 0x30, 0x00, 0x00, 0x00, 0x17}, /* reset level */
 194        {0xa0, 0x11, 0x34, 0x02, 0x00, 0x00, 0x00, 0x17}, /* pixel bias volt */
 195};
 196
 197static const __u8 initHv7131r[] = {
 198        0x46, 0x77, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
 199        0x00, 0x00,
 200        0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
 201        0x28, 0x1e, 0x60, 0x8a, 0x20,
 202};
 203static const __u8 hv7131r_sensor_init[][8] = {
 204        {0xc0, 0x11, 0x31, 0x38, 0x2a, 0x2e, 0x00, 0x10},
 205        {0xa0, 0x11, 0x01, 0x08, 0x2a, 0x2e, 0x00, 0x10},
 206        {0xb0, 0x11, 0x20, 0x00, 0xd0, 0x2e, 0x00, 0x10},
 207        {0xc0, 0x11, 0x25, 0x03, 0x0e, 0x28, 0x00, 0x16},
 208        {0xa0, 0x11, 0x30, 0x10, 0x0e, 0x28, 0x00, 0x15},
 209};
 210static const __u8 initOv6650[] = {
 211        0x44, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
 212        0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 213        0x00, 0x01, 0x01, 0x0a, 0x16, 0x12, 0x68, 0x8b,
 214        0x10,
 215};
 216static const __u8 ov6650_sensor_init[][8] = {
 217        /* Bright, contrast, etc are set through SCBB interface.
 218         * AVCAP on win2 do not send any data on this controls. */
 219        /* Anyway, some registers appears to alter bright and constrat */
 220
 221        /* Reset sensor */
 222        {0xa0, 0x60, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
 223        /* Set clock register 0x11 low nibble is clock divider */
 224        {0xd0, 0x60, 0x11, 0xc0, 0x1b, 0x18, 0xc1, 0x10},
 225        /* Next some unknown stuff */
 226        {0xb0, 0x60, 0x15, 0x00, 0x02, 0x18, 0xc1, 0x10},
 227/*      {0xa0, 0x60, 0x1b, 0x01, 0x02, 0x18, 0xc1, 0x10},
 228                 * THIS SET GREEN SCREEN
 229                 * (pixels could be innverted in decode kind of "brg",
 230                 * but blue wont be there. Avoid this data ... */
 231        {0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10}, /* format out? */
 232        {0xd0, 0x60, 0x26, 0x01, 0x14, 0xd8, 0xa4, 0x10},
 233        {0xa0, 0x60, 0x30, 0x3d, 0x0a, 0xd8, 0xa4, 0x10},
 234        /* Enable rgb brightness control */
 235        {0xa0, 0x60, 0x61, 0x08, 0x00, 0x00, 0x00, 0x10},
 236        /* HDG: Note windows uses the line below, which sets both register 0x60
 237           and 0x61 I believe these registers of the ov6650 are identical as
 238           those of the ov7630, because if this is true the windows settings
 239           add a bit additional red gain and a lot additional blue gain, which
 240           matches my findings that the windows settings make blue much too
 241           blue and red a little too red.
 242        {0xb0, 0x60, 0x60, 0x66, 0x68, 0xd8, 0xa4, 0x10}, */
 243        /* Some more unknown stuff */
 244        {0xa0, 0x60, 0x68, 0x04, 0x68, 0xd8, 0xa4, 0x10},
 245        {0xd0, 0x60, 0x17, 0x24, 0xd6, 0x04, 0x94, 0x10}, /* Clipreg */
 246};
 247
 248static const __u8 initOv7630[] = {
 249        0x04, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, /* r01 .. r08 */
 250        0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* r09 .. r10 */
 251        0x00, 0x01, 0x01, 0x0a,                         /* r11 .. r14 */
 252        0x28, 0x1e,                     /* H & V sizes     r15 .. r16 */
 253        0x68, 0x8f, MCK_INIT1,                          /* r17 .. r19 */
 254};
 255static const __u8 ov7630_sensor_init[][8] = {
 256        {0xa0, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10},
 257        {0xb0, 0x21, 0x01, 0x77, 0x3a, 0x00, 0x00, 0x10},
 258/*      {0xd0, 0x21, 0x12, 0x7c, 0x01, 0x80, 0x34, 0x10},          jfm */
 259        {0xd0, 0x21, 0x12, 0x5c, 0x00, 0x80, 0x34, 0x10},       /* jfm */
 260        {0xa0, 0x21, 0x1b, 0x04, 0x00, 0x80, 0x34, 0x10},
 261        {0xa0, 0x21, 0x20, 0x44, 0x00, 0x80, 0x34, 0x10},
 262        {0xa0, 0x21, 0x23, 0xee, 0x00, 0x80, 0x34, 0x10},
 263        {0xd0, 0x21, 0x26, 0xa0, 0x9a, 0xa0, 0x30, 0x10},
 264        {0xb0, 0x21, 0x2a, 0x80, 0x00, 0xa0, 0x30, 0x10},
 265        {0xb0, 0x21, 0x2f, 0x3d, 0x24, 0xa0, 0x30, 0x10},
 266        {0xa0, 0x21, 0x32, 0x86, 0x24, 0xa0, 0x30, 0x10},
 267        {0xb0, 0x21, 0x60, 0xa9, 0x4a, 0xa0, 0x30, 0x10},
 268/*      {0xb0, 0x21, 0x60, 0xa9, 0x42, 0xa0, 0x30, 0x10},        * jfm */
 269        {0xa0, 0x21, 0x65, 0x00, 0x42, 0xa0, 0x30, 0x10},
 270        {0xa0, 0x21, 0x69, 0x38, 0x42, 0xa0, 0x30, 0x10},
 271        {0xc0, 0x21, 0x6f, 0x88, 0x0b, 0x00, 0x30, 0x10},
 272        {0xc0, 0x21, 0x74, 0x21, 0x8e, 0x00, 0x30, 0x10},
 273        {0xa0, 0x21, 0x7d, 0xf7, 0x8e, 0x00, 0x30, 0x10},
 274        {0xd0, 0x21, 0x17, 0x1c, 0xbd, 0x06, 0xf6, 0x10},
 275};
 276
 277static const __u8 initPas106[] = {
 278        0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x40, 0x00, 0x00, 0x00,
 279        0x00, 0x00,
 280        0x00, 0x00, 0x00, 0x04, 0x01, 0x00,
 281        0x16, 0x12, 0x24, COMP1, MCK_INIT1,
 282};
 283/* compression 0x86 mckinit1 0x2b */
 284
 285/* "Known" PAS106B registers:
 286  0x02 clock divider
 287  0x03 Variable framerate bits 4-11
 288  0x04 Var framerate bits 0-3, one must leave the 4 msb's at 0 !!
 289       The variable framerate control must never be set lower then 300,
 290       which sets the framerate at 90 / reg02, otherwise vsync is lost.
 291  0x05 Shutter Time Line Offset, this can be used as an exposure control:
 292       0 = use full frame time, 255 = no exposure at all
 293       Note this may never be larger then "var-framerate control" / 2 - 2.
 294       When var-framerate control is < 514, no exposure is reached at the max
 295       allowed value for the framerate control value, rather then at 255.
 296  0x06 Shutter Time Pixel Offset, like reg05 this influences exposure, but
 297       only a very little bit, leave at 0xcd
 298  0x07 offset sign bit (bit0 1 > negative offset)
 299  0x08 offset
 300  0x09 Blue Gain
 301  0x0a Green1 Gain
 302  0x0b Green2 Gain
 303  0x0c Red Gain
 304  0x0e Global gain
 305  0x13 Write 1 to commit settings to sensor
 306*/
 307
 308static const __u8 pas106_sensor_init[][8] = {
 309        /* Pixel Clock Divider 6 */
 310        { 0xa1, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x14 },
 311        /* Frame Time MSB (also seen as 0x12) */
 312        { 0xa1, 0x40, 0x03, 0x13, 0x00, 0x00, 0x00, 0x14 },
 313        /* Frame Time LSB (also seen as 0x05) */
 314        { 0xa1, 0x40, 0x04, 0x06, 0x00, 0x00, 0x00, 0x14 },
 315        /* Shutter Time Line Offset (also seen as 0x6d) */
 316        { 0xa1, 0x40, 0x05, 0x65, 0x00, 0x00, 0x00, 0x14 },
 317        /* Shutter Time Pixel Offset (also seen as 0xb1) */
 318        { 0xa1, 0x40, 0x06, 0xcd, 0x00, 0x00, 0x00, 0x14 },
 319        /* Black Level Subtract Sign (also seen 0x00) */
 320        { 0xa1, 0x40, 0x07, 0xc1, 0x00, 0x00, 0x00, 0x14 },
 321        /* Black Level Subtract Level (also seen 0x01) */
 322        { 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
 323        { 0xa1, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0x14 },
 324        /* Color Gain B Pixel 5 a */
 325        { 0xa1, 0x40, 0x09, 0x05, 0x00, 0x00, 0x00, 0x14 },
 326        /* Color Gain G1 Pixel 1 5 */
 327        { 0xa1, 0x40, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x14 },
 328        /* Color Gain G2 Pixel 1 0 5 */
 329        { 0xa1, 0x40, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x14 },
 330        /* Color Gain R Pixel 3 1 */
 331        { 0xa1, 0x40, 0x0c, 0x05, 0x00, 0x00, 0x00, 0x14 },
 332        /* Color GainH  Pixel */
 333        { 0xa1, 0x40, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x14 },
 334        /* Global Gain */
 335        { 0xa1, 0x40, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x14 },
 336        /* Contrast */
 337        { 0xa1, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x14 },
 338        /* H&V synchro polarity */
 339        { 0xa1, 0x40, 0x10, 0x06, 0x00, 0x00, 0x00, 0x14 },
 340        /* ?default */
 341        { 0xa1, 0x40, 0x11, 0x06, 0x00, 0x00, 0x00, 0x14 },
 342        /* DAC scale */
 343        { 0xa1, 0x40, 0x12, 0x06, 0x00, 0x00, 0x00, 0x14 },
 344        /* ?default */
 345        { 0xa1, 0x40, 0x14, 0x02, 0x00, 0x00, 0x00, 0x14 },
 346        /* Validate Settings */
 347        { 0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14 },
 348};
 349
 350static const __u8 initPas202[] = {
 351        0x44, 0x44, 0x21, 0x30, 0x00, 0x00, 0x00, 0x80, 0x40, 0x00, 0x00, 0x00,
 352        0x00, 0x00,
 353        0x00, 0x00, 0x00, 0x06, 0x03, 0x0a,
 354        0x28, 0x1e, 0x20, 0x89, 0x20,
 355};
 356
 357/* "Known" PAS202BCB registers:
 358  0x02 clock divider
 359  0x04 Variable framerate bits 6-11 (*)
 360  0x05 Var framerate  bits 0-5, one must leave the 2 msb's at 0 !!
 361  0x07 Blue Gain
 362  0x08 Green Gain
 363  0x09 Red Gain
 364  0x0b offset sign bit (bit0 1 > negative offset)
 365  0x0c offset
 366  0x0e Unknown image is slightly brighter when bit 0 is 0, if reg0f is 0 too,
 367       leave at 1 otherwise we get a jump in our exposure control
 368  0x0f Exposure 0-255, 0 = use full frame time, 255 = no exposure at all
 369  0x10 Master gain 0 - 31
 370  0x11 write 1 to apply changes
 371  (*) The variable framerate control must never be set lower then 500
 372      which sets the framerate at 30 / reg02, otherwise vsync is lost.
 373*/
 374static const __u8 pas202_sensor_init[][8] = {
 375        /* Set the clock divider to 4 -> 30 / 4 = 7.5 fps, we would like
 376           to set it lower, but for some reason the bridge starts missing
 377           vsync's then */
 378        {0xa0, 0x40, 0x02, 0x04, 0x00, 0x00, 0x00, 0x10},
 379        {0xd0, 0x40, 0x04, 0x07, 0x34, 0x00, 0x09, 0x10},
 380        {0xd0, 0x40, 0x08, 0x01, 0x00, 0x00, 0x01, 0x10},
 381        {0xd0, 0x40, 0x0c, 0x00, 0x0c, 0x01, 0x32, 0x10},
 382        {0xd0, 0x40, 0x10, 0x00, 0x01, 0x00, 0x63, 0x10},
 383        {0xa0, 0x40, 0x15, 0x70, 0x01, 0x00, 0x63, 0x10},
 384        {0xa0, 0x40, 0x18, 0x00, 0x01, 0x00, 0x63, 0x10},
 385        {0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
 386        {0xa0, 0x40, 0x03, 0x56, 0x01, 0x00, 0x63, 0x10},
 387        {0xa0, 0x40, 0x11, 0x01, 0x01, 0x00, 0x63, 0x10},
 388};
 389
 390static const __u8 initTas5110c[] = {
 391        0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
 392        0x00, 0x00,
 393        0x00, 0x00, 0x00, 0x45, 0x09, 0x0a,
 394        0x16, 0x12, 0x60, 0x86, 0x2b,
 395};
 396/* Same as above, except a different hstart */
 397static const __u8 initTas5110d[] = {
 398        0x44, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
 399        0x00, 0x00,
 400        0x00, 0x00, 0x00, 0x41, 0x09, 0x0a,
 401        0x16, 0x12, 0x60, 0x86, 0x2b,
 402};
 403/* tas5110c is 3 wire, tas5110d is 2 wire (regular i2c) */
 404static const __u8 tas5110c_sensor_init[][8] = {
 405        {0x30, 0x11, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x10},
 406        {0x30, 0x11, 0x02, 0x20, 0xa9, 0x00, 0x00, 0x10},
 407};
 408/* Known TAS5110D registers
 409 * reg02: gain, bit order reversed!! 0 == max gain, 255 == min gain
 410 * reg03: bit3: vflip, bit4: ~hflip, bit7: ~gainboost (~ == inverted)
 411 *        Note: writing reg03 seems to only work when written together with 02
 412 */
 413static const __u8 tas5110d_sensor_init[][8] = {
 414        {0xa0, 0x61, 0x9a, 0xca, 0x00, 0x00, 0x00, 0x17}, /* reset */
 415};
 416
 417static const __u8 initTas5130[] = {
 418        0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x11, 0x00, 0x00, 0x00,
 419        0x00, 0x00,
 420        0x00, 0x00, 0x00, 0x68, 0x0c, 0x0a,
 421        0x28, 0x1e, 0x60, COMP, MCK_INIT,
 422};
 423static const __u8 tas5130_sensor_init[][8] = {
 424/*      {0x30, 0x11, 0x00, 0x40, 0x47, 0x00, 0x00, 0x10},
 425                                        * shutter 0x47 short exposure? */
 426        {0x30, 0x11, 0x00, 0x40, 0x01, 0x00, 0x00, 0x10},
 427                                        /* shutter 0x01 long exposure */
 428        {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10},
 429};
 430
 431static const struct sensor_data sensor_data[] = {
 432        SENS(initHv7131d, hv7131d_sensor_init, 0, 0),
 433        SENS(initHv7131r, hv7131r_sensor_init, 0, 0),
 434        SENS(initOv6650, ov6650_sensor_init, F_SIF, 0x60),
 435        SENS(initOv7630, ov7630_sensor_init, 0, 0x21),
 436        SENS(initPas106, pas106_sensor_init, F_SIF, 0),
 437        SENS(initPas202, pas202_sensor_init, 0, 0),
 438        SENS(initTas5110c, tas5110c_sensor_init, F_SIF, 0),
 439        SENS(initTas5110d, tas5110d_sensor_init, F_SIF, 0),
 440        SENS(initTas5130, tas5130_sensor_init, 0, 0),
 441};
 442
 443/* get one byte in gspca_dev->usb_buf */
 444static void reg_r(struct gspca_dev *gspca_dev,
 445                  __u16 value)
 446{
 447        int res;
 448
 449        if (gspca_dev->usb_err < 0)
 450                return;
 451
 452        res = usb_control_msg(gspca_dev->dev,
 453                        usb_rcvctrlpipe(gspca_dev->dev, 0),
 454                        0,                      /* request */
 455                        USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
 456                        value,
 457                        0,                      /* index */
 458                        gspca_dev->usb_buf, 1,
 459                        500);
 460
 461        if (res < 0) {
 462                dev_err(gspca_dev->v4l2_dev.dev,
 463                        "Error reading register %02x: %d\n", value, res);
 464                gspca_dev->usb_err = res;
 465        }
 466}
 467
 468static void reg_w(struct gspca_dev *gspca_dev,
 469                  __u16 value,
 470                  const __u8 *buffer,
 471                  int len)
 472{
 473        int res;
 474
 475        if (gspca_dev->usb_err < 0)
 476                return;
 477
 478        memcpy(gspca_dev->usb_buf, buffer, len);
 479        res = usb_control_msg(gspca_dev->dev,
 480                        usb_sndctrlpipe(gspca_dev->dev, 0),
 481                        0x08,                   /* request */
 482                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
 483                        value,
 484                        0,                      /* index */
 485                        gspca_dev->usb_buf, len,
 486                        500);
 487
 488        if (res < 0) {
 489                dev_err(gspca_dev->v4l2_dev.dev,
 490                        "Error writing register %02x: %d\n", value, res);
 491                gspca_dev->usb_err = res;
 492        }
 493}
 494
 495static void i2c_w(struct gspca_dev *gspca_dev, const u8 *buf)
 496{
 497        int retry = 60;
 498
 499        if (gspca_dev->usb_err < 0)
 500                return;
 501
 502        /* is i2c ready */
 503        reg_w(gspca_dev, 0x08, buf, 8);
 504        while (retry--) {
 505                if (gspca_dev->usb_err < 0)
 506                        return;
 507                msleep(1);
 508                reg_r(gspca_dev, 0x08);
 509                if (gspca_dev->usb_buf[0] & 0x04) {
 510                        if (gspca_dev->usb_buf[0] & 0x08) {
 511                                dev_err(gspca_dev->v4l2_dev.dev,
 512                                        "i2c error writing %8ph\n", buf);
 513                                gspca_dev->usb_err = -EIO;
 514                        }
 515                        return;
 516                }
 517        }
 518
 519        dev_err(gspca_dev->v4l2_dev.dev, "i2c write timeout\n");
 520        gspca_dev->usb_err = -EIO;
 521}
 522
 523static void i2c_w_vector(struct gspca_dev *gspca_dev,
 524                        const __u8 buffer[][8], int len)
 525{
 526        for (;;) {
 527                if (gspca_dev->usb_err < 0)
 528                        return;
 529                i2c_w(gspca_dev, *buffer);
 530                len -= 8;
 531                if (len <= 0)
 532                        break;
 533                buffer++;
 534        }
 535}
 536
 537static void setbrightness(struct gspca_dev *gspca_dev)
 538{
 539        struct sd *sd = (struct sd *) gspca_dev;
 540
 541        switch (sd->sensor) {
 542        case  SENSOR_OV6650:
 543        case  SENSOR_OV7630: {
 544                __u8 i2cOV[] =
 545                        {0xa0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x10};
 546
 547                /* change reg 0x06 */
 548                i2cOV[1] = sensor_data[sd->sensor].sensor_addr;
 549                i2cOV[3] = sd->brightness->val;
 550                i2c_w(gspca_dev, i2cOV);
 551                break;
 552        }
 553        case SENSOR_PAS106:
 554        case SENSOR_PAS202: {
 555                __u8 i2cpbright[] =
 556                        {0xb0, 0x40, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x16};
 557                __u8 i2cpdoit[] =
 558                        {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
 559
 560                /* PAS106 uses reg 7 and 8 instead of b and c */
 561                if (sd->sensor == SENSOR_PAS106) {
 562                        i2cpbright[2] = 7;
 563                        i2cpdoit[2] = 0x13;
 564                }
 565
 566                if (sd->brightness->val < 127) {
 567                        /* change reg 0x0b, signreg */
 568                        i2cpbright[3] = 0x01;
 569                        /* set reg 0x0c, offset */
 570                        i2cpbright[4] = 127 - sd->brightness->val;
 571                } else
 572                        i2cpbright[4] = sd->brightness->val - 127;
 573
 574                i2c_w(gspca_dev, i2cpbright);
 575                i2c_w(gspca_dev, i2cpdoit);
 576                break;
 577        }
 578        default:
 579                break;
 580        }
 581}
 582
 583static void setgain(struct gspca_dev *gspca_dev)
 584{
 585        struct sd *sd = (struct sd *) gspca_dev;
 586        u8 gain = gspca_dev->gain->val;
 587
 588        switch (sd->sensor) {
 589        case SENSOR_HV7131D: {
 590                __u8 i2c[] =
 591                        {0xc0, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0x17};
 592
 593                i2c[3] = 0x3f - gain;
 594                i2c[4] = 0x3f - gain;
 595                i2c[5] = 0x3f - gain;
 596
 597                i2c_w(gspca_dev, i2c);
 598                break;
 599        }
 600        case SENSOR_TAS5110C:
 601        case SENSOR_TAS5130CXX: {
 602                __u8 i2c[] =
 603                        {0x30, 0x11, 0x02, 0x20, 0x70, 0x00, 0x00, 0x10};
 604
 605                i2c[4] = 255 - gain;
 606                i2c_w(gspca_dev, i2c);
 607                break;
 608        }
 609        case SENSOR_TAS5110D: {
 610                __u8 i2c[] = {
 611                        0xb0, 0x61, 0x02, 0x00, 0x10, 0x00, 0x00, 0x17 };
 612                gain = 255 - gain;
 613                /* The bits in the register are the wrong way around!! */
 614                i2c[3] |= (gain & 0x80) >> 7;
 615                i2c[3] |= (gain & 0x40) >> 5;
 616                i2c[3] |= (gain & 0x20) >> 3;
 617                i2c[3] |= (gain & 0x10) >> 1;
 618                i2c[3] |= (gain & 0x08) << 1;
 619                i2c[3] |= (gain & 0x04) << 3;
 620                i2c[3] |= (gain & 0x02) << 5;
 621                i2c[3] |= (gain & 0x01) << 7;
 622                i2c_w(gspca_dev, i2c);
 623                break;
 624        }
 625        case SENSOR_OV6650:
 626        case SENSOR_OV7630: {
 627                __u8 i2c[] = {0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10};
 628
 629                /*
 630                 * The ov7630's gain is weird, at 32 the gain drops to the
 631                 * same level as at 16, so skip 32-47 (of the 0-63 scale).
 632                 */
 633                if (sd->sensor == SENSOR_OV7630 && gain >= 32)
 634                        gain += 16;
 635
 636                i2c[1] = sensor_data[sd->sensor].sensor_addr;
 637                i2c[3] = gain;
 638                i2c_w(gspca_dev, i2c);
 639                break;
 640        }
 641        case SENSOR_PAS106:
 642        case SENSOR_PAS202: {
 643                __u8 i2cpgain[] =
 644                        {0xa0, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x15};
 645                __u8 i2cpcolorgain[] =
 646                        {0xc0, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x15};
 647                __u8 i2cpdoit[] =
 648                        {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
 649
 650                /* PAS106 uses different regs (and has split green gains) */
 651                if (sd->sensor == SENSOR_PAS106) {
 652                        i2cpgain[2] = 0x0e;
 653                        i2cpcolorgain[0] = 0xd0;
 654                        i2cpcolorgain[2] = 0x09;
 655                        i2cpdoit[2] = 0x13;
 656                }
 657
 658                i2cpgain[3] = gain;
 659                i2cpcolorgain[3] = gain >> 1;
 660                i2cpcolorgain[4] = gain >> 1;
 661                i2cpcolorgain[5] = gain >> 1;
 662                i2cpcolorgain[6] = gain >> 1;
 663
 664                i2c_w(gspca_dev, i2cpgain);
 665                i2c_w(gspca_dev, i2cpcolorgain);
 666                i2c_w(gspca_dev, i2cpdoit);
 667                break;
 668        }
 669        default:
 670                if (sd->bridge == BRIDGE_103) {
 671                        u8 buf[3] = { gain, gain, gain }; /* R, G, B */
 672                        reg_w(gspca_dev, 0x05, buf, 3);
 673                } else {
 674                        u8 buf[2];
 675                        buf[0] = gain << 4 | gain; /* Red and blue */
 676                        buf[1] = gain; /* Green */
 677                        reg_w(gspca_dev, 0x10, buf, 2);
 678                }
 679        }
 680}
 681
 682static void setexposure(struct gspca_dev *gspca_dev)
 683{
 684        struct sd *sd = (struct sd *) gspca_dev;
 685
 686        switch (sd->sensor) {
 687        case SENSOR_HV7131D: {
 688                /* Note the datasheet wrongly says line mode exposure uses reg
 689                   0x26 and 0x27, testing has shown 0x25 + 0x26 */
 690                __u8 i2c[] = {0xc0, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x17};
 691                u16 reg = gspca_dev->exposure->val;
 692
 693                i2c[3] = reg >> 8;
 694                i2c[4] = reg & 0xff;
 695                i2c_w(gspca_dev, i2c);
 696                break;
 697        }
 698        case SENSOR_TAS5110C:
 699        case SENSOR_TAS5110D: {
 700                /* register 19's high nibble contains the sn9c10x clock divider
 701                   The high nibble configures the no fps according to the
 702                   formula: 60 / high_nibble. With a maximum of 30 fps */
 703                u8 reg = gspca_dev->exposure->val;
 704
 705                reg = (reg << 4) | 0x0b;
 706                reg_w(gspca_dev, 0x19, &reg, 1);
 707                break;
 708        }
 709        case SENSOR_OV6650:
 710        case SENSOR_OV7630: {
 711                /* The ov6650 / ov7630 have 2 registers which both influence
 712                   exposure, register 11, whose low nibble sets the nr off fps
 713                   according to: fps = 30 / (low_nibble + 1)
 714
 715                   The fps configures the maximum exposure setting, but it is
 716                   possible to use less exposure then what the fps maximum
 717                   allows by setting register 10. register 10 configures the
 718                   actual exposure as quotient of the full exposure, with 0
 719                   being no exposure at all (not very useful) and reg10_max
 720                   being max exposure possible at that framerate.
 721
 722                   The code maps our 0 - 510 ms exposure ctrl to these 2
 723                   registers, trying to keep fps as high as possible.
 724                */
 725                __u8 i2c[] = {0xb0, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x10};
 726                int reg10, reg11, reg10_max;
 727
 728                /* ov6645 datasheet says reg10_max is 9a, but that uses
 729                   tline * 2 * reg10 as formula for calculating texpo, the
 730                   ov6650 probably uses the same formula as the 7730 which uses
 731                   tline * 4 * reg10, which explains why the reg10max we've
 732                   found experimentally for the ov6650 is exactly half that of
 733                   the ov6645. The ov7630 datasheet says the max is 0x41. */
 734                if (sd->sensor == SENSOR_OV6650) {
 735                        reg10_max = 0x4d;
 736                        i2c[4] = 0xc0; /* OV6650 needs non default vsync pol */
 737                } else
 738                        reg10_max = 0x41;
 739
 740                reg11 = (15 * gspca_dev->exposure->val + 999) / 1000;
 741                if (reg11 < 1)
 742                        reg11 = 1;
 743                else if (reg11 > 16)
 744                        reg11 = 16;
 745
 746                /* In 640x480, if the reg11 has less than 4, the image is
 747                   unstable (the bridge goes into a higher compression mode
 748                   which we have not reverse engineered yet). */
 749                if (gspca_dev->pixfmt.width == 640 && reg11 < 4)
 750                        reg11 = 4;
 751
 752                /* frame exposure time in ms = 1000 * reg11 / 30    ->
 753                reg10 = (gspca_dev->exposure->val / 2) * reg10_max
 754                                / (1000 * reg11 / 30) */
 755                reg10 = (gspca_dev->exposure->val * 15 * reg10_max)
 756                                / (1000 * reg11);
 757
 758                /* Don't allow this to get below 10 when using autogain, the
 759                   steps become very large (relatively) when below 10 causing
 760                   the image to oscilate from much too dark, to much too bright
 761                   and back again. */
 762                if (gspca_dev->autogain->val && reg10 < 10)
 763                        reg10 = 10;
 764                else if (reg10 > reg10_max)
 765                        reg10 = reg10_max;
 766
 767                /* Write reg 10 and reg11 low nibble */
 768                i2c[1] = sensor_data[sd->sensor].sensor_addr;
 769                i2c[3] = reg10;
 770                i2c[4] |= reg11 - 1;
 771
 772                /* If register 11 didn't change, don't change it */
 773                if (sd->reg11 == reg11)
 774                        i2c[0] = 0xa0;
 775
 776                i2c_w(gspca_dev, i2c);
 777                if (gspca_dev->usb_err == 0)
 778                        sd->reg11 = reg11;
 779                break;
 780        }
 781        case SENSOR_PAS202: {
 782                __u8 i2cpframerate[] =
 783                        {0xb0, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x16};
 784                __u8 i2cpexpo[] =
 785                        {0xa0, 0x40, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x16};
 786                const __u8 i2cpdoit[] =
 787                        {0xa0, 0x40, 0x11, 0x01, 0x00, 0x00, 0x00, 0x16};
 788                int framerate_ctrl;
 789
 790                /* The exposure knee for the autogain algorithm is 200
 791                   (100 ms / 10 fps on other sensors), for values below this
 792                   use the control for setting the partial frame expose time,
 793                   above that use variable framerate. This way we run at max
 794                   framerate (640x480@7.5 fps, 320x240@10fps) until the knee
 795                   is reached. Using the variable framerate control above 200
 796                   is better then playing around with both clockdiv + partial
 797                   frame exposure times (like we are doing with the ov chips),
 798                   as that sometimes leads to jumps in the exposure control,
 799                   which are bad for auto exposure. */
 800                if (gspca_dev->exposure->val < 200) {
 801                        i2cpexpo[3] = 255 - (gspca_dev->exposure->val * 255)
 802                                                / 200;
 803                        framerate_ctrl = 500;
 804                } else {
 805                        /* The PAS202's exposure control goes from 0 - 4095,
 806                           but anything below 500 causes vsync issues, so scale
 807                           our 200-1023 to 500-4095 */
 808                        framerate_ctrl = (gspca_dev->exposure->val - 200)
 809                                                        * 1000 / 229 +  500;
 810                }
 811
 812                i2cpframerate[3] = framerate_ctrl >> 6;
 813                i2cpframerate[4] = framerate_ctrl & 0x3f;
 814                i2c_w(gspca_dev, i2cpframerate);
 815                i2c_w(gspca_dev, i2cpexpo);
 816                i2c_w(gspca_dev, i2cpdoit);
 817                break;
 818        }
 819        case SENSOR_PAS106: {
 820                __u8 i2cpframerate[] =
 821                        {0xb1, 0x40, 0x03, 0x00, 0x00, 0x00, 0x00, 0x14};
 822                __u8 i2cpexpo[] =
 823                        {0xa1, 0x40, 0x05, 0x00, 0x00, 0x00, 0x00, 0x14};
 824                const __u8 i2cpdoit[] =
 825                        {0xa1, 0x40, 0x13, 0x01, 0x00, 0x00, 0x00, 0x14};
 826                int framerate_ctrl;
 827
 828                /* For values below 150 use partial frame exposure, above
 829                   that use framerate ctrl */
 830                if (gspca_dev->exposure->val < 150) {
 831                        i2cpexpo[3] = 150 - gspca_dev->exposure->val;
 832                        framerate_ctrl = 300;
 833                } else {
 834                        /* The PAS106's exposure control goes from 0 - 4095,
 835                           but anything below 300 causes vsync issues, so scale
 836                           our 150-1023 to 300-4095 */
 837                        framerate_ctrl = (gspca_dev->exposure->val - 150)
 838                                                * 1000 / 230 + 300;
 839                }
 840
 841                i2cpframerate[3] = framerate_ctrl >> 4;
 842                i2cpframerate[4] = framerate_ctrl & 0x0f;
 843                i2c_w(gspca_dev, i2cpframerate);
 844                i2c_w(gspca_dev, i2cpexpo);
 845                i2c_w(gspca_dev, i2cpdoit);
 846                break;
 847        }
 848        default:
 849                break;
 850        }
 851}
 852
 853static void setfreq(struct gspca_dev *gspca_dev)
 854{
 855        struct sd *sd = (struct sd *) gspca_dev;
 856
 857        if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630) {
 858                /* Framerate adjust register for artificial light 50 hz flicker
 859                   compensation, for the ov6650 this is identical to ov6630
 860                   0x2b register, see ov6630 datasheet.
 861                   0x4f / 0x8a -> (30 fps -> 25 fps), 0x00 -> no adjustment */
 862                __u8 i2c[] = {0xa0, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x10};
 863                switch (sd->plfreq->val) {
 864                default:
 865/*              case 0:                  * no filter*/
 866/*              case 2:                  * 60 hz */
 867                        i2c[3] = 0;
 868                        break;
 869                case 1:                 /* 50 hz */
 870                        i2c[3] = (sd->sensor == SENSOR_OV6650)
 871                                        ? 0x4f : 0x8a;
 872                        break;
 873                }
 874                i2c[1] = sensor_data[sd->sensor].sensor_addr;
 875                i2c_w(gspca_dev, i2c);
 876        }
 877}
 878
 879static void do_autogain(struct gspca_dev *gspca_dev)
 880{
 881        struct sd *sd = (struct sd *) gspca_dev;
 882        int deadzone, desired_avg_lum, avg_lum;
 883
 884        avg_lum = atomic_read(&sd->avg_lum);
 885        if (avg_lum == -1)
 886                return;
 887
 888        if (sd->autogain_ignore_frames > 0) {
 889                sd->autogain_ignore_frames--;
 890                return;
 891        }
 892
 893        /* SIF / VGA sensors have a different autoexposure area and thus
 894           different avg_lum values for the same picture brightness */
 895        if (sensor_data[sd->sensor].flags & F_SIF) {
 896                deadzone = 500;
 897                /* SIF sensors tend to overexpose, so keep this small */
 898                desired_avg_lum = 5000;
 899        } else {
 900                deadzone = 1500;
 901                desired_avg_lum = 13000;
 902        }
 903
 904        if (sd->brightness)
 905                desired_avg_lum = sd->brightness->val * desired_avg_lum / 127;
 906
 907        if (gspca_dev->exposure->maximum < 500) {
 908                if (gspca_coarse_grained_expo_autogain(gspca_dev, avg_lum,
 909                                desired_avg_lum, deadzone))
 910                        sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
 911        } else {
 912                int gain_knee = (s32)gspca_dev->gain->maximum * 9 / 10;
 913                if (gspca_expo_autogain(gspca_dev, avg_lum, desired_avg_lum,
 914                                deadzone, gain_knee, sd->exposure_knee))
 915                        sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
 916        }
 917}
 918
 919/* this function is called at probe time */
 920static int sd_config(struct gspca_dev *gspca_dev,
 921                        const struct usb_device_id *id)
 922{
 923        struct sd *sd = (struct sd *) gspca_dev;
 924        struct cam *cam;
 925
 926        reg_r(gspca_dev, 0x00);
 927        if (gspca_dev->usb_buf[0] != 0x10)
 928                return -ENODEV;
 929
 930        /* copy the webcam info from the device id */
 931        sd->sensor = id->driver_info >> 8;
 932        sd->bridge = id->driver_info & 0xff;
 933
 934        cam = &gspca_dev->cam;
 935        if (!(sensor_data[sd->sensor].flags & F_SIF)) {
 936                cam->cam_mode = vga_mode;
 937                cam->nmodes = ARRAY_SIZE(vga_mode);
 938        } else {
 939                cam->cam_mode = sif_mode;
 940                cam->nmodes = ARRAY_SIZE(sif_mode);
 941        }
 942        cam->npkt = 36;                 /* 36 packets per ISOC message */
 943
 944        return 0;
 945}
 946
 947/* this function is called at probe and resume time */
 948static int sd_init(struct gspca_dev *gspca_dev)
 949{
 950        const __u8 stop = 0x09; /* Disable stream turn of LED */
 951
 952        reg_w(gspca_dev, 0x01, &stop, 1);
 953
 954        return gspca_dev->usb_err;
 955}
 956
 957static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 958{
 959        struct gspca_dev *gspca_dev =
 960                container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 961        struct sd *sd = (struct sd *)gspca_dev;
 962
 963        gspca_dev->usb_err = 0;
 964
 965        if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
 966                /* when switching to autogain set defaults to make sure
 967                   we are on a valid point of the autogain gain /
 968                   exposure knee graph, and give this change time to
 969                   take effect before doing autogain. */
 970                gspca_dev->gain->val = gspca_dev->gain->default_value;
 971                gspca_dev->exposure->val = gspca_dev->exposure->default_value;
 972                sd->autogain_ignore_frames = AUTOGAIN_IGNORE_FRAMES;
 973        }
 974
 975        if (!gspca_dev->streaming)
 976                return 0;
 977
 978        switch (ctrl->id) {
 979        case V4L2_CID_BRIGHTNESS:
 980                setbrightness(gspca_dev);
 981                break;
 982        case V4L2_CID_AUTOGAIN:
 983                if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
 984                        setexposure(gspca_dev);
 985                if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
 986                        setgain(gspca_dev);
 987                break;
 988        case V4L2_CID_POWER_LINE_FREQUENCY:
 989                setfreq(gspca_dev);
 990                break;
 991        default:
 992                return -EINVAL;
 993        }
 994        return gspca_dev->usb_err;
 995}
 996
 997static const struct v4l2_ctrl_ops sd_ctrl_ops = {
 998        .s_ctrl = sd_s_ctrl,
 999};
1000
1001/* this function is called at probe time */
1002static int sd_init_controls(struct gspca_dev *gspca_dev)
1003{
1004        struct sd *sd = (struct sd *) gspca_dev;
1005        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
1006
1007        gspca_dev->vdev.ctrl_handler = hdl;
1008        v4l2_ctrl_handler_init(hdl, 5);
1009
1010        if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630 ||
1011            sd->sensor == SENSOR_PAS106 || sd->sensor == SENSOR_PAS202)
1012                sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1013                                        V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1014
1015        /* Gain range is sensor dependent */
1016        switch (sd->sensor) {
1017        case SENSOR_OV6650:
1018        case SENSOR_PAS106:
1019        case SENSOR_PAS202:
1020                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1021                                        V4L2_CID_GAIN, 0, 31, 1, 15);
1022                break;
1023        case SENSOR_OV7630:
1024                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1025                                        V4L2_CID_GAIN, 0, 47, 1, 31);
1026                break;
1027        case SENSOR_HV7131D:
1028                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1029                                        V4L2_CID_GAIN, 0, 63, 1, 31);
1030                break;
1031        case SENSOR_TAS5110C:
1032        case SENSOR_TAS5110D:
1033        case SENSOR_TAS5130CXX:
1034                gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1035                                        V4L2_CID_GAIN, 0, 255, 1, 127);
1036                break;
1037        default:
1038                if (sd->bridge == BRIDGE_103) {
1039                        gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1040                                                V4L2_CID_GAIN, 0, 127, 1, 63);
1041                } else {
1042                        gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1043                                                V4L2_CID_GAIN, 0, 15, 1, 7);
1044                }
1045        }
1046
1047        /* Exposure range is sensor dependent, and not all have exposure */
1048        switch (sd->sensor) {
1049        case SENSOR_HV7131D:
1050                gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1051                                        V4L2_CID_EXPOSURE, 0, 8191, 1, 482);
1052                sd->exposure_knee = 964;
1053                break;
1054        case SENSOR_OV6650:
1055        case SENSOR_OV7630:
1056        case SENSOR_PAS106:
1057        case SENSOR_PAS202:
1058                gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1059                                        V4L2_CID_EXPOSURE, 0, 1023, 1, 66);
1060                sd->exposure_knee = 200;
1061                break;
1062        case SENSOR_TAS5110C:
1063        case SENSOR_TAS5110D:
1064                gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1065                                        V4L2_CID_EXPOSURE, 2, 15, 1, 2);
1066                break;
1067        }
1068
1069        if (gspca_dev->exposure) {
1070                gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1071                                                V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
1072        }
1073
1074        if (sd->sensor == SENSOR_OV6650 || sd->sensor == SENSOR_OV7630)
1075                sd->plfreq = v4l2_ctrl_new_std_menu(hdl, &sd_ctrl_ops,
1076                        V4L2_CID_POWER_LINE_FREQUENCY,
1077                        V4L2_CID_POWER_LINE_FREQUENCY_60HZ, 0,
1078                        V4L2_CID_POWER_LINE_FREQUENCY_DISABLED);
1079
1080        if (hdl->error) {
1081                pr_err("Could not initialize controls\n");
1082                return hdl->error;
1083        }
1084
1085        if (gspca_dev->autogain)
1086                v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
1087
1088        return 0;
1089}
1090
1091/* -- start the camera -- */
1092static int sd_start(struct gspca_dev *gspca_dev)
1093{
1094        struct sd *sd = (struct sd *) gspca_dev;
1095        struct cam *cam = &gspca_dev->cam;
1096        int i, mode;
1097        __u8 regs[0x31];
1098
1099        mode = cam->cam_mode[gspca_dev->curr_mode].priv & 0x07;
1100        /* Copy registers 0x01 - 0x19 from the template */
1101        memcpy(&regs[0x01], sensor_data[sd->sensor].bridge_init, 0x19);
1102        /* Set the mode */
1103        regs[0x18] |= mode << 4;
1104
1105        /* Set bridge gain to 1.0 */
1106        if (sd->bridge == BRIDGE_103) {
1107                regs[0x05] = 0x20; /* Red */
1108                regs[0x06] = 0x20; /* Green */
1109                regs[0x07] = 0x20; /* Blue */
1110        } else {
1111                regs[0x10] = 0x00; /* Red and blue */
1112                regs[0x11] = 0x00; /* Green */
1113        }
1114
1115        /* Setup pixel numbers and auto exposure window */
1116        if (sensor_data[sd->sensor].flags & F_SIF) {
1117                regs[0x1a] = 0x14; /* HO_SIZE 640, makes no sense */
1118                regs[0x1b] = 0x0a; /* VO_SIZE 320, makes no sense */
1119                regs[0x1c] = 0x02; /* AE H-start 64 */
1120                regs[0x1d] = 0x02; /* AE V-start 64 */
1121                regs[0x1e] = 0x09; /* AE H-end 288 */
1122                regs[0x1f] = 0x07; /* AE V-end 224 */
1123        } else {
1124                regs[0x1a] = 0x1d; /* HO_SIZE 960, makes no sense */
1125                regs[0x1b] = 0x10; /* VO_SIZE 512, makes no sense */
1126                regs[0x1c] = 0x05; /* AE H-start 160 */
1127                regs[0x1d] = 0x03; /* AE V-start 96 */
1128                regs[0x1e] = 0x0f; /* AE H-end 480 */
1129                regs[0x1f] = 0x0c; /* AE V-end 384 */
1130        }
1131
1132        /* Setup the gamma table (only used with the sn9c103 bridge) */
1133        for (i = 0; i < 16; i++)
1134                regs[0x20 + i] = i * 16;
1135        regs[0x20 + i] = 255;
1136
1137        /* Special cases where some regs depend on mode or bridge */
1138        switch (sd->sensor) {
1139        case SENSOR_TAS5130CXX:
1140                /* FIXME / TESTME
1141                   probably not mode specific at all most likely the upper
1142                   nibble of 0x19 is exposure (clock divider) just as with
1143                   the tas5110, we need someone to test this. */
1144                regs[0x19] = mode ? 0x23 : 0x43;
1145                break;
1146        case SENSOR_OV7630:
1147                /* FIXME / TESTME for some reason with the 101/102 bridge the
1148                   clock is set to 12 Mhz (reg1 == 0x04), rather then 24.
1149                   Also the hstart needs to go from 1 to 2 when using a 103,
1150                   which is likely related. This does not seem right. */
1151                if (sd->bridge == BRIDGE_103) {
1152                        regs[0x01] = 0x44; /* Select 24 Mhz clock */
1153                        regs[0x12] = 0x02; /* Set hstart to 2 */
1154                }
1155                break;
1156        case SENSOR_PAS202:
1157                /* For some unknown reason we need to increase hstart by 1 on
1158                   the sn9c103, otherwise we get wrong colors (bayer shift). */
1159                if (sd->bridge == BRIDGE_103)
1160                        regs[0x12] += 1;
1161                break;
1162        }
1163        /* Disable compression when the raw bayer format has been selected */
1164        if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW)
1165                regs[0x18] &= ~0x80;
1166
1167        /* Vga mode emulation on SIF sensor? */
1168        if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_REDUCED_SIF) {
1169                regs[0x12] += 16;       /* hstart adjust */
1170                regs[0x13] += 24;       /* vstart adjust */
1171                regs[0x15]  = 320 / 16; /* hsize */
1172                regs[0x16]  = 240 / 16; /* vsize */
1173        }
1174
1175        /* reg 0x01 bit 2 video transfert on */
1176        reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1177        /* reg 0x17 SensorClk enable inv Clk 0x60 */
1178        reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1179        /* Set the registers from the template */
1180        reg_w(gspca_dev, 0x01, &regs[0x01],
1181              (sd->bridge == BRIDGE_103) ? 0x30 : 0x1f);
1182
1183        /* Init the sensor */
1184        i2c_w_vector(gspca_dev, sensor_data[sd->sensor].sensor_init,
1185                        sensor_data[sd->sensor].sensor_init_size);
1186
1187        /* Mode / bridge specific sensor setup */
1188        switch (sd->sensor) {
1189        case SENSOR_PAS202: {
1190                const __u8 i2cpclockdiv[] =
1191                        {0xa0, 0x40, 0x02, 0x03, 0x00, 0x00, 0x00, 0x10};
1192                /* clockdiv from 4 to 3 (7.5 -> 10 fps) when in low res mode */
1193                if (mode)
1194                        i2c_w(gspca_dev, i2cpclockdiv);
1195                break;
1196            }
1197        case SENSOR_OV7630:
1198                /* FIXME / TESTME We should be able to handle this identical
1199                   for the 101/102 and the 103 case */
1200                if (sd->bridge == BRIDGE_103) {
1201                        const __u8 i2c[] = { 0xa0, 0x21, 0x13,
1202                                             0x80, 0x00, 0x00, 0x00, 0x10 };
1203                        i2c_w(gspca_dev, i2c);
1204                }
1205                break;
1206        }
1207        /* H_size V_size 0x28, 0x1e -> 640x480. 0x16, 0x12 -> 352x288 */
1208        reg_w(gspca_dev, 0x15, &regs[0x15], 2);
1209        /* compression register */
1210        reg_w(gspca_dev, 0x18, &regs[0x18], 1);
1211        /* H_start */
1212        reg_w(gspca_dev, 0x12, &regs[0x12], 1);
1213        /* V_START */
1214        reg_w(gspca_dev, 0x13, &regs[0x13], 1);
1215        /* reset 0x17 SensorClk enable inv Clk 0x60 */
1216                                /*fixme: ov7630 [17]=68 8f (+20 if 102)*/
1217        reg_w(gspca_dev, 0x17, &regs[0x17], 1);
1218        /*MCKSIZE ->3 */        /*fixme: not ov7630*/
1219        reg_w(gspca_dev, 0x19, &regs[0x19], 1);
1220        /* AE_STRX AE_STRY AE_ENDX AE_ENDY */
1221        reg_w(gspca_dev, 0x1c, &regs[0x1c], 4);
1222        /* Enable video transfert */
1223        reg_w(gspca_dev, 0x01, &regs[0x01], 1);
1224        /* Compression */
1225        reg_w(gspca_dev, 0x18, &regs[0x18], 2);
1226        msleep(20);
1227
1228        sd->reg11 = -1;
1229
1230        setgain(gspca_dev);
1231        setbrightness(gspca_dev);
1232        setexposure(gspca_dev);
1233        setfreq(gspca_dev);
1234
1235        sd->frames_to_drop = 0;
1236        sd->autogain_ignore_frames = 0;
1237        gspca_dev->exp_too_high_cnt = 0;
1238        gspca_dev->exp_too_low_cnt = 0;
1239        atomic_set(&sd->avg_lum, -1);
1240        return gspca_dev->usb_err;
1241}
1242
1243static void sd_stopN(struct gspca_dev *gspca_dev)
1244{
1245        sd_init(gspca_dev);
1246}
1247
1248static u8* find_sof(struct gspca_dev *gspca_dev, u8 *data, int len)
1249{
1250        struct sd *sd = (struct sd *) gspca_dev;
1251        int i, header_size = (sd->bridge == BRIDGE_103) ? 18 : 12;
1252
1253        /* frames start with:
1254         *      ff ff 00 c4 c4 96       synchro
1255         *      00              (unknown)
1256         *      xx              (frame sequence / size / compression)
1257         *      (xx)            (idem - extra byte for sn9c103)
1258         *      ll mm           brightness sum inside auto exposure
1259         *      ll mm           brightness sum outside auto exposure
1260         *      (xx xx xx xx xx)        audio values for snc103
1261         */
1262        for (i = 0; i < len; i++) {
1263                switch (sd->header_read) {
1264                case 0:
1265                        if (data[i] == 0xff)
1266                                sd->header_read++;
1267                        break;
1268                case 1:
1269                        if (data[i] == 0xff)
1270                                sd->header_read++;
1271                        else
1272                                sd->header_read = 0;
1273                        break;
1274                case 2:
1275                        if (data[i] == 0x00)
1276                                sd->header_read++;
1277                        else if (data[i] != 0xff)
1278                                sd->header_read = 0;
1279                        break;
1280                case 3:
1281                        if (data[i] == 0xc4)
1282                                sd->header_read++;
1283                        else if (data[i] == 0xff)
1284                                sd->header_read = 1;
1285                        else
1286                                sd->header_read = 0;
1287                        break;
1288                case 4:
1289                        if (data[i] == 0xc4)
1290                                sd->header_read++;
1291                        else if (data[i] == 0xff)
1292                                sd->header_read = 1;
1293                        else
1294                                sd->header_read = 0;
1295                        break;
1296                case 5:
1297                        if (data[i] == 0x96)
1298                                sd->header_read++;
1299                        else if (data[i] == 0xff)
1300                                sd->header_read = 1;
1301                        else
1302                                sd->header_read = 0;
1303                        break;
1304                default:
1305                        sd->header[sd->header_read - 6] = data[i];
1306                        sd->header_read++;
1307                        if (sd->header_read == header_size) {
1308                                sd->header_read = 0;
1309                                return data + i + 1;
1310                        }
1311                }
1312        }
1313        return NULL;
1314}
1315
1316static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1317                        u8 *data,                       /* isoc packet */
1318                        int len)                        /* iso packet length */
1319{
1320        int fr_h_sz = 0, lum_offset = 0, len_after_sof = 0;
1321        struct sd *sd = (struct sd *) gspca_dev;
1322        struct cam *cam = &gspca_dev->cam;
1323        u8 *sof;
1324
1325        sof = find_sof(gspca_dev, data, len);
1326        if (sof) {
1327                if (sd->bridge == BRIDGE_103) {
1328                        fr_h_sz = 18;
1329                        lum_offset = 3;
1330                } else {
1331                        fr_h_sz = 12;
1332                        lum_offset = 2;
1333                }
1334
1335                len_after_sof = len - (sof - data);
1336                len = (sof - data) - fr_h_sz;
1337                if (len < 0)
1338                        len = 0;
1339        }
1340
1341        if (cam->cam_mode[gspca_dev->curr_mode].priv & MODE_RAW) {
1342                /* In raw mode we sometimes get some garbage after the frame
1343                   ignore this */
1344                int used;
1345                int size = cam->cam_mode[gspca_dev->curr_mode].sizeimage;
1346
1347                used = gspca_dev->image_len;
1348                if (used + len > size)
1349                        len = size - used;
1350        }
1351
1352        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1353
1354        if (sof) {
1355                int  lum = sd->header[lum_offset] +
1356                          (sd->header[lum_offset + 1] << 8);
1357
1358                /* When exposure changes midway a frame we
1359                   get a lum of 0 in this case drop 2 frames
1360                   as the frames directly after an exposure
1361                   change have an unstable image. Sometimes lum
1362                   *really* is 0 (cam used in low light with
1363                   low exposure setting), so do not drop frames
1364                   if the previous lum was 0 too. */
1365                if (lum == 0 && sd->prev_avg_lum != 0) {
1366                        lum = -1;
1367                        sd->frames_to_drop = 2;
1368                        sd->prev_avg_lum = 0;
1369                } else
1370                        sd->prev_avg_lum = lum;
1371                atomic_set(&sd->avg_lum, lum);
1372
1373                if (sd->frames_to_drop)
1374                        sd->frames_to_drop--;
1375                else
1376                        gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
1377
1378                gspca_frame_add(gspca_dev, FIRST_PACKET, sof, len_after_sof);
1379        }
1380}
1381
1382#if IS_ENABLED(CONFIG_INPUT)
1383static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
1384                        u8 *data,               /* interrupt packet data */
1385                        int len)                /* interrupt packet length */
1386{
1387        int ret = -EINVAL;
1388
1389        if (len == 1 && data[0] == 1) {
1390                input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
1391                input_sync(gspca_dev->input_dev);
1392                input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
1393                input_sync(gspca_dev->input_dev);
1394                ret = 0;
1395        }
1396
1397        return ret;
1398}
1399#endif
1400
1401/* sub-driver description */
1402static const struct sd_desc sd_desc = {
1403        .name = MODULE_NAME,
1404        .config = sd_config,
1405        .init = sd_init,
1406        .init_controls = sd_init_controls,
1407        .start = sd_start,
1408        .stopN = sd_stopN,
1409        .pkt_scan = sd_pkt_scan,
1410        .dq_callback = do_autogain,
1411#if IS_ENABLED(CONFIG_INPUT)
1412        .int_pkt_scan = sd_int_pkt_scan,
1413#endif
1414};
1415
1416/* -- module initialisation -- */
1417#define SB(sensor, bridge) \
1418        .driver_info = (SENSOR_ ## sensor << 8) | BRIDGE_ ## bridge
1419
1420
1421static const struct usb_device_id device_table[] = {
1422        {USB_DEVICE(0x0c45, 0x6001), SB(TAS5110C, 102)}, /* TAS5110C1B */
1423        {USB_DEVICE(0x0c45, 0x6005), SB(TAS5110C, 101)}, /* TAS5110C1B */
1424        {USB_DEVICE(0x0c45, 0x6007), SB(TAS5110D, 101)}, /* TAS5110D */
1425        {USB_DEVICE(0x0c45, 0x6009), SB(PAS106, 101)},
1426        {USB_DEVICE(0x0c45, 0x600d), SB(PAS106, 101)},
1427        {USB_DEVICE(0x0c45, 0x6011), SB(OV6650, 101)},
1428        {USB_DEVICE(0x0c45, 0x6019), SB(OV7630, 101)},
1429        {USB_DEVICE(0x0c45, 0x6024), SB(TAS5130CXX, 102)},
1430        {USB_DEVICE(0x0c45, 0x6025), SB(TAS5130CXX, 102)},
1431        {USB_DEVICE(0x0c45, 0x6027), SB(OV7630, 101)}, /* Genius Eye 310 */
1432        {USB_DEVICE(0x0c45, 0x6028), SB(PAS202, 102)},
1433        {USB_DEVICE(0x0c45, 0x6029), SB(PAS106, 102)},
1434        {USB_DEVICE(0x0c45, 0x602a), SB(HV7131D, 102)},
1435        /* {USB_DEVICE(0x0c45, 0x602b), SB(MI0343, 102)}, */
1436        {USB_DEVICE(0x0c45, 0x602c), SB(OV7630, 102)},
1437        {USB_DEVICE(0x0c45, 0x602d), SB(HV7131R, 102)},
1438        {USB_DEVICE(0x0c45, 0x602e), SB(OV7630, 102)},
1439        /* {USB_DEVICE(0x0c45, 0x6030), SB(MI03XX, 102)}, */ /* MI0343 MI0360 MI0330 */
1440        /* {USB_DEVICE(0x0c45, 0x6082), SB(MI03XX, 103)}, */ /* MI0343 MI0360 */
1441        {USB_DEVICE(0x0c45, 0x6083), SB(HV7131D, 103)},
1442        {USB_DEVICE(0x0c45, 0x608c), SB(HV7131R, 103)},
1443        /* {USB_DEVICE(0x0c45, 0x608e), SB(CISVF10, 103)}, */
1444        {USB_DEVICE(0x0c45, 0x608f), SB(OV7630, 103)},
1445        {USB_DEVICE(0x0c45, 0x60a8), SB(PAS106, 103)},
1446        {USB_DEVICE(0x0c45, 0x60aa), SB(TAS5130CXX, 103)},
1447        {USB_DEVICE(0x0c45, 0x60af), SB(PAS202, 103)},
1448        {USB_DEVICE(0x0c45, 0x60b0), SB(OV7630, 103)},
1449        {}
1450};
1451MODULE_DEVICE_TABLE(usb, device_table);
1452
1453/* -- device connect -- */
1454static int sd_probe(struct usb_interface *intf,
1455                        const struct usb_device_id *id)
1456{
1457        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1458                                THIS_MODULE);
1459}
1460
1461static struct usb_driver sd_driver = {
1462        .name = MODULE_NAME,
1463        .id_table = device_table,
1464        .probe = sd_probe,
1465        .disconnect = gspca_disconnect,
1466#ifdef CONFIG_PM
1467        .suspend = gspca_suspend,
1468        .resume = gspca_resume,
1469        .reset_resume = gspca_resume,
1470#endif
1471};
1472
1473module_usb_driver(sd_driver);
1474