linux/drivers/media/usb/gspca/mr97310a.c
<<
>>
Prefs
   1/*
   2 * Mars MR97310A library
   3 *
   4 * The original mr97310a driver, which supported the Aiptek Pencam VGA+, is
   5 * Copyright (C) 2009 Kyle Guinn <elyk03@gmail.com>
   6 *
   7 * Support for the MR97310A cameras in addition to the Aiptek Pencam VGA+
   8 * and for the routines for detecting and classifying these various cameras,
   9 * is Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
  10 *
  11 * Support for the control settings for the CIF cameras is
  12 * Copyright (C) 2009 Hans de Goede <hdegoede@redhat.com> and
  13 * Thomas Kaiser <thomas@kaiser-linux.li>
  14 *
  15 * Support for the control settings for the VGA cameras is
  16 * Copyright (C) 2009 Theodore Kilgore <kilgota@auburn.edu>
  17 *
  18 * Several previously unsupported cameras are owned and have been tested by
  19 * Hans de Goede <hdegoede@redhat.com> and
  20 * Thomas Kaiser <thomas@kaiser-linux.li> and
  21 * Theodore Kilgore <kilgota@auburn.edu> and
  22 * Edmond Rodriguez <erodrig_97@yahoo.com> and
  23 * Aurelien Jacobs <aurel@gnuage.org>
  24 *
  25 * The MR97311A support in gspca/mars.c has been helpful in understanding some
  26 * of the registers in these cameras.
  27 *
  28 * This program is free software; you can redistribute it and/or modify
  29 * it under the terms of the GNU General Public License as published by
  30 * the Free Software Foundation; either version 2 of the License, or
  31 * any later version.
  32 *
  33 * This program is distributed in the hope that it will be useful,
  34 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  35 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  36 * GNU General Public License for more details.
  37 */
  38
  39#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  40
  41#define MODULE_NAME "mr97310a"
  42
  43#include "gspca.h"
  44
  45#define CAM_TYPE_CIF                    0
  46#define CAM_TYPE_VGA                    1
  47
  48#define MR97310A_BRIGHTNESS_DEFAULT     0
  49
  50#define MR97310A_EXPOSURE_MIN           0
  51#define MR97310A_EXPOSURE_MAX           4095
  52#define MR97310A_EXPOSURE_DEFAULT       1000
  53
  54#define MR97310A_GAIN_MIN               0
  55#define MR97310A_GAIN_MAX               31
  56#define MR97310A_GAIN_DEFAULT           25
  57
  58#define MR97310A_CONTRAST_MIN           0
  59#define MR97310A_CONTRAST_MAX           31
  60#define MR97310A_CONTRAST_DEFAULT       23
  61
  62#define MR97310A_CS_GAIN_MIN            0
  63#define MR97310A_CS_GAIN_MAX            0x7ff
  64#define MR97310A_CS_GAIN_DEFAULT        0x110
  65
  66#define MR97310A_CID_CLOCKDIV (V4L2_CTRL_CLASS_USER + 0x1000)
  67#define MR97310A_MIN_CLOCKDIV_MIN       3
  68#define MR97310A_MIN_CLOCKDIV_MAX       8
  69#define MR97310A_MIN_CLOCKDIV_DEFAULT   3
  70
  71MODULE_AUTHOR("Kyle Guinn <elyk03@gmail.com>,Theodore Kilgore <kilgota@auburn.edu>");
  72MODULE_DESCRIPTION("GSPCA/Mars-Semi MR97310A USB Camera Driver");
  73MODULE_LICENSE("GPL");
  74
  75/* global parameters */
  76static int force_sensor_type = -1;
  77module_param(force_sensor_type, int, 0644);
  78MODULE_PARM_DESC(force_sensor_type, "Force sensor type (-1 (auto), 0 or 1)");
  79
  80/* specific webcam descriptor */
  81struct sd {
  82        struct gspca_dev gspca_dev;  /* !! must be the first item */
  83        struct { /* exposure/min_clockdiv control cluster */
  84                struct v4l2_ctrl *exposure;
  85                struct v4l2_ctrl *min_clockdiv;
  86        };
  87        u8 sof_read;
  88        u8 cam_type;    /* 0 is CIF and 1 is VGA */
  89        u8 sensor_type; /* We use 0 and 1 here, too. */
  90        u8 do_lcd_stop;
  91        u8 adj_colors;
  92};
  93
  94struct sensor_w_data {
  95        u8 reg;
  96        u8 flags;
  97        u8 data[16];
  98        int len;
  99};
 100
 101static void sd_stopN(struct gspca_dev *gspca_dev);
 102
 103static const struct v4l2_pix_format vga_mode[] = {
 104        {160, 120, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 105                .bytesperline = 160,
 106                .sizeimage = 160 * 120,
 107                .colorspace = V4L2_COLORSPACE_SRGB,
 108                .priv = 4},
 109        {176, 144, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 110                .bytesperline = 176,
 111                .sizeimage = 176 * 144,
 112                .colorspace = V4L2_COLORSPACE_SRGB,
 113                .priv = 3},
 114        {320, 240, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 115                .bytesperline = 320,
 116                .sizeimage = 320 * 240,
 117                .colorspace = V4L2_COLORSPACE_SRGB,
 118                .priv = 2},
 119        {352, 288, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 120                .bytesperline = 352,
 121                .sizeimage = 352 * 288,
 122                .colorspace = V4L2_COLORSPACE_SRGB,
 123                .priv = 1},
 124        {640, 480, V4L2_PIX_FMT_MR97310A, V4L2_FIELD_NONE,
 125                .bytesperline = 640,
 126                .sizeimage = 640 * 480,
 127                .colorspace = V4L2_COLORSPACE_SRGB,
 128                .priv = 0},
 129};
 130
 131/* the bytes to write are in gspca_dev->usb_buf */
 132static int mr_write(struct gspca_dev *gspca_dev, int len)
 133{
 134        int rc;
 135
 136        rc = usb_bulk_msg(gspca_dev->dev,
 137                          usb_sndbulkpipe(gspca_dev->dev, 4),
 138                          gspca_dev->usb_buf, len, NULL, 500);
 139        if (rc < 0)
 140                pr_err("reg write [%02x] error %d\n",
 141                       gspca_dev->usb_buf[0], rc);
 142        return rc;
 143}
 144
 145/* the bytes are read into gspca_dev->usb_buf */
 146static int mr_read(struct gspca_dev *gspca_dev, int len)
 147{
 148        int rc;
 149
 150        rc = usb_bulk_msg(gspca_dev->dev,
 151                          usb_rcvbulkpipe(gspca_dev->dev, 3),
 152                          gspca_dev->usb_buf, len, NULL, 500);
 153        if (rc < 0)
 154                pr_err("reg read [%02x] error %d\n",
 155                       gspca_dev->usb_buf[0], rc);
 156        return rc;
 157}
 158
 159static int sensor_write_reg(struct gspca_dev *gspca_dev, u8 reg, u8 flags,
 160        const u8 *data, int len)
 161{
 162        gspca_dev->usb_buf[0] = 0x1f;
 163        gspca_dev->usb_buf[1] = flags;
 164        gspca_dev->usb_buf[2] = reg;
 165        memcpy(gspca_dev->usb_buf + 3, data, len);
 166
 167        return mr_write(gspca_dev, len + 3);
 168}
 169
 170static int sensor_write_regs(struct gspca_dev *gspca_dev,
 171        const struct sensor_w_data *data, int len)
 172{
 173        int i, rc;
 174
 175        for (i = 0; i < len; i++) {
 176                rc = sensor_write_reg(gspca_dev, data[i].reg, data[i].flags,
 177                                          data[i].data, data[i].len);
 178                if (rc < 0)
 179                        return rc;
 180        }
 181
 182        return 0;
 183}
 184
 185static int sensor_write1(struct gspca_dev *gspca_dev, u8 reg, u8 data)
 186{
 187        struct sd *sd = (struct sd *) gspca_dev;
 188        u8 buf, confirm_reg;
 189        int rc;
 190
 191        buf = data;
 192        if (sd->cam_type == CAM_TYPE_CIF) {
 193                rc = sensor_write_reg(gspca_dev, reg, 0x01, &buf, 1);
 194                confirm_reg = sd->sensor_type ? 0x13 : 0x11;
 195        } else {
 196                rc = sensor_write_reg(gspca_dev, reg, 0x00, &buf, 1);
 197                confirm_reg = 0x11;
 198        }
 199        if (rc < 0)
 200                return rc;
 201
 202        buf = 0x01;
 203        rc = sensor_write_reg(gspca_dev, confirm_reg, 0x00, &buf, 1);
 204        if (rc < 0)
 205                return rc;
 206
 207        return 0;
 208}
 209
 210static int cam_get_response16(struct gspca_dev *gspca_dev, u8 reg, int verbose)
 211{
 212        int err_code;
 213
 214        gspca_dev->usb_buf[0] = reg;
 215        err_code = mr_write(gspca_dev, 1);
 216        if (err_code < 0)
 217                return err_code;
 218
 219        err_code = mr_read(gspca_dev, 16);
 220        if (err_code < 0)
 221                return err_code;
 222
 223        if (verbose)
 224                gspca_dbg(gspca_dev, D_PROBE, "Register: %02x reads %02x%02x%02x\n",
 225                          reg,
 226                          gspca_dev->usb_buf[0],
 227                          gspca_dev->usb_buf[1],
 228                          gspca_dev->usb_buf[2]);
 229
 230        return 0;
 231}
 232
 233static int zero_the_pointer(struct gspca_dev *gspca_dev)
 234{
 235        __u8 *data = gspca_dev->usb_buf;
 236        int err_code;
 237        u8 status = 0;
 238        int tries = 0;
 239
 240        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 241        if (err_code < 0)
 242                return err_code;
 243
 244        data[0] = 0x19;
 245        data[1] = 0x51;
 246        err_code = mr_write(gspca_dev, 2);
 247        if (err_code < 0)
 248                return err_code;
 249
 250        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 251        if (err_code < 0)
 252                return err_code;
 253
 254        data[0] = 0x19;
 255        data[1] = 0xba;
 256        err_code = mr_write(gspca_dev, 2);
 257        if (err_code < 0)
 258                return err_code;
 259
 260        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 261        if (err_code < 0)
 262                return err_code;
 263
 264        data[0] = 0x19;
 265        data[1] = 0x00;
 266        err_code = mr_write(gspca_dev, 2);
 267        if (err_code < 0)
 268                return err_code;
 269
 270        err_code = cam_get_response16(gspca_dev, 0x21, 0);
 271        if (err_code < 0)
 272                return err_code;
 273
 274        data[0] = 0x19;
 275        data[1] = 0x00;
 276        err_code = mr_write(gspca_dev, 2);
 277        if (err_code < 0)
 278                return err_code;
 279
 280        while (status != 0x0a && tries < 256) {
 281                err_code = cam_get_response16(gspca_dev, 0x21, 0);
 282                status = data[0];
 283                tries++;
 284                if (err_code < 0)
 285                        return err_code;
 286        }
 287        if (status != 0x0a)
 288                gspca_err(gspca_dev, "status is %02x\n", status);
 289
 290        tries = 0;
 291        while (tries < 4) {
 292                data[0] = 0x19;
 293                data[1] = 0x00;
 294                err_code = mr_write(gspca_dev, 2);
 295                if (err_code < 0)
 296                        return err_code;
 297
 298                err_code = cam_get_response16(gspca_dev, 0x21, 0);
 299                status = data[0];
 300                tries++;
 301                if (err_code < 0)
 302                        return err_code;
 303        }
 304
 305        data[0] = 0x19;
 306        err_code = mr_write(gspca_dev, 1);
 307        if (err_code < 0)
 308                return err_code;
 309
 310        err_code = mr_read(gspca_dev, 16);
 311        if (err_code < 0)
 312                return err_code;
 313
 314        return 0;
 315}
 316
 317static int stream_start(struct gspca_dev *gspca_dev)
 318{
 319        gspca_dev->usb_buf[0] = 0x01;
 320        gspca_dev->usb_buf[1] = 0x01;
 321        return mr_write(gspca_dev, 2);
 322}
 323
 324static void stream_stop(struct gspca_dev *gspca_dev)
 325{
 326        gspca_dev->usb_buf[0] = 0x01;
 327        gspca_dev->usb_buf[1] = 0x00;
 328        if (mr_write(gspca_dev, 2) < 0)
 329                gspca_err(gspca_dev, "Stream Stop failed\n");
 330}
 331
 332static void lcd_stop(struct gspca_dev *gspca_dev)
 333{
 334        gspca_dev->usb_buf[0] = 0x19;
 335        gspca_dev->usb_buf[1] = 0x54;
 336        if (mr_write(gspca_dev, 2) < 0)
 337                gspca_err(gspca_dev, "LCD Stop failed\n");
 338}
 339
 340static int isoc_enable(struct gspca_dev *gspca_dev)
 341{
 342        gspca_dev->usb_buf[0] = 0x00;
 343        gspca_dev->usb_buf[1] = 0x4d;  /* ISOC transferring enable... */
 344        return mr_write(gspca_dev, 2);
 345}
 346
 347/* This function is called at probe time */
 348static int sd_config(struct gspca_dev *gspca_dev,
 349                     const struct usb_device_id *id)
 350{
 351        struct sd *sd = (struct sd *) gspca_dev;
 352        struct cam *cam;
 353        int err_code;
 354
 355        cam = &gspca_dev->cam;
 356        cam->cam_mode = vga_mode;
 357        cam->nmodes = ARRAY_SIZE(vga_mode);
 358        sd->do_lcd_stop = 0;
 359
 360        /* Several of the supported CIF cameras share the same USB ID but
 361         * require different initializations and different control settings.
 362         * The same is true of the VGA cameras. Therefore, we are forced
 363         * to start the initialization process in order to determine which
 364         * camera is present. Some of the supported cameras require the
 365         * memory pointer to be set to 0 as the very first item of business
 366         * or else they will not stream. So we do that immediately.
 367         */
 368        err_code = zero_the_pointer(gspca_dev);
 369        if (err_code < 0)
 370                return err_code;
 371
 372        err_code = stream_start(gspca_dev);
 373        if (err_code < 0)
 374                return err_code;
 375
 376        /* Now, the query for sensor type. */
 377        err_code = cam_get_response16(gspca_dev, 0x07, 1);
 378        if (err_code < 0)
 379                return err_code;
 380
 381        if (id->idProduct == 0x0110 || id->idProduct == 0x010e) {
 382                sd->cam_type = CAM_TYPE_CIF;
 383                cam->nmodes--;
 384                /*
 385                 * All but one of the known CIF cameras share the same USB ID,
 386                 * but two different init routines are in use, and the control
 387                 * settings are different, too. We need to detect which camera
 388                 * of the two known varieties is connected!
 389                 *
 390                 * A list of known CIF cameras follows. They all report either
 391                 * 0200 for type 0 or 0300 for type 1.
 392                 * If you have another to report, please do
 393                 *
 394                 * Name         sd->sensor_type         reported by
 395                 *
 396                 * Sakar 56379 Spy-shot 0               T. Kilgore
 397                 * Innovage             0               T. Kilgore
 398                 * Vivitar Mini         0               H. De Goede
 399                 * Vivitar Mini         0               E. Rodriguez
 400                 * Vivitar Mini         1               T. Kilgore
 401                 * Elta-Media 8212dc    1               T. Kaiser
 402                 * Philips dig. keych.  1               T. Kilgore
 403                 * Trust Spyc@m 100     1               A. Jacobs
 404                 */
 405                switch (gspca_dev->usb_buf[0]) {
 406                case 2:
 407                        sd->sensor_type = 0;
 408                        break;
 409                case 3:
 410                        sd->sensor_type = 1;
 411                        break;
 412                default:
 413                        pr_err("Unknown CIF Sensor id : %02x\n",
 414                               gspca_dev->usb_buf[1]);
 415                        return -ENODEV;
 416                }
 417                gspca_dbg(gspca_dev, D_PROBE, "MR97310A CIF camera detected, sensor: %d\n",
 418                          sd->sensor_type);
 419        } else {
 420                sd->cam_type = CAM_TYPE_VGA;
 421
 422                /*
 423                 * Here is a table of the responses to the query for sensor
 424                 * type, from the known MR97310A VGA cameras. Six different
 425                 * cameras of which five share the same USB ID.
 426                 *
 427                 * Name                 gspca_dev->usb_buf[]    sd->sensor_type
 428                 *                              sd->do_lcd_stop
 429                 * Aiptek Pencam VGA+   0300            0               1
 430                 * ION digital          0300            0               1
 431                 * Argus DC-1620        0450            1               0
 432                 * Argus QuickClix      0420            1               1
 433                 * Sakar 77379 Digital  0350            0               1
 434                 * Sakar 1638x CyberPix 0120            0               2
 435                 *
 436                 * Based upon these results, we assume default settings
 437                 * and then correct as necessary, as follows.
 438                 *
 439                 */
 440
 441                sd->sensor_type = 1;
 442                sd->do_lcd_stop = 0;
 443                sd->adj_colors = 0;
 444                if (gspca_dev->usb_buf[0] == 0x01) {
 445                        sd->sensor_type = 2;
 446                } else if ((gspca_dev->usb_buf[0] != 0x03) &&
 447                                        (gspca_dev->usb_buf[0] != 0x04)) {
 448                        pr_err("Unknown VGA Sensor id Byte 0: %02x\n",
 449                               gspca_dev->usb_buf[0]);
 450                        pr_err("Defaults assumed, may not work\n");
 451                        pr_err("Please report this\n");
 452                }
 453                /* Sakar Digital color needs to be adjusted. */
 454                if ((gspca_dev->usb_buf[0] == 0x03) &&
 455                                        (gspca_dev->usb_buf[1] == 0x50))
 456                        sd->adj_colors = 1;
 457                if (gspca_dev->usb_buf[0] == 0x04) {
 458                        sd->do_lcd_stop = 1;
 459                        switch (gspca_dev->usb_buf[1]) {
 460                        case 0x50:
 461                                sd->sensor_type = 0;
 462                                gspca_dbg(gspca_dev, D_PROBE, "sensor_type corrected to 0\n");
 463                                break;
 464                        case 0x20:
 465                                /* Nothing to do here. */
 466                                break;
 467                        default:
 468                                pr_err("Unknown VGA Sensor id Byte 1: %02x\n",
 469                                       gspca_dev->usb_buf[1]);
 470                                pr_err("Defaults assumed, may not work\n");
 471                                pr_err("Please report this\n");
 472                        }
 473                }
 474                gspca_dbg(gspca_dev, D_PROBE, "MR97310A VGA camera detected, sensor: %d\n",
 475                          sd->sensor_type);
 476        }
 477        /* Stop streaming as we've started it only to probe the sensor type. */
 478        sd_stopN(gspca_dev);
 479
 480        if (force_sensor_type != -1) {
 481                sd->sensor_type = !!force_sensor_type;
 482                gspca_dbg(gspca_dev, D_PROBE, "Forcing sensor type to: %d\n",
 483                          sd->sensor_type);
 484        }
 485
 486        return 0;
 487}
 488
 489/* this function is called at probe and resume time */
 490static int sd_init(struct gspca_dev *gspca_dev)
 491{
 492        return 0;
 493}
 494
 495static int start_cif_cam(struct gspca_dev *gspca_dev)
 496{
 497        struct sd *sd = (struct sd *) gspca_dev;
 498        __u8 *data = gspca_dev->usb_buf;
 499        int err_code;
 500        static const __u8 startup_string[] = {
 501                0x00,
 502                0x0d,
 503                0x01,
 504                0x00, /* Hsize/8 for 352 or 320 */
 505                0x00, /* Vsize/4 for 288 or 240 */
 506                0x13, /* or 0xbb, depends on sensor */
 507                0x00, /* Hstart, depends on res. */
 508                0x00, /* reserved ? */
 509                0x00, /* Vstart, depends on res. and sensor */
 510                0x50, /* 0x54 to get 176 or 160 */
 511                0xc0
 512        };
 513
 514        /* Note: Some of the above descriptions guessed from MR97113A driver */
 515
 516        memcpy(data, startup_string, 11);
 517        if (sd->sensor_type)
 518                data[5] = 0xbb;
 519
 520        switch (gspca_dev->pixfmt.width) {
 521        case 160:
 522                data[9] |= 0x04;  /* reg 8, 2:1 scale down from 320 */
 523                /* fall thru */
 524        case 320:
 525        default:
 526                data[3] = 0x28;                    /* reg 2, H size/8 */
 527                data[4] = 0x3c;                    /* reg 3, V size/4 */
 528                data[6] = 0x14;                    /* reg 5, H start  */
 529                data[8] = 0x1a + sd->sensor_type;  /* reg 7, V start  */
 530                break;
 531        case 176:
 532                data[9] |= 0x04;  /* reg 8, 2:1 scale down from 352 */
 533                /* fall thru */
 534        case 352:
 535                data[3] = 0x2c;                    /* reg 2, H size/8 */
 536                data[4] = 0x48;                    /* reg 3, V size/4 */
 537                data[6] = 0x06;                    /* reg 5, H start  */
 538                data[8] = 0x06 - sd->sensor_type;  /* reg 7, V start  */
 539                break;
 540        }
 541        err_code = mr_write(gspca_dev, 11);
 542        if (err_code < 0)
 543                return err_code;
 544
 545        if (!sd->sensor_type) {
 546                static const struct sensor_w_data cif_sensor0_init_data[] = {
 547                        {0x02, 0x00, {0x03, 0x5a, 0xb5, 0x01,
 548                                      0x0f, 0x14, 0x0f, 0x10}, 8},
 549                        {0x0c, 0x00, {0x04, 0x01, 0x01, 0x00, 0x1f}, 5},
 550                        {0x12, 0x00, {0x07}, 1},
 551                        {0x1f, 0x00, {0x06}, 1},
 552                        {0x27, 0x00, {0x04}, 1},
 553                        {0x29, 0x00, {0x0c}, 1},
 554                        {0x40, 0x00, {0x40, 0x00, 0x04}, 3},
 555                        {0x50, 0x00, {0x60}, 1},
 556                        {0x60, 0x00, {0x06}, 1},
 557                        {0x6b, 0x00, {0x85, 0x85, 0xc8, 0xc8, 0xc8, 0xc8}, 6},
 558                        {0x72, 0x00, {0x1e, 0x56}, 2},
 559                        {0x75, 0x00, {0x58, 0x40, 0xa2, 0x02, 0x31, 0x02,
 560                                      0x31, 0x80, 0x00}, 9},
 561                        {0x11, 0x00, {0x01}, 1},
 562                        {0, 0, {0}, 0}
 563                };
 564                err_code = sensor_write_regs(gspca_dev, cif_sensor0_init_data,
 565                                         ARRAY_SIZE(cif_sensor0_init_data));
 566        } else {        /* sd->sensor_type = 1 */
 567                static const struct sensor_w_data cif_sensor1_init_data[] = {
 568                        /* Reg 3,4, 7,8 get set by the controls */
 569                        {0x02, 0x00, {0x10}, 1},
 570                        {0x05, 0x01, {0x22}, 1}, /* 5/6 also seen as 65h/32h */
 571                        {0x06, 0x01, {0x00}, 1},
 572                        {0x09, 0x02, {0x0e}, 1},
 573                        {0x0a, 0x02, {0x05}, 1},
 574                        {0x0b, 0x02, {0x05}, 1},
 575                        {0x0c, 0x02, {0x0f}, 1},
 576                        {0x0d, 0x02, {0x07}, 1},
 577                        {0x0e, 0x02, {0x0c}, 1},
 578                        {0x0f, 0x00, {0x00}, 1},
 579                        {0x10, 0x00, {0x06}, 1},
 580                        {0x11, 0x00, {0x07}, 1},
 581                        {0x12, 0x00, {0x00}, 1},
 582                        {0x13, 0x00, {0x01}, 1},
 583                        {0, 0, {0}, 0}
 584                };
 585                /* Without this command the cam won't work with USB-UHCI */
 586                gspca_dev->usb_buf[0] = 0x0a;
 587                gspca_dev->usb_buf[1] = 0x00;
 588                err_code = mr_write(gspca_dev, 2);
 589                if (err_code < 0)
 590                        return err_code;
 591                err_code = sensor_write_regs(gspca_dev, cif_sensor1_init_data,
 592                                         ARRAY_SIZE(cif_sensor1_init_data));
 593        }
 594        return err_code;
 595}
 596
 597static int start_vga_cam(struct gspca_dev *gspca_dev)
 598{
 599        struct sd *sd = (struct sd *) gspca_dev;
 600        __u8 *data = gspca_dev->usb_buf;
 601        int err_code;
 602        static const __u8 startup_string[] =
 603                {0x00, 0x0d, 0x01, 0x00, 0x00, 0x2b, 0x00, 0x00,
 604                 0x00, 0x50, 0xc0};
 605        /* What some of these mean is explained in start_cif_cam(), above */
 606
 607        memcpy(data, startup_string, 11);
 608        if (!sd->sensor_type) {
 609                data[5]  = 0x00;
 610                data[10] = 0x91;
 611        }
 612        if (sd->sensor_type == 2) {
 613                data[5]  = 0x00;
 614                data[10] = 0x18;
 615        }
 616
 617        switch (gspca_dev->pixfmt.width) {
 618        case 160:
 619                data[9] |= 0x0c;  /* reg 8, 4:1 scale down */
 620                /* fall thru */
 621        case 320:
 622                data[9] |= 0x04;  /* reg 8, 2:1 scale down */
 623                /* fall thru */
 624        case 640:
 625        default:
 626                data[3] = 0x50;  /* reg 2, H size/8 */
 627                data[4] = 0x78;  /* reg 3, V size/4 */
 628                data[6] = 0x04;  /* reg 5, H start */
 629                data[8] = 0x03;  /* reg 7, V start */
 630                if (sd->sensor_type == 2) {
 631                        data[6] = 2;
 632                        data[8] = 1;
 633                }
 634                if (sd->do_lcd_stop)
 635                        data[8] = 0x04;  /* Bayer tile shifted */
 636                break;
 637
 638        case 176:
 639                data[9] |= 0x04;  /* reg 8, 2:1 scale down */
 640                /* fall thru */
 641        case 352:
 642                data[3] = 0x2c;  /* reg 2, H size */
 643                data[4] = 0x48;  /* reg 3, V size */
 644                data[6] = 0x94;  /* reg 5, H start */
 645                data[8] = 0x63;  /* reg 7, V start */
 646                if (sd->do_lcd_stop)
 647                        data[8] = 0x64;  /* Bayer tile shifted */
 648                break;
 649        }
 650
 651        err_code = mr_write(gspca_dev, 11);
 652        if (err_code < 0)
 653                return err_code;
 654
 655        if (!sd->sensor_type) {
 656                static const struct sensor_w_data vga_sensor0_init_data[] = {
 657                        {0x01, 0x00, {0x0c, 0x00, 0x04}, 3},
 658                        {0x14, 0x00, {0x01, 0xe4, 0x02, 0x84}, 4},
 659                        {0x20, 0x00, {0x00, 0x80, 0x00, 0x08}, 4},
 660                        {0x25, 0x00, {0x03, 0xa9, 0x80}, 3},
 661                        {0x30, 0x00, {0x30, 0x18, 0x10, 0x18}, 4},
 662                        {0, 0, {0}, 0}
 663                };
 664                err_code = sensor_write_regs(gspca_dev, vga_sensor0_init_data,
 665                                         ARRAY_SIZE(vga_sensor0_init_data));
 666        } else if (sd->sensor_type == 1) {
 667                static const struct sensor_w_data color_adj[] = {
 668                        {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
 669                                /* adjusted blue, green, red gain correct
 670                                   too much blue from the Sakar Digital */
 671                                0x05, 0x01, 0x04}, 8}
 672                };
 673
 674                static const struct sensor_w_data color_no_adj[] = {
 675                        {0x02, 0x00, {0x06, 0x59, 0x0c, 0x16, 0x00,
 676                                /* default blue, green, red gain settings */
 677                                0x07, 0x00, 0x01}, 8}
 678                };
 679
 680                static const struct sensor_w_data vga_sensor1_init_data[] = {
 681                        {0x11, 0x04, {0x01}, 1},
 682                        {0x0a, 0x00, {0x00, 0x01, 0x00, 0x00, 0x01,
 683                        /* These settings may be better for some cameras */
 684                        /* {0x0a, 0x00, {0x01, 0x06, 0x00, 0x00, 0x01, */
 685                                0x00, 0x0a}, 7},
 686                        {0x11, 0x04, {0x01}, 1},
 687                        {0x12, 0x00, {0x00, 0x63, 0x00, 0x70, 0x00, 0x00}, 6},
 688                        {0x11, 0x04, {0x01}, 1},
 689                        {0, 0, {0}, 0}
 690                };
 691
 692                if (sd->adj_colors)
 693                        err_code = sensor_write_regs(gspca_dev, color_adj,
 694                                         ARRAY_SIZE(color_adj));
 695                else
 696                        err_code = sensor_write_regs(gspca_dev, color_no_adj,
 697                                         ARRAY_SIZE(color_no_adj));
 698
 699                if (err_code < 0)
 700                        return err_code;
 701
 702                err_code = sensor_write_regs(gspca_dev, vga_sensor1_init_data,
 703                                         ARRAY_SIZE(vga_sensor1_init_data));
 704        } else {        /* sensor type == 2 */
 705                static const struct sensor_w_data vga_sensor2_init_data[] = {
 706
 707                        {0x01, 0x00, {0x48}, 1},
 708                        {0x02, 0x00, {0x22}, 1},
 709                        /* Reg 3 msb and 4 is lsb of the exposure setting*/
 710                        {0x05, 0x00, {0x10}, 1},
 711                        {0x06, 0x00, {0x00}, 1},
 712                        {0x07, 0x00, {0x00}, 1},
 713                        {0x08, 0x00, {0x00}, 1},
 714                        {0x09, 0x00, {0x00}, 1},
 715                        /* The following are used in the gain control
 716                         * which is BTW completely borked in the OEM driver
 717                         * The values for each color go from 0 to 0x7ff
 718                         *{0x0a, 0x00, {0x01}, 1},  green1 gain msb
 719                         *{0x0b, 0x00, {0x10}, 1},  green1 gain lsb
 720                         *{0x0c, 0x00, {0x01}, 1},  red gain msb
 721                         *{0x0d, 0x00, {0x10}, 1},  red gain lsb
 722                         *{0x0e, 0x00, {0x01}, 1},  blue gain msb
 723                         *{0x0f, 0x00, {0x10}, 1},  blue gain lsb
 724                         *{0x10, 0x00, {0x01}, 1}, green2 gain msb
 725                         *{0x11, 0x00, {0x10}, 1}, green2 gain lsb
 726                         */
 727                        {0x12, 0x00, {0x00}, 1},
 728                        {0x13, 0x00, {0x04}, 1}, /* weird effect on colors */
 729                        {0x14, 0x00, {0x00}, 1},
 730                        {0x15, 0x00, {0x06}, 1},
 731                        {0x16, 0x00, {0x01}, 1},
 732                        {0x17, 0x00, {0xe2}, 1}, /* vertical alignment */
 733                        {0x18, 0x00, {0x02}, 1},
 734                        {0x19, 0x00, {0x82}, 1}, /* don't mess with */
 735                        {0x1a, 0x00, {0x00}, 1},
 736                        {0x1b, 0x00, {0x20}, 1},
 737                        /* {0x1c, 0x00, {0x17}, 1}, contrast control */
 738                        {0x1d, 0x00, {0x80}, 1}, /* moving causes a mess */
 739                        {0x1e, 0x00, {0x08}, 1}, /* moving jams the camera */
 740                        {0x1f, 0x00, {0x0c}, 1},
 741                        {0x20, 0x00, {0x00}, 1},
 742                        {0, 0, {0}, 0}
 743                };
 744                err_code = sensor_write_regs(gspca_dev, vga_sensor2_init_data,
 745                                         ARRAY_SIZE(vga_sensor2_init_data));
 746        }
 747        return err_code;
 748}
 749
 750static int sd_start(struct gspca_dev *gspca_dev)
 751{
 752        struct sd *sd = (struct sd *) gspca_dev;
 753        int err_code;
 754
 755        sd->sof_read = 0;
 756
 757        /* Some of the VGA cameras require the memory pointer
 758         * to be set to 0 again. We have been forced to start the
 759         * stream in sd_config() to detect the hardware, and closed it.
 760         * Thus, we need here to do a completely fresh and clean start. */
 761        err_code = zero_the_pointer(gspca_dev);
 762        if (err_code < 0)
 763                return err_code;
 764
 765        err_code = stream_start(gspca_dev);
 766        if (err_code < 0)
 767                return err_code;
 768
 769        if (sd->cam_type == CAM_TYPE_CIF) {
 770                err_code = start_cif_cam(gspca_dev);
 771        } else {
 772                err_code = start_vga_cam(gspca_dev);
 773        }
 774        if (err_code < 0)
 775                return err_code;
 776
 777        return isoc_enable(gspca_dev);
 778}
 779
 780static void sd_stopN(struct gspca_dev *gspca_dev)
 781{
 782        struct sd *sd = (struct sd *) gspca_dev;
 783
 784        stream_stop(gspca_dev);
 785        /* Not all the cams need this, but even if not, probably a good idea */
 786        zero_the_pointer(gspca_dev);
 787        if (sd->do_lcd_stop)
 788                lcd_stop(gspca_dev);
 789}
 790
 791static void setbrightness(struct gspca_dev *gspca_dev, s32 val)
 792{
 793        struct sd *sd = (struct sd *) gspca_dev;
 794        u8 sign_reg = 7;  /* This reg and the next one used on CIF cams. */
 795        u8 value_reg = 8; /* VGA cams seem to use regs 0x0b and 0x0c */
 796        static const u8 quick_clix_table[] =
 797        /*        0  1  2   3  4  5  6  7  8  9  10  11  12  13  14  15 */
 798                { 0, 4, 8, 12, 1, 2, 3, 5, 6, 9,  7, 10, 13, 11, 14, 15};
 799        if (sd->cam_type == CAM_TYPE_VGA) {
 800                sign_reg += 4;
 801                value_reg += 4;
 802        }
 803
 804        /* Note register 7 is also seen as 0x8x or 0xCx in some dumps */
 805        if (val > 0) {
 806                sensor_write1(gspca_dev, sign_reg, 0x00);
 807        } else {
 808                sensor_write1(gspca_dev, sign_reg, 0x01);
 809                val = 257 - val;
 810        }
 811        /* Use lookup table for funky Argus QuickClix brightness */
 812        if (sd->do_lcd_stop)
 813                val = quick_clix_table[val];
 814
 815        sensor_write1(gspca_dev, value_reg, val);
 816}
 817
 818static void setexposure(struct gspca_dev *gspca_dev, s32 expo, s32 min_clockdiv)
 819{
 820        struct sd *sd = (struct sd *) gspca_dev;
 821        int exposure = MR97310A_EXPOSURE_DEFAULT;
 822        u8 buf[2];
 823
 824        if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1) {
 825                /* This cam does not like exposure settings < 300,
 826                   so scale 0 - 4095 to 300 - 4095 */
 827                exposure = (expo * 9267) / 10000 + 300;
 828                sensor_write1(gspca_dev, 3, exposure >> 4);
 829                sensor_write1(gspca_dev, 4, exposure & 0x0f);
 830        } else if (sd->sensor_type == 2) {
 831                exposure = expo;
 832                exposure >>= 3;
 833                sensor_write1(gspca_dev, 3, exposure >> 8);
 834                sensor_write1(gspca_dev, 4, exposure & 0xff);
 835        } else {
 836                /* We have both a clock divider and an exposure register.
 837                   We first calculate the clock divider, as that determines
 838                   the maximum exposure and then we calculate the exposure
 839                   register setting (which goes from 0 - 511).
 840
 841                   Note our 0 - 4095 exposure is mapped to 0 - 511
 842                   milliseconds exposure time */
 843                u8 clockdiv = (60 * expo + 7999) / 8000;
 844
 845                /* Limit framerate to not exceed usb bandwidth */
 846                if (clockdiv < min_clockdiv && gspca_dev->pixfmt.width >= 320)
 847                        clockdiv = min_clockdiv;
 848                else if (clockdiv < 2)
 849                        clockdiv = 2;
 850
 851                if (sd->cam_type == CAM_TYPE_VGA && clockdiv < 4)
 852                        clockdiv = 4;
 853
 854                /* Frame exposure time in ms = 1000 * clockdiv / 60 ->
 855                exposure = (sd->exposure / 8) * 511 / (1000 * clockdiv / 60) */
 856                exposure = (60 * 511 * expo) / (8000 * clockdiv);
 857                if (exposure > 511)
 858                        exposure = 511;
 859
 860                /* exposure register value is reversed! */
 861                exposure = 511 - exposure;
 862
 863                buf[0] = exposure & 0xff;
 864                buf[1] = exposure >> 8;
 865                sensor_write_reg(gspca_dev, 0x0e, 0, buf, 2);
 866                sensor_write1(gspca_dev, 0x02, clockdiv);
 867        }
 868}
 869
 870static void setgain(struct gspca_dev *gspca_dev, s32 val)
 871{
 872        struct sd *sd = (struct sd *) gspca_dev;
 873        u8 gainreg;
 874
 875        if (sd->cam_type == CAM_TYPE_CIF && sd->sensor_type == 1)
 876                sensor_write1(gspca_dev, 0x0e, val);
 877        else if (sd->cam_type == CAM_TYPE_VGA && sd->sensor_type == 2)
 878                for (gainreg = 0x0a; gainreg < 0x11; gainreg += 2) {
 879                        sensor_write1(gspca_dev, gainreg, val >> 8);
 880                        sensor_write1(gspca_dev, gainreg + 1, val & 0xff);
 881                }
 882        else
 883                sensor_write1(gspca_dev, 0x10, val);
 884}
 885
 886static void setcontrast(struct gspca_dev *gspca_dev, s32 val)
 887{
 888        sensor_write1(gspca_dev, 0x1c, val);
 889}
 890
 891static int sd_s_ctrl(struct v4l2_ctrl *ctrl)
 892{
 893        struct gspca_dev *gspca_dev =
 894                container_of(ctrl->handler, struct gspca_dev, ctrl_handler);
 895        struct sd *sd = (struct sd *)gspca_dev;
 896
 897        gspca_dev->usb_err = 0;
 898
 899        if (!gspca_dev->streaming)
 900                return 0;
 901
 902        switch (ctrl->id) {
 903        case V4L2_CID_BRIGHTNESS:
 904                setbrightness(gspca_dev, ctrl->val);
 905                break;
 906        case V4L2_CID_CONTRAST:
 907                setcontrast(gspca_dev, ctrl->val);
 908                break;
 909        case V4L2_CID_EXPOSURE:
 910                setexposure(gspca_dev, sd->exposure->val,
 911                            sd->min_clockdiv ? sd->min_clockdiv->val : 0);
 912                break;
 913        case V4L2_CID_GAIN:
 914                setgain(gspca_dev, ctrl->val);
 915                break;
 916        }
 917        return gspca_dev->usb_err;
 918}
 919
 920static const struct v4l2_ctrl_ops sd_ctrl_ops = {
 921        .s_ctrl = sd_s_ctrl,
 922};
 923
 924static int sd_init_controls(struct gspca_dev *gspca_dev)
 925{
 926        struct sd *sd = (struct sd *)gspca_dev;
 927        struct v4l2_ctrl_handler *hdl = &gspca_dev->ctrl_handler;
 928        static const struct v4l2_ctrl_config clockdiv = {
 929                .ops = &sd_ctrl_ops,
 930                .id = MR97310A_CID_CLOCKDIV,
 931                .type = V4L2_CTRL_TYPE_INTEGER,
 932                .name = "Minimum Clock Divider",
 933                .min = MR97310A_MIN_CLOCKDIV_MIN,
 934                .max = MR97310A_MIN_CLOCKDIV_MAX,
 935                .step = 1,
 936                .def = MR97310A_MIN_CLOCKDIV_DEFAULT,
 937        };
 938        bool has_brightness = false;
 939        bool has_argus_brightness = false;
 940        bool has_contrast = false;
 941        bool has_gain = false;
 942        bool has_cs_gain = false;
 943        bool has_exposure = false;
 944        bool has_clockdiv = false;
 945
 946        gspca_dev->vdev.ctrl_handler = hdl;
 947        v4l2_ctrl_handler_init(hdl, 4);
 948
 949        /* Setup controls depending on camera type */
 950        if (sd->cam_type == CAM_TYPE_CIF) {
 951                /* No brightness for sensor_type 0 */
 952                if (sd->sensor_type == 0)
 953                        has_exposure = has_gain = has_clockdiv = true;
 954                else
 955                        has_exposure = has_gain = has_brightness = true;
 956        } else {
 957                /* All controls need to be disabled if VGA sensor_type is 0 */
 958                if (sd->sensor_type == 0)
 959                        ; /* no controls! */
 960                else if (sd->sensor_type == 2)
 961                        has_exposure = has_cs_gain = has_contrast = true;
 962                else if (sd->do_lcd_stop)
 963                        has_exposure = has_gain = has_argus_brightness =
 964                                has_clockdiv = true;
 965                else
 966                        has_exposure = has_gain = has_brightness =
 967                                has_clockdiv = true;
 968        }
 969
 970        /* Separate brightness control description for Argus QuickClix as it has
 971         * different limits from the other mr97310a cameras, and separate gain
 972         * control for Sakar CyberPix camera. */
 973        /*
 974         * This control is disabled for CIF type 1 and VGA type 0 cameras.
 975         * It does not quite act linearly for the Argus QuickClix camera,
 976         * but it does control brightness. The values are 0 - 15 only, and
 977         * the table above makes them act consecutively.
 978         */
 979        if (has_brightness)
 980                v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 981                        V4L2_CID_BRIGHTNESS, -254, 255, 1,
 982                        MR97310A_BRIGHTNESS_DEFAULT);
 983        else if (has_argus_brightness)
 984                v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 985                        V4L2_CID_BRIGHTNESS, 0, 15, 1,
 986                        MR97310A_BRIGHTNESS_DEFAULT);
 987        if (has_contrast)
 988                v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 989                        V4L2_CID_CONTRAST, MR97310A_CONTRAST_MIN,
 990                        MR97310A_CONTRAST_MAX, 1, MR97310A_CONTRAST_DEFAULT);
 991        if (has_gain)
 992                v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
 993                        V4L2_CID_GAIN, MR97310A_GAIN_MIN, MR97310A_GAIN_MAX,
 994                        1, MR97310A_GAIN_DEFAULT);
 995        else if (has_cs_gain)
 996                v4l2_ctrl_new_std(hdl, &sd_ctrl_ops, V4L2_CID_GAIN,
 997                        MR97310A_CS_GAIN_MIN, MR97310A_CS_GAIN_MAX,
 998                        1, MR97310A_CS_GAIN_DEFAULT);
 999        if (has_exposure)
1000                sd->exposure = v4l2_ctrl_new_std(hdl, &sd_ctrl_ops,
1001                        V4L2_CID_EXPOSURE, MR97310A_EXPOSURE_MIN,
1002                        MR97310A_EXPOSURE_MAX, 1, MR97310A_EXPOSURE_DEFAULT);
1003        if (has_clockdiv)
1004                sd->min_clockdiv = v4l2_ctrl_new_custom(hdl, &clockdiv, NULL);
1005
1006        if (hdl->error) {
1007                pr_err("Could not initialize controls\n");
1008                return hdl->error;
1009        }
1010        if (has_exposure && has_clockdiv)
1011                v4l2_ctrl_cluster(2, &sd->exposure);
1012        return 0;
1013}
1014
1015/* Include pac common sof detection functions */
1016#include "pac_common.h"
1017
1018static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1019                        u8 *data,               /* isoc packet */
1020                        int len)                /* iso packet length */
1021{
1022        struct sd *sd = (struct sd *) gspca_dev;
1023        unsigned char *sof;
1024
1025        sof = pac_find_sof(gspca_dev, &sd->sof_read, data, len);
1026        if (sof) {
1027                int n;
1028
1029                /* finish decoding current frame */
1030                n = sof - data;
1031                if (n > sizeof pac_sof_marker)
1032                        n -= sizeof pac_sof_marker;
1033                else
1034                        n = 0;
1035                gspca_frame_add(gspca_dev, LAST_PACKET,
1036                                        data, n);
1037                /* Start next frame. */
1038                gspca_frame_add(gspca_dev, FIRST_PACKET,
1039                        pac_sof_marker, sizeof pac_sof_marker);
1040                len -= sof - data;
1041                data = sof;
1042        }
1043        gspca_frame_add(gspca_dev, INTER_PACKET, data, len);
1044}
1045
1046/* sub-driver description */
1047static const struct sd_desc sd_desc = {
1048        .name = MODULE_NAME,
1049        .config = sd_config,
1050        .init = sd_init,
1051        .init_controls = sd_init_controls,
1052        .start = sd_start,
1053        .stopN = sd_stopN,
1054        .pkt_scan = sd_pkt_scan,
1055};
1056
1057/* -- module initialisation -- */
1058static const struct usb_device_id device_table[] = {
1059        {USB_DEVICE(0x08ca, 0x0110)},   /* Trust Spyc@m 100 */
1060        {USB_DEVICE(0x08ca, 0x0111)},   /* Aiptek Pencam VGA+ */
1061        {USB_DEVICE(0x093a, 0x010f)},   /* All other known MR97310A VGA cams */
1062        {USB_DEVICE(0x093a, 0x010e)},   /* All known MR97310A CIF cams */
1063        {}
1064};
1065MODULE_DEVICE_TABLE(usb, device_table);
1066
1067/* -- device connect -- */
1068static int sd_probe(struct usb_interface *intf,
1069                    const struct usb_device_id *id)
1070{
1071        return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
1072                               THIS_MODULE);
1073}
1074
1075static struct usb_driver sd_driver = {
1076        .name = MODULE_NAME,
1077        .id_table = device_table,
1078        .probe = sd_probe,
1079        .disconnect = gspca_disconnect,
1080#ifdef CONFIG_PM
1081        .suspend = gspca_suspend,
1082        .resume = gspca_resume,
1083        .reset_resume = gspca_resume,
1084#endif
1085};
1086
1087module_usb_driver(sd_driver);
1088