[linux-dvb] FIX: No recovery after lost lock

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

 



> > To avoid that lockup, the following code just before the actual PLL-settings
> > in pll_set make that go away:
> > 
> > 	{ // GA: Kick PLL to avoid hanging VCO
> >                 u8 xreg0 [2] = { 0x00, 0x0f };
> >                 u8 xreg1 [4] = { 0x01, 0xff, 0xff, 0x00 };
> >                 u8 xreg2 [3] = { 0x02, 0xff, 0xff };
> >                 tua6100_pll_write(fe, 0x60, xreg0, sizeof(xreg0));
> >                 tua6100_pll_write(fe, 0x60, xreg1, sizeof(xreg1));
> >                 tua6100_pll_write(fe, 0x60, xreg2, sizeof(xreg2));
> > 	}
> > 
> > Is it possible that some of the stv0299 related tuning issues actually are
> > based on this PLL problem? As the driver doesn't read out the PLL lock
> > status, it may be get totally unrecognised that the PLL and not the stv0299
> > is the cause...
> > 
> 
> Actually, this is the code I was refering to when I asked if it could be added
> to the stv0299b frontend for the Nexus 2.3 cards.. Sorry if the previous post
> was not specific enough.

In fact, my cards are not equipped with TUA6100, but instead they have 
TSA5059.

However, exactly for these cards, there's completely different tuning code
present in stv0299.c - perhaps it's not fully OK. Please see here:

stv0299_set_frontend() 
[snip]
        if (state->config->enhanced_tuning) {

*********************************************************
**** This is the tuning code for SU1278 with TSA5059 ****
*********************************************************

                /* check if we should do a finetune */
                int frequency_delta = p->frequency - state->tuner_frequency;
                int minmax = p->u.qpsk.symbol_rate / 2000;
                if (minmax < 5000) minmax = 5000;

                if ((frequency_delta > -minmax) && (frequency_delta <
minmax) && (frequency_delta != 0) &&
                    (state->fec_inner == p->u.qpsk.fec_inner) &&
                    (state->symbol_rate == p->u.qpsk.symbol_rate)) {
                        int Drot_freq = (frequency_delta << 16) /
(state->config->mclk / 1000);

                        // zap the derotator registers first
                        stv0299_writeregI(state, 0x22, 0x00);
                        stv0299_writeregI(state, 0x23, 0x00);

                        // now set them as we want
                        stv0299_writeregI(state, 0x22, Drot_freq >> 8);
                        stv0299_writeregI(state, 0x23, Drot_freq);
                } else {
                        /* A "normal" tune is requested */
                        stv0299_writeregI(state, 0x05, 0xb5);   /*  enable
i2c repeater on stv0299  */
                        state->config->pll_set(fe, state->i2c, p);
                        stv0299_writeregI(state, 0x05, 0x35);   /*  disable
i2c repeater on stv0299  */

                        stv0299_writeregI(state, 0x32, 0x80);
                        stv0299_writeregI(state, 0x22, 0x00);
                        stv0299_writeregI(state, 0x23, 0x00);
                        stv0299_writeregI(state, 0x32, 0x19);
                        stv0299_set_symbolrate (fe, p->u.qpsk.symbol_rate);
                        stv0299_set_FEC (state, p->u.qpsk.fec_inner);
                }
        } else {

********************************************************
**** This applies for all other stv0299 based cards ****
********************************************************

                stv0299_writeregI(state, 0x05, 0xb5);   /*  enable i2c
repeater on stv0299  */
                state->config->pll_set(fe, state->i2c, p);
                stv0299_writeregI(state, 0x05, 0x35);   /*  disable i2c
repeater on stv0299  */

                stv0299_set_FEC (state, p->u.qpsk.fec_inner);
                stv0299_set_symbolrate (fe, p->u.qpsk.symbol_rate);
                stv0299_writeregI(state, 0x22, 0x00);
                stv0299_writeregI(state, 0x23, 0x00);
                stv0299_readreg (state, 0x23);
                stv0299_writeregI(state, 0x12, 0xb9);
        }


Could someone perhaps check this - seems the finetuning code brings the 
card to some weird state...

	Thanks & kind regards,

		M.
--------------------------------------------------------------------------
----                                                                  ----
----   Marian Durkovic                       network  manager         ----
----                                                                  ----
----   Slovak Technical University           Tel: +421 2 524 51 301   ----
----   Computer Centre, Nam. Slobody 17      Fax: +421 2 524 94 351   ----
----   812 43 Bratislava, Slovak Republic    E-mail/sip: md@xxxxxx    ----
----                                                                  ----
--------------------------------------------------------------------------


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

  Powered by Linux