On Sun, Oct 20, 2002 at 01:05:11PM +0600, Cherry George Mathew wrote:
> Hello,
>
> I was wondering where to get info on the CLGD5446, like tech refs. A url
> would be great.
Tons of cirrus logic docs:
ftp://ftp.leo.org/pub/comp/general/devices/cirruslogic/pubs
They've got tech refs, etc.. (gd5446trm.pdf.gz, ...)
> I've a pixelview combo plus card with an ITTvpx3225d tuner
> attached to the GD5446 via i2c. Want the info in connection with writing a
> v4l driver.
There's a user space driver (no v4l) at:
http://users.actcom.co.il/~nahshon/linux-tv.html
It supports gd5446, gd5465, gd5480 and the CL-PX4072 pixel decoder.
I have an lgv-5480tvr card which uses gd5480, vpx3225d, and Samsung
TCPN9082DA27C NTSC tuner. A small patch to his driver got the card working
(assumes vpx3225d will only be used in NTSC mode).
The driver/program only supports overlay, no capture.
>
> Any general comments would also be welcome.
>
> Thanks in advance.
>
> George.
>
>
> --
>
> " And do not fear those who kill the body but cannot kill the soul.
> But rather fear Him who is able to destroy both soul and body in hell."
>
> Jesus of Nazareth.
>
> Cherry George Mathew,
> II/157, Thyparampil Veedu,
> Eraviperoor P.O
> Kerala,
> India 689542,
> Tel:+91-473-663982
> http://resumes.yahoo.com/berryplumis/myprofile/
>
>
>
> _______________________________________________
> Video4linux-list mailing list
> [EMAIL PROTECTED]
> https://listman.redhat.com/mailman/listinfo/video4linux-list
>
diff -Naur xtv/README.lgv-5480tvr xtv-patched2/README.lgv-5480tvr
--- xtv/README.lgv-5480tvr Wed Dec 31 19:00:00 1969
+++ xtv-patched2/README.lgv-5480tvr Sun Sep 22 08:41:01 2002
@@ -0,0 +1 @@
+xtvtap -i i5-lgv-5480tvr -geometry 640x480
diff -Naur xtv/i2c.c xtv-patched2/i2c.c
--- xtv/i2c.c Sat Nov 13 20:38:04 1999
+++ xtv-patched2/i2c.c Sun Sep 22 09:29:51 2002
@@ -308,6 +308,10 @@
fscanf(in, "%d %lf", &data, &freq);
SetPresetChannel(data, freq);
}
+ else if(!strcmp(cmd, "px0002")) {
+ fscanf(in, "%x", &data);
+ i2c_0002 = data;
+ }
else {
printf("Parser: syntax error at %s\n", cmd);
}
diff -Naur xtv/i5-lgv-5480tvr xtv-patched2/i5-lgv-5480tvr
--- xtv/i5-lgv-5480tvr Wed Dec 31 19:00:00 1969
+++ xtv-patched2/i5-lgv-5480tvr Sun Sep 22 09:31:49 2002
@@ -0,0 +1,172 @@
+# tuner 4 (samsung TCPN9082DA27C NTSC only tuner). Probe for I2C address.
+tuner 4 0
+
+# alternate address for px0002 (actually, I'm not even sure if it's a
+# px0002)
+px0002 0x4e
+
+# preset channels
+# These match the local cable channels on the local
+# You probably need to edit and fix this. A good start
+# is the file \WINDOWS\CHANNEL.INI which the Windows95
+# tv program is using.
+#
+# These are for NTSC USA CATV STD.
+# Taken from c:\WINDOWS\CHANNEL.INI that came with lgv-5480tvr
+ch 1 000.00
+ch 2 055.25
+ch 3 061.25
+ch 4 067.25
+ch 5 077.25
+ch 6 083.25
+ch 7 175.25
+ch 8 181.25
+ch 9 187.25
+ch 10 193.25
+ch 11 199.25
+ch 12 205.25
+ch 13 211.25
+ch 14 121.25
+ch 15 127.25
+ch 16 133.25
+ch 17 139.25
+ch 18 145.25
+ch 19 151.25
+ch 20 157.25
+ch 21 163.25
+ch 22 169.25
+ch 23 217.25
+ch 24 223.25
+ch 25 229.25
+ch 26 235.25
+ch 27 241.25
+ch 28 247.25
+ch 29 253.25
+ch 30 259.25
+ch 31 265.25
+ch 32 271.25
+ch 33 277.25
+ch 34 283.25
+ch 35 289.25
+ch 36 295.25
+ch 37 301.25
+ch 38 307.25
+ch 39 313.25
+ch 40 319.25
+ch 41 325.25
+ch 42 331.25
+ch 43 337.25
+ch 44 343.25
+ch 45 349.25
+ch 46 355.25
+ch 47 361.25
+ch 48 367.25
+ch 49 373.25
+ch 50 379.25
+ch 51 385.25
+ch 52 391.25
+ch 53 397.25
+ch 54 403.25
+ch 55 409.25
+ch 56 415.25
+ch 57 421.25
+ch 58 427.25
+ch 59 433.25
+ch 60 439.25
+ch 61 445.25
+ch 62 451.25
+ch 63 457.25
+ch 64 463.25
+ch 65 469.25
+ch 66 475.25
+ch 67 481.25
+ch 68 487.25
+ch 69 493.25
+ch 70 499.25
+ch 71 505.25
+ch 72 511.25
+ch 73 517.25
+ch 74 523.25
+ch 75 529.25
+ch 76 535.25
+ch 77 541.25
+ch 78 547.25
+ch 79 553.25
+ch 80 559.25
+ch 81 565.25
+ch 82 571.25
+ch 83 577.25
+ch 84 583.25
+ch 85 589.25
+ch 86 595.25
+ch 87 601.25
+ch 88 607.25
+ch 89 613.25
+ch 90 619.25
+ch 91 625.25
+ch 92 631.25
+ch 93 637.25
+ch 94 643.25
+ch 95 91.25
+ch 96 97.25
+ch 97 103.25
+ch 98 109.25
+ch 99 115.25
+ch 100 649.25
+ch 101 655.25
+ch 102 661.25
+ch 103 667.25
+ch 104 673.25
+ch 105 679.25
+ch 106 685.25
+ch 107 691.25
+ch 108 697.25
+ch 109 703.25
+ch 110 709.25
+ch 111 715.25
+ch 112 721.25
+ch 113 727.25
+ch 114 733.25
+ch 115 739.25
+ch 116 745.25
+ch 117 751.25
+ch 118 757.25
+ch 119 763.25
+ch 120 769.25
+ch 121 775.25
+ch 122 781.25
+ch 123 787.25
+ch 124 793.25
+ch 125 799.25
+
+# w2 - write to px0002 register
+# t - set tuner's initial channel
+w2 4 32
+w2 3 3a
+w2 3 38
+w2 3 38
+w2 4 36
+w2 3 38
+w2 3 38
+w2 3 38
+w2 4 32
+w2 2 0d
+w2 1 a0
+w2 2 0d
+w2 3 0
+w2 2 3d
+w2 3 8
+w2 4 3b
+
+w2 3 38
+w2 3 3a
+w2 3 3a
+
+w2 04 3b
+
+w2 4 33
+
+t 4
+
+w2 3 32
+w2 4 37
diff -Naur xtv/lgtvr xtv-patched2/lgtvr
--- xtv/lgtvr Wed Dec 31 19:00:00 1969
+++ xtv-patched2/lgtvr Sun Sep 29 06:38:22 2002
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+./xtvtap -i i5-lgv-5480tvr -geometry 640x480
+
diff -Naur xtv/px0002.c xtv-patched2/px0002.c
--- xtv/px0002.c Wed Nov 11 17:35:28 1998
+++ xtv-patched2/px0002.c Sun Sep 22 05:17:10 2002
@@ -39,8 +39,27 @@
void
set_mute(int mute) {
int val;
+
+ /*FIXME with lgv-5480tvr set_mute(0) doesn't work. Since this function
+ * is called after a channel switch in xwin.c, sound is lost.
+ */
+ if (i2c_0002 == 0x4e)
+ return;
+
val = i2c_read8(i2c_0002, 0x04);
val &= ~0x04;
if(!mute) val |= 0x04;
i2c_write8(i2c_0002, 0x04, val);
+}
+
+/*FIXME since I'm not using the above set_mute() function this is makes sure
+ * sound is turned off when the program exits.
+ */
+void
+audio_off(void) {
+ int val;
+
+ val = i2c_read8(i2c_0002, 0x04);
+ val &= ~0x04;
+ i2c_write8(i2c_0002, 0x04, val);
}
diff -Naur xtv/px4072.c xtv-patched2/px4072.c
--- xtv/px4072.c Mon Apr 12 06:31:27 1999
+++ xtv-patched2/px4072.c Tue Oct 8 03:40:13 2002
@@ -15,12 +15,21 @@
#include "xtv.h"
+#define VPX3225D 0x7230
+
int i2c_4072 = 0x86;
/* Hard limits for the 4072, PAL and the clocks used */
unsigned long max_width = 704; /* must be a multiple of 4 ! */
unsigned long max_height = 576;
+static unsigned decoderId = 0x0;
+
+static unsigned fpReadReg = 0x26;
+static unsigned fpWriteReg = 0x27;
+static unsigned fpDataReg = 0x28;
+static unsigned fpStatusReg = 0x29;
+
void
px4072_write_direct(unsigned reg, unsigned data) {
i2c_write8(i2c_4072, reg, data);
@@ -34,12 +43,12 @@
void
px4072_write_indirect(unsigned reg, unsigned data) {
unsigned status;
- status = i2c_read8(i2c_4072, 0x29);
+ status = i2c_read8(i2c_4072, fpStatusReg);
/* printf("stat = %x\n", status); */
- i2c_write16(i2c_4072, 0x27, reg);
- status = i2c_read8(i2c_4072, 0x29);
+ i2c_write16(i2c_4072, fpWriteReg, reg);
+ status = i2c_read8(i2c_4072, fpStatusReg);
/* printf("stat = %x\n", status); */
- i2c_write16(i2c_4072, 0x28, data);
+ i2c_write16(i2c_4072, fpDataReg, data);
}
@@ -47,12 +56,12 @@
px4072_read_indirect(unsigned reg) {
unsigned data, status;
- status = i2c_read8(i2c_4072, 0x29);
+ status = i2c_read8(i2c_4072, fpStatusReg);
/* printf("stat = %x\n", status); */
- i2c_write16(i2c_4072, 0x26, reg);
- status = i2c_read8(i2c_4072, 0x29);
+ i2c_write16(i2c_4072, fpReadReg, reg);
+ status = i2c_read8(i2c_4072, fpStatusReg);
/* printf("stat = %x\n", status); */
- data = i2c_read16(i2c_4072, 0x28);
+ data = i2c_read16(i2c_4072, fpDataReg);
return data;
}
@@ -77,17 +86,54 @@
h = lines-2*begin;
if(w > max_width)
w = max_width;
- px4072_write_indirect(0x8e, begin);
- px4072_write_indirect(0x8f, lines/2);
- px4072_write_indirect(0x90, h/2);
- px4072_write_indirect(0x91, 0);
- px4072_write_indirect(0x92, w);
- px4072_write_indirect(0x93, w);
- px4072_write_indirect(0xf0, 0x041);
+
+ switch (decoderId) {
+ case VPX3225D: //FIXME double check this
+ px4072_write_indirect (0x120, begin); /* window1 ver begin */
+ px4072_write_indirect (0x121, lines/2); /* w1 ver lines in */
+ px4072_write_indirect (0x122, h/2); /* w1 ver lines out */
+ px4072_write_indirect (0x123, 0); /* w1 horiz begin */
+ px4072_write_indirect (0x124, w); /* w1 horiz length */
+ px4072_write_indirect (0x125, w); /* w1 num of pixels */
+ //px4072_write_indirect (0x140, 0x060);
+ px4072_write_indirect (0x140, 0x020); /* latch window 1 */
+ break;
+ default:
+ px4072_write_indirect(0x8e, begin);
+ px4072_write_indirect(0x8f, lines/2);
+ px4072_write_indirect(0x90, h/2);
+ px4072_write_indirect(0x91, 0);
+ px4072_write_indirect(0x92, w);
+ px4072_write_indirect(0x93, w);
+ px4072_write_indirect(0xf0, 0x041);
+ break;
+ }
+}
+
+static void
+vpx3225d_Setsource (void) {
+ unsigned data;
+
+ data = px4072_read_indirect (0x20);
+
+ switch (videosource) {
+ case TUNER:
+ px4072_write_indirect (0x21, 0x001);
+ px4072_write_indirect (0x20, data & 0xfbf);
+ break;
+ case VCR: // svhs
+ px4072_write_indirect (0x21, 0x406);
+ px4072_write_indirect (0x20, data | 0x40);
+ break;
+ }
}
void
px4072_Setsource(void) {
+ if (decoderId == VPX3225D) {
+ vpx3225d_Setsource ();
+ return;
+ }
switch(videosource) {
case TUNER:
px4072_write_direct(0x33, 1);
@@ -101,6 +147,12 @@
void
px4072_Setcolorspace() {
int valE8;
+
+ if (decoderId == VPX3225D) {
+ /*FIXME */
+ return;
+ }
+
switch(colorspace) {
case RGB_565:
valE8 = 0x06;
@@ -124,8 +176,28 @@
px4072_write_direct(0xe8, valE8);
}
+static void
+vpx3225d_Setsystem (void) {
+ unsigned val;
+
+ /*FIXME */
+ switch (system) {
+ case NTSC:
+ default:
+ val = 0x001;
+ break;
+ }
+
+ px4072_write_indirect (0x150, val);
+}
+
void
px4072_Setsystem() {
+ if (decoderId == VPX3225D) {
+ vpx3225d_Setsystem ();
+ return;
+ }
+
switch(system) {
case NTSC:
px4072_write_indirect(0xf2, 0x13);
@@ -142,6 +214,36 @@
}
}
+void video_decoder_off (void)
+{
+ if (decoderId == VPX3225D) {
+ px4072_write_direct (0xF2, 0x00); // disable output
+ px4072_write_direct (0xAA, 0x03); // switch to low power mode
+ return;
+ }
+}
+
+static void
+vpx3225d_init (void) {
+ px4072_write_direct (0xAA, 0x00); // full power mode
+ //px4072_write_direct (0xF8, 0x24); //
+ //px4072_write_direct (0xF9, 0x20);
+ //AC px4072_write_direct (0xC8, 0); // 64 sync slicer disable
+
+ px4072_Setwindow(capW, capH);
+ vpx3225d_Setsystem ();
+ px4072_Setsource();
+
+ //px4072_write_indirect (0x22, 0); // start position of video active
+ //px4072_write_indirect (0x138, 0); // disable vbi window
+ px4072_write_indirect (0x12B, 0xc00); // disable window 2
+ px4072_write_indirect (0x126, 0x100); // peaking and coring
+
+ px4072_write_indirect (0x154, 0x200); // output multiplexer, set double
+ // clock
+ px4072_write_direct (0xF2, 0x0f); // enable output
+}
+
void
InitPX4072() {
int t1, t2;
@@ -156,15 +258,26 @@
px4072_read_direct(0x01);
printf("InitPX4072: videodecoder %02x %04x\n", t1, t2);
+ decoderId = t2;
switch(t2) {
case 0x4680:
case 0x4260:
case 0x4280:
+ case VPX3225D: /* 0x7230 */
+ fpReadReg = 0x36;
+ fpWriteReg = 0x37;
+ fpDataReg = 0x38;
+ fpStatusReg = 0x35;
break;
default:
fprintf(stderr, "Unsupported video decoder\n");
exit(1);
+ }
+
+ if (decoderId == VPX3225D) {
+ vpx3225d_init ();
+ return;
}
px4072_write_indirect(0x89, 0xc01);
diff -Naur xtv/tuner.c xtv-patched2/tuner.c
--- xtv/tuner.c Sat Jun 19 18:45:21 1999
+++ xtv-patched2/tuner.c Sun Sep 22 06:56:31 2002
@@ -44,6 +44,7 @@
{ 38.90, 48.25, 170.00, 450.00, 855.25 }, /* 1216 CCIR B/G */
{ 42.75, 55.25, 160.00, 454.00, 801.25 }, /* 1236 RTMA M/N */
{ 38.90, 45.75, 170.00, 450.00, 855.25 }, /* 1246 CCIR I */
+ { 45.75, 55.25, 169.25, 457.25, 855.25 }, /* samsung TCPN9082DA27C NTSC only
+*/
};
static int is_radio = 0;
diff -Naur xtv/xwin.c xtv-patched2/xwin.c
--- xtv/xwin.c Sat Nov 13 23:01:25 1999
+++ xtv-patched2/xwin.c Sun Sep 22 08:46:53 2002
@@ -326,6 +326,8 @@
case XK_q:
gd5480_off();
set_mute(1);
+ audio_off (); /*FIXME */
+ video_decoder_off ();
gd5480_restore();
exit(0);
break;