Hi, I was working on support for Leadtek WinFast DTV-1800H. First I made it work with Markus Rechberger's v4l repository (there was better XC3028-tunner code). Few weeks ago Markus Rechberger announced that he is no going to support non-ex28xx cards anymore and that I have to focus on the linuxtv linux-dvb repository. So I (cooperating with Paul Chubb) made a patch against linuxtv linux-dvb. (attached file: leadtek_winfast_dtv1800h.patch) It enables support for DVB-T, analogue TV, radio and IR remote control. I have tried to use existing parts of code as much as possible. The creation of 'cx88_xc3028_winfast1800h_callback' function was necessary. Function 'cx88_xc3028_geniatech_tuner_callback' is similar, but the extra GPIO code makes IR remote control not work. It will be great if patch is merged into the repository. There is one question I want to ask you in terms of this message: http://www.linuxtv.org/pipermail/linux-dvb/2008-August/028117.html Why is using of cx_write() risky? Thank you for your reply. - Miroslav Šustek
diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-cards.c --- a/linux/drivers/media/video/cx88/cx88-cards.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/video/cx88/cx88-cards.c Mon Oct 20 01:15:29 2008 +0200 @@ -1904,6 +1904,47 @@ } }, .mpeg = CX88_MPEG_DVB, }, + [CX88_BOARD_WINFAST_DTV1800H] = { + .name = "Leadtek WinFast DTV1800 Hybrid", + .tuner_type = TUNER_XC2028, + .radio_type = TUNER_XC2028, + .tuner_addr = 0x61, + .radio_addr = 0x61, + /* + * GPIO setting + * + * 2: mute (0=off,1=on) + * 12: tuner reset pin + * 13: audio source (0=tuner audio,1=line in) + * 14: FM (0=on,1=off ???) + */ + .input = {{ + .type = CX88_VMUX_TELEVISION, + .vmux = 0, + .gpio0 = 0x0400, //pin 2 = 0 + .gpio1 = 0x6040, //pin 13 = 0, pin 14 = 1 + .gpio2 = 0x0000, + },{ + .type = CX88_VMUX_COMPOSITE1, + .vmux = 1, + .gpio0 = 0x0400, //pin 2 = 0 + .gpio1 = 0x6060, //pin 13 = 1, pin 14 = 1 + .gpio2 = 0x0000, + },{ + .type = CX88_VMUX_SVIDEO, + .vmux = 2, + .gpio0 = 0x0400, //pin 2 = 0 + .gpio1 = 0x6060, //pin 13 = 1, pin 14 = 1 + .gpio2 = 0x0000, + }}, + .radio = { + .type = CX88_RADIO, + .gpio0 = 0x0400, //pin 2 = 0 + .gpio1 = 0x6000, //pin 13 = 0, pin 14 = 0 + .gpio2 = 0x0000, + }, + .mpeg = CX88_MPEG_DVB, + }, }; /* ------------------------------------------------------------------ */ @@ -2297,6 +2338,10 @@ .subvendor = 0xB033, .subdevice = 0x3033, .card = CX88_BOARD_PROF_7300, + }, { + .subvendor = 0x107d, + .subdevice = 0x6654, + .card = CX88_BOARD_WINFAST_DTV1800H, }, }; @@ -2494,6 +2539,23 @@ return -EINVAL; } +static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core, + int command, int arg) +{ + switch (command) { + case XC2028_TUNER_RESET: + // GPIO 12 = xc3028 tuner reset + cx_set(MO_GP1_IO, 0x1010); //gpio 12 = 1: powerup XC3028 + mdelay(50); + cx_clear(MO_GP1_IO, 0x10); //gpio 12 = 0: powerdown XC3028 + mdelay(50); + cx_set(MO_GP1_IO, 0x10); //gpio 12 = 1: powerup XC3028 + mdelay(50); + return 0; + } + return -EINVAL; +} + /* ------------------------------------------------------------------- */ /* some Divco specific stuff */ static int cx88_pv_8000gt_callback(struct cx88_core *core, @@ -2566,6 +2628,8 @@ case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: return cx88_dvico_xc2028_callback(core, command, arg); + case CX88_BOARD_WINFAST_DTV1800H: + return cx88_xc3028_winfast1800h_callback(core, command, arg); } switch (command) { @@ -2740,6 +2804,15 @@ cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ udelay(1000); break; + + case CX88_BOARD_WINFAST_DTV1800H: + cx_set(MO_GP1_IO, 0x1010); //gpio 12 = 1: powerup XC3028 + mdelay(50); + cx_clear(MO_GP1_IO, 0x10); //gpio 12 = 0: powerdown XC3028 + mdelay(50); + cx_set(MO_GP1_IO, 0x10); //gpio 12 = 1: powerup XC3028 + mdelay(50); + break; } } @@ -2760,6 +2833,7 @@ core->i2c_algo.udelay = 16; break; case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: + case CX88_BOARD_WINFAST_DTV1800H: ctl->demod = XC3028_FE_ZARLINK456; break; case CX88_BOARD_KWORLD_ATSC_120: diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-dvb.c --- a/linux/drivers/media/video/cx88/cx88-dvb.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/video/cx88/cx88-dvb.c Mon Oct 20 01:15:29 2008 +0200 @@ -963,6 +963,7 @@ } break; case CX88_BOARD_PINNACLE_HYBRID_PCTV: + case CX88_BOARD_WINFAST_DTV1800H: fe0->dvb.frontend = dvb_attach(zl10353_attach, &cx88_pinnacle_hybrid_pctv, &core->i2c_adap); diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88-input.c --- a/linux/drivers/media/video/cx88/cx88-input.c Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/video/cx88/cx88-input.c Mon Oct 20 01:15:29 2008 +0200 @@ -93,6 +93,7 @@ gpio=(gpio & 0x7fd) + (auxgpio & 0xef); break; case CX88_BOARD_WINFAST_DTV1000: + case CX88_BOARD_WINFAST_DTV1800H: gpio = (gpio & 0x6ff) | ((cx_read(MO_GP1_IO) << 8) & 0x900); auxgpio = gpio; break; @@ -244,6 +245,7 @@ ir->sampling = 1; break; case CX88_BOARD_WINFAST_DTV2000H: + case CX88_BOARD_WINFAST_DTV1800H: ir_codes = ir_codes_winfast; ir->gpio_addr = MO_GP0_IO; ir->mask_keycode = 0x8f8; diff -r e2a8b9b9c294 linux/drivers/media/video/cx88/cx88.h --- a/linux/drivers/media/video/cx88/cx88.h Fri Oct 17 19:45:55 2008 +0300 +++ b/linux/drivers/media/video/cx88/cx88.h Mon Oct 20 01:15:29 2008 +0200 @@ -230,6 +230,7 @@ #define CX88_BOARD_TEVII_S420 73 #define CX88_BOARD_PROLINK_PV_GLOBAL_XTREME 74 #define CX88_BOARD_PROF_7300 75 +#define CX88_BOARD_WINFAST_DTV1800H 76 enum cx88_itype { CX88_VMUX_COMPOSITE1 = 1,
_______________________________________________ linux-dvb mailing list linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb