cx2388x with LG TDQF-S001F problems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux