[linux-dvb] fmd1216 integration

Hartmut Hackmann hartmut.hackmann at t-online.de
Tue Mar 13 01:13:21 CET 2007


Hi.

Trent Piepho schrieb:
> On Mon, 12 Mar 2007, Hartmut Hackmann wrote:
>>> On Sunday 11 March 2007 09:40, Trent Piepho wrote:
>>>> In dvb-pll, the frequency offset, which is the IF frequency the tuner will
>>>> output at, is set to 36.213333 MHz.  It looks like this code was written
>>>> about two years ago by Patrick as part of the reverse engineered cxusb
>>>> driver.
>>>>
>>>> In saa7134-dvb, there is some totally different code from programming
>>>> fmd1216 tuners, and it uses an IF frequency of 36.13 MHz.
>>>>
>>>> So, why the difference?
> 
> After looking at dvb-pll some more, I'm pretty sure the difference between
> the saa7134 and the dvb-pll IF frequency is that the dvb-pll version has
> 1/2 the step size added in, so the result will be rounded correctly.
> 
> I think that should be done is adjust the IF values in in the dvb-pll
> config structs to NOT include step-size/2 for rounding.  Just use the IF
> frequency.  This is how most of the PLL definitions are already.  The code
> which calculates the divisor should be changed to round to the nearest
> integer, rather than round down.
> 
Jep

>> I wrote the code in saa7134-dvb. The FMD1216 has an integrated SAW filter
>> for DVB-T, the data sheet says 36.13MHz. This is strange because the
>> data sheet also recommends a tuning step size of 167 kHz (4 MHz / 24),
>> so it should be 36.167MHz....
> 
> Maybe the person who picked the SAW filter and the person who recommended
> the step size should have talked to each other...
> 
>> When i started writing it, there was no dvb-pll module. And the reason
>> why i didn't move to dvb-pll yet is that this module has no means to
>> control the RF AGC. Philips recommends different setting for analog and
>> DVB-T.
> 
> dvb-pll can do this now.  These are the notes I've made about converting
> fmd1216 to use dvb-pll wrt the saa7134 driver.
> 
ok that's new

> saa7134 driver
> 
> tda10046 demod, driver supports IF 36.13 Mhz (used here) or 36.17 MHz
> SAA7134_BOARD_MD7134                    Medion 7134
> SAA7134_BOARD_ASUS_EUROPA2_HYBRID       Asus Europa2 OEM
> 
> tuner_ops.init = philips_fmd1216_tuner_init
> tuner_ops.sleep = philips_fmd1216_tuner_sleep
> tuner_ops.set_params = philips_fmd1216_tuner_set_params
> 
> philips_fmd1216_tuner_init() just sends { 0x0b, 0xdc, 0x9c, 0xa0 } to the
> tuner.  It could be replaced with the dvb-pll version, which will have
> the same effect.
> 
I will have a look

> philips_fmd1216_tuner_set_params() does not use dvb_pll_configure(), but is
> totally different code.  I've looked through it, and it will end up sending
> almost the same data to the tuner.  The only difference is that dvb-pll
> uses a IF frequency of 36.213333 MHz while the code in saa7134 uses 36.13
> MHz.  In this case, I think dvb-pll is wrong.  It looks like the 26.213 MHz
> value was written by Patrick Boettcher in 2005 when he wrote the cxusb
> driver.  Actually, what I think now is that the dvb-pll value is offset by
> stepsize/2 for rounding, since dvb-pll rounds down while saa7143 rounds to
> nearest.  I should make a patch to fix rounding in dvb-pll.
> 
> philips_fmd1216_tuner_sleep() is buggy!  The _first_ time it is called
> after _module loading_ it will send {0x0b, 0xdc, 0x9c, 0x60} and then
> {0x0b, 0xdc, 0x86, 0x54} to the tuner.  The first sequence sets AGC to
> analog mode (IMHO, the v4l tuner driver should do this for tuner init,
> but it doesn't).  The second sequence just tunes to some random frequency
> for no apparent reason.  Neither actually turns the tuner off!
> 
AFIK the v4l tuner driver can't do this since init is called only one at
module initialization. Maybe the sequence is overdone but the intention is:
- set up RF AGC
- set the PLL to a valid frequency. I was told that this is important.
- turn on the tda9887. This is invisible on the I2C bus in DVB mode.
I am not aware that the tuner actually has a sleep mode. I used the sleep
call be cause it simply was there.

> After the first time it is called, philips_fmd1216_tuner_sleep() will just
> send {0x0b, 0xdc, 0x86, 0x54} twice!  The array the sequence is in
> shouldn't be static, or there should just be two static arrays for each
> sequence.  IMHO, using static locals that are not const is almost always
> wrong in the kernel.
> 
Thats right, it is a bug.

> I think this could be replaced with the dvb-pll sleep function, if a
> sleep sequence was added to dvb_pll_fmd1216me.  We should send {0x9d,
> 0x60}, which will turn the tuner off and set the AGC back to the analog
> recommended value.
> 
Hm, the sequence is incomplete.. Do you have more information about the
PLL chip?

I will be happy to remove the tuning code from saa7134-dvb as soon as
dvb-pll fulfills the needs - and things look like we are close to this.
Are you aware that there is also the td1316?

Hartmut



More information about the linux-dvb mailing list