I already posted this on the v4l ml, but since this is a dvb issue:
Please Help!
I'm trying to add a driver section for a cx2388x based card with a LG
TDQF-S001F tuner and the ISL6421 lnb supply.
So far - I must admit with little luck.
The driver loads and runs, but fails to tune anything. I expect I'm
not hitting the tuner just right.
I suspect that I got the sl1935 pll code wrong, There is little code
and information about this chip
available on the net, so I probably missed some initialization code.
This is what syslog says:
Jan 7 10:00:40 zenslack kernel: cx88[0]/2: cx2388x 8802 Driver Manager
Jan 7 10:00:40 zenslack kernel: ACPI: PCI Interrupt Link [LNKA]
enabled at IRQ 11
Jan 7 10:00:40 zenslack kernel: cx88[0]/2: cx2388x based dvb card
Jan 7 10:00:40 zenslack kernel: !!Samsung INIT done.
Jan 7 10:00:40 zenslack kernel: DVB: registering new adapter (cx88[0]).
Jan 7 10:00:40 zenslack kernel: DVB: registering frontend 0 (ST
STV0299 DVB-S)...
dmesg output:
!!Samsung isl6421 SEC_VOLTAGE_18.
stv0299: stv0299_wait_diseqc_idle
!!Samsung stv0299 SEC_TONE_ON.
stv0299: stv0299_set_frontend : FE_SET_FRONTEND
!!Samsung samsung_tuner_set_params() freq: 1587000
!!Samsung samsung_tuner_set_params() OK.
stv0299: stv0299_set_FEC
!!Samsung samsung_tuner_set_symbol_rate() srate:27500000 ratio:5242880
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_read_status : FE_READ_STATUS : VSTATUS: 0x81
stv0299: stv0299_set_frontend : FE_SET_FRONTEND
!!Samsung samsung_tuner_set_params() freq: 1587000
!!Samsung samsung_tuner_set_params() OK.
stv0299: stv0299_set_FEC
...
cx88[0]/2-mpeg: cx8802_timeout
Using a Multimeter I can now read 16.9V on the Antenna lead and the
20kHz Tone.
But she won't tune in to anything. I get about about 5% CPU load for
the fe-thread
but apart from writing to the logs it doesn't do much.
Here are the segments of driver code I added to cx88-dvb.c:
static int dvb_register(struct cx8802_dev *dev)
{
...
case CX88_BOARD_SAMSUNG_SMT_7020:
dev->dvb.frontend = dvb_attach(stv0299_attach,
&samsung_stv0299_config,
&dev->core->i2c_adap);
if (dev->dvb.frontend) {
dev->dvb.frontend->ops.tuner_ops.set_params
= samsung_tuner_set_params;
dev->dvb.frontend->tuner_priv = &dev->core-
>i2c_adap;
dvb_attach(isl6421_attach, dev->dvb.frontend,
&dev->core->i2c_adap, 0x08, 0x00,
0x00);
printk("!!Samsung INIT done.\n");
}
break;
...
}
static u8 samsung_inittab[] = {
0x01, 0x15,
0x02, 0x00,
0x03, 0x00,
0x04, 0x7d, /* F22FR = 0x7d, F22 = f_VCO / 128 / 0x7d = 22
kHz */
0x05, 0x35, /* I2CT = 0, SCLT = 1, SDAT = 1 */
0x06, 0x40, /* DAC not used, set to high impendance mode */
0x07, 0x00, /* DAC LSB */
0x08, 0x40, /* DiSEqC off, LNB power on OP2/LOCK pin on */
0x09, 0x00, /* FIFO */
0x0c, 0x51, /* OP1 ctl = Normal, OP1 val = 1 (LNB Power
ON) */
0x0d, 0x82, /* DC offset compensation = ON, beta_agc1 = 2 */
0x0e, 0x23, /* alpha_tmg = 2, beta_tmg = 3 */
0x10, 0x3f, // AGC2 0x3d
0x11, 0x84,
0x12, 0xb5, //DH: was 0xb9
0x15, 0xc9, // lock detector threshold
0x16, 0x00,
0x17, 0x00,
0x18, 0x00,
0x19, 0x00,
0x1a, 0x00,
0x1f, 0x50,
0x20, 0x00,
0x21, 0x00,
0x22, 0x00,
0x23, 0x00,
0x28, 0x00, // out imp: normal out type: parallel FEC mode:0
0x29, 0x1e, // 1/2 threshold
0x2a, 0x14, // 2/3 threshold
0x2b, 0x0f, // 3/4 threshold
0x2c, 0x09, // 5/6 threshold
0x2d, 0x05, // 7/8 threshold
0x2e, 0x01,
0x31, 0x1f, // test all FECs
0x32, 0x19, // viterbi and synchro search
0x33, 0xfc, // rs control
0x34, 0x93, // error control
0x0f, 0x52,
0xff, 0xff
};
static int samsung_tuner_set_params(struct dvb_frontend* fe, struct
dvb_frontend_parameters *params)
{
struct cx8802_dev *dev= fe->dvb->priv;
struct cx88_core *core = dev->core;
u8 buf[4];
u32 div;
struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf =
buf, .len = sizeof(buf) };
printk("!!Samsung samsung_tuner_set_params() freq: %d
\n",params->frequency);
div = params->frequency / 125;
buf[0] = (div >> 8) & 0x7f;
buf[1] = div & 0xff;
buf[2] = 0x84; /* 0xC4 */
buf[3] = 0x08;
if (params->frequency < 1500000) buf[3] |= 0x10;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
if (i2c_transfer(&core->i2c_adap, &msg, 1) != 1) {
return -EIO;
}
printk("!!Samsung samsung_tuner_set_params() OK.\n");
return 0;
}
static int samsung_stv0299_set_symbol_rate(struct dvb_frontend *fe,
u32 srate, u32 ratio)
{
u8 aclk = 0;
u8 bclk = 0;
printk("!!Samsung samsung_tuner_set_symbol_rate() srate:%d
ratio:%d\n",srate,ratio);
if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }
else if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
else if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
else if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
else if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
else if (srate < 45000000) { aclk = 0xb4; bclk = 0x51; }
stv0299_writereg (fe, 0x13, aclk);
stv0299_writereg (fe, 0x14, bclk);
stv0299_writereg (fe, 0x1f, (ratio >> 16) & 0xff);
stv0299_writereg (fe, 0x20, (ratio >> 8) & 0xff);
stv0299_writereg (fe, 0x21, (ratio ) & 0xf0);
return 0;
}
static struct stv0299_config samsung_stv0299_config = {
.demod_address = 0x68,
.inittab = samsung_inittab,
.mclk = 88000000UL,
.invert = 1,
.skip_reinit = 0,
.lock_output = STV0229_LOCKOUTPUT_1,
.volt13_op0_op1 = STV0299_VOLT13_OP1,
.min_delay_ms = 100,
.set_symbol_rate = samsung_stv0299_set_symbol_rate,
};
_______________________________________________
linux-dvb mailing list
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb