linux/drivers/media/video/sn9c102/sn9c102_tas5130d1b.c
<<
>>
Prefs
   1/***************************************************************************
   2 * Plug-in for TAS5130D1B image sensor connected to the SN9C1xx PC Camera  *
   3 * Controllers                                                             *
   4 *                                                                         *
   5 * Copyright (C) 2004-2007 by Luca Risolia <luca.risolia@studio.unibo.it>  *
   6 *                                                                         *
   7 * This program is free software; you can redistribute it and/or modify    *
   8 * it under the terms of the GNU General Public License as published by    *
   9 * the Free Software Foundation; either version 2 of the License, or       *
  10 * (at your option) any later version.                                     *
  11 *                                                                         *
  12 * This program is distributed in the hope that it will be useful,         *
  13 * but WITHOUT ANY WARRANTY; without even the implied warranty of          *
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           *
  15 * GNU General Public License for more details.                            *
  16 *                                                                         *
  17 * You should have received a copy of the GNU General Public License       *
  18 * along with this program; if not, write to the Free Software             *
  19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.               *
  20 ***************************************************************************/
  21
  22#include "sn9c102_sensor.h"
  23#include "sn9c102_devtable.h"
  24
  25
  26static int tas5130d1b_init(struct sn9c102_device* cam)
  27{
  28        int err;
  29
  30        err = sn9c102_write_const_regs(cam, {0x01, 0x01}, {0x20, 0x17},
  31                                       {0x04, 0x01}, {0x01, 0x10},
  32                                       {0x00, 0x11}, {0x00, 0x14},
  33                                       {0x60, 0x17}, {0x07, 0x18});
  34
  35        return err;
  36}
  37
  38
  39static int tas5130d1b_set_ctrl(struct sn9c102_device* cam,
  40                               const struct v4l2_control* ctrl)
  41{
  42        int err = 0;
  43
  44        switch (ctrl->id) {
  45        case V4L2_CID_GAIN:
  46                err += sn9c102_i2c_write(cam, 0x20, 0xf6 - ctrl->value);
  47                break;
  48        case V4L2_CID_EXPOSURE:
  49                err += sn9c102_i2c_write(cam, 0x40, 0x47 - ctrl->value);
  50                break;
  51        default:
  52                return -EINVAL;
  53        }
  54
  55        return err ? -EIO : 0;
  56}
  57
  58
  59static int tas5130d1b_set_crop(struct sn9c102_device* cam,
  60                               const struct v4l2_rect* rect)
  61{
  62        struct sn9c102_sensor* s = sn9c102_get_sensor(cam);
  63        u8 h_start = (u8)(rect->left - s->cropcap.bounds.left) + 104,
  64           v_start = (u8)(rect->top - s->cropcap.bounds.top) + 12;
  65        int err = 0;
  66
  67        err += sn9c102_write_reg(cam, h_start, 0x12);
  68        err += sn9c102_write_reg(cam, v_start, 0x13);
  69
  70        /* Do NOT change! */
  71        err += sn9c102_write_reg(cam, 0x1f, 0x1a);
  72        err += sn9c102_write_reg(cam, 0x1a, 0x1b);
  73        err += sn9c102_write_reg(cam, sn9c102_pread_reg(cam, 0x19), 0x19);
  74
  75        return err;
  76}
  77
  78
  79static int tas5130d1b_set_pix_format(struct sn9c102_device* cam,
  80                                     const struct v4l2_pix_format* pix)
  81{
  82        int err = 0;
  83
  84        if (pix->pixelformat == V4L2_PIX_FMT_SN9C10X)
  85                err += sn9c102_write_reg(cam, 0x63, 0x19);
  86        else
  87                err += sn9c102_write_reg(cam, 0xf3, 0x19);
  88
  89        return err;
  90}
  91
  92
  93static const struct sn9c102_sensor tas5130d1b = {
  94        .name = "TAS5130D1B",
  95        .maintainer = "Luca Risolia <luca.risolia@studio.unibo.it>",
  96        .supported_bridge = BRIDGE_SN9C101 | BRIDGE_SN9C102,
  97        .sysfs_ops = SN9C102_I2C_WRITE,
  98        .frequency = SN9C102_I2C_100KHZ,
  99        .interface = SN9C102_I2C_3WIRES,
 100        .init = &tas5130d1b_init,
 101        .qctrl = {
 102                {
 103                        .id = V4L2_CID_GAIN,
 104                        .type = V4L2_CTRL_TYPE_INTEGER,
 105                        .name = "global gain",
 106                        .minimum = 0x00,
 107                        .maximum = 0xf6,
 108                        .step = 0x02,
 109                        .default_value = 0x00,
 110                        .flags = 0,
 111                },
 112                {
 113                        .id = V4L2_CID_EXPOSURE,
 114                        .type = V4L2_CTRL_TYPE_INTEGER,
 115                        .name = "exposure",
 116                        .minimum = 0x00,
 117                        .maximum = 0x47,
 118                        .step = 0x01,
 119                        .default_value = 0x00,
 120                        .flags = 0,
 121                },
 122        },
 123        .set_ctrl = &tas5130d1b_set_ctrl,
 124        .cropcap = {
 125                .bounds = {
 126                        .left = 0,
 127                        .top = 0,
 128                        .width = 640,
 129                        .height = 480,
 130                },
 131                .defrect = {
 132                        .left = 0,
 133                        .top = 0,
 134                        .width = 640,
 135                        .height = 480,
 136                },
 137        },
 138        .set_crop = &tas5130d1b_set_crop,
 139        .pix_format = {
 140                .width = 640,
 141                .height = 480,
 142                .pixelformat = V4L2_PIX_FMT_SBGGR8,
 143                .priv = 8,
 144        },
 145        .set_pix_format = &tas5130d1b_set_pix_format
 146};
 147
 148
 149int sn9c102_probe_tas5130d1b(struct sn9c102_device* cam)
 150{
 151        const struct usb_device_id tas5130d1b_id_table[] = {
 152                { USB_DEVICE(0x0c45, 0x6024), },
 153                { USB_DEVICE(0x0c45, 0x6025), },
 154                { USB_DEVICE(0x0c45, 0x60aa), },
 155                { }
 156        };
 157
 158        /* Sensor detection is based on USB pid/vid */
 159        if (!sn9c102_match_id(cam, tas5130d1b_id_table))
 160                return -ENODEV;
 161
 162        sn9c102_attach_sensor(cam, &tas5130d1b);
 163
 164        return 0;
 165}
 166