Hi Tim,
Am Freitag, den 27.02.2009, 11:28 +0000 schrieb Tim Small:
> Hello,
>
> I'm interested in getting this card working under Linux as well, it's
> labelled GDI2500PCTV on the back, and has a Conexant CX23881 visible on
> the front, with a Philips "TU1216/1 H P" RF box... Looks like there may
> be some more ICs under the metal box, but I'd have to desolder it to
> check what they were (which I can do if necessary).
>
> According to the preliminary datasheet which I found, the TU1216
> contains a TDA 10046 Channel Decoder, and a TDA6651 Mixer/Oscillator.
>
> There seems to be TU1216 support in both v4l/saa7134-dvb.c and
> v4l/budget-av.c (code cut-n-paste by the look of it), but I can't see a
> way to select this tuner with the cx88xx module (e.g. CARDLIST.tuner),
> unless it's called something different, or is compatible with another
> Philips tuner.
since there is no analog TV tuning support you use TUNER_ABSENT in
cx88-cards.c like SAA7134_BOARD_VIDEOMATE_DVBT_200 and
SAA7134_BOARD_PHILIPS_TOUGH do in saa7134-cards.c accordingly.
> So... I'm game for trying to get this working, and have a bit of kernel
> programming experience, but is there anything else I'm likely to need to
> know before I set out on this?
You then need to implement the functions they call in saa7134-dvb.c
accordingly to cx88-dvb.c and find out if the tuner address is 0x60 or
0x61.
case SAA7134_BOARD_PHILIPS_TOUGH:
fe0->dvb.frontend = dvb_attach(tda10046_attach,
&philips_tu1216_60_config,
&dev->i2c_adap);
if (fe0->dvb.frontend) {
fe0->dvb.frontend->ops.tuner_ops.init =
philips_tu1216_init;
fe0->dvb.frontend->ops.tuner_ops.set_params =
philips_tda6651_pll_set;
}
For testing, on a first look, you need to introduce the tda10046
including firmware upload #include "tda1004x.h" and at least adapt these
functions to cx88-dvb.
/* ==================================================================
* tda1004x based DVB-T cards, helper functions
*/
static int philips_tda1004x_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);
}
/* ------------------------------------------------------------------
* these tuners are tu1216, td1316(a)
*/
static int philips_tda6651_pll_set(struct dvb_frontend *fe, struct
dvb_frontend_parameters *params)
{
struct saa7134_dev *dev = fe->dvb->priv;
struct tda1004x_state *state = fe->demodulator_priv;
u8 addr = state->config->tuner_address;
u8 tuner_buf[4];
struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf =
tuner_buf,.len =
sizeof(tuner_buf) };
int tuner_frequency = 0;
u8 band, cp, filter;
/* determine charge pump */
tuner_frequency = params->frequency + 36166000;
if (tuner_frequency < 87000000)
return -EINVAL;
else if (tuner_frequency < 130000000)
cp = 3;
else if (tuner_frequency < 160000000)
cp = 5;
else if (tuner_frequency < 200000000)
cp = 6;
else if (tuner_frequency < 290000000)
cp = 3;
else if (tuner_frequency < 420000000)
cp = 5;
else if (tuner_frequency < 480000000)
cp = 6;
else if (tuner_frequency < 620000000)
cp = 3;
else if (tuner_frequency < 830000000)
cp = 5;
else if (tuner_frequency < 895000000)
cp = 7;
else
return -EINVAL;
/* determine band */
if (params->frequency < 49000000)
return -EINVAL;
else if (params->frequency < 161000000)
band = 1;
else if (params->frequency < 444000000)
band = 2;
else if (params->frequency < 861000000)
band = 4;
else
return -EINVAL;
/* setup PLL filter */
switch (params->u.ofdm.bandwidth) {
case BANDWIDTH_6_MHZ:
filter = 0;
break;
case BANDWIDTH_7_MHZ:
filter = 0;
break;
case BANDWIDTH_8_MHZ:
filter = 1;
break;
default:
return -EINVAL;
}
/* calculate divisor
* ((36166000+((1000000/6)/2)) + Finput)/(1000000/6)
*/
tuner_frequency = (((params->frequency / 1000) * 6) + 217496) / 1000;
/* setup tuner buffer */
tuner_buf[0] = (tuner_frequency >> 8) & 0x7f;
tuner_buf[1] = tuner_frequency & 0xff;
tuner_buf[2] = 0xca;
tuner_buf[3] = (cp << 5) | (filter << 3) | band;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
wprintk("could not write to tuner at addr: 0x%02x\n",
addr << 1);
return -EIO;
}
msleep(1);
return 0;
}
static int philips_tu1216_init(struct dvb_frontend *fe)
{
struct saa7134_dev *dev = fe->dvb->priv;
struct tda1004x_state *state = fe->demodulator_priv;
u8 addr = state->config->tuner_address;
static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf =
tu1216_init,.len = sizeof(tu1216_init) };
/* setup PLL configuration */
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
return -EIO;
msleep(1);
return 0;
}
/* ------------------------------------------------------------------ */
static struct tda1004x_config philips_tu1216_60_config = {
.demod_address = 0x8,
.invert = 1,
.invert_oclk = 0,
.xtal_freq = TDA10046_XTAL_4M,
.agc_config = TDA10046_AGC_DEFAULT,
.if_freq = TDA10046_FREQ_3617,
.tuner_address = 0x60,
.request_firmware = philips_tda1004x_request_firmware
};
static struct tda1004x_config philips_tu1216_61_config = {
.demod_address = 0x8,
.invert = 1,
.invert_oclk = 0,
.xtal_freq = TDA10046_XTAL_4M,
.agc_config = TDA10046_AGC_DEFAULT,
.if_freq = TDA10046_FREQ_3617,
.tuner_address = 0x61,
.request_firmware = philips_tda1004x_request_firmware
};
/* ------------------------------------------------------------------ */
What could be factored out to avoid code duplication is another later
question I guess.
Cheers,
Hermann
> Cheers!
>
> Tim.
>
>
> Richard Runds wrote:
> > Hi,
> >
> > Have a GDI Black Gold card with subsystem 14c7:0108 and I cannot make it
> > work. Does anyone on the list have a working config for this card and/or
> > know how to make this card work?
> >
> > I'm getting so far as video1 and vbi1 is created, but I don't have any
> > entries in /dev/dvb/.
> >
> > cat /dev/video1 > test.mpg produces a video typical of a tv picture without
> > signal (ant-war)... :)
> >
> >
> > config
> > ====
> >
> > /etc/modprobe.conf:
> >
> > alias char-major-81-1 cx88-dvb
> > options cx88xx card=2 i2c_scan=1
> >
> > lspci -v:
> >
> > 02:09.0 Multimedia video controller: Conexant CX23880/1/2/3 PCI Video and
> > Audio Decoder (rev 05)
> > Subsystem: Modular Technology Holdings Ltd GDI Black Gold
> > Flags: bus master, medium devsel, latency 64, IRQ 23
> > Memory at f5000000 (32-bit, non-prefetchable) [size=16M]
> > Capabilities: [44] Vital Product Data
> > Capabilities: [4c] Power Management version 2
> >
> > 02:09.2 Multimedia controller: Conexant CX23880/1/2/3 PCI Video and Audio
> > Decoder [MPEG Port] (rev 05)
> > Subsystem: Modular Technology Holdings Ltd Unknown device 0108
> > Flags: bus master, medium devsel, latency 64, IRQ 5
> > Memory at f6000000 (32-bit, non-prefetchable) [size=16M]
> > Capabilities: [4c] Power Management version 2
> >
> > dmesg:
> >
> > CORE cx88[0]: subsystem: 14c7:0108, board: GDI Black Gold [card=2,insmod
> > option]
> > TV tuner -1 at 0x1fe, Radio tuner -1 at 0x1fe
> > cx88[0]: Test OK
> > cx88[0]: i2c scan: found device @ 0x10 [???]
> > cx88[0]: i2c scan: found device @ 0xa0 [eeprom]
> > cx88[0]: GDI: tuner=unknown
> > cx88[0]/2: cx2388x 8802 Driver Manager
> > ACPI: PCI Interrupt 0000:02:09.0[A] -> GSI 21 (level, low) -> IRQ 23
> > CORE cx88[0]: subsystem: 14c7:0108, board: GDI Black Gold [card=2,insmod
> > option]
> > TV tuner -1 at 0x1fe, Radio tuner -1 at 0x1fe
> > cx88[0]: Test OK
> > cx88[0]: i2c scan: found device @ 0x10 [???]
> > cx88[0]: i2c scan: found device @ 0xa0 [eeprom]
> > cx88[0]: GDI: tuner=unknown
> > cx88[0]/0: found at 0000:02:09.0, rev: 5, irq: 23, latency: 64, mmio:
> > 0xf5000000
> > cx88[0]/0: registered device video1 [v4l2]
> > cx88[0]/0: registered device vbi1
> >
> >
> >
> > Thanks,
> >
> > //riru
> >
> >
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html