linux/drivers/media/usb/gspca/pac7302.c
<<
>>
Prefs
   1/*
   2 * Pixart PAC7302 driver
   3 *
   4 * Copyright (C) 2008-2012 Jean-Francois Moine <http://moinejf.free.fr>
   5 * Copyright (C) 2005 Thomas Kaiser thomas@kaiser-linux.li
   6 *
   7 * Separated from Pixart PAC7311 library by Márton Németh
   8 * Camera button input handling by Márton Németh <nm127@freemail.hu>
   9 * Copyright (C) 2009-2010 Márton Németh <nm127@freemail.hu>
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19 * GNU General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  24 */
  25
  26/*
  27 * Some documentation about various registers as determined by trial and error.
  28 *
  29 * Register page 0:
  30 *
  31 * Address      Description
  32 * 0x01         Red balance control
  33 * 0x02         Green balance control
  34 * 0x03         Blue balance control
  35 *                   The Windows driver uses a quadratic approach to map
  36 *                   the settable values (0-200) on register values:
  37 *                   min=0x20, default=0x40, max=0x80
  38 * 0x0f-0x20    Color and saturation control
  39 * 0xa2-0xab    Brightness, contrast and gamma control
  40 * 0xb6         Sharpness control (bits 0-4)
  41 *
  42 * Register page 1:
  43 *
  44 * Address      Description
  45 * 0x78         Global control, bit 6 controls the LED (inverted)
  46 * 0x80         Compression balance, 2 interesting settings:
  47 *              0x0f Default
  48 *              0x50 Values >= this switch the camera to a lower compression,
  49 *                   using the same table for both luminance and chrominance.
  50 *                   This gives a sharper picture. Only usable when running
  51 *                   at < 15 fps! Note currently the driver does not use this
  52 *                   as the quality gain is small and the generated JPG-s are
  53 *                   only understood by v4l-utils >= 0.8.9
  54 *
  55 * Register page 3:
  56 *
  57 * Address      Description
  58 * 0x02         Clock divider 3-63, fps = 90 / val. Must be a multiple of 3 on
  59 *              the 7302, so one of 3, 6, 9, ..., except when between 6 and 12?
  60 * 0x03         Variable framerate ctrl reg2==3: 0 -> ~30 fps, 255 -> ~22fps
  61 * 0x04         Another var framerate ctrl reg2==3, reg3==0: 0 -> ~30 fps,
  62 *              63 -> ~27 fps, the 2 msb's must always be 1 !!
  63 * 0x05         Another var framerate ctrl reg2==3, reg3==0, reg4==0xc0:
  64 *              1 -> ~30 fps, 2 -> ~20 fps
  65 * 0x0e         Exposure bits 0-7, 0-448, 0 = use full frame time
  66 * 0x0f         Exposure bit 8, 0-448, 448 = no exposure at all
  67 * 0x10         Gain 0-31
  68 * 0x12         Another gain 0-31, unlike 0x10 this one seems to start with an
  69 *              amplification value of 1 rather then 0 at its lowest setting
  70 * 0x21         Bitfield: 0-1 unused, 2-3 vflip/hflip, 4-5 unknown, 6-7 unused
  71 * 0x80         Another framerate control, best left at 1, moving it from 1 to
  72 *              2 causes the framerate to become 3/4th of what it was, and
  73 *              also seems to cause pixel averaging, resulting in an effective
  74 *              resolution of 320x240 and thus a much blockier image
  75 *
  76 * The registers are accessed in the following functions:
  77 *
  78 * Page | Register   | Function
  79 * -----+------------+---------------------------------------------------
  80 *  0   | 0x01       | setredbalance()
  81 *  0   | 0x03       | setbluebalance()
  82 *  0   | 0x0f..0x20 | setcolors()
  83 *  0   | 0xa2..0xab | setbrightcont()
  84 *  0   | 0xb6       | setsharpness()
  85 *  0   | 0xc6       | setwhitebalance()
  86 *  0   | 0xdc       | setbrightcont(), setcolors()
  87 *  3   | 0x02       | setexposure()
  88 *  3   | 0x10, 0x12 | setgain()
  89 *  3   | 0x11       | setcolors(), setgain(), setexposure(), sethvflip()
  90 *  3   | 0x21       | sethvflip()
  91 */
  92
  93#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  94
  95#include <linux/input.h>
  96#include "gspca.h"
  97/* Include pac common sof detection functions */
  98#include "pac_common.h"
  99
 100#define PAC7302_RGB_BALANCE_MIN           0
 101#define PAC7302_RGB_BALANCE_MAX         200
 102#define PAC7302_RGB_BALANCE_DEFAULT     100
 103#define PAC7302_GAIN_DEFAULT             15
 104#define PAC7302_GAIN_KNEE                42
 105#define PAC7302_EXPOSURE_DEFAULT         66 /* 33 ms / 30 fps */
 106#define PAC7302_EXPOSURE_KNEE           133 /* 66 ms / 15 fps */
 107
 108MODULE_AUTHOR("Jean-Francois Moine <http://moinejf.free.fr>, "
 109                "Thomas Kaiser thomas@kaiser-linux.li");
 110MODULE_DESCRIPTION("Pixart PAC7302");
 111MODULE_LICENSE("GPL");
 112
 113struct sd {
 114        struct gspca_dev gspca_dev;             /* !! must be the first item */
 115
 116        struct { /* brightness / contrast cluster */
 117                struct v4l2_ctrl *brightness;
 118                struct v4l2_ctrl *contrast;
 119        };
 120        struct v4l2_ctrl *saturation;
 121        struct v4l2_ctrl *white_balance;
 122        struct v4l2_ctrl *red_balance;
 123        struct v4l2_ctrl *blue_balance;
 124        struct { /* flip cluster */
 125                struct v4l2_ctrl *hflip;
 126                struct v4l2_ctrl *vflip;
 127        };
 128        struct v4l2_ctrl *sharpness;
 129        u8 flags;
 130#define FL_HFLIP 0x01           /* mirrored by default */
 131#define FL_VFLIP 0x02           /* vertical flipped by default */
 132
 133        u8 sof_read;
 134        s8 autogain_ignore_frames;
 135
 136        atomic_t avg_lum;
 137};
 138
 139static const struct v4l2_pix_format vga_mode[] = {
 140        {640, 480, V4L2_PIX_FMT_PJPG, V4L2_FIELD_NONE,
 141                .bytesperline = 640,
 142                .sizeimage = 640 * 480 * 3 / 8 + 590,
 143                .colorspace = V4L2_COLORSPACE_JPEG,
 144        },
 145};
 146
 147#define LOAD_PAGE3              255
 148#define END_OF_SEQUENCE         0
 149
 150static const u8 init_7302[] = {
 151/*      index,value */
 152        0xff, 0x01,             /* page 1 */
 153        0x78, 0x00,             /* deactivate */
 154        0xff, 0x01,
 155        0x78, 0x40,             /* led off */
 156};
 157static const u8 start_7302[] = {
 158/*      index, len, [value]* */
 159        0xff, 1,        0x00,           /* page 0 */
 160        0x00, 12,       0x01, 0x40, 0x40, 0x40, 0x01, 0xe0, 0x02, 0x80,
 161                        0x00, 0x00, 0x00, 0x00,
 162        0x0d, 24,       0x03, 0x01, 0x00, 0xb5, 0x07, 0xcb, 0x00, 0x00,
 163                        0x07, 0xc8, 0x00, 0xea, 0x07, 0xcf, 0x07, 0xf7,
 164                        0x07, 0x7e, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x11,
 165        0x26, 2,        0xaa, 0xaa,
 166        0x2e, 1,        0x31,
 167        0x38, 1,        0x01,
 168        0x3a, 3,        0x14, 0xff, 0x5a,
 169        0x43, 11,       0x00, 0x0a, 0x18, 0x11, 0x01, 0x2c, 0x88, 0x11,
 170                        0x00, 0x54, 0x11,
 171        0x55, 1,        0x00,
 172        0x62, 4,        0x10, 0x1e, 0x1e, 0x18,
 173        0x6b, 1,        0x00,
 174        0x6e, 3,        0x08, 0x06, 0x00,
 175        0x72, 3,        0x00, 0xff, 0x00,
 176        0x7d, 23,       0x01, 0x01, 0x58, 0x46, 0x50, 0x3c, 0x50, 0x3c,
 177                        0x54, 0x46, 0x54, 0x56, 0x52, 0x50, 0x52, 0x50,
 178                        0x56, 0x64, 0xa4, 0x00, 0xda, 0x00, 0x00,
 179        0xa2, 10,       0x22, 0x2c, 0x3c, 0x54, 0x69, 0x7c, 0x9c, 0xb9,
 180                        0xd2, 0xeb,
 181        0xaf, 1,        0x02,
 182        0xb5, 2,        0x08, 0x08,
 183        0xb8, 2,        0x08, 0x88,
 184        0xc4, 4,        0xae, 0x01, 0x04, 0x01,
 185        0xcc, 1,        0x00,
 186        0xd1, 11,       0x01, 0x30, 0x49, 0x5e, 0x6f, 0x7f, 0x8e, 0xa9,
 187                        0xc1, 0xd7, 0xec,
 188        0xdc, 1,        0x01,
 189        0xff, 1,        0x01,           /* page 1 */
 190        0x12, 3,        0x02, 0x00, 0x01,
 191        0x3e, 2,        0x00, 0x00,
 192        0x76, 5,        0x01, 0x20, 0x40, 0x00, 0xf2,
 193        0x7c, 1,        0x00,
 194        0x7f, 10,       0x4b, 0x0f, 0x01, 0x2c, 0x02, 0x58, 0x03, 0x20,
 195                        0x02, 0x00,
 196        0x96, 5,        0x01, 0x10, 0x04, 0x01, 0x04,
 197        0xc8, 14,       0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
 198                        0x07, 0x00, 0x01, 0x07, 0x04, 0x01,
 199        0xd8, 1,        0x01,
 200        0xdb, 2,        0x00, 0x01,
 201        0xde, 7,        0x00, 0x01, 0x04, 0x04, 0x00, 0x00, 0x00,
 202        0xe6, 4,        0x00, 0x00, 0x00, 0x01,
 203        0xeb, 1,        0x00,
 204        0xff, 1,        0x02,           /* page 2 */
 205        0x22, 1,        0x00,
 206        0xff, 1,        0x03,           /* page 3 */
 207        0, LOAD_PAGE3,                  /* load the page 3 */
 208        0x11, 1,        0x01,
 209        0xff, 1,        0x02,           /* page 2 */
 210        0x13, 1,        0x00,
 211        0x22, 4,        0x1f, 0xa4, 0xf0, 0x96,
 212        0x27, 2,        0x14, 0x0c,
 213        0x2a, 5,        0xc8, 0x00, 0x18, 0x12, 0x22,
 214        0x64, 8,        0x00, 0x00, 0xf0, 0x01, 0x14, 0x44, 0x44, 0x44,
 215        0x6e, 1,        0x08,
 216        0xff, 1,        0x01,           /* page 1 */
 217        0x78, 1,        0x00,
 218        0, END_OF_SEQUENCE              /* end of sequence */
 219};
 220
 221#define SKIP            0xaa
 222/* page 3 - the value SKIP says skip the index - see reg_w_page() */
 223static const u8 page3_7302[] = {
 224        0x90, 0x40, 0x03, 0x00, 0xc0, 0x01, 0x14, 0x16,
 225        0x14, 0x12, 0x00, 0x00, 0x00, 0x02, 0x33, 0x00,
 226        0x0f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 227        0x00, 0x00, 0x00, 0x47, 0x01, 0xb3, 0x01, 0x00,
 228        0x00, 0x08, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x21,
 229        0x00, 0x00, 0x00, 0x54, 0xf4, 0x02, 0x52, 0x54,
 230        0xa4, 0xb8, 0xe0, 0x2a, 0xf6, 0x00, 0x00, 0x00,
 231        0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 232        0x00, 0xfc, 0x00, 0xf2, 0x1f, 0x04, 0x00, 0x00,
 233        SKIP, 0x00, 0x00, 0xc0, 0xc0, 0x10, 0x00, 0x00,
 234        0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 235        0x00, 0x40, 0xff, 0x03, 0x19, 0x00, 0x00, 0x00,
 236        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 237        0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xc8, 0xc8,
 238        0xc8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50,
 239        0x08, 0x10, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00,
 240        0x01, 0x00, 0x02, 0x47, 0x00, 0x00, 0x00, 0x00,
 241        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 242        0x00, 0x02, 0xfa, 0x00, 0x64, 0x5a, 0x28, 0x00,
 243        0x00
 244};
 245
 246static void reg_w_buf(struct gspca_dev *gspca_dev,
 247                u8 index,
 248                  const u8 *buffer, int len)
 249{
 250        int ret;
 251
 252        if (gspca_dev->usb_err < 0)
 253                return;
 254        memcpy(gspca_dev->usb_buf, buffer, len);
 255        ret = usb_control_msg(gspca_dev->dev,
 256                        usb_sndctrlpipe(gspca_dev->dev, 0),
 257                        0,              /* request */
 258                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 259                        0,              /* value */
 260                        index, gspca_dev->usb_buf, len,
 261                        500);
 262        if (ret < 0) {
 263                pr_err("reg_w_buf failed i: %02x error %d\n",
 264                       index, ret);
 265                gspca_dev->usb_err = ret;
 266        }
 267}
 268
 269
 270static void reg_w(struct gspca_dev *gspca_dev,
 271                u8 index,
 272                u8 value)
 273{
 274        int ret;
 275
 276        if (gspca_dev->usb_err < 0)
 277                return;
 278        gspca_dev->usb_buf[0] = value;
 279        ret = usb_control_msg(gspca_dev->dev,
 280                        usb_sndctrlpipe(gspca_dev->dev, 0),
 281                        0,                      /* request */
 282                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 283                        0, index, gspca_dev->usb_buf, 1,
 284                        500);
 285        if (ret < 0) {
 286                pr_err("reg_w() failed i: %02x v: %02x error %d\n",
 287                       index, value, ret);
 288                gspca_dev->usb_err = ret;
 289        }
 290}
 291
 292static void reg_w_seq(struct gspca_dev *gspca_dev,
 293                const u8 *seq, int len)
 294{
 295        while (--len >= 0) {
 296                reg_w(gspca_dev, seq[0], seq[1]);
 297                seq += 2;
 298        }
 299}
 300
 301/* load the beginning of a page */
 302static void reg_w_page(struct gspca_dev *gspca_dev,
 303                        const u8 *page, int len)
 304{
 305        int index;
 306        int ret = 0;
 307
 308        if (gspca_dev->usb_err < 0)
 309                return;
 310        for (index = 0; index < len; index++) {
 311                if (page[index] == SKIP)                /* skip this index */
 312                        continue;
 313                gspca_dev->usb_buf[0] = page[index];
 314                ret = usb_control_msg(gspca_dev->dev,
 315                                usb_sndctrlpipe(gspca_dev->dev, 0),
 316                                0,                      /* request */
 317                        USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
 318                                0, index, gspca_dev->usb_buf, 1,
 319                                500);
 320                if (ret < 0) {
 321                        pr_err("reg_w_page() failed i: %02x v: %02x error %d\n",
 322                               index, page[index], ret);
 323                        gspca_dev->usb_err = ret;
 324                        break;
 325                }
 326        }
 327}
 328
 329/* output a variable sequence */
 330static void reg_w_var(struct gspca_dev *gspca_dev,
 331                        const u8 *seq,
 332                        const u8 *page3, unsigned int page3_len)
 333{
 334        int index, len;
 335
 336        for (;;) {
 337                index = *seq++;
 338                len = *seq++;
 339                switch (len) {
 340                case END_OF_SEQUENCE:
 341                        return;
 342                case LOAD_PAGE3:
 343                        reg_w_page(gspca_dev, page3, page3_len);
 344                        break;
 345                default:
 346                        if (len > USB_BUF_SZ) {
 347                                PERR("Incorrect variable sequence");
 348                                return;
 349                        }
 350                        while (len > 0) {
 351                                if (len < 8) {
 352                                        reg_w_buf(gspca_dev,
 353                                                index, seq, len);
 354                                        seq += len;
 355                                        break;
 356                                }
 357                                reg_w_buf(gspca_dev, index, seq, 8);
 358                                seq += 8;
 359                                index += 8;
 360                                len -= 8;
 361                        }
 362                }
 363        }
 364        /* not reached */
 365}
 366
 367/* this function is called at probe time for pac7302 */
 368static int sd_config(struct gspca_dev *gspca_dev,
 369                        const struct usb_device_id *id)
 370{
 371        struct sd *sd = (struct sd *) gspca_dev;
 372        struct cam *cam;
 373
 374        cam = &gspca_dev->cam;
 375
 376        cam->cam_mode = vga_mode;       /* only 640x480 */
 377        cam->nmodes = ARRAY_SIZE(vga_mode);
 378
 379        sd->flags = id->driver_info;
 380        return 0;
 381}
 382
 383static void setbrightcont(struct gspca_dev *gspca_dev)
 384{
 385        struct sd *sd = (struct sd *) gspca_dev;
 386        int i, v;
 387        static const u8 max[10] =
 388                {0x29, 0x33, 0x42, 0x5a, 0x6e, 0x80, 0x9f, 0xbb,
 389                 0xd4, 0xec};
 390        static const u8 delta[10] =
 391                {0x35, 0x33, 0x33, 0x2f, 0x2a, 0x25, 0x1e, 0x17,
 392                 0x11, 0x0b};
 393
 394        reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
 395        for (i = 0; i < 10; i++) {
 396                v = max[i];
 397                v += (sd->brightness->val - (s32)sd->brightness->maximum)
 398                        * 150 / (s32)sd->brightness->maximum; /* 200 ? */
 399                v -= delta[i] * sd->contrast->val / (s32)sd->contrast->maximum;
 400                if (v < 0)
 401                        v = 0;
 402                else if (v > 0xff)
 403                        v = 0xff;
 404                reg_w(gspca_dev, 0xa2 + i, v);
 405        }
 406        reg_w(gspca_dev, 0xdc, 0x01);
 407}
 408
 409static void setcolors(struct gspca_dev *gspca_dev)
 410{
 411        struct sd *sd = (struct sd *) gspca_dev;
 412        int i, v;
 413        static const int a[9] =
 414                {217, -212, 0, -101, 170, -67, -38, -315, 355};
 415        static const int b[9] =
 416                {19, 106, 0, 19, 106, 1, 19, 106, 1};
 417
 418        reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
 419        reg_w(gspca_dev, 0x11, 0x01);
 420        reg_w(gspca_dev, 0xff, 0x00);                   /* page 0 */
 421        for (i = 0; i < 9; i++) {
 422                v = a[i] * sd->saturation->val / (s32)sd->saturation->maximum;
 423                v += b[i];
 424                reg_w(gspca_dev, 0x0f + 2 * i, (v >> 8) & 0x07);
 425                reg_w(gspca_dev, 0x0f + 2 * i + 1, v);
 426        }
 427        reg_w(gspca_dev, 0xdc, 0x01);
 428}
 429
 430static void setwhitebalance(struct gspca_dev *gspca_dev)
 431{
 432        struct sd *sd = (struct sd *) gspca_dev;
 433
 434        reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
 435        reg_w(gspca_dev, 0xc6, sd->white_balance->val);
 436
 437        reg_w(gspca_dev, 0xdc, 0x01);
 438}
 439
 440static u8 rgbbalance_ctrl_to_reg_value(s32 rgb_ctrl_val)
 441{
 442        const unsigned int k = 1000;    /* precision factor */
 443        unsigned int norm;
 444
 445        /* Normed value [0...k] */
 446        norm = k * (rgb_ctrl_val - PAC7302_RGB_BALANCE_MIN)
 447                    / (PAC7302_RGB_BALANCE_MAX - PAC7302_RGB_BALANCE_MIN);
 448        /* Qudratic apporach improves control at small (register) values: */
 449        return 64 * norm * norm / (k*k)  +  32 * norm / k  +  32;
 450        /* Y = 64*X*X + 32*X + 32
 451         * => register values 0x20-0x80; Windows driver uses these limits */
 452
 453        /* NOTE: for full value range (0x00-0xff) use
 454         *         Y = 254*X*X + X
 455         *         => 254 * norm * norm / (k*k)  +  1 * norm / k        */
 456}
 457
 458static void setredbalance(struct gspca_dev *gspca_dev)
 459{
 460        struct sd *sd = (struct sd *) gspca_dev;
 461
 462        reg_w(gspca_dev, 0xff, 0x00);                   /* page 0 */
 463        reg_w(gspca_dev, 0x01,
 464              rgbbalance_ctrl_to_reg_value(sd->red_balance->val));
 465
 466        reg_w(gspca_dev, 0xdc, 0x01);
 467}
 468
 469static void setbluebalance(struct gspca_dev *gspca_dev)
 470{
 471        struct sd *sd = (struct sd *) gspca_dev;
 472
 473        reg_w(gspca_dev, 0xff, 0x00);                   /* page 0 */
 474        reg_w(gspca_dev, 0x03,
 475              rgbbalance_ctrl_to_reg_value(sd->blue_balance->val));
 476
 477        reg_w(gspca_dev, 0xdc, 0x01);
 478}
 479
 480static void setgain(struct gspca_dev *gspca_dev)
 481{
 482        u8 reg10, reg12;
 483
 484        if (gspca_dev->gain->val < 32) {
 485                reg10 = gspca_dev->gain->val;
 486                reg12 = 0;
 487        } else {
 488                reg10 = 31;
 489                reg12 = gspca_dev->gain->val - 31;
 490        }
 491
 492        reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
 493        reg_w(gspca_dev, 0x10, reg10);
 494        reg_w(gspca_dev, 0x12, reg12);
 495
 496        /* load registers to sensor (Bit 0, auto clear) */
 497        reg_w(gspca_dev, 0x11, 0x01);
 498}
 499
 500static void setexposure(struct gspca_dev *gspca_dev)
 501{
 502        u8 clockdiv;
 503        u16 exposure;
 504
 505        /*
 506         * Register 2 of frame 3 contains the clock divider configuring the
 507         * no fps according to the formula: 90 / reg. sd->exposure is the
 508         * desired exposure time in 0.5 ms.
 509         */
 510        clockdiv = (90 * gspca_dev->exposure->val + 1999) / 2000;
 511
 512        /*
 513         * Note clockdiv = 3 also works, but when running at 30 fps, depending
 514         * on the scene being recorded, the camera switches to another
 515         * quantization table for certain JPEG blocks, and we don't know how
 516         * to decompress these blocks. So we cap the framerate at 15 fps.
 517         */
 518        if (clockdiv < 6)
 519                clockdiv = 6;
 520        else if (clockdiv > 63)
 521                clockdiv = 63;
 522
 523        /*
 524         * Register 2 MUST be a multiple of 3, except when between 6 and 12?
 525         * Always round up, otherwise we cannot get the desired frametime
 526         * using the partial frame time exposure control.
 527         */
 528        if (clockdiv < 6 || clockdiv > 12)
 529                clockdiv = ((clockdiv + 2) / 3) * 3;
 530
 531        /*
 532         * frame exposure time in ms = 1000 * clockdiv / 90    ->
 533         * exposure = (sd->exposure / 2) * 448 / (1000 * clockdiv / 90)
 534         */
 535        exposure = (gspca_dev->exposure->val * 45 * 448) / (1000 * clockdiv);
 536        /* 0 = use full frametime, 448 = no exposure, reverse it */
 537        exposure = 448 - exposure;
 538
 539        reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
 540        reg_w(gspca_dev, 0x02, clockdiv);
 541        reg_w(gspca_dev, 0x0e, exposure & 0xff);
 542        reg_w(gspca_dev, 0x0f, exposure >> 8);
 543
 544        /* load registers to sensor (Bit 0, auto clear) */
 545        reg_w(gspca_dev, 0x11, 0x01);
 546}
 547
 548static void sethvflip(struct gspca_dev *gspca_dev)
 549{
 550        struct sd *sd = (struct sd *) gspca_dev;
 551        u8 data, hflip, vflip;
 552
 553        hflip = sd->hflip->val;
 554        if (sd->flags & FL_HFLIP)
 555                hflip = !hflip;
 556        vflip = sd->vflip->val;
 557        if (sd->flags & FL_VFLIP)
 558                vflip = !vflip;
 559
 560        reg_w(gspca_dev, 0xff, 0x03);                   /* page 3 */
 561        data = (hflip ? 0x08 : 0x00) | (vflip ? 0x04 : 0x00);
 562        reg_w(gspca_dev, 0x21, data);
 563
 564        /* load registers to sensor (Bit 0, auto clear) */
 565        reg_w(gspca_dev, 0x11, 0x01);
 566}
 567
 568static void setsharpness(struct gspca_dev *gspca_dev)
 569{
 570        struct sd *sd = (struct sd *) gspca_dev;
 571
 572        reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
 573        reg_w(gspca_dev, 0xb6, sd->sharpness->val);
 574
 575        reg_w(gspca_dev, 0xdc, 0x01);
 576}
 577
 578/* this function is called at probe and resume time for pac7302 */
 579static int sd_init(struct gspca_dev *gspca_dev)
 580{
 581        reg_w_seq(gspca_dev, init_7302, sizeof(init_7302)/2);
 582        return gspca_dev->usb_err;
 583}
 584
 585static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 586{
 587        struct gspca_dev *gspca_dev =
 588                container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 589        struct sd *sd = (struct sd *)gspca_dev;
 590
 591        gspca_dev->usb_err = 0;
 592
 593        if (ctrl->id == V4L2_CID_AUTOGAIN && ctrl->is_new && ctrl->val) {
 594                /* when switching to autogain set defaults to make sure
 595                   we are on a valid point of the autogain gain /
 596                   exposure knee graph, and give this change time to
 597                   take effect before doing autogain. */
 598                gspca_dev->exposure->val    = PAC7302_EXPOSURE_DEFAULT;
 599                gspca_dev->gain->val        = PAC7302_GAIN_DEFAULT;
 600                sd->autogain_ignore_frames  = PAC_AUTOGAIN_IGNORE_FRAMES;
 601        }
 602
 603        if (!gspca_dev->streaming)
 604                return 0;
 605
 606        switch (ctrl->id) {
 607        case V4L2_CID_BRIGHTNESS:
 608                setbrightcont(gspca_dev);
 609                break;
 610        case V4L2_CID_SATURATION:
 611                setcolors(gspca_dev);
 612                break;
 613        case V4L2_CID_WHITE_BALANCE_TEMPERATURE:
 614                setwhitebalance(gspca_dev);
 615                break;
 616        case V4L2_CID_RED_BALANCE:
 617                setredbalance(gspca_dev);
 618                break;
 619        case V4L2_CID_BLUE_BALANCE:
 620                setbluebalance(gspca_dev);
 621                break;
 622        case V4L2_CID_AUTOGAIN:
 623                if (gspca_dev->exposure->is_new || (ctrl->is_new && ctrl->val))
 624                        setexposure(gspca_dev);
 625                if (gspca_dev->gain->is_new || (ctrl->is_new && ctrl->val))
 626                        setgain(gspca_dev);
 627                break;
 628        case V4L2_CID_HFLIP:
 629                sethvflip(gspca_dev);
 630                break;
 631        case V4L2_CID_SHARPNESS:
 632                setsharpness(gspca_dev);
 633                break;
 634        default:
 635                return -EINVAL;
 636        }
 637        return gspca_dev->usb_err;
 638}
 639
 640static const struct v4l2_ctrl_ops sd_ctrl_ops = {
 641        .s_ctrl = sd_s_ctrl,
 642};
 643
 644/* this function is called at probe time */
 645static int sd_init_controls(struct gspca_dev *gspca_dev)
 646{
 647        struct sd *sd = (struct sd *) gspca_dev;
 648        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 649
 650        gspca_dev->vdev.ctrl_handler = hdl;
 651        v4l2_ctrl_handler_init(hdl, 12);
 652
 653        sd->brightness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 654                                        V4L2_CID_BRIGHTNESS, 0, 32, 1, 16);
 655        sd->contrast = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 656                                        V4L2_CID_CONTRAST, 0, 255, 1, 127);
 657
 658        sd->saturation = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 659                                        V4L2_CID_SATURATION, 0, 255, 1, 127);
 660        sd->white_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 661                                        V4L2_CID_WHITE_BALANCE_TEMPERATURE,
 662                                        0, 255, 1, 55);
 663        sd->red_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 664                                        V4L2_CID_RED_BALANCE,
 665                                        PAC7302_RGB_BALANCE_MIN,
 666                                        PAC7302_RGB_BALANCE_MAX,
 667                                        1, PAC7302_RGB_BALANCE_DEFAULT);
 668        sd->blue_balance = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 669                                        V4L2_CID_BLUE_BALANCE,
 670                                        PAC7302_RGB_BALANCE_MIN,
 671                                        PAC7302_RGB_BALANCE_MAX,
 672                                        1, PAC7302_RGB_BALANCE_DEFAULT);
 673
 674        gspca_dev->autogain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 675                                        V4L2_CID_AUTOGAIN, 0, 1, 1, 1);
 676        gspca_dev->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 677                                        V4L2_CID_EXPOSURE, 0, 1023, 1,
 678                                        PAC7302_EXPOSURE_DEFAULT);
 679        gspca_dev->gain = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 680                                        V4L2_CID_GAIN, 0, 62, 1,
 681                                        PAC7302_GAIN_DEFAULT);
 682
 683        sd->hflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 684                V4L2_CID_HFLIP, 0, 1, 1, 0);
 685        sd->vflip = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 686                V4L2_CID_VFLIP, 0, 1, 1, 0);
 687
 688        sd->sharpness = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 689                                        V4L2_CID_SHARPNESS, 0, 15, 1, 8);
 690
 691        if (hdl->error) {
 692                pr_err("Could not initialize controls\n");
 693                return hdl->error;
 694        }
 695
 696        v4l2_ctrl_cluster(2, &sd->brightness);
 697        v4l2_ctrl_auto_cluster(3, &gspca_dev->autogain, 0, false);
 698        v4l2_ctrl_cluster(2, &sd->hflip);
 699        return 0;
 700}
 701
 702/* -- start the camera -- */
 703static int sd_start(struct gspca_dev *gspca_dev)
 704{
 705        struct sd *sd = (struct sd *) gspca_dev;
 706
 707        reg_w_var(gspca_dev, start_7302,
 708                page3_7302, sizeof(page3_7302));
 709
 710        sd->sof_read = 0;
 711        sd->autogain_ignore_frames = 0;
 712        atomic_set(&sd->avg_lum, 270 + sd->brightness->val);
 713
 714        /* start stream */
 715        reg_w(gspca_dev, 0xff, 0x01);
 716        reg_w(gspca_dev, 0x78, 0x01);
 717
 718        return gspca_dev->usb_err;
 719}
 720
 721static void sd_stopN(struct gspca_dev *gspca_dev)
 722{
 723
 724        /* stop stream */
 725        reg_w(gspca_dev, 0xff, 0x01);
 726        reg_w(gspca_dev, 0x78, 0x00);
 727}
 728
 729/* called on streamoff with alt 0 and on disconnect for pac7302 */
 730static void sd_stop0(struct gspca_dev *gspca_dev)
 731{
 732        if (!gspca_dev->present)
 733                return;
 734        reg_w(gspca_dev, 0xff, 0x01);
 735        reg_w(gspca_dev, 0x78, 0x40);
 736}
 737
 738static void do_autogain(struct gspca_dev *gspca_dev)
 739{
 740        struct sd *sd = (struct sd *) gspca_dev;
 741        int avg_lum = atomic_read(&sd->avg_lum);
 742        int desired_lum;
 743        const int deadzone = 30;
 744
 745        if (sd->autogain_ignore_frames < 0)
 746                return;
 747
 748        if (sd->autogain_ignore_frames > 0) {
 749                sd->autogain_ignore_frames--;
 750        } else {
 751                desired_lum = 270 + sd->brightness->val;
 752
 753                if (gspca_expo_autogain(gspca_dev, avg_lum, desired_lum,
 754                                        deadzone, PAC7302_GAIN_KNEE,
 755                                        PAC7302_EXPOSURE_KNEE))
 756                        sd->autogain_ignore_frames =
 757                                                PAC_AUTOGAIN_IGNORE_FRAMES;
 758        }
 759}
 760
 761/* JPEG header */
 762static const u8 jpeg_header[] = {
 763        0xff, 0xd8,     /* SOI: Start of Image */
 764
 765        0xff, 0xc0,     /* SOF0: Start of Frame (Baseline DCT) */
 766        0x00, 0x11,     /* length = 17 bytes (including this length field) */
 767        0x08,           /* Precision: 8 */
 768        0x02, 0x80,     /* height = 640 (image rotated) */
 769        0x01, 0xe0,     /* width = 480 */
 770        0x03,           /* Number of image components: 3 */
 771        0x01, 0x21, 0x00, /* ID=1, Subsampling 1x1, Quantization table: 0 */
 772        0x02, 0x11, 0x01, /* ID=2, Subsampling 2x1, Quantization table: 1 */
 773        0x03, 0x11, 0x01, /* ID=3, Subsampling 2x1, Quantization table: 1 */
 774
 775        0xff, 0xda,     /* SOS: Start Of Scan */
 776        0x00, 0x0c,     /* length = 12 bytes (including this length field) */
 777        0x03,           /* number of components: 3 */
 778        0x01, 0x00,     /* selector 1, table 0x00 */
 779        0x02, 0x11,     /* selector 2, table 0x11 */
 780        0x03, 0x11,     /* selector 3, table 0x11 */
 781        0x00, 0x3f,     /* Spectral selection: 0 .. 63 */
 782        0x00            /* Successive approximation: 0 */
 783};
 784
 785/* this function is run at interrupt level */
 786static void sd_pkt_scan(struct gspca_dev *gspca_dev,
 787                        u8 *data,                       /* isoc packet */
 788                        int len)                        /* iso packet length */
 789{
 790        struct sd *sd = (struct sd *) gspca_dev;
 791        u8 *image;
 792        u8 *sof;
 793
 794        sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
 795        if (sof) {
 796                int n, lum_offset, footer_length;
 797
 798                /*
 799                 * 6 bytes after the FF D9 EOF marker a number of lumination
 800                 * bytes are send corresponding to different parts of the
 801                 * image, the 14th and 15th byte after the EOF seem to
 802                 * correspond to the center of the image.
 803                 */
 804                lum_offset = 61 + sizeof pac_sof_marker;
 805                footer_length = 74;
 806
 807                /* Finish decoding current frame */
 808                n = (sof - data) - (footer_length + sizeof pac_sof_marker);
 809                if (n < 0) {
 810                        gspca_dev->image_len += n;
 811                        n = 0;
 812                } else {
 813                        gspca_frame_add(gspca_dev, INTER_PACKET, data, n);
 814                }
 815
 816                image = gspca_dev->image;
 817                if (image != NULL
 818                 && image[gspca_dev->image_len - 2] == 0xff
 819                 && image[gspca_dev->image_len - 1] == 0xd9)
 820                        gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0);
 821
 822                n = sof - data;
 823                len -= n;
 824                data = sof;
 825
 826                /* Get average lumination */
 827                if (gspca_dev->last_packet_type == LAST_PACKET &&
 828                                n >= lum_offset)
 829                        atomic_set(&sd->avg_lum, data[-lum_offset] +
 830                                                data[-lum_offset + 1]);
 831
 832                /* Start the new frame with the jpeg header */
 833                /* The PAC7302 has the image rotated 90 degrees */
 834                gspca_frame_add(gspca_dev, FIRST_PACKET,
 835                                jpeg_header, sizeof jpeg_header);
 836        }
 837        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
 838}
 839
 840#ifdef CONFIG_VIDEO_ADV_DEBUG
 841static int sd_dbg_s_register(struct gspca_dev *gspca_dev,
 842                        const struct v4l2_dbg_register *reg)
 843{
 844        u8 index;
 845        u8 value;
 846
 847        /*
 848         * reg->reg: bit0..15: reserved for register index (wIndex is 16bit
 849         *                     long on the USB bus)
 850         */
 851        if (reg->match.addr == 0 &&
 852            (reg->reg < 0x000000ff) &&
 853            (reg->val <= 0x000000ff)
 854        ) {
 855                /* Currently writing to page 0 is only supported. */
 856                /* reg_w() only supports 8bit index */
 857                index = reg->reg;
 858                value = reg->val;
 859
 860                /*
 861                 * Note that there shall be no access to other page
 862                 * by any other function between the page switch and
 863                 * the actual register write.
 864                 */
 865                reg_w(gspca_dev, 0xff, 0x00);           /* page 0 */
 866                reg_w(gspca_dev, index, value);
 867
 868                reg_w(gspca_dev, 0xdc, 0x01);
 869        }
 870        return gspca_dev->usb_err;
 871}
 872#endif
 873
 874#if IS_ENABLED(CONFIG_INPUT)
 875static int sd_int_pkt_scan(struct gspca_dev *gspca_dev,
 876                        u8 *data,               /* interrupt packet data */
 877                        int len)                /* interrupt packet length */
 878{
 879        int ret = -EINVAL;
 880        u8 data0, data1;
 881
 882        if (len == 2) {
 883                data0 = data[0];
 884                data1 = data[1];
 885                if ((data0 == 0x00 && data1 == 0x11) ||
 886                    (data0 == 0x22 && data1 == 0x33) ||
 887                    (data0 == 0x44 && data1 == 0x55) ||
 888                    (data0 == 0x66 && data1 == 0x77) ||
 889                    (data0 == 0x88 && data1 == 0x99) ||
 890                    (data0 == 0xaa && data1 == 0xbb) ||
 891                    (data0 == 0xcc && data1 == 0xdd) ||
 892                    (data0 == 0xee && data1 == 0xff)) {
 893                        input_report_key(gspca_dev->input_dev, KEY_CAMERA, 1);
 894                        input_sync(gspca_dev->input_dev);
 895                        input_report_key(gspca_dev->input_dev, KEY_CAMERA, 0);
 896                        input_sync(gspca_dev->input_dev);
 897                        ret = 0;
 898                }
 899        }
 900
 901        return ret;
 902}
 903#endif
 904
 905/* sub-driver description for pac7302 */
 906static const struct sd_desc sd_desc = {
 907        .name = KBUILD_MODNAME,
 908        .config = sd_config,
 909        .init = sd_init,
 910        .init_controls = sd_init_controls,
 911        .start = sd_start,
 912        .stopN = sd_stopN,
 913        .stop0 = sd_stop0,
 914        .pkt_scan = sd_pkt_scan,
 915        .dq_callback = do_autogain,
 916#ifdef CONFIG_VIDEO_ADV_DEBUG
 917        .set_register = sd_dbg_s_register,
 918#endif
 919#if IS_ENABLED(CONFIG_INPUT)
 920        .int_pkt_scan = sd_int_pkt_scan,
 921#endif
 922};
 923
 924/* -- module initialisation -- */
 925static const struct usb_device_id device_table[] = {
 926        {USB_DEVICE(0x06f8, 0x3009)},
 927        {USB_DEVICE(0x06f8, 0x301b)},
 928        {USB_DEVICE(0x093a, 0x2620)},
 929        {USB_DEVICE(0x093a, 0x2621)},
 930        {USB_DEVICE(0x093a, 0x2622), .driver_info = FL_VFLIP},
 931        {USB_DEVICE(0x093a, 0x2623), .driver_info = FL_VFLIP},
 932        {USB_DEVICE(0x093a, 0x2624), .driver_info = FL_VFLIP},
 933        {USB_DEVICE(0x093a, 0x2625)},
 934        {USB_DEVICE(0x093a, 0x2626)},
 935        {USB_DEVICE(0x093a, 0x2627), .driver_info = FL_VFLIP},
 936        {USB_DEVICE(0x093a, 0x2628)},
 937        {USB_DEVICE(0x093a, 0x2629), .driver_info = FL_VFLIP},
 938        {USB_DEVICE(0x093a, 0x262a)},
 939        {USB_DEVICE(0x093a, 0x262c)},
 940        {USB_DEVICE(0x145f, 0x013c)},
 941        {USB_DEVICE(0x1ae7, 0x2001)}, /* SpeedLink Snappy Mic SL-6825-SBK */
 942        {}
 943};
 944MODULE_DEVICE_TABLE(usb, device_table);
 945
 946/* -- device connect -- */
 947static int sd_probe(struct usb_interface *intf,
 948                        const struct usb_device_id *id)
 949{
 950        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
 951                                THIS_MODULE);
 952}
 953
 954static struct usb_driver sd_driver = {
 955        .name = KBUILD_MODNAME,
 956        .id_table = device_table,
 957        .probe = sd_probe,
 958        .disconnect = gspca_disconnect,
 959#ifdef CONFIG_PM
 960        .suspend = gspca_suspend,
 961        .resume = gspca_resume,
 962        .reset_resume = gspca_resume,
 963#endif
 964};
 965
 966module_usb_driver(sd_driver);
 967