mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 21:26:44 +07:00
V4L/DVB (8674): gspca: Webcam 0c45:612e added in sonixj.
Signed-off-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
285a4f6c8e
commit
6ab0b174d2
@ -55,8 +55,9 @@ struct sd {
|
||||
#define SENSOR_MI0360 1
|
||||
#define SENSOR_MO4000 2
|
||||
#define SENSOR_OM6802 3
|
||||
#define SENSOR_OV7648 4
|
||||
#define SENSOR_OV7660 5
|
||||
#define SENSOR_OV7630 4
|
||||
#define SENSOR_OV7648 5
|
||||
#define SENSOR_OV7660 6
|
||||
unsigned char i2c_base;
|
||||
};
|
||||
|
||||
@ -195,6 +196,17 @@ static const __u8 sn_om6802[] = {
|
||||
0xf7
|
||||
};
|
||||
|
||||
static const __u8 sn_ov7630[] = {
|
||||
/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
|
||||
0x00, 0x21, 0x40, 0x00, 0x1a, 0x20, 0x1f, 0x20,
|
||||
/* reg8 reg9 rega regb regc regd rege regf */
|
||||
0xa1, 0x21, 0x76, 0x21, 0x00, 0x00, 0x00, 0x10,
|
||||
/* reg10 reg11 reg12 reg13 reg14 reg15 reg16 reg17 */
|
||||
0x03, 0x00, 0x04, 0x01, 0x0a, 0x28, 0x1e, 0xc2,
|
||||
/* reg18 reg19 reg1a reg1b reg1c reg1d reg1e reg1f */
|
||||
0x0b, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
static const __u8 sn_ov7648[] = {
|
||||
/* reg0 reg1 reg2 reg3 reg4 reg5 reg6 reg7 */
|
||||
0x00, 0x21, 0x62, 0x00, 0x1a, 0x20, 0x20, 0x20,
|
||||
@ -223,6 +235,7 @@ static const __u8 *sn_tb[] = {
|
||||
sn_mi0360,
|
||||
sn_mo4000,
|
||||
sn_om6802,
|
||||
sn_ov7630,
|
||||
sn_ov7648,
|
||||
sn_ov7660
|
||||
};
|
||||
@ -390,6 +403,56 @@ static __u8 om6802_sensor_init[][8] = {
|
||||
/* {0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10}, */
|
||||
{}
|
||||
};
|
||||
static const __u8 ov7630_sensor_init[][8] = {
|
||||
{0xa1, 0x21, 0x76, 0x01, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
|
||||
/* win: delay 20ms */
|
||||
{0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x12, 0xc8, 0x00, 0x00, 0x00, 0x10},
|
||||
/* win: delay 20ms */
|
||||
{0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
|
||||
/* win: loop on 2 wwrite, 1 read */
|
||||
{0xd1, 0x21, 0x03, 0x80, 0x10, 0x20, 0x80, 0x10},
|
||||
{0xb1, 0x21, 0x0c, 0x20, 0x20, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x11, 0x00, 0x48, 0xc0, 0x00, 0x10},
|
||||
{0xb1, 0x21, 0x15, 0x80, 0x03, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
|
||||
{0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x1f, 0x00, 0x80, 0x80, 0x80, 0x10},
|
||||
{0xd1, 0x21, 0x23, 0xde, 0x10, 0x8a, 0xa0, 0x10},
|
||||
{0xc1, 0x21, 0x27, 0xca, 0xa2, 0x74, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x2a, 0x88, 0x00, 0x88, 0x01, 0x10},
|
||||
{0xc1, 0x21, 0x2e, 0x80, 0x00, 0x18, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x21, 0x08, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x22, 0x00, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xb1, 0x21, 0x32, 0xc2, 0x08, 0x00, 0x00, 0x10},
|
||||
{0xb1, 0x21, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x60, 0x05, 0x40, 0x12, 0x57, 0x10},
|
||||
{0xa1, 0x21, 0x64, 0x73, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x65, 0x00, 0x55, 0x01, 0xac, 0x10},
|
||||
{0xa1, 0x21, 0x69, 0x38, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x6f, 0x1f, 0x01, 0x00, 0x10, 0x10},
|
||||
{0xd1, 0x21, 0x73, 0x50, 0x20, 0x02, 0x01, 0x10},
|
||||
{0xd1, 0x21, 0x77, 0xf3, 0x90, 0x98, 0x98, 0x10},
|
||||
{0xc1, 0x21, 0x7b, 0x00, 0x4c, 0xf7, 0x00, 0x10},
|
||||
{0xd1, 0x21, 0x17, 0x1b, 0xbd, 0x05, 0xf6, 0x10},
|
||||
{0xa1, 0x21, 0x1b, 0x04, 0x00, 0x00, 0x00, 0x10},
|
||||
/* */
|
||||
{0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x12, 0x48, 0x00, 0x00, 0x00, 0x10},
|
||||
/*fixme: + 0x12, 0x04*/
|
||||
{0xa1, 0x21, 0x75, 0x82, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x10, 0x32, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xb1, 0x21, 0x01, 0x80, 0x80, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x11, 0x00, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x2a, 0x88, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x2b, 0x34, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xa1, 0x21, 0x10, 0x83, 0x00, 0x00, 0x00, 0x10},
|
||||
{0xb1, 0x21, 0x01, 0x88, 0x70, 0x00, 0x00, 0x10},
|
||||
{}
|
||||
};
|
||||
static const __u8 ov7660_sensor_init[][8] = {
|
||||
{0xa1, 0x21, 0x12, 0x80, 0x00, 0x00, 0x00, 0x10}, /* reset SCCB */
|
||||
/* (delay 20ms) */
|
||||
@ -803,6 +866,19 @@ static void om6802_InitSensor(struct gspca_dev *gspca_dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void ov7630_InitSensor(struct gspca_dev *gspca_dev)
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
i2c_w8(gspca_dev, ov7630_sensor_init[i]);
|
||||
i++;
|
||||
msleep(20);
|
||||
while (ov7630_sensor_init[i][0]) {
|
||||
i2c_w8(gspca_dev, ov7630_sensor_init[i]);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
static void ov7648_InitSensor(struct gspca_dev *gspca_dev)
|
||||
{
|
||||
int i = 0;
|
||||
@ -1060,8 +1136,8 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
||||
static const __u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
|
||||
static const __u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
|
||||
static const __u8 CE[] = { 0x32, 0xdd, 0x2d, 0xdd }; /* MI0360 */
|
||||
static const __u8 CE_sn9c325[] =
|
||||
{ 0x32, 0xdd, 0x32, 0xdd }; /* OV7648 - SN9C325 */
|
||||
static const __u8 CE_ov76xx[] =
|
||||
{ 0x32, 0xdd, 0x32, 0xdd }; /* OV7630/48 */
|
||||
|
||||
sn9c1xx = sn_tb[(int) sd->sensor];
|
||||
configure_gpio(gspca_dev, sn9c1xx);
|
||||
@ -1079,10 +1155,17 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
||||
reg_w1(gspca_dev, 0xc8, 0x50);
|
||||
reg_w1(gspca_dev, 0xc9, 0x3c);
|
||||
reg_w1(gspca_dev, 0x18, sn9c1xx[0x18]);
|
||||
switch (sd->bridge) {
|
||||
case BRIDGE_SN9C325:
|
||||
switch (sd->sensor) {
|
||||
case SENSOR_OV7630:
|
||||
reg17 = 0xe2;
|
||||
break;
|
||||
case SENSOR_OV7648:
|
||||
reg17 = 0xae;
|
||||
break;
|
||||
/*jfm: from win trace */
|
||||
case SENSOR_OV7660:
|
||||
reg17 = 0xa0;
|
||||
break;
|
||||
default:
|
||||
reg17 = 0x60;
|
||||
break;
|
||||
@ -1138,6 +1221,11 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
||||
om6802_InitSensor(gspca_dev);
|
||||
reg17 = 0x64; /* 640 MCKSIZE */
|
||||
break;
|
||||
case SENSOR_OV7630:
|
||||
ov7630_InitSensor(gspca_dev);
|
||||
reg17 = 0xe2;
|
||||
reg1 = 0x40;
|
||||
break;
|
||||
case SENSOR_OV7648:
|
||||
ov7648_InitSensor(gspca_dev);
|
||||
reg17 = 0xa2;
|
||||
@ -1162,9 +1250,10 @@ static void sd_start(struct gspca_dev *gspca_dev)
|
||||
}
|
||||
reg_w(gspca_dev, 0xc0, C0, 6);
|
||||
reg_w(gspca_dev, 0xca, CA, 4);
|
||||
switch (sd->bridge) {
|
||||
case BRIDGE_SN9C325:
|
||||
reg_w(gspca_dev, 0xce, CE_sn9c325, 4);
|
||||
switch (sd->sensor) {
|
||||
case SENSOR_OV7630:
|
||||
case SENSOR_OV7648:
|
||||
reg_w(gspca_dev, 0xce, CE_ov76xx, 4);
|
||||
break;
|
||||
default:
|
||||
reg_w(gspca_dev, 0xce, CE, 4);
|
||||
@ -1208,6 +1297,7 @@ static void sd_stopN(struct gspca_dev *gspca_dev)
|
||||
i2c_w8(gspca_dev, stopmi0360);
|
||||
data = 0x29;
|
||||
break;
|
||||
case SENSOR_OV7630:
|
||||
case SENSOR_OV7648:
|
||||
data = 0x29;
|
||||
break;
|
||||
@ -1503,7 +1593,7 @@ static const __devinitdata struct usb_device_id device_table[] = {
|
||||
/*bw600.inf:*/
|
||||
{USB_DEVICE(0x0c45, 0x612a), BSI(SN9C110, OV7648, 0x21)}, /*sn9c325?*/
|
||||
{USB_DEVICE(0x0c45, 0x612c), BSI(SN9C110, MO4000, 0x21)},
|
||||
/* {USB_DEVICE(0x0c45, 0x612e), BSI(SN9C110, OV7630, 0x??)}, */
|
||||
{USB_DEVICE(0x0c45, 0x612e), BSI(SN9C110, OV7630, 0x21)},
|
||||
/* {USB_DEVICE(0x0c45, 0x612f), BSI(SN9C110, ICM105C, 0x??)}, */
|
||||
#ifndef CONFIG_USB_SN9C102
|
||||
{USB_DEVICE(0x0c45, 0x6130), BSI(SN9C120, MI0360, 0x5d)},
|
||||
|
Loading…
Reference in New Issue
Block a user