[linux-dvb] cx2388x with LG TDQF-S001F problems

d.herrendoerfer dvb at zen.htpc-forum.de
Wed Mar 7 09:07:45 CET 2007


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,
};





More information about the linux-dvb mailing list