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

Johannes Stezenbach js at linuxtv.org
Fri Sep 23 03:32:21 CEST 2005


On Wed, Sep 21, 2005 Oliver Endriss wrote:
> Imho the 'enhanced' code looks broken:

cvs annotate blames this to Andrew, maybe he can enlighten us?
Otherwise, if it is obviously broken we should just remove it.

Johannes


>        if (state->config->enhanced_tuning) {
>                 /* check if we should do a finetune */
>                 int frequency_delta = p->frequency - state->tuner_frequency;
>                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>                 ...
>                 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) {
>                         /* fine-tuning */
>                         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 {
>                         ...
>                         state->config->pll_set(fe, state->i2c, p);
>                         ...
>                 }
>         } else {
>                 ...
>                 state->config->pll_set(fe, state->i2c, p);
>                 ...
>         }
> 
>         state->tuner_frequency = p->frequency;
>         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>         ...
> 
>         
> For fine-tuning, this code finally sets state->tuner_frequency, too.
> 
> The derotator can be used if (and only if)
>   pll_frequency - delta < p->frequency < pll_frequency + delta
> AFAICS the real *pll* frequency is never checked. :-(
> 
> If frequency_delta is small enough for subsequent calls, the pll will
> not be set, the derotator registers will be set incorrectly, and tuning
> will fail. Is this optimization really useful?
> 
> Furthermore, there are two slightly different tuning sections:
> - 'enhanced':
>                         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);
> 
> - 'standard':
>                 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);             <-- why?
>                 stv0299_writeregI(state, 0x12, 0xb9);      <-- should be set by xxx_inittab!
> 
> The 'enhanced' version is used by the budget-ci driver for sub-system
> 13c2:100f. All other cards and drivers use the standard variant...
> Is there a good reason for the enhanced tuning code?
> 
> Above I marked all lines which look strange to me. Maybe a stv0299
> expert could comment on this. Imho the standard code looks better.
> 
> Btw. what is 'skip_reinit' in struct stv0299_config good for?
> It is not used anywhere...



More information about the linux-dvb mailing list