[linux-dvb] DVICO FusionHDTV DVB-T1

frosts1 at hotkey.net.au frosts1 at hotkey.net.au
Wed Jun 29 08:50:52 CEST 2005


There have been a number of people reporting success with the DVICO cards and
the 2.6.12 kernel. Unfortunately, these are people with the Plus card and I have
the T1 card. The differences are highlighted on this page:
http://www.fusionhdtv.co.kr/eng/Products/DVBT.aspx in the table at the bottom.
The principal difference is the tuner. T1=LG-Z201 Plus=Thomson 7579.

So I went hunting in the kernel code to try to see what was different in the
tuner area for my patched 2.6.11.7 (using Chris Pascoes patches from
www.itee.uq.edu.au/~chrisp/Linux-DVB/DVICO/) which works and 2.6.12 which doesnt.

This was a lot harder than I thought it would be because the structure of the
code has been completely changed, but here's what I found:

This is the bit of code that controls the lg-z201 tuner in my patched 2.6.11.7
kernel:
Code:
static int lg_z201_pll_set(struct dvb_frontend* fe,
            struct dvb_frontend_parameters* params, u8* pllbuf)
{
   u32 div;
   unsigned char cp = 0;
   unsigned char bs = 0;

   printk ("lg_z201_pll_set %d\n", params->frequency);

   div = (((params->frequency + 83333) * 3) / 500000) + IF_FREQUENCYx6;

   if (params->frequency < 542000000) cp = 0xbc;
   else if (params->frequency < 830000000) cp = 0xf4;
   else cp = 0xfc;

   if (params->frequency == 0) bs = 0x03;
   else if (params->frequency < 157500000) bs = 0x01;
   else if (params->frequency < 443250000) bs = 0x02;
   else bs = 0x04;

   pllbuf[0] = 0xC2; /* Note: non-linux standard PLL I2C address */
   pllbuf[1] = div >> 8;
   pllbuf[2] = div & 0xff;
   pllbuf[3] = cp;
   pllbuf[4] = bs;

   return 0;
}
Notice in particular the cp and bs values and how they vary with frequency.

I then looked in the 2.6.12 code and found the following in
drivers/media/dvb/fontends/dvb-pll.c:
Code:
struct dvb_pll_desc dvb_pll_lg_z201 = {
   .name  = "LG z201",
   .min   = 174000000,
   .max   = 862000000,
   .count = 5,
   .entries = {
      {          0, 36166667, 166666, 0xbc, 0x03 },
      {  443250000, 36166667, 166666, 0xbc, 0x01 },
      {  542000000, 36166667, 166666, 0xbc, 0x02 },
      {  830000000, 36166667, 166666, 0xf4, 0x02 },
      {  999999999, 36166667, 166666, 0xfc, 0x02 },
   },
};
EXPORT_SYMBOL(dvb_pll_lg_z201);


So it looks like the same stuff is represented in a table and there must be some
generic bit of code that uses the info in the table to tune the card. It looks
like the last two fields are the cp and bs values. Looking at some of the other
tuners, I established that the values are to be used for frequencies below the
frequency in the first field.

Now compare this with the code for the lg_z201 from my working kernel and you
will see that the numbers don't match. The bs value should only be 0x01 below
157500000 and 0x02 below 443250000 and then 0x04 for all other frequencies. I
modified the 2.6.12 (which I have check is the same as cvs at the moment) code
as shown below:
Code:
struct dvb_pll_desc dvb_pll_lg_z201 = {
   .name  = "LG z201",
   .min   = 174000000,
   .max   = 862000000,
   .count = 6,
   .entries = {
      {          0, 36166667, 166666, 0xbc, 0x03 },
      {  157500000, 36166667, 166666, 0xbc, 0x01 },
      {  443250000, 36166667, 166666, 0xbc, 0x02 },
      {  542000000, 36166667, 166666, 0xbc, 0x04 },
      {  830000000, 36166667, 166666, 0xf4, 0x04 },
      {  999999999, 36166667, 166666, 0xfc, 0x04 },
   },
};
EXPORT_SYMBOL(dvb_pll_lg_z201);
Rebuilt the kernel and everything worked!

Was this just an oversight from the person who re-structured the code, or is
there a card using an LG ZX201 that needs to be controlled this way. If it is
the former, it would be nice to have the change incorporated.

Greg Frost




More information about the linux-dvb mailing list