[linux-dvb] [RFC] Change dvb-pll handling of IF frequency
Michael Krufky
mkrufky at linuxtv.org
Tue Mar 13 18:57:41 CET 2007
Trent Piepho wrote:
> The basic frequency calculation done in dvb-pll is to take the desired
> frequency, add the IF frequency, and then divide by the reference
> frequency.
>
> When dvb-pll does the division, it just rounds the result down. It would
> make more sense to round to the nearest integer, which is done by adding
> 1/2 the divisor (the reference frequency) before dividing.
>
> Some PLL definitions already do this, by adding one half the reference
> frequency to the IF frequency. The effect is the same, except one looking
> at the code doesn't know if they are seeing the IF frequency, or the IF
> frequency plus 1/2 the reference frequency. Of course some PLL defintions
> do it one way and some do it the other and there is no record of which is
> which.
>
> I think it makes a lot more sense put just the IF frequency in the PLL
> definition, and take care of rounding properly in the dvb-pll code. So I
> have attached a patch which does this. In order to do this, I had to guess
> which PLLs had stepsize/2 added to the offset and which didn't.
>
> The second patch moves the IF frequency out of the per-band data. There is
> no reason for the IF to change from one band to another, and in all of the
> PLLs defined the IF is constant across bands.
>
> As far as which PLLs had offsets with stepsize/2 added and which didn't,
> I've made a list of all the IF frequencies defined in dvb-pll:
>
> dvb_pll_thomson_dtt7610 44
> dvb_pll_microtune_4042 44
> dvb_pll_thomson_dtt761x 44
> dvb_pll_lg_tdvs_h06xf 44
> dvb_pll_tdhu2 44
> dvb_pll_tuv1236d 44
> dvb_pll_samsung_tbmv 44
> dvb_pll_tua6010xs 36 1/8
> dvb_pll_thomson_dtt7579 36 1/6
> dvb_pll_tded4 36 1/6
> dvb_pll_tua6034 36 1/6
> dvb_pll_unknown_1 36 1/6
> dvb_pll_thomson_dtt759x 36 1/6
> dvb_pll_lg_z201 36 1/6
> dvb_pll_philips_td1316 36 1/6 (rounded to nearest kHz)
> dvb_pll_tda665x 36 1/6 (rounded to nearest kHz) + step/2
> dvb_pll_fmd1216me 36 1/8 (rounded to two decimals) + step/2
> dvb_pll_thomson_fe6600 36 1/8 (rounded to two decimals) + step/2
> dvb_pll_env57h1xd5 36 1/8 + step
> dvb_pll_philips_sd1878_tda8261 499
>
> Anyway, from this list I think it's clear that the PLLs with a pre-adjusted
> offset are dvb_pll_tda665x, dvb_pll_fmd1216me, dvb_pll_thomson_fe6600, and
> dvb_pll_env57h1xd5.
>
> dvb_pll_philips_sd1878_tda8261 is an odd one, as it's the only satellite
> PLL with zero-IF output in the list. It uses an offset of 499 with a
> stepsize of 500 kHz so that it rounds _up_. I've left this PLL rounding
> up, assuming there is a reason it was this way.
>
> Also, dvb_pll_env57h1xd5 is not 36 1/8 + step/2, but 36 1/8 + step. I
> think this is a bug. If you go back to patch 1740 which created the
> dvb-pll definition, you'll see it was taken from the dibusb driver. The
> original code for this pll was:
>
> u32 freq_khz = fep->frequency / 1000;
> u32 tfreq = ((freq_khz + 36125)*6 + 500) / 1000;
>
> If you multiple that out and reduce it, you get:
> tfreq = (fep->frequency + 36125000 + 166667/2) / 166667;
>
> But the dvb-pll definition is using 36125000 + 166667.
Trent,
This looks good to me, pending review from the other dvb developers.
Acked-by: Michael Krufky <mkrufky at linuxtv dot org>
More information about the linux-dvb
mailing list