Commit 9b71521b authored by Robert W. Boone's avatar Robert W. Boone Committed by Linus Torvalds

[PATCH] v4l: 686: change the number of lines in the input signal when the

- Change the number of lines in the input signal when the video standard is
  changed.

- Fix comments style.
Signed-off-by: default avatarRobert W. Boone <rboone@rtd.com>
Signed-off-by: default avatarNickolay V. Shmyrev <nshmyrev@yandex.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@brturbo.com.br>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 20f441f6
......@@ -57,6 +57,7 @@ struct saa6752hs_state {
struct i2c_client client;
struct v4l2_mpeg_compression params;
enum saa6752hs_videoformat video_format;
v4l2_std_id standard;
};
enum saa6752hs_command {
......@@ -74,58 +75,58 @@ enum saa6752hs_command {
/* ---------------------------------------------------------------------- */
static u8 PAT[] = {
0xc2, // i2c register
0x00, // table number for encoder
0xc2, /* i2c register */
0x00, /* table number for encoder */
0x47, // sync
0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0)
0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0)
0x47, /* sync */
0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */
0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
0x00, // PSI pointer to start of table
0x00, /* PSI pointer to start of table */
0x00, // tid(0)
0xb0, 0x0d, // section_syntax_indicator(1), section_length(13)
0x00, /* tid(0) */
0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */
0x00, 0x01, // transport_stream_id(1)
0x00, 0x01, /* transport_stream_id(1) */
0xc1, // version_number(0), current_next_indicator(1)
0xc1, /* version_number(0), current_next_indicator(1) */
0x00, 0x00, // section_number(0), last_section_number(0)
0x00, 0x00, /* section_number(0), last_section_number(0) */
0x00, 0x01, // program_number(1)
0x00, 0x01, /* program_number(1) */
0xe0, 0x00, // PMT PID
0xe0, 0x00, /* PMT PID */
0x00, 0x00, 0x00, 0x00 // CRC32
0x00, 0x00, 0x00, 0x00 /* CRC32 */
};
static u8 PMT[] = {
0xc2, // i2c register
0x01, // table number for encoder
0xc2, /* i2c register */
0x01, /* table number for encoder */
0x47, // sync
0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid
0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0)
0x47, /* sync */
0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */
0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
0x00, // PSI pointer to start of table
0x00, /* PSI pointer to start of table */
0x02, // tid(2)
0xb0, 0x17, // section_syntax_indicator(1), section_length(23)
0x02, /* tid(2) */
0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */
0x00, 0x01, // program_number(1)
0x00, 0x01, /* program_number(1) */
0xc1, // version_number(0), current_next_indicator(1)
0xc1, /* version_number(0), current_next_indicator(1) */
0x00, 0x00, // section_number(0), last_section_number(0)
0x00, 0x00, /* section_number(0), last_section_number(0) */
0xe0, 0x00, // PCR_PID
0xe0, 0x00, /* PCR_PID */
0xf0, 0x00, // program_info_length(0)
0xf0, 0x00, /* program_info_length(0) */
0x02, 0xe0, 0x00, 0xf0, 0x00, // video stream type(2), pid
0x04, 0xe0, 0x00, 0xf0, 0x00, // audio stream type(4), pid
0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */
0x00, 0x00, 0x00, 0x00 // CRC32
0x00, 0x00, 0x00, 0x00 /* CRC32 */
};
static struct v4l2_mpeg_compression param_defaults =
......@@ -166,7 +167,7 @@ static int saa6752hs_chip_command(struct i2c_client* client,
unsigned long timeout;
int status = 0;
// execute the command
/* execute the command */
switch(command) {
case SAA6752HS_COMMAND_RESET:
buf[0] = 0x00;
......@@ -200,11 +201,11 @@ static int saa6752hs_chip_command(struct i2c_client* client,
return -EINVAL;
}
// set it and wait for it to be so
/* set it and wait for it to be so */
i2c_master_send(client, buf, 1);
timeout = jiffies + HZ * 3;
for (;;) {
// get the current status
/* get the current status */
buf[0] = 0x10;
i2c_master_send(client, buf, 1);
i2c_master_recv(client, buf, 1);
......@@ -216,14 +217,12 @@ static int saa6752hs_chip_command(struct i2c_client* client,
break;
}
// wait a bit
msleep(10);
}
// delay a bit to let encoder settle
/* delay a bit to let encoder settle */
msleep(50);
// done
return status;
}
......@@ -233,44 +232,43 @@ static int saa6752hs_set_bitrate(struct i2c_client* client,
{
u8 buf[3];
// set the bitrate mode
/* set the bitrate mode */
buf[0] = 0x71;
buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1;
i2c_master_send(client, buf, 2);
// set the video bitrate
/* set the video bitrate */
if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) {
// set the target bitrate
/* set the target bitrate */
buf[0] = 0x80;
buf[1] = params->vi_bitrate.target >> 8;
buf[2] = params->vi_bitrate.target & 0xff;
i2c_master_send(client, buf, 3);
// set the max bitrate
/* set the max bitrate */
buf[0] = 0x81;
buf[1] = params->vi_bitrate.max >> 8;
buf[2] = params->vi_bitrate.max & 0xff;
i2c_master_send(client, buf, 3);
} else {
// set the target bitrate (no max bitrate for CBR)
/* set the target bitrate (no max bitrate for CBR) */
buf[0] = 0x81;
buf[1] = params->vi_bitrate.target >> 8;
buf[2] = params->vi_bitrate.target & 0xff;
i2c_master_send(client, buf, 3);
}
// set the audio bitrate
/* set the audio bitrate */
buf[0] = 0x94;
buf[1] = (256 == params->au_bitrate.target) ? 0 : 1;
i2c_master_send(client, buf, 2);
// set the total bitrate
/* set the total bitrate */
buf[0] = 0xb1;
buf[1] = params->st_bitrate.target >> 8;
buf[2] = params->st_bitrate.target & 0xff;
i2c_master_send(client, buf, 3);
// return success
return 0;
}
......@@ -376,36 +374,43 @@ static int saa6752hs_init(struct i2c_client* client)
h = i2c_get_clientdata(client);
// Set video format - must be done first as it resets other settings
/* Set video format - must be done first as it resets other settings */
buf[0] = 0x41;
buf[1] = h->video_format;
i2c_master_send(client, buf, 2);
// set bitrate
/* Set number of lines in input signal */
buf[0] = 0x40;
buf[1] = 0x00;
if (h->standard & V4L2_STD_525_60)
buf[1] = 0x01;
i2c_master_send(client, buf, 2);
/* set bitrate */
saa6752hs_set_bitrate(client, &h->params);
// Set GOP structure {3, 13}
/* Set GOP structure {3, 13} */
buf[0] = 0x72;
buf[1] = 0x03;
buf[2] = 0x0D;
i2c_master_send(client,buf,3);
// Set minimum Q-scale {4}
/* Set minimum Q-scale {4} */
buf[0] = 0x82;
buf[1] = 0x04;
i2c_master_send(client,buf,2);
// Set maximum Q-scale {12}
/* Set maximum Q-scale {12} */
buf[0] = 0x83;
buf[1] = 0x0C;
i2c_master_send(client,buf,2);
// Set Output Protocol
/* Set Output Protocol */
buf[0] = 0xD0;
buf[1] = 0x81;
i2c_master_send(client,buf,2);
// Set video output stream format {TS}
/* Set video output stream format {TS} */
buf[0] = 0xB0;
buf[1] = 0x05;
i2c_master_send(client,buf,2);
......@@ -436,39 +441,39 @@ static int saa6752hs_init(struct i2c_client* client)
localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF;
localPMT[sizeof(PMT) - 1] = crc & 0xFF;
// Set Audio PID
/* Set Audio PID */
buf[0] = 0xC1;
buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF;
buf[2] = h->params.ts_pid_audio & 0xFF;
i2c_master_send(client,buf,3);
// Set Video PID
/* Set Video PID */
buf[0] = 0xC0;
buf[1] = (h->params.ts_pid_video >> 8) & 0xFF;
buf[2] = h->params.ts_pid_video & 0xFF;
i2c_master_send(client,buf,3);
// Set PCR PID
/* Set PCR PID */
buf[0] = 0xC4;
buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF;
buf[2] = h->params.ts_pid_pcr & 0xFF;
i2c_master_send(client,buf,3);
// Send SI tables
/* Send SI tables */
i2c_master_send(client,localPAT,sizeof(PAT));
i2c_master_send(client,localPMT,sizeof(PMT));
// mute then unmute audio. This removes buzzing artefacts
/* mute then unmute audio. This removes buzzing artefacts */
buf[0] = 0xa4;
buf[1] = 1;
i2c_master_send(client, buf, 2);
buf[1] = 0;
i2c_master_send(client, buf, 2);
// start it going
/* start it going */
saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
// readout current state
/* readout current state */
buf[0] = 0xE1;
buf[1] = 0xA7;
buf[2] = 0xFE;
......@@ -477,7 +482,7 @@ static int saa6752hs_init(struct i2c_client* client)
i2c_master_send(client, buf, 5);
i2c_master_recv(client, buf2, 4);
// change aspect ratio
/* change aspect ratio */
buf[0] = 0xE0;
buf[1] = 0xA7;
buf[2] = 0xFE;
......@@ -498,7 +503,6 @@ static int saa6752hs_init(struct i2c_client* client)
buf[8] = buf2[3];
i2c_master_send(client, buf, 9);
// return success
return 0;
}
......@@ -516,6 +520,9 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
h->client.adapter = adap;
h->client.addr = addr;
/* Assume 625 input lines */
h->standard = 0;
i2c_set_clientdata(&h->client, h);
i2c_attach_client(&h->client);
return 0;
......@@ -576,6 +583,9 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
saa6752hs_set_subsampling(client, f);
break;
}
case VIDIOC_S_STD:
h->standard = *((v4l2_std_id *) arg);
break;
default:
/* nothing */
break;
......
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