V4L/DVB (4050): Add NTSC sliced VBI support to the cx25840 module.
NTSC sliced VBI support by Christopher Neufeld <television@cneufeld.ca> with additional fixes by Hans Verkuil <hverkuil@xs4all.nl>. Signed-off-by: Christopher Neufeld <television@cneufeld.ca> Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
88ca8ed0b7
commit
3e3bf277f1
3 changed files with 24 additions and 5 deletions
|
@ -10,6 +10,9 @@
|
|||
*
|
||||
* VBI support by Hans Verkuil <hverkuil@xs4all.nl>.
|
||||
*
|
||||
* NTSC sliced VBI support by Christopher Neufeld <television@cneufeld.ca>
|
||||
* with additional fixes by Hans Verkuil <hverkuil@xs4all.nl>.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
|
@ -982,6 +985,7 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
|
|||
state->audclk_freq = 48000;
|
||||
state->pvr150_workaround = 0;
|
||||
state->audmode = V4L2_TUNER_MODE_LANG1;
|
||||
state->vbi_line_offset = 8;
|
||||
state->id = id;
|
||||
|
||||
if (state->is_cx25836)
|
||||
|
|
|
@ -40,6 +40,7 @@ struct cx25840_state {
|
|||
enum cx25840_audio_input aud_input;
|
||||
u32 audclk_freq;
|
||||
int audmode;
|
||||
int vbi_line_offset;
|
||||
enum v4l2_chip_ident id;
|
||||
int is_cx25836;
|
||||
};
|
||||
|
|
|
@ -84,6 +84,7 @@ static int decode_vps(u8 * dst, u8 * p)
|
|||
|
||||
void cx25840_vbi_setup(struct i2c_client *client)
|
||||
{
|
||||
struct cx25840_state *state = i2c_get_clientdata(client);
|
||||
v4l2_std_id std = cx25840_get_v4lstd(client);
|
||||
|
||||
if (std & ~V4L2_STD_NTSC) {
|
||||
|
@ -117,6 +118,7 @@ void cx25840_vbi_setup(struct i2c_client *client)
|
|||
|
||||
cx25840_write(client, 0x47e, 0x0a);
|
||||
cx25840_write(client, 0x47f, 0x01);
|
||||
state->vbi_line_offset = 5;
|
||||
} else {
|
||||
/* datasheet startup, step 8d */
|
||||
cx25840_write(client, 0x49f, 0x14);
|
||||
|
@ -140,11 +142,13 @@ void cx25840_vbi_setup(struct i2c_client *client)
|
|||
cx25840_write(client, 0x47d, 0x7c);
|
||||
cx25840_write(client, 0x47e, 0x08);
|
||||
cx25840_write(client, 0x47f, 0x00);
|
||||
state->vbi_line_offset = 8;
|
||||
}
|
||||
}
|
||||
|
||||
int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct cx25840_state *state = i2c_get_clientdata(client);
|
||||
struct v4l2_format *fmt;
|
||||
struct v4l2_sliced_vbi_format *svbi;
|
||||
|
||||
|
@ -211,7 +215,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
cx25840_vbi_setup(client);
|
||||
|
||||
/* Sliced VBI */
|
||||
cx25840_write(client, 0x404, 0x36); /* Ancillery data */
|
||||
cx25840_write(client, 0x404, 0x32); /* Ancillary data */
|
||||
cx25840_write(client, 0x406, 0x13);
|
||||
cx25840_write(client, 0x47f, vbi_offset);
|
||||
|
||||
|
@ -248,8 +252,18 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
}
|
||||
}
|
||||
|
||||
for (x = 1, i = 0x424; i <= 0x434; i++, x++) {
|
||||
cx25840_write(client, i, lcr[6 + x]);
|
||||
if (is_pal) {
|
||||
for (x = 1, i = 0x424; i <= 0x434; i++, x++) {
|
||||
cx25840_write(client, i, lcr[6 + x]);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (x = 1, i = 0x424; i <= 0x430; i++, x++) {
|
||||
cx25840_write(client, i, lcr[9 + x]);
|
||||
}
|
||||
for (i = 0x431; i <= 0x434; i++) {
|
||||
cx25840_write(client, i, 0);
|
||||
}
|
||||
}
|
||||
|
||||
cx25840_write(client, 0x43c, 0x16);
|
||||
|
@ -257,7 +271,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
if (is_pal) {
|
||||
cx25840_write(client, 0x474, 0x2a);
|
||||
} else {
|
||||
cx25840_write(client, 0x474, 0x1a + 6);
|
||||
cx25840_write(client, 0x474, 0x22);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -278,7 +292,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
|
|||
id1 = p[-1];
|
||||
id2 = p[0] & 0xf;
|
||||
l = p[2] & 0x3f;
|
||||
l += 5;
|
||||
l += state->vbi_line_offset;
|
||||
p += 4;
|
||||
|
||||
switch (id2) {
|
||||
|
|
Loading…
Reference in a new issue