Commit 3fccb774 authored by Jean-Francois Moine's avatar Jean-Francois Moine Committed by Mauro Carvalho Chehab

V4L/DVB (13303): gspca - sonixj: Change sensor and om6802 exchanges.

- the sensors are now initialized sooner
- om6802:
  . set some parameters in factory mode
  . lack of some parameters
  . gpio adjustments
Signed-off-by: default avatarJean-Francois Moine <moinejf@free.fr>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent a782636c
...@@ -574,7 +574,9 @@ static const u8 mt9v111_sensor_init[][8] = { ...@@ -574,7 +574,9 @@ static const u8 mt9v111_sensor_init[][8] = {
{0xb1, 0x5c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* digital zoom */ {0xb1, 0x5c, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x10}, /* digital zoom */
{0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, /* read mode */ {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, /* read mode */
{0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
/*******/ {}
};
static const u8 mt9v111_sensor_param1[][8] = {
{0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
{0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10}, {0xb1, 0x5c, 0x20, 0x00, 0x00, 0x00, 0x00, 0x10},
{0xb1, 0x5c, 0x09, 0x01, 0x2c, 0x00, 0x00, 0x10}, {0xb1, 0x5c, 0x09, 0x01, 0x2c, 0x00, 0x00, 0x10},
...@@ -587,11 +589,16 @@ static const u8 mt9v111_sensor_init[][8] = { ...@@ -587,11 +589,16 @@ static const u8 mt9v111_sensor_init[][8] = {
{0xb1, 0x5c, 0x35, 0x01, 0xc0, 0x00, 0x00, 0x10}, /* global gain */ {0xb1, 0x5c, 0x35, 0x01, 0xc0, 0x00, 0x00, 0x10}, /* global gain */
{} {}
}; };
static const u8 om6802_init0[2][8] = {
/*fixme: variable*/
{0xa0, 0x34, 0x29, 0x0e, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x23, 0xb0, 0x00, 0x00, 0x00, 0x10},
};
static const u8 om6802_sensor_init[][8] = { static const u8 om6802_sensor_init[][8] = {
{0xa0, 0x34, 0x90, 0x05, 0x00, 0x00, 0x00, 0x10}, {0xa0, 0x34, 0xdf, 0x6d, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x49, 0x85, 0x00, 0x00, 0x00, 0x10}, /* factory mode */
{0xa0, 0x34, 0x5a, 0xc0, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0xdd, 0x18, 0x00, 0x00, 0x00, 0x10}, {0xa0, 0x34, 0xdd, 0x18, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x5a, 0xc0, 0x00, 0x00, 0x00, 0x10},
/* {0xa0, 0x34, 0xfb, 0x11, 0x00, 0x00, 0x00, 0x10}, */ /* {0xa0, 0x34, 0xfb, 0x11, 0x00, 0x00, 0x00, 0x10}, */
{0xa0, 0x34, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x10}, {0xa0, 0x34, 0xf0, 0x04, 0x00, 0x00, 0x00, 0x10},
/* white balance & auto-exposure */ /* white balance & auto-exposure */
...@@ -614,11 +621,14 @@ static const u8 om6802_sensor_init[][8] = { ...@@ -614,11 +621,14 @@ static const u8 om6802_sensor_init[][8] = {
/* {0xa0, 0x34, 0xef, 0x00, 0x00, 0x00, 0x00, 0x10}, /* {0xa0, 0x34, 0xef, 0x00, 0x00, 0x00, 0x00, 0x10},
* auto frame rate */ * auto frame rate */
/* {0xa0, 0x34, 0xfb, 0xee, 0x00, 0x00, 0x00, 0x10}, */ /* {0xa0, 0x34, 0xfb, 0xee, 0x00, 0x00, 0x00, 0x10}, */
{0xa0, 0x34, 0x5d, 0x80, 0x00, 0x00, 0x00, 0x10},
/* {0xa0, 0x34, 0x71, 0x84, 0x00, 0x00, 0x00, 0x10}, */ {}
/* {0xa0, 0x34, 0x72, 0x05, 0x00, 0x00, 0x00, 0x10}, */ };
/* {0xa0, 0x34, 0x68, 0x80, 0x00, 0x00, 0x00, 0x10}, */ static const u8 om6802_sensor_param1[][8] = {
/* {0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10}, */ {0xa0, 0x34, 0x71, 0x84, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x72, 0x05, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x68, 0x80, 0x00, 0x00, 0x00, 0x10},
{0xa0, 0x34, 0x69, 0x01, 0x00, 0x00, 0x00, 0x10},
{} {}
}; };
static const u8 ov7630_sensor_init[][8] = { static const u8 ov7630_sensor_init[][8] = {
...@@ -704,7 +714,9 @@ static const u8 ov7648_sensor_init[][8] = { ...@@ -704,7 +714,9 @@ static const u8 ov7648_sensor_init[][8] = {
/* {0xd1, 0x21, 0x25, 0x80, 0x32, 0xfe, 0xa0, 0x10}, jfm done */ /* {0xd1, 0x21, 0x25, 0x80, 0x32, 0xfe, 0xa0, 0x10}, jfm done */
/* {0xd1, 0x21, 0x29, 0x00, 0x91, 0x00, 0x88, 0x10}, jfm done */ /* {0xd1, 0x21, 0x29, 0x00, 0x91, 0x00, 0x88, 0x10}, jfm done */
/* {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10}, set by setfreq */ /* {0xb1, 0x21, 0x2d, 0x85, 0x00, 0x00, 0x00, 0x10}, set by setfreq */
/*...*/ {}
};
static const u8 ov7648_sensor_param1[][8] = {
/* {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */ /* {0xa1, 0x21, 0x12, 0x08, 0x00, 0x00, 0x00, 0x10}, jfm done */
/* {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, * COMN /* {0xa1, 0x21, 0x75, 0x06, 0x00, 0x00, 0x00, 0x10}, * COMN
* set by setvflip */ * set by setvflip */
...@@ -786,8 +798,11 @@ static const u8 ov7660_sensor_init[][8] = { ...@@ -786,8 +798,11 @@ static const u8 ov7660_sensor_init[][8] = {
{0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */ {0xc1, 0x21, 0x88, 0xaf, 0xc7, 0xdf, 0x00, 0x10}, /* gamma curve */
{0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */ {0xc1, 0x21, 0x8b, 0x99, 0x99, 0xcf, 0x00, 0x10}, /* reserved */
{0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */ {0xb1, 0x21, 0x92, 0x00, 0x00, 0x00, 0x00, 0x10}, /* DM_LNL/H */
/* not in all ms-win traces*/
{0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x21, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x10},
/****** (some exchanges in the win trace) ******/ {}
};
static const u8 ov7660_sensor_param1[][8] = {
{0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */ {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, /* MVFP */
/* bits[3..0]reserved */ /* bits[3..0]reserved */
{0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x21, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x10},
...@@ -800,6 +815,7 @@ static const u8 ov7660_sensor_init[][8] = { ...@@ -800,6 +815,7 @@ static const u8 ov7660_sensor_init[][8] = {
{0xa1, 0x21, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10}, /* GAIN */ {0xa1, 0x21, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x10}, /* GAIN */
/* {0xb1, 0x21, 0x01, 0x78, 0x78, 0x00, 0x00, 0x10}, * BLUE */ /* {0xb1, 0x21, 0x01, 0x78, 0x78, 0x00, 0x00, 0x10}, * BLUE */
/****** (some exchanges in the win trace) ******/ /****** (some exchanges in the win trace) ******/
/*fixme:param2*/
{0xa1, 0x21, 0x93, 0x00, 0x00, 0x00, 0x00, 0x10},/* dummy line hight */ {0xa1, 0x21, 0x93, 0x00, 0x00, 0x00, 0x00, 0x10},/* dummy line hight */
{0xa1, 0x21, 0x92, 0x25, 0x00, 0x00, 0x00, 0x10}, /* dummy line low */ {0xa1, 0x21, 0x92, 0x25, 0x00, 0x00, 0x00, 0x10}, /* dummy line low */
{0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCH */ {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, /* EXHCH */
...@@ -807,6 +823,7 @@ static const u8 ov7660_sensor_init[][8] = { ...@@ -807,6 +823,7 @@ static const u8 ov7660_sensor_init[][8] = {
/* {0xa1, 0x21, 0x02, 0x90, 0x00, 0x00, 0x00, 0x10}, * RED */ /* {0xa1, 0x21, 0x02, 0x90, 0x00, 0x00, 0x00, 0x10}, * RED */
/****** (some exchanges in the win trace) ******/ /****** (some exchanges in the win trace) ******/
/******!! startsensor KO if changed !!****/ /******!! startsensor KO if changed !!****/
/*fixme: param3*/
{0xa1, 0x21, 0x93, 0x01, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x21, 0x93, 0x01, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x21, 0x92, 0xff, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x21, 0x92, 0xff, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x21, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x10},
...@@ -886,7 +903,9 @@ static const u8 sp80708_sensor_init[][8] = { ...@@ -886,7 +903,9 @@ static const u8 sp80708_sensor_init[][8] = {
{0xa1, 0x18, 0x67, 0x24, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x67, 0x24, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x18, 0x68, 0x08, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x68, 0x08, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x18, 0x2f, 0xc9, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x2f, 0xc9, 0x00, 0x00, 0x00, 0x10},
/********/ {}
};
static const u8 sp80708_sensor_param1[][8] = {
{0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x0c, 0x04, 0x00, 0x00, 0x00, 0x10},
{0xa1, 0x18, 0x03, 0x01, 0x00, 0x00, 0x00, 0x10}, {0xa1, 0x18, 0x03, 0x01, 0x00, 0x00, 0x00, 0x10},
...@@ -1125,7 +1144,7 @@ static void mi0360_probe(struct gspca_dev *gspca_dev) ...@@ -1125,7 +1144,7 @@ static void mi0360_probe(struct gspca_dev *gspca_dev)
} }
} }
static void configure_gpio(struct gspca_dev *gspca_dev, static void bridge_init(struct gspca_dev *gspca_dev,
const u8 *sn9c1xx) const u8 *sn9c1xx)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
...@@ -1166,10 +1185,22 @@ static void configure_gpio(struct gspca_dev *gspca_dev, ...@@ -1166,10 +1185,22 @@ static void configure_gpio(struct gspca_dev *gspca_dev,
reg_w1(gspca_dev, 0x01, 0x40); reg_w1(gspca_dev, 0x01, 0x40);
break; break;
case SENSOR_OM6802: case SENSOR_OM6802:
reg_w1(gspca_dev, 0x02, 0x71); msleep(10);
reg_w1(gspca_dev, 0x01, 0x42); reg_w1(gspca_dev, 0x02, 0x73);
reg_w1(gspca_dev, 0x17, 0x60);
reg_w1(gspca_dev, 0x01, 0x22);
msleep(100);
reg_w1(gspca_dev, 0x01, 0x62);
reg_w1(gspca_dev, 0x17, 0x64);
reg_w1(gspca_dev, 0x17, 0x64); reg_w1(gspca_dev, 0x17, 0x64);
reg_w1(gspca_dev, 0x01, 0x42); reg_w1(gspca_dev, 0x01, 0x42);
msleep(10);
reg_w1(gspca_dev, 0x01, 0x42);
i2c_w8(gspca_dev, om6802_init0[0]);
i2c_w8(gspca_dev, om6802_init0[1]);
msleep(15);
reg_w1(gspca_dev, 0x02, 0x71);
msleep(150);
break; break;
case SENSOR_OV7630: case SENSOR_OV7630:
reg_w1(gspca_dev, 0x01, 0x61); reg_w1(gspca_dev, 0x01, 0x61);
...@@ -1639,8 +1670,9 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1639,8 +1670,9 @@ static int sd_start(struct gspca_dev *gspca_dev)
{ {
struct sd *sd = (struct sd *) gspca_dev; struct sd *sd = (struct sd *) gspca_dev;
int i; int i;
u8 reg1, reg17; u8 reg1, reg2, reg17;
const u8 *sn9c1xx; const u8 *sn9c1xx;
const u8 (*init)[8];
int mode; int mode;
static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
...@@ -1656,8 +1688,25 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1656,8 +1688,25 @@ static int sd_start(struct gspca_dev *gspca_dev)
0x21); /* JPEG 422 */ 0x21); /* JPEG 422 */
jpeg_set_qual(sd->jpeg_hdr, sd->quality); jpeg_set_qual(sd->jpeg_hdr, sd->quality);
sn9c1xx = sn_tb[(int) sd->sensor]; /* initialize the bridge */
configure_gpio(gspca_dev, sn9c1xx); sn9c1xx = sn_tb[sd->sensor];
bridge_init(gspca_dev, sn9c1xx);
/* initialize the sensor */
i2c_w_seq(gspca_dev, sensor_init[sd->sensor]);
switch (sd->sensor) {
case SENSOR_OM6802:
reg2 = 0x71;
break;
case SENSOR_SP80708:
reg2 = 0x62;
break;
default:
reg2 = 0x40;
break;
}
reg_w1(gspca_dev, 0x02, reg2);
reg_w1(gspca_dev, 0x02, reg2);
reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]); reg_w1(gspca_dev, 0x15, sn9c1xx[0x15]);
reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]); reg_w1(gspca_dev, 0x16, sn9c1xx[0x16]);
...@@ -1704,6 +1753,10 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1704,6 +1753,10 @@ static int sd_start(struct gspca_dev *gspca_dev)
reg_w1(gspca_dev, 0x9a, 0x07); reg_w1(gspca_dev, 0x9a, 0x07);
reg_w1(gspca_dev, 0x99, 0x59); reg_w1(gspca_dev, 0x99, 0x59);
break; break;
case SENSOR_OM6802:
reg_w1(gspca_dev, 0x9a, 0x08);
reg_w1(gspca_dev, 0x99, 0x10);
break;
case SENSOR_OV7648: case SENSOR_OV7648:
reg_w1(gspca_dev, 0x9a, 0x0a); reg_w1(gspca_dev, 0x9a, 0x0a);
reg_w1(gspca_dev, 0x99, 0x60); reg_w1(gspca_dev, 0x99, 0x60);
...@@ -1719,9 +1772,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1719,9 +1772,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
break; break;
} }
/* initialize the sensor */ reg_w(gspca_dev, 0x84, reg84, sizeof reg84);
i2c_w_seq(gspca_dev, sensor_init[sd->sensor]); reg_w1(gspca_dev, 0x05, sn9c1xx[5]); /* red */
reg_w1(gspca_dev, 0x07, sn9c1xx[7]); /* green */
reg_w1(gspca_dev, 0x06, sn9c1xx[6]); /* blue */
init = NULL;
mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
if (mode) if (mode)
reg1 = 0x46; /* 320x240: clk 48Mhz, video trf enable */ reg1 = 0x46; /* 320x240: clk 48Mhz, video trf enable */
...@@ -1739,6 +1795,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1739,6 +1795,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
} }
break; break;
case SENSOR_MT9V111: case SENSOR_MT9V111:
init = mt9v111_sensor_param1;
if (mode) { if (mode) {
reg1 = 0x04; /* 320 clk 48Mhz */ reg1 = 0x04; /* 320 clk 48Mhz */
} else { } else {
...@@ -1747,6 +1804,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1747,6 +1804,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
} }
break; break;
case SENSOR_OM6802: case SENSOR_OM6802:
init = om6802_sensor_param1;
reg17 = 0x64; /* 640 MCKSIZE */ reg17 = 0x64; /* 640 MCKSIZE */
break; break;
case SENSOR_OV7630: case SENSOR_OV7630:
...@@ -1755,10 +1813,12 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1755,10 +1813,12 @@ static int sd_start(struct gspca_dev *gspca_dev)
reg1 = 0x44; reg1 = 0x44;
break; break;
case SENSOR_OV7648: case SENSOR_OV7648:
init = ov7648_sensor_param1;
reg17 = 0x21; reg17 = 0x21;
/* reg1 = 0x42; * 42 - 46? */ /* reg1 = 0x42; * 42 - 46? */
break; break;
case SENSOR_OV7660: case SENSOR_OV7660:
init = ov7660_sensor_param1;
if (sd->bridge == BRIDGE_SN9C120) { if (sd->bridge == BRIDGE_SN9C120) {
if (mode) { /* 320x240 - 160x120 */ if (mode) { /* 320x240 - 160x120 */
reg17 = 0xa2; reg17 = 0xa2;
...@@ -1772,6 +1832,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1772,6 +1832,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
break; break;
default: default:
/* case SENSOR_SP80708: */ /* case SENSOR_SP80708: */
init = sp80708_sensor_param1;
if (mode) { if (mode) {
/*?? reg1 = 0x04; * 320 clk 48Mhz */ /*?? reg1 = 0x04; * 320 clk 48Mhz */
} else { } else {
...@@ -1780,6 +1841,13 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1780,6 +1841,13 @@ static int sd_start(struct gspca_dev *gspca_dev)
} }
break; break;
} }
/* more sensor initialization - param1 */
if (init != NULL) {
i2c_w_seq(gspca_dev, init);
/* init = NULL; */
}
reg_w(gspca_dev, 0xc0, C0, 6); reg_w(gspca_dev, 0xc0, C0, 6);
reg_w(gspca_dev, 0xca, CA, 4); reg_w(gspca_dev, 0xca, CA, 4);
switch (sd->sensor) { switch (sd->sensor) {
...@@ -1794,6 +1862,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1794,6 +1862,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
break; break;
} }
/* here change size mode 0 -> VGA; 1 -> CIF */ /* here change size mode 0 -> VGA; 1 -> CIF */
sd->reg18 = sn9c1xx[0x18] | (mode << 4) | 0x40; sd->reg18 = sn9c1xx[0x18] | (mode << 4) | 0x40;
reg_w1(gspca_dev, 0x18, sd->reg18); reg_w1(gspca_dev, 0x18, sd->reg18);
...@@ -1801,6 +1870,7 @@ static int sd_start(struct gspca_dev *gspca_dev) ...@@ -1801,6 +1870,7 @@ static int sd_start(struct gspca_dev *gspca_dev)
reg_w1(gspca_dev, 0x17, reg17); reg_w1(gspca_dev, 0x17, reg17);
reg_w1(gspca_dev, 0x01, reg1); reg_w1(gspca_dev, 0x01, reg1);
switch (sd->sensor) { switch (sd->sensor) {
case SENSOR_OV7630: case SENSOR_OV7630:
setvflip(sd); setvflip(sd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment