[linux-dvb] some questions on cx23885/xc3028

Steven Toth stoth at linuxtv.org
Sun Dec 23 22:53:03 CET 2007


Ronald DELOBEL wrote:
> Hi,
> 
> I have bought a tv/dvb-t card which is unsupported at this time, this
> is a leadtek winfast PxDVR 3200 H.
> Product summary (as far as i can tell): cx23885 bridge, cx23417 encoder,
> xc3028 tuner, zl10353 demod.
> 
> I have looked around the v4l-dvb tree, and finally got some results
> today (ok, actually, I have just copied the parts I suspected to match
> the card, I don't *really* now what I am doing).

Welcome, you've come to the right place to learn. :)

I would say this, the very best you can hope to achieve right now with 
the card is to get DVB-T working. This should easily be acheivable. 
Drivers for the analog parts are under development.

> 
> So I have some questions:
> 
> Shouldn't the tuner (0xc2) be shown by the i2c scan?

No. This does not surprise me.

The tuner will not show up in an i2c scan if it's being held 
electrically in reset using a GPIO between the '885 and the tuner, or if 
it's located behind an I2C gate which is closed on the 353.

The best way to determine GPIO configuration is described below.


> I've tried w_scan, unsucceffuly :
> w_scan version 20070909
> Info: using DVB adapter auto detection.
>    Found DVB-T frontend. Using adapter /dev/dvb/adapter0/frontend0
> -_-_-_-_ Getting frontend capabilities-_-_-_-_
> frontend Zarlink ZL10353 DVB-T supports
> INVERSION_AUTO
> QAM_AUTO
> TRANSMISSION_MODE_AUTO
> GUARD_INTERVAL_AUTO
> HIERARCHY_AUTO
> FEC_AUTO
> 
> the frontend seems to be correctly recognized (no?) but a full scan show nothing.
> In the dmesg output there is nothing about firmware loading, doesn't xc3028 need one?

Yes, the 3028 expects to load firmware, but the 3028 driver is lot being 
attached - so you're not seeing errors - yet.

> About firmware, I have two *.rom files which I got from windows install:  wf23885C.rom and wf416enc.rom, 
> maybe xc2028 one is in this first, how to extract/use it?

No, neither of these files are for the 3028. The first is for the 
bridge, but you don't need it yet. The second is for the encoder, and 
you don't need that yet either.

The 3028 firmware will be compiled directly into the leadtek driver. 
However, that firmware is available on the web for download in other 
places. I think the wiki at linuxtv.org describes this. If not, ask here.

> Last question: how can I know what to use portb or portc? 

This will be answered along with my GPIO reference below.

> 
> The following is dmesg output after modprobe cx23885 and tveeprom:
> 
> cx23885 driver version 0.0.1 loaded
> ACPI: PCI Interrupt 0000:02:00.0[A] -> GSI 18 (level, low) -> IRQ 18
> CORE cx23885[0]: subsystem: 107d:6681, board: Leadtek Winfast PxDVR
> 3200 H [card=7,autodetected] cx23885[0]: i2c bus 0 registered
> cx23885[0]: i2c scan: found device @ 0x1e  [???]
> cx23885[0]: i2c scan: found device @ 0xa0  [eeprom]
> cx23885[0]: i2c bus 1 registered
> cx23885[0]: i2c bus 2 registered
> cx23885[0]: i2c scan: found device @ 0x66  [???]
> cx23885[0]: i2c scan: found device @ 0x88  [cx25837]
> cx23885[0]: i2c scan: found device @ 0x98  [???]
> tveeprom 1-0050: full 256-byte eeprom dump:
> tveeprom 1-0050: 00: 08 00 18 03 00 00 03 ff 20 00 13 00 00 00 00 00
> tveeprom 1-0050: 10: 20 00 13 00 00 00 00 00 20 00 13 00 00 00 00 00
> tveeprom 1-0050: 20: 20 00 13 00 00 00 00 00 20 00 13 00 00 00 00 00
> tveeprom 1-0050: 30: 20 00 13 00 00 00 00 00 20 00 13 00 00 00 00 13
> tveeprom 1-0050: 40: 20 00 13 00 00 00 00 00 20 00 13 00 00 00 00 00
> tveeprom 1-0050: 50: 08 00 18 03 00 00 03 9d 0c 03 05 00 0e 01 00 00
> tveeprom 1-0050: 60: 20 00 13 00 00 00 00 00 50 03 05 00 04 80 00 08
> tveeprom 1-0050: 70: 2c 00 05 00 7d 10 81 66 0c 03 05 80 0e 01 00 00
> tveeprom 1-0050: 80: 82 01 00 22 78 00 00 00 ff ff ff ff ff ff ff ff
> tveeprom 1-0050: 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> tveeprom 1-0050: f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
> cx23885[0]: cx23885 based dvb card
> xc2028 1-0061: type set to XCeive xc2028/xc3028 tuner
> DVB: registering new adapter (cx23885[0])
> DVB: registering frontend 0 (Zarlink ZL10353 DVB-T)...
> cx23885[0]/0: found at 0000:02:00.0, rev: 2, irq: 18, latency: 0, mmio:
> 0xfda00000 
> PCI: Setting latency timer of device 0000:02:00.0 to 64
> 
> And result of messing around:
> 
> diff -r 3683fd95d4ad linux/drivers/media/video/cx23885/cx23885-cards.c
> --- a/linux/drivers/media/video/cx23885/cx23885-cards.c Sun Dec 23 08:15:42 2007 -0200
> +++ b/linux/drivers/media/video/cx23885/cx23885-cards.c Sun Dec 23 20:57:57 2007 +0100
> @@ -122,6 +122,22 @@ struct cx23885_board cx23885_boards[] =
>                 .name           = "Hauppauge WinTV-HVR1500",
>                 .portc          = CX23885_MPEG_DVB,
>         },
> +       [CX23885_BOARD_LEADTEK_WINFAST3200] = {
> +               .name           = "Leadtek Winfast PxDVR 3200 H",
> +               .portc          = CX23885_MPEG_DVB,
> +               /*
> +               .input          = {{
> +                       .type   = CX23885_VMUX_TELEVISION,
> +                       .vmux   = 2,
> +               },{
> +                       .type   = CX23885_VMUX_COMPOSITE1,
> +                       .vmux   = 1,
> +               },{
> +                       .type   = CX23885_VMUX_SVIDEO,
> +                       .vmux   = 3,
> +               }},
> +               */
> +       },
>  };

For the time being, you don't need to define .input, they are not used 
in the digital driver - although they will be used by analog.

>  const unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
> 
> @@ -161,7 +177,11 @@ struct cx23885_subid cx23885_subids[] =
>                 .subvendor = 0x0070,
>                 .subdevice = 0x7717,
>                 .card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
> -       },
> +       },{
> +               .subvendor = 0x107d,
> +               .subdevice = 0x6681,
> +               .card      = CX23885_BOARD_LEADTEK_WINFAST3200,
> +       }
>  };
>  const unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
> 
> @@ -250,6 +270,9 @@ void cx23885_gpio_setup(struct cx23885_d
> 
>                 cx_set(GP0_IO, 0x00040004); /* Bring the tuner out of reset */
>                 break;
> +       case CX23885_BOARD_LEADTEK_WINFAST3200:
> +               cx_set(GP0_IO, 0x00040004);
> +               break;
>         }
>  }

This is a guess, right? It's a bad idea to guess with GPIO's unless you 
know what you're doing, you could be driving current into a part that 
doesn't like it. This can break hardware.

> 
> @@ -302,6 +325,7 @@ void cx23885_card_setup(struct cx23885_d
>         case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
>         case CX23885_BOARD_HAUPPAUGE_HVR1800:
>         case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
> +       case CX23885_BOARD_LEADTEK_WINFAST3200:
>         default:
>                 ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
>                 ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
> diff -r 3683fd95d4ad linux/drivers/media/video/cx23885/cx23885-dvb.c
> --- a/linux/drivers/media/video/cx23885/cx23885-dvb.c   Sun Dec 23 08:15:42 2007 -0200
> +++ b/linux/drivers/media/video/cx23885/cx23885-dvb.c   Sun Dec 23 20:57:57 2007 +0100
> @@ -39,6 +39,7 @@
>  #include "dvb-pll.h"
>  #include "tuner-xc2028.h"
>  #include "tuner-xc2028-types.h"
> +#include "zl10353.h"
> 
>  static unsigned int debug = 0;
> 
> @@ -179,6 +180,10 @@ static struct xc5000_config hauppauge_hv
>         .tuner_reset      = hauppauge_hvr1500q_tuner_reset
>  };
> 
> +static struct zl10353_config winfast3200_config = {
> +       .demod_address = 0x1e >> 1
> +};
> +
>  static int cx23885_hvr1500_xc3028_callback(void *ptr, int command, int arg)
>  {
>         struct cx23885_tsport *port = ptr;
> @@ -314,6 +319,32 @@ static int dvb_register(struct cx23885_t
>                                 fe->ops.tuner_ops.set_config(fe, &ctl);
>                 }
>                 break;
> +       case CX23885_BOARD_LEADTEK_WINFAST3200:
> +               i2c_bus = &dev->i2c_bus[0];
> +               port->dvb.frontend = dvb_attach(zl10353_attach,
> +                                               &winfast3200_config,
> +                                               &i2c_bus->i2c_adap);
> +
> +               if (port->dvb.frontend != NULL) {
> +                       struct dvb_frontend *fe;
> +                       struct xc2028_config cfg = {
> +                               .i2c_adap  = &i2c_bus->i2c_adap,
> +                               .i2c_addr  = 0xc2 >> 1,
> +                               .video_dev = port,
> +                               .callback  = cx23885_hvr1500_xc3028_callback,
> +                       };
> +                       static struct xc2028_ctrl ctl = {
> +                               .fname       = "xc3028-v27.fw",
> +                               .max_len     = 64,
> +                               .scode_table = ZARLINK456,
> +                       };
> +
> +                       fe = dvb_attach(xc2028_attach,
> +                                       port->dvb.frontend, &cfg);
> +                       if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
> +                               fe->ops.tuner_ops.set_config(fe, &ctl);
> +               }
> +               break;
>         default:
>                 printk("%s: The frontend of your DVB/ATSC card isn't supported yet\n",
>                        dev->name);
> diff -r 3683fd95d4ad linux/drivers/media/video/cx23885/cx23885.h
> --- a/linux/drivers/media/video/cx23885/cx23885.h       Sun Dec 23 08:15:42 2007 -0200
> +++ b/linux/drivers/media/video/cx23885/cx23885.h       Sun Dec 23 20:57:57 2007 +0100
> @@ -58,6 +58,7 @@
>  #define CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP   4
>  #define CX23885_BOARD_HAUPPAUGE_HVR1500Q       5
>  #define CX23885_BOARD_HAUPPAUGE_HVR1500        6
> +#define CX23885_BOARD_LEADTEK_WINFAST3200      7
> 
>  enum cx23885_itype {
>         CX23885_VMUX_COMPOSITE1 = 1,
> 
> Thanks for any help.
> 

The first thing you need to do is download this project and install it 
on a windows box with your leadtek card:

http://deinterlace.sourceforge.net/

Then download this:

http://www.steventoth.net/anonfiles/RegSpy.exe

Start the regspy tool and then start the leadtek Tv application and 
switch to DVB-T mode, make sure video is playing then use the regspy 
tool to dump the register contents to file.

Then switch to analog mode, ensure the encoder is running and use regspy 
to dump the register values again, to another file.

Finally, stop the TV application, and dump the register values again.

Perhaps you could create a page on the WIKI and upload these files? 
Among other things, these files will us what GPIO values should be used, 
and whether it's using portb or c for DVB-T.

Please ensure all email traffic is posted to this list.

Regards,

Steve







More information about the linux-dvb mailing list