V4L/DVB (11404): gspca - m5602-s5k4aa: Add start function and VGA resolution init.

Signed-off-by: Erik Andr?n <erik.andren@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Erik Andr?n 2008-12-26 12:57:42 -03:00 committed by Mauro Carvalho Chehab
parent 148d0b8deb
commit ad567ec235
2 changed files with 104 additions and 0 deletions

View File

@ -123,6 +123,49 @@ int s5k4aa_probe(struct sd *sd)
return 0;
}
int s5k4aa_start(struct sd *sd)
{
int i, err = 0;
u8 data[2];
struct cam *cam = &sd->gspca_dev.cam;
switch (cam->cam_mode[sd->gspca_dev.curr_mode].width)
{
case 640:
PDEBUG(D_V4L2, "Configuring camera for VGA mode");
for (i = 0; i < ARRAY_SIZE(VGA_s5k4aa); i++) {
switch (VGA_s5k4aa[i][0]) {
case BRIDGE:
err = m5602_write_bridge(sd,
VGA_s5k4aa[i][1],
VGA_s5k4aa[i][2]);
break;
case SENSOR:
data[0] = VGA_s5k4aa[i][2];
err = m5602_write_sensor(sd,
VGA_s5k4aa[i][1],
data, 1);
break;
case SENSOR_LONG:
data[0] = VGA_s5k4aa[i][2];
data[1] = VGA_s5k4aa[i][3];
err = m5602_write_sensor(sd,
VGA_s5k4aa[i][1],
data, 2);
break;
default:
err("Invalid stream command, exiting init");
return -EINVAL;
}
}
}
return err;
}
int s5k4aa_init(struct sd *sd)
{
int i, err = 0;

View File

@ -65,6 +65,7 @@ extern int dump_sensor;
int s5k4aa_probe(struct sd *sd);
int s5k4aa_init(struct sd *sd);
int s5k4aa_start(struct sd *sd);
int s5k4aa_power_down(struct sd *sd);
int s5k4aa_get_exposure(struct gspca_dev *gspca_dev, __s32 *val);
@ -80,6 +81,7 @@ static struct m5602_sensor s5k4aa = {
.name = "S5K4AA",
.probe = s5k4aa_probe,
.init = s5k4aa_init,
.start = s5k4aa_start,
.power_down = s5k4aa_power_down,
.i2c_slave_id = 0x5a,
.i2c_regW = 2,
@ -329,4 +331,63 @@ static const unsigned char init_s5k4aa[][4] =
{SENSOR, S5K4AA_GAIN_2, 0xa0, 0x00}
};
static const unsigned char VGA_s5k4aa[][4] =
{
{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x06, 0x00},
{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xb0, 0x00},
{BRIDGE, M5602_XB_ADC_CTRL, 0xc0, 0x00},
{BRIDGE, M5602_XB_SENSOR_TYPE, 0x08, 0x00},
{BRIDGE, M5602_XB_LINE_OF_FRAME_H, 0x81, 0x00},
{BRIDGE, M5602_XB_PIX_OF_LINE_H, 0x82, 0x00},
{BRIDGE, M5602_XB_SIG_INI, 0x01, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
/* VSYNC_PARA, VSYNC_PARA : img height 480 = 0x01e0 */
{BRIDGE, M5602_XB_VSYNC_PARA, 0x01, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0xe0, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_VSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_SIG_INI, 0x00, 0x00},
{BRIDGE, M5602_XB_SIG_INI, 0x02, 0x00},
{BRIDGE, M5602_XB_HSYNC_PARA, 0x00, 0x00},
{BRIDGE, M5602_XB_HSYNC_PARA, 0x00, 0x00},
/* HSYNC_PARA, HSYNC_PARA : img width 640 = 0x0280 */
{BRIDGE, M5602_XB_HSYNC_PARA, 0x02, 0x00},
{BRIDGE, M5602_XB_HSYNC_PARA, 0x80, 0x00},
{BRIDGE, M5602_XB_SIG_INI, 0x00, 0x00},
{BRIDGE, M5602_XB_SEN_CLK_DIV, 0x00, 0x00},
{BRIDGE, M5602_XB_SEN_CLK_CTRL, 0xa0, 0x00}, /* 48 MHz */
{SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
{SENSOR, S5K4AA_READ_MODE, S5K4AA_RM_H_FLIP | S5K4AA_RM_ROW_SKIP_2X
| S5K4AA_RM_COL_SKIP_2X, 0x00},
/* 0x37 : Fix image stability when light is too bright and improves
* image quality in 640x480, but worsens it in 1280x1024 */
{SENSOR, 0x37, 0x01, 0x00},
/* ROWSTART_HI, ROWSTART_LO : 10 + (1024-960)/2 = 42 = 0x002a */
{SENSOR, S5K4AA_ROWSTART_HI, 0x00, 0x00},
{SENSOR, S5K4AA_ROWSTART_LO, 0x2a, 0x00},
{SENSOR, S5K4AA_COLSTART_HI, 0x00, 0x00},
{SENSOR, S5K4AA_COLSTART_LO, 0x0c, 0x00},
/* window_height_hi, window_height_lo : 960 = 0x03c0 */
{SENSOR, S5K4AA_WINDOW_HEIGHT_HI, 0x03, 0x00},
{SENSOR, S5K4AA_WINDOW_HEIGHT_LO, 0xc0, 0x00},
/* window_width_hi, window_width_lo : 1280 = 0x0500 */
{SENSOR, S5K4AA_WINDOW_WIDTH_HI, 0x05, 0x00},
{SENSOR, S5K4AA_WINDOW_WIDTH_LO, 0x00, 0x00},
{SENSOR, S5K4AA_H_BLANK_HI__, 0x00, 0x00},
{SENSOR, S5K4AA_H_BLANK_LO__, 0xa8, 0x00}, /* helps to sync... */
{SENSOR, S5K4AA_EXPOSURE_HI, 0x01, 0x00},
{SENSOR, S5K4AA_EXPOSURE_LO, 0x00, 0x00},
{SENSOR, 0x11, 0x04, 0x00},
{SENSOR, 0x12, 0xc3, 0x00},
{SENSOR, S5K4AA_PAGE_MAP, 0x02, 0x00},
{SENSOR, 0x02, 0x0e, 0x00},
{SENSOR_LONG, S5K4AA_GLOBAL_GAIN__, 0x0f, 0x00},
{SENSOR, S5K4AA_GAIN_1, 0x0b, 0x00},
{SENSOR, S5K4AA_GAIN_2, 0xa0, 0x00}
};
#endif