|
@@ -73,14 +73,15 @@ struct sd {
|
|
|
#define BRIDGE_103 1
|
|
|
|
|
|
__u8 sensor; /* Type of image sensor chip */
|
|
|
-#define SENSOR_HV7131R 0
|
|
|
-#define SENSOR_OV6650 1
|
|
|
-#define SENSOR_OV7630 2
|
|
|
-#define SENSOR_PAS106 3
|
|
|
-#define SENSOR_PAS202 4
|
|
|
-#define SENSOR_TAS5110C 5
|
|
|
-#define SENSOR_TAS5110D 6
|
|
|
-#define SENSOR_TAS5130CXX 7
|
|
|
+#define SENSOR_HV7131D 0
|
|
|
+#define SENSOR_HV7131R 1
|
|
|
+#define SENSOR_OV6650 2
|
|
|
+#define SENSOR_OV7630 3
|
|
|
+#define SENSOR_PAS106 4
|
|
|
+#define SENSOR_PAS202 5
|
|
|
+#define SENSOR_TAS5110C 6
|
|
|
+#define SENSOR_TAS5110D 7
|
|
|
+#define SENSOR_TAS5130CXX 8
|
|
|
__u8 reg11;
|
|
|
};
|
|
|
|
|
@@ -305,14 +306,29 @@ static const struct v4l2_pix_format sif_mode[] = {
|
|
|
.priv = 0},
|
|
|
};
|
|
|
|
|
|
-static const __u8 initHv7131[] = {
|
|
|
+static const __u8 initHv7131d[] = {
|
|
|
+ 0x04, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
|
|
|
+ 0x00, 0x00,
|
|
|
+ 0x00, 0x00, 0x00, 0x02, 0x02, 0x00,
|
|
|
+ 0x28, 0x1e, 0x60, 0x8e, 0x42,
|
|
|
+ 0x1d, 0x10, 0x02, 0x03, 0x0f, 0x0c
|
|
|
+};
|
|
|
+static const __u8 hv7131d_sensor_init[][8] = {
|
|
|
+ {0xa0, 0x11, 0x01, 0x04, 0x00, 0x00, 0x00, 0x17},
|
|
|
+ {0xa0, 0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x17},
|
|
|
+ {0xa0, 0x11, 0x28, 0x00, 0x00, 0x00, 0x00, 0x17},
|
|
|
+ {0xa0, 0x11, 0x30, 0x30, 0x00, 0x00, 0x00, 0x17}, /* reset level */
|
|
|
+ {0xa0, 0x11, 0x34, 0x02, 0x00, 0x00, 0x00, 0x17}, /* pixel bias volt */
|
|
|
+};
|
|
|
+
|
|
|
+static const __u8 initHv7131r[] = {
|
|
|
0x46, 0x77, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00,
|
|
|
0x00, 0x00,
|
|
|
0x00, 0x00, 0x00, 0x02, 0x01, 0x00,
|
|
|
0x28, 0x1e, 0x60, 0x8a, 0x20,
|
|
|
0x1d, 0x10, 0x02, 0x03, 0x0f, 0x0c
|
|
|
};
|
|
|
-static const __u8 hv7131_sensor_init[][8] = {
|
|
|
+static const __u8 hv7131r_sensor_init[][8] = {
|
|
|
{0xc0, 0x11, 0x31, 0x38, 0x2a, 0x2e, 0x00, 0x10},
|
|
|
{0xa0, 0x11, 0x01, 0x08, 0x2a, 0x2e, 0x00, 0x10},
|
|
|
{0xb0, 0x11, 0x20, 0x00, 0xd0, 0x2e, 0x00, 0x10},
|
|
@@ -553,7 +569,8 @@ static const __u8 tas5130_sensor_init[][8] = {
|
|
|
};
|
|
|
|
|
|
static struct sensor_data sensor_data[] = {
|
|
|
-SENS(initHv7131, NULL, hv7131_sensor_init, NULL, NULL, 0, NO_EXPO|NO_FREQ, 0),
|
|
|
+SENS(initHv7131d, NULL, hv7131d_sensor_init, NULL, NULL, F_GAIN, NO_BRIGHTNESS|NO_FREQ, 0),
|
|
|
+SENS(initHv7131r, NULL, hv7131r_sensor_init, NULL, NULL, 0, NO_BRIGHTNESS|NO_EXPO|NO_FREQ, 0),
|
|
|
SENS(initOv6650, NULL, ov6650_sensor_init, NULL, NULL, F_GAIN|F_SIF, 0, 0x60),
|
|
|
SENS(initOv7630, initOv7630_3, ov7630_sensor_init, NULL, ov7630_sensor_init_3,
|
|
|
F_GAIN, 0, 0x21),
|
|
@@ -703,7 +720,18 @@ static void setsensorgain(struct gspca_dev *gspca_dev)
|
|
|
unsigned char gain = sd->gain;
|
|
|
|
|
|
switch (sd->sensor) {
|
|
|
+ case SENSOR_HV7131D: {
|
|
|
+ __u8 i2c[] =
|
|
|
+ {0xc0, 0x11, 0x31, 0x00, 0x00, 0x00, 0x00, 0x17};
|
|
|
+
|
|
|
+ i2c[3] = 0x3f - (sd->gain / 4);
|
|
|
+ i2c[4] = 0x3f - (sd->gain / 4);
|
|
|
+ i2c[5] = 0x3f - (sd->gain / 4);
|
|
|
|
|
|
+ if (i2c_w(gspca_dev, i2c) < 0)
|
|
|
+ goto err;
|
|
|
+ break;
|
|
|
+ }
|
|
|
case SENSOR_TAS5110C:
|
|
|
case SENSOR_TAS5110D: {
|
|
|
__u8 i2c[] =
|
|
@@ -790,6 +818,23 @@ static void setexposure(struct gspca_dev *gspca_dev)
|
|
|
struct sd *sd = (struct sd *) gspca_dev;
|
|
|
|
|
|
switch (sd->sensor) {
|
|
|
+ case SENSOR_HV7131D: {
|
|
|
+ /* Note the datasheet wrongly says line mode exposure uses reg
|
|
|
+ 0x26 and 0x27, testing has shown 0x25 + 0x26 */
|
|
|
+ __u8 i2c[] = {0xc0, 0x11, 0x25, 0x00, 0x00, 0x00, 0x00, 0x17};
|
|
|
+ /* The HV7131D's exposure goes from 0 - 65535, we scale our
|
|
|
+ exposure of 0-1023 to 0-6138. There are 2 reasons for this:
|
|
|
+ 1) This puts our exposure knee of 200 at approx the point
|
|
|
+ where the framerate starts dropping
|
|
|
+ 2) At 6138 the framerate has already dropped to 2 fps,
|
|
|
+ going any lower makes little sense */
|
|
|
+ __u16 reg = sd->exposure * 6;
|
|
|
+ i2c[3] = reg >> 8;
|
|
|
+ i2c[4] = reg & 0xff;
|
|
|
+ if (i2c_w(gspca_dev, i2c) != 0)
|
|
|
+ goto err;
|
|
|
+ break;
|
|
|
+ }
|
|
|
case SENSOR_TAS5110C:
|
|
|
case SENSOR_TAS5110D: {
|
|
|
/* register 19's high nibble contains the sn9c10x clock divider
|
|
@@ -1494,9 +1539,12 @@ static const struct usb_device_id device_table[] __devinitconst = {
|
|
|
#endif
|
|
|
{USB_DEVICE(0x0c45, 0x6028), SB(PAS202, 102)},
|
|
|
{USB_DEVICE(0x0c45, 0x6029), SB(PAS106, 102)},
|
|
|
+ {USB_DEVICE(0x0c45, 0x602a), SB(HV7131D, 102)},
|
|
|
+ /* {USB_DEVICE(0x0c45, 0x602b), SB(MI0343, 102)}, */
|
|
|
{USB_DEVICE(0x0c45, 0x602c), SB(OV7630, 102)},
|
|
|
{USB_DEVICE(0x0c45, 0x602d), SB(HV7131R, 102)},
|
|
|
{USB_DEVICE(0x0c45, 0x602e), SB(OV7630, 102)},
|
|
|
+ /* {USB_DEVICE(0x0c45, 0x602b), SB(MI03XX, 102)}, */ /* MI0343 MI0360 MI0330 */
|
|
|
{USB_DEVICE(0x0c45, 0x608f), SB(OV7630, 103)},
|
|
|
#if !defined CONFIG_USB_SN9C102 && !defined CONFIG_USB_SN9C102_MODULE
|
|
|
{USB_DEVICE(0x0c45, 0x60af), SB(PAS202, 103)},
|