[linux-dvb] pinnacle pctv310i

Gabriele Verzeletti gabriele at verzeletti.org
Wed Feb 15 11:05:00 CET 2006

I'm trying to make my "pinnacle pctv310i" work.
I noticed many are managing to do the same, so I decided to share the results I've been able to obtain so far.
At the moment only non-digital TV signal works.
On the card are the following components: TDA8275A Tuner, SAA7131E decoder and a TDA10046A decoder for earth digital signal.
In order to pilot the tuner I had to change the I2C_SCAN addresses range at the row 533 of TDA8290.C, for the tuner address is at 0xe1.

 /* probe for tuner chip */
        tuners_found = 0;
        tuner_addrs = 0;
        for (i=0x60; i<= 0xe1; i++) {
                msg.addr = i;
                ret = i2c_transfer(c->adapter, &msg, 1);

Now, loading:

saa7134 i2c_scan=1

the result is

saa7130/34: v4l2 driver version 0.2.14 loaded
ACPI: PCI Interrupt 0000:01:00.0[A] -> GSI 21 (level, low) -> IRQ 21
saa7133[0]: found at 0000:01:00.0, rev: 208, irq: 21, latency: 64, mmio: 0xfeafe800
saa7133[0]: subsystem: 11bd:002f, board: Pinnacle PCTV 310i (saa7131E) [card=89,autodetected]
saa7133[0]: board init: gpio is 600c000
input: Pinnacle PCTV as /class/input/input4
ir-kbd-i2c: Pinnacle PCTV detected at i2c-0/0-0047/ir0 [saa7133[0]]
saa7133[0]: i2c eeprom 00: bd 11 2f 00 54 20 1c 00 43 43 a9 1c 55 d2 b2 92
saa7133[0]: i2c eeprom 10: ff e0 60 06 ff 20 ff ff 00 30 8d 2d 14 35 ff ff
saa7133[0]: i2c eeprom 20: 01 2c 01 02 02 01 04 30 98 ff 00 a5 ff 21 00 c2
saa7133[0]: i2c eeprom 30: 96 10 03 32 15 20 ff ff 0c 22 17 88 03 48 e9 3a
saa7133[0]: i2c eeprom 40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c eeprom 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
saa7133[0]: i2c scan: found device @ 0x10  [???]
saa7133[0]: i2c scan: found device @ 0x8e  [???]
saa7133[0]: i2c scan: found device @ 0x96  [???]
saa7133[0]: i2c scan: found device @ 0xa0  [eeprom]
tuner 0-004b: chip found @ 0x96 (saa7133[0])
tuner 0-004b: setting tuner address to e1
tuner 0-004b: type set to tda8290+75a
saa7133[0]: registered device video0 [v4l2]
saa7133[0]: registered device vbi0
saa7133[0]: registered device radio0

As easy to see, I2C is able to find several devices.

Device		address		description
0x10		0x08		i2c-controller ???
0x8e		0x47		pctv-irda/ir-kbd-i2c
0x96		0x4b		saa7131E
???		0xe1		tda8290+75a
0xa0		0x50		eeprom

At the moment I'm trying many solutions for DVB-T, but the results ar quite disappointing.
All I obtain is always:

tda1004x: pll set failed

Here are the changes I made to SAA7134-DVB.C

static int pctv310i_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
        int ret;
        ret = philips_tda827xa_pll_set(0xe1, fe, params);
        return ret;
static int pctv310i_pll_init(struct dvb_frontend *fe)
        return 0;
static void pctv310i_pll_sleep(struct dvb_frontend *fe)
        philips_tda827xa_pll_sleep( 0xe1, fe);
static int pctv310i_request_firmware(struct dvb_frontend *fe,
                                           const struct firmware **fw, char *name)
        struct saa7134_dev *dev = fe->dvb->priv;
        return request_firmware(fw, name, &dev->pci->dev);
static struct tda1004x_config pctv310i_config = {
        .demod_address = 0x08,
        .invert        = 1,
        .invert_oclk   = 0,
        .xtal_freq     = TDA10046_XTAL_16M,
        .agc_config    = TDA10046_AGC_TDA827X,
        .if_freq       = TDA10046_FREQ_045,
        .pll_init      = pctv310i_pll_init,
        .pll_set       = pctv310i_pll_set,
        .pll_sleep     = pctv310i_pll_sleep,
        .request_firmware = pctv310i_request_firmware,

Put dvb-fe-tda10046.fw in the firmware directory
and at the module loading:

modprobe saa7134-dvb

DVB: registering new adapter (saa7133[0]).
DVB: registering frontend 0 (Philips TDA10046H DVB-T)...
tda1004x: setting up plls for 48MHz sampling clock
tda1004x: found firmware revision 20 -- ok

I also found this post in a forum that made me think I'n not aiming the correct way...

"The tuner is - as far as i know - a TDA8275a. This is supported. But
the application of the tuner is different, it has an external preamplifier.
This requires a different strategy for the AGC - which is not implemented
yet. But it might work at least a bit without it.
The other issues:
I can't belive that there is no firmware eeprom on the card but its address
might be controlled in a different way.
You need to use the pll_init and pll_sleep functions to switch the board
between analog and dvb mode. This mainly is switching the AGC source
between analog IF and the channel decoder. I have no idea how this is
done on the pinnacle board. Some boards do this by just setting
the outputs to tristate (the chip drivers do this when they go to sleep
mode). But most use an analog multiplexer (4052), controlled by some
GPIO pin. It is the hard part of the job to find which one."


More information about the linux-dvb mailing list