Commit 3e3bf277 authored by Christopher Neufeld's avatar Christopher Neufeld Committed by Mauro Carvalho Chehab

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: default avatarChristopher Neufeld <television@cneufeld.ca>
Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 88ca8ed0
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
* *
* VBI support by Hans Verkuil <hverkuil@xs4all.nl>. * 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 * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 * 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, ...@@ -982,6 +985,7 @@ static int cx25840_detect_client(struct i2c_adapter *adapter, int address,
state->audclk_freq = 48000; state->audclk_freq = 48000;
state->pvr150_workaround = 0; state->pvr150_workaround = 0;
state->audmode = V4L2_TUNER_MODE_LANG1; state->audmode = V4L2_TUNER_MODE_LANG1;
state->vbi_line_offset = 8;
state->id = id; state->id = id;
if (state->is_cx25836) if (state->is_cx25836)
......
...@@ -40,6 +40,7 @@ struct cx25840_state { ...@@ -40,6 +40,7 @@ struct cx25840_state {
enum cx25840_audio_input aud_input; enum cx25840_audio_input aud_input;
u32 audclk_freq; u32 audclk_freq;
int audmode; int audmode;
int vbi_line_offset;
enum v4l2_chip_ident id; enum v4l2_chip_ident id;
int is_cx25836; int is_cx25836;
}; };
......
...@@ -84,6 +84,7 @@ static int decode_vps(u8 * dst, u8 * p) ...@@ -84,6 +84,7 @@ static int decode_vps(u8 * dst, u8 * p)
void cx25840_vbi_setup(struct i2c_client *client) void cx25840_vbi_setup(struct i2c_client *client)
{ {
struct cx25840_state *state = i2c_get_clientdata(client);
v4l2_std_id std = cx25840_get_v4lstd(client); v4l2_std_id std = cx25840_get_v4lstd(client);
if (std & ~V4L2_STD_NTSC) { if (std & ~V4L2_STD_NTSC) {
...@@ -117,6 +118,7 @@ void cx25840_vbi_setup(struct i2c_client *client) ...@@ -117,6 +118,7 @@ void cx25840_vbi_setup(struct i2c_client *client)
cx25840_write(client, 0x47e, 0x0a); cx25840_write(client, 0x47e, 0x0a);
cx25840_write(client, 0x47f, 0x01); cx25840_write(client, 0x47f, 0x01);
state->vbi_line_offset = 5;
} else { } else {
/* datasheet startup, step 8d */ /* datasheet startup, step 8d */
cx25840_write(client, 0x49f, 0x14); cx25840_write(client, 0x49f, 0x14);
...@@ -140,11 +142,13 @@ void cx25840_vbi_setup(struct i2c_client *client) ...@@ -140,11 +142,13 @@ void cx25840_vbi_setup(struct i2c_client *client)
cx25840_write(client, 0x47d, 0x7c); cx25840_write(client, 0x47d, 0x7c);
cx25840_write(client, 0x47e, 0x08); cx25840_write(client, 0x47e, 0x08);
cx25840_write(client, 0x47f, 0x00); cx25840_write(client, 0x47f, 0x00);
state->vbi_line_offset = 8;
} }
} }
int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) 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_format *fmt;
struct v4l2_sliced_vbi_format *svbi; struct v4l2_sliced_vbi_format *svbi;
...@@ -211,7 +215,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -211,7 +215,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
cx25840_vbi_setup(client); cx25840_vbi_setup(client);
/* Sliced VBI */ /* Sliced VBI */
cx25840_write(client, 0x404, 0x36); /* Ancillery data */ cx25840_write(client, 0x404, 0x32); /* Ancillary data */
cx25840_write(client, 0x406, 0x13); cx25840_write(client, 0x406, 0x13);
cx25840_write(client, 0x47f, vbi_offset); cx25840_write(client, 0x47f, vbi_offset);
...@@ -248,16 +252,26 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -248,16 +252,26 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
} }
} }
if (is_pal) {
for (x = 1, i = 0x424; i <= 0x434; i++, x++) { for (x = 1, i = 0x424; i <= 0x434; i++, x++) {
cx25840_write(client, i, lcr[6 + 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); cx25840_write(client, 0x43c, 0x16);
if (is_pal) { if (is_pal) {
cx25840_write(client, 0x474, 0x2a); cx25840_write(client, 0x474, 0x2a);
} else { } else {
cx25840_write(client, 0x474, 0x1a + 6); cx25840_write(client, 0x474, 0x22);
} }
break; break;
} }
...@@ -278,7 +292,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg) ...@@ -278,7 +292,7 @@ int cx25840_vbi(struct i2c_client *client, unsigned int cmd, void *arg)
id1 = p[-1]; id1 = p[-1];
id2 = p[0] & 0xf; id2 = p[0] & 0xf;
l = p[2] & 0x3f; l = p[2] & 0x3f;
l += 5; l += state->vbi_line_offset;
p += 4; p += 4;
switch (id2) { switch (id2) {
......
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