patch-2.4.20 linux-2.4.20/drivers/media/video/bttv-cards.c
Next file: linux-2.4.20/drivers/media/video/bttv-driver.c
Previous file: linux-2.4.20/drivers/media/video/Makefile
Back to the patch index
Back to the overall index
- Lines: 1068
- Date:
Thu Nov 28 15:53:13 2002
- Orig file:
linux-2.4.19/drivers/media/video/bttv-cards.c
- Orig date:
Fri Aug 2 17:39:44 2002
diff -urN linux-2.4.19/drivers/media/video/bttv-cards.c linux-2.4.20/drivers/media/video/bttv-cards.c
@@ -63,9 +63,9 @@
static int triton1=0;
static int vsfx=0;
int no_overlay=-1;
-static unsigned int card[4] = { -1, -1, -1, -1 };
-static unsigned int pll[4] = { -1, -1, -1, -1 };
-static unsigned int tuner[4] = { -1, -1, -1, -1 };
+static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1};
+static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1};
+static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1};
#ifdef MODULE
static unsigned int autoload = 1;
#else
@@ -83,11 +83,11 @@
MODULE_PARM_DESC(vsfx,"set VSFX pci config bit "
"[yet another chipset flaw workaround]");
MODULE_PARM(no_overlay,"i");
-MODULE_PARM(card,"1-4i");
+MODULE_PARM(card,"1-" __stringify(BTTV_MAX) "i");
MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list");
-MODULE_PARM(pll,"1-4i");
+MODULE_PARM(pll,"1-" __stringify(BTTV_MAX) "i");
MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz, 35=35 MHz)");
-MODULE_PARM(tuner,"1-4i");
+MODULE_PARM(tuner,"1-" __stringify(BTTV_MAX) "i");
MODULE_PARM_DESC(tuner,"specify installed tuner type");
MODULE_PARM(autoload,"i");
MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o, default is 1 (yes)");
@@ -127,7 +127,7 @@
} cards[] __devinitdata = {
{ 0x13eb0070, BTTV_HAUPPAUGE878, "Hauppauge WinTV" },
{ 0x39000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV-D" },
- { 0x45000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV/PVR" },
+ { 0x45000070, BTTV_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" },
{ 0xff000070, BTTV_HAUPPAUGE878, "Osprey-100" },
{ 0xff010070, BTTV_HAUPPAUGE878, "Osprey-200" },
@@ -135,9 +135,10 @@
{ 0x00031002, BTTV_ATI_TVWONDERVE,"ATI TV Wonder/VE" },
{ 0x6606107d, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" },
+ { 0x6607107d, BTTV_WINFAST2000, "Leadtek WinFast VC 100" },
{ 0x263610b4, BTTV_STB2, "STB TV PCI FM, P/N 6000704" },
- { 0x402010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCV3/PCI" },
- { 0x405010fc, BTTV_GVBCTV4PCI, "I-O Data Co. GV-BCV4/PCI" },
+ { 0x402010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" },
+ { 0x405010fc, BTTV_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" },
{ 0x1200bd11, BTTV_PINNACLE, "Pinnacle PCTV" },
{ 0x001211bd, BTTV_PINNACLE, "Pinnacle PCTV" },
@@ -163,6 +164,8 @@
{ 0x111a153b, BTTV_TERRATVALUE, "Terratec TValue" },
{ 0x1123153b, BTTV_TERRATVRADIO, "Terratec TV Radio+" },
{ 0x1127153b, BTTV_TERRATV, "Terratec TV+" },
+ // clashes with FlyVideo
+ //{ 0x18521852, BTTV_TERRATV, "Terratec TV+" },
{ 0x1134153b, BTTV_TERRATVALUE, "Terratec TValue" },
{ 0x1135153b, BTTV_TERRATVALUER, "Terratec TValue Radio" },
{ 0x5018153b, BTTV_TERRATVALUE, "Terratec TValue" },
@@ -174,13 +177,14 @@
{ 0x010115cb, BTTV_GMV1, "AG GMV1" },
{ 0x010114c7, BTTV_MODTEC_205, "Modular Technology MM205 PCTV" },
- { 0x18501851, BTTV_CHRONOS_VS2, "Flyvideo 98 (LR50)/ Chronos Video Shuttle II" },
- { 0x18511851, BTTV_FLYVIDEO98EZ, "Flyvideo 98EZ (LR51)/ CyberMail AV" },
- { 0x18521852, BTTV_TYPHOON_TVIEW, "Flyvideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" },
+ { 0x18501851, BTTV_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },
+ { 0x18511851, BTTV_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" },
+ { 0x18521852, BTTV_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" },
{ 0x10b42636, BTTV_HAUPPAUGE878, "STB ???" },
{ 0x217d6606, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" },
{ 0x03116000, BTTV_SENSORAY311, "Sensoray 311" },
{ 0x00790e11, BTTV_WINDVR, "Canopus WinDVR PCI" },
+ { 0xa0fca1a0, BTTV_ZOLTRIX, "Face to Face Tvmax" },
{ 0, -1, NULL }
};
@@ -235,16 +239,16 @@
},{
/* ---- card 0x04 ---------------------------------- */
- name: "Intel",
- video_inputs: 3,
- audio_inputs: 1,
- tuner: 0,
- svhs: -1,
- gpiomask: 7,
+ name: "Intel Create and Share PCI/ Smart Video Recorder III",
+ video_inputs: 4,
+ audio_inputs: 0,
+ tuner: -1,
+ svhs: 2,
+ gpiomask: 0,
muxsel: { 2, 3, 1, 1},
- audiomux: { 0, 1, 2, 3, 4},
- needs_tvaudio: 1,
- tuner_type: -1,
+ audiomux: { 0 },
+ needs_tvaudio: 0,
+ tuner_type: 4,
},{
name: "Diamond DTV2000",
video_inputs: 4,
@@ -283,7 +287,7 @@
},{
/* ---- card 0x08 ---------------------------------- */
- name: "FlyVideo II (Bt848) LR26",
+ name: "Lifeview FlyVideo II (Bt848) LR26",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -295,7 +299,7 @@
pll: PLL_28,
tuner_type: -1,
},{
- name: "IXMicro TurboTV",
+ name: "IMS/IXmicro TurboTV",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -303,8 +307,9 @@
gpiomask: 3,
muxsel: { 2, 3, 1, 1},
audiomux: { 1, 1, 2, 3, 0},
- needs_tvaudio: 1,
- tuner_type: -1,
+ needs_tvaudio: 0,
+ pll: PLL_28,
+ tuner_type: TUNER_TEMIC_PAL,
},{
name: "Hauppauge (bt878)",
video_inputs: 4,
@@ -331,7 +336,7 @@
},{
/* ---- card 0x0c ---------------------------------- */
- name: "ADS Technologies Channel Surfer TV",
+ name: "ADS Technologies Channel Surfer TV (bt848)",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -352,7 +357,7 @@
audiomux: { 13, 14, 11, 7, 0, 0},
needs_tvaudio: 1,
pll: PLL_28,
- tuner_type: -1,
+ tuner_type: TUNER_PHILIPS_PAL,
},{
name: "Aimslab Video Highway Xtreme (VHX)",
video_inputs: 3,
@@ -363,6 +368,7 @@
muxsel: { 2, 3, 1, 1},
audiomux: { 0, 2, 1, 3, 4}, /* old: { 0, 1, 2, 3, 4} */
needs_tvaudio: 1,
+ pll: PLL_28,
tuner_type: -1,
},{
name: "Zoltrix TV-Max",
@@ -378,7 +384,7 @@
},{
/* ---- card 0x10 ---------------------------------- */
- name: "Pixelview PlayTV (bt878)",
+ name: "Prolink Pixelview PlayTV (bt878)",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -414,8 +420,8 @@
needs_tvaudio: 1,
tuner_type: -1,
},{
- name: "LifeView FlyKit w/o Tuner",
- video_inputs: 3,
+ name: "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)",
+ video_inputs: 4,
audio_inputs: 1,
tuner: -1,
svhs: -1,
@@ -435,19 +441,18 @@
muxsel: {2, 3, 1, 1},
tuner_type: -1,
},{
- name: "Lucky Star Image World ConferenceTV",
- video_inputs: 3,
- audio_inputs: 1,
+ name: "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50",
+ video_inputs: 4,
+ audio_inputs: 2, // tuner, line in
tuner: 0,
svhs: 2,
- gpiomask: 0x00fffe07,
+ gpiomask: 0x1800,
muxsel: { 2, 3, 1, 1},
- audiomux: { 131072, 1, 1638400, 3, 4},
- needs_tvaudio: 1,
+ audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800},
pll: PLL_28,
tuner_type: TUNER_PHILIPS_PAL_I,
},{
- name: "Phoebe Tv Master + FM (CPH050)",
+ name: "Askey CPH050/ Phoebe Tv Master + FM",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -456,6 +461,7 @@
muxsel: { 2, 3, 1, 1},
audiomux: {0, 1, 0x800, 0x400, 0xc00, 0},
needs_tvaudio: 1,
+ pll: PLL_28,
tuner_type: -1,
},{
name: "Modular Technology MM205 PCTV, bt878",
@@ -472,7 +478,7 @@
},{
/* ---- card 0x18 ---------------------------------- */
- name: "[many vendors] CPH05X/06X (bt878)",
+ name: "Askey CPH05X/06X (bt878) [many vendors]",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -484,7 +490,7 @@
pll: PLL_28,
tuner_type: -1,
},{
- name: "Terratec/Vobis TV-Boostar",
+ name: "Terratec Terra TV+ Version 1.0 (Bt848)/Vobis TV-Boostar",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -495,7 +501,7 @@
needs_tvaudio: 1,
tuner_type: -1,
},{
- name: "Newer Hauppauge WinCam (bt878)",
+ name: "Hauppauge WinCam newer (bt878)",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -506,15 +512,15 @@
needs_tvaudio: 1,
tuner_type: -1,
},{
- name: "MAXI TV Video PCI2",
- video_inputs: 3,
- audio_inputs: 1,
+ name: "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50",
+ video_inputs: 4,
+ audio_inputs: 2,
tuner: 0,
svhs: 2,
- gpiomask: 0xffff,
+ gpiomask: 0x1800,
muxsel: { 2, 3, 1, 1},
- audiomux: { 0, 1, 2, 3, 0xc00},
- needs_tvaudio: 1,
+ audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800},
+ pll: PLL_28,
tuner_type: TUNER_PHILIPS_SECAM,
},{
@@ -543,18 +549,18 @@
needs_tvaudio: 1,
tuner_type: -1,
},{
- name: "FlyVideo 98",
- video_inputs: 3,
+ name: "Lifeview FlyVideo 98 LR50",
+ video_inputs: 4,
audio_inputs: 1,
tuner: 0,
svhs: 2,
gpiomask: 0x1800, //0x8dfe00
- muxsel: {2, 3, 1, 1},
+ muxsel: { 2, 3, 1, 1},
audiomux: { 0, 0x0800, 0x1000, 0x1000, 0x1800, 0 },
- needs_tvaudio: 1,
+ pll: PLL_28,
tuner_type: -1,
},{
- name: "iProTV",
+ name: "Formac iProTV",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -566,16 +572,16 @@
},{
/* ---- card 0x20 ---------------------------------- */
- name: "Intel Create and Share PCI",
+ name: "Intel Create and Share PCI/ Smart Video Recorder III",
video_inputs: 4,
- audio_inputs: 1,
- tuner: 0,
+ audio_inputs: 0,
+ tuner: -1,
svhs: 2,
- gpiomask: 7,
+ gpiomask: 0,
muxsel: { 2, 3, 1, 1},
- audiomux: { 4, 4, 4, 4, 4},
- needs_tvaudio: 1,
- tuner_type: -1,
+ audiomux: { 0 },
+ needs_tvaudio: 0,
+ tuner_type: 4,
},{
name: "Terratec TerraTValue",
video_inputs: 3,
@@ -589,47 +595,57 @@
pll: PLL_28,
tuner_type: TUNER_PHILIPS_PAL,
},{
- name: "Leadtek WinFast 2000",
- video_inputs: 3,
+ name: "Leadtek WinFast 2000/ WinFast 2000 XP",
+ video_inputs: 4,
audio_inputs: 1,
tuner: 0,
svhs: 2,
gpiomask: 0xc33000,
- muxsel: { 2, 3, 1, 1,0},
- audiomux: { 0x422000,0x001000,0x621100,0x620000,0x800000,0x620000},
+ muxsel: { 2, 3, 1, 1, 0}, // TV, CVid, SVid, CVid over SVid connector
+ audiomux: { 0x422000,0x1000,0x0000,0x620000,0x800000},
+ /* Audio Routing for "WinFast 2000 XP" (no tv stereo !)
+ gpio23 -- hef4052:nEnable (0x800000)
+ gpio12 -- hef4052:A1
+ gpio13 -- hef4052:A0
+ 0x0000: external audio
+ 0x1000: FM
+ 0x2000: TV
+ 0x3000: n.c.
+ Note: There exists another variant "Winfast 2000" with tv stereo !?
+ Note: eeprom only contains FF and pci subsystem id 107d:6606
+ */
needs_tvaudio: 0,
pll: PLL_28,
- tuner_type: -1,
+ has_radio: 1,
+ tuner_type: 5, // default for now, gpio reads BFFF06 for Pal bg+dk
audio_hook: winfast2000_audio,
},{
- name: "Flyvideo 98 (LR50Q) / Chronos Video Shuttle II",
- video_inputs: 3,
+ name: "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II",
+ video_inputs: 4,
audio_inputs: 3,
tuner: 0,
svhs: 2,
gpiomask: 0x1800,
muxsel: { 2, 3, 1, 1},
audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800},
- needs_tvaudio: 1,
pll: PLL_28,
tuner_type: -1,
},{
/* ---- card 0x24 ---------------------------------- */
- name: "Flyvideo 98FM (LR50Q) / Typhoon TView TV/FM Tuner",
- video_inputs: 3,
+ name: "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner",
+ video_inputs: 4,
audio_inputs: 3,
tuner: 0,
svhs: 2,
gpiomask: 0x1800,
muxsel: { 2, 3, 1, 1},
audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 },
- needs_tvaudio: 1,
pll: PLL_28,
tuner_type: -1,
has_radio: 1,
},{
- name: "PixelView PlayTV pro",
+ name: "Prolink PixelView PlayTV pro",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -641,7 +657,7 @@
pll: PLL_28,
tuner_type: -1,
},{
- name: "TView99 CPH06X",
+ name: "Askey CPH06X TView99",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -684,7 +700,7 @@
audio_inputs: 4,
tuner: 0,
svhs: 2,
- gpiomask: 12,
+ gpiomask: 15,
muxsel: { 2, 3, 1, 1},
audiomux: { 13, 4, 11, 7, 0, 0},
needs_tvaudio: 1,
@@ -700,6 +716,7 @@
gpiomask: 0,
muxsel: { 2, 3, 1, 1},
audiomux: { 0, 0, 0, 0, 0},
+ needs_tvaudio: 1,
no_msp34xx: 1,
pll: PLL_28,
tuner_type: 1,
@@ -758,9 +775,9 @@
audio_inputs: 1,
tuner: 0,
svhs: 2,
- gpiomask: 0x1f0000,
+ gpiomask: 0x70000,
muxsel: { 2, 3, 1, 1},
- audiomux: { 0xe2ffff, 0xebffff, 0, 0, 0xe0ffff, 0xe2ffff },
+ audiomux: { 0x20000, 0x30000, 0x10000, 0, 0x40000, 0x20000 },
needs_tvaudio: 1,
no_msp34xx: 1,
pll: PLL_35,
@@ -769,7 +786,7 @@
},{
/* ---- card 0x30 ---------------------------------- */
- name: "Dynalink Magic TView ",
+ name: "Askey CPH03x/ Dynalink Magic TView",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -781,7 +798,7 @@
pll: PLL_28,
tuner_type: -1,
},{
- name: "GV-BCTV3",
+ name: "IODATA GV-BCTV3/PCI",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -828,6 +845,15 @@
gpiomask: 0x03000F,
muxsel: { 2, 3, 1, 1},
audiomux: { 1, 0x10001, 0, 0, 10},
+ /* sound path (5 sources):
+ MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable)
+ 0= ext. Audio IN
+ 1= from MUX2
+ 2= Mono TV sound from Tuner
+ 3= not connected
+ MUX2 (mask 0x30000):
+ 0,2,3= from MSP34xx
+ 1= FM stereo Radio from Tuner */
needs_tvaudio: 1,
pll: PLL_28,
tuner_type: -1,
@@ -852,7 +878,7 @@
options bttv card=0 pll=1 radio=1 gpiomask=0x18e0
audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff
options tuner type=5 */
- name: "Lifetec LT 9415 TV (LR90 Rev.F)",
+ name: "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -860,17 +886,16 @@
gpiomask: 0x18e0,
muxsel: { 2, 3, 1, 1},
audiomux: { 0x0000,0x0800,0x1000,0x1000,0x18e0 },
- /* 0x0000: Tuner normal stereo
+ /* For cards with tda9820/tda9821:
+ 0x0000: Tuner normal stereo
0x0080: Tuner A2 SAP (second audio program = Zweikanalton)
0x0880: Tuner A2 stereo */
pll: PLL_28,
- tuner_type: TUNER_PHILIPS_PAL,
- audio_hook: lt9415_audio,
- has_radio: 1,
+ tuner_type: -1,
},{
/* Miguel Angel Alvarez <maacruz@navegalia.com>
old Easy TV BT848 version (model CPH031) */
- name: "BESTBUY Easy TV (CPH031)",
+ name: "Askey CPH031/ BESTBUY Easy TV",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -885,15 +910,14 @@
/* ---- card 0x38 ---------------------------------- */
/* Gordon Heydon <gjheydon@bigfoot.com ('98) */
- name: "FlyVideo '98/FM",
- video_inputs: 3,
+ name: "Lifeview FlyVideo 98FM LR50",
+ video_inputs: 4,
audio_inputs: 3,
tuner: 0,
svhs: 2,
gpiomask: 0x1800,
- muxsel: { 2, 3, 0, 1},
+ muxsel: { 2, 3, 1, 1},
audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 },
- needs_tvaudio: 1,
pll: PLL_28,
tuner_type: 5,
},{
@@ -914,7 +938,7 @@
tuner_type: -1,
},{
/* Daniel Herrington <daniel.herrington@home.com> */
- name: "Phoebe TV Master Only (No FM) CPH060",
+ name: "Askey CPH060/ Phoebe TV Master Only (No FM)",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -923,11 +947,11 @@
muxsel: { 2, 3, 1, 1},
audiomux: { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 },
needs_tvaudio: 1,
- pll: PLL_NONE,
+ pll: PLL_28,
tuner_type: TUNER_TEMIC_4036FY5_NTSC,
},{
/* Matti Mottus <mottus@physic.ut.ee> */
- name: "TV Capturer (CPH03X)",
+ name: "Askey CPH03x TV Capturer",
video_inputs: 4,
audio_inputs: 1,
tuner: 0,
@@ -944,10 +968,12 @@
name: "Modular Technology MM100PCTV",
video_inputs: 2,
audio_inputs: 2,
+ tuner: 0,
+ svhs: -1,
gpiomask: 11,
muxsel: { 2, 3, 1, 1},
audiomux: { 2, 0, 0, 1, 8},
- pll: PLL_NONE,
+ pll: PLL_35,
tuner_type: TUNER_TEMIC_PAL,
},{
@@ -968,7 +994,7 @@
/* Miguel Angel Alvarez <maacruz@navegalia.com>
new Easy TV BT878 version (model CPH061)
special thanks to Informatica Mieres for providing the card */
- name: "BESTBUY Easy TV (bt878)",
+ name: "Askey CPH061/ BESTBUY Easy TV (bt878)",
video_inputs: 3,
audio_inputs: 2,
tuner: 0,
@@ -1008,7 +1034,7 @@
tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL,
},{
/* DeeJay <deejay@westel900.net (2000S) */
- name: "FlyVideo 2000S",
+ name: "Lifeview FlyVideo 2000S LR90",
video_inputs: 3,
audio_inputs: 3,
tuner: 0,
@@ -1016,7 +1042,7 @@
gpiomask: 0x18e0,
muxsel: { 2, 3, 0, 1},
/* Radio changed from 1e80 to 0x800 to make
- Flyvideo2000S in .hu happy (gm)*/
+ FlyVideo2000S in .hu happy (gm)*/
/* -dk-???: set mute=0x1800 for tda9874h daughterboard */
audiomux: { 0x0000,0x0800,0x1000,0x1000,0x1800, 0x1080 },
audio_hook: fv2000s_audio,
@@ -1040,7 +1066,7 @@
has_radio: 1,
},{
/* TANAKA Kei <peg00625@nifty.com> */
- name: "GV-BCTV4/PCI",
+ name: "IODATA GV-BCTV4/PCI",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -1084,7 +1110,7 @@
gpiomask: 0
},{
/* Tomasz Pyra <hellfire@sedez.iq.pl> */
- name: "PV-BT878P+",
+ name: "Prolink Pixelview PV-BT878P+ (Rev.4C)",
video_inputs: 3,
audio_inputs: 4,
tuner: 0,
@@ -1096,7 +1122,7 @@
pll: PLL_28,
tuner_type: 25,
},{
- name: "Flyvideo 98EZ (capture only)",
+ name: "Lifeview FlyVideo 98EZ (capture only) LR51",
video_inputs: 4,
audio_inputs: 0,
tuner: -1,
@@ -1108,7 +1134,7 @@
/* ---- card 0x48 ---------------------------------- */
/* Dariusz Kowalewski <darekk@automex.pl> */
- name: "Prolink PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)",
+ name: "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)",
video_inputs: 3,
audio_inputs: 1,
tuner: 0,
@@ -1141,8 +1167,8 @@
name: "RemoteVision MX (RV605)",
video_inputs: 16,
audio_inputs: 0,
- tuner: 0,
- svhs: 0,
+ tuner: -1,
+ svhs: -1,
gpiomask: 0x00,
gpiomask2: 0x07ff,
muxsel: { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03,
@@ -1155,6 +1181,7 @@
name: "Powercolor MTV878/ MTV878R/ MTV878F",
video_inputs: 3,
audio_inputs: 2,
+ tuner: 0,
svhs: 2,
gpiomask: 0x1C800F, // Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset
muxsel: { 2, 1, 1, },
@@ -1191,15 +1218,57 @@
pll: PLL_28,
tuner_type: -1,
},{
- /* http://www.aopen.com/products/video/va1000.htm */
- name: "AOPEN VA1000",
- video_inputs: 3, /* coax, AV, s-vid */
- audio_inputs: 1,
- tuner: 0,
- tuner_type: TUNER_LG_PAL, /* actually TP18PSB12P (PAL B/G) */
- audiomux: { 2, 0, 0, 0 },
- muxsel: { 2, 3, 1, 0 },
- pll: PLL_28,
+ name: "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF",
+ video_inputs: 4,
+ audio_inputs: 3,
+ tuner: 0,
+ svhs: 2,
+ gpiomask: 7,
+ muxsel: { 2, 3, 1, 1 }, // Tuner, SVid, SVHS, SVid to SVHS connector
+ audiomux: { 0 ,0 ,4, 4,4,4},// Yes, this tuner uses the same audio output for TV and FM radio!
+ // This card lacks external Audio In, so we mute it on Ext. & Int.
+ // The PCB can take a sbx1637/sbx1673, wiring unknown.
+ // This card lacks PCI subsystem ID, sigh.
+ // audiomux=1: lower volume, 2+3: mute
+ // btwincap uses 0x80000/0x80003
+ needs_tvaudio: 0,
+ no_msp34xx: 1,
+ pll: PLL_28,
+ tuner_type: 5, // Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and
+ // radio signal strength indicators work fine.
+ has_radio: 1,
+ /* GPIO Info:
+ GPIO0,1: HEF4052 A0,A1
+ GPIO2: HEF4052 nENABLE
+ GPIO3-7: n.c.
+ GPIO8-13: IRDC357 data0,5 (data6 n.c. ?) [chip not present on my card]
+ GPIO14,15: ??
+ GPIO16-21: n.c.
+ GPIO22,23: ??
+ ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/
+},{
+ /* Arthur Tetzlaff-Deas, DSP Design Ltd <software@dspdesign.com> */
+ name: "DSP Design TCVIDEO",
+ video_inputs: 4,
+ svhs: -1,
+ muxsel: { 2, 3, 1, 0},
+ pll: PLL_28,
+ tuner_type: -1,
+},{
+
+ /* ---- card 0x50 ---------------------------------- */
+ name: "Hauppauge WinTV PVR",
+ video_inputs: 4,
+ audio_inputs: 1,
+ tuner: 0,
+ svhs: 2,
+ muxsel: { 2, 0, 1, 1},
+ needs_tvaudio: 1,
+ pll: PLL_28,
+ tuner_type: -1,
+
+ gpiomask: 7,
+ audiomux: {7},
}};
const int bttv_num_tvcards = (sizeof(bttv_tvcards)/sizeof(struct tvcard));
@@ -1289,8 +1358,8 @@
*/
static void flyvideo_gpio(struct bttv *btv)
-{
- int gpio,outbits;
+{
+ int gpio,outbits,has_remote,has_radio,is_capture_only,is_lr90,has_tda9820_tda9821;
int tuner=-1,ttype;
outbits = btread(BT848_GPIO_OUT_EN);
@@ -1299,29 +1368,56 @@
gpio=btread(BT848_GPIO_DATA);
btwrite(outbits, BT848_GPIO_OUT_EN);
// all cards provide GPIO info, some have an additional eeprom
+ // LR50: GPIO coding can be found lower right CP1 .. CP9
+ // CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1.
+ // GPIO14-12: n.c.
+ // LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878)
// lowest 3 bytes are remote control codes (no handshake needed)
+ // xxxFFF: No remote control chip soldered
+ // xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered
+ // Note: Some bits are Audio_Mask !
+
ttype=(gpio&0x0f0000)>>16;
switch(ttype) {
- case 0: tuner=4; // None
+ case 0x0: tuner=4; // None
+ break;
+ case 0x2: tuner=39;// LG NTSC (newer TAPC series) TAPC-H701P
break;
- case 4: tuner=5; // Philips PAL
+ case 0x4: tuner=5; // Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216
break;
- case 6: tuner=37; // LG PAL (newer TAPC series)
+ case 0x6: tuner=37; // LG PAL (newer TAPC series) TAPC-G702P
break;
- case 0xC: tuner=3; // Philips SECAM(+PAL)
+ case 0xC: tuner=3; // Philips SECAM(+PAL) FQ1216ME or FI1216MF
break;
default:
- printk(KERN_INFO "bttv%d: flyvideo_gpio: unknown tuner type.\n", btv->nr);
+ printk(KERN_INFO "bttv%d: FlyVideo_gpio: unknown tuner type.\n", btv->nr);
}
-
- printk(KERN_INFO "bttv%d: Flyvideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
- btv->nr,
- gpio&0x400000? "yes":"no",
- gpio&0x800000? "yes":"no", tuner, gpio);
-
- btv->tuner_type = tuner;
- btv->has_radio = gpio&0x400000? 1:0;
+
+ has_remote = gpio & 0x800000;
+ has_radio = gpio & 0x400000;
+ // unknown 0x200000;
+ // unknown2 0x100000;
+ is_capture_only = !(gpio & 0x008000); //GPIO15
+ has_tda9820_tda9821 = !(gpio & 0x004000);
+ is_lr90 = !(gpio & 0x002000); // else LR26/LR50 (LR38/LR51 f. capture only)
+ // gpio & 0x001000 // output bit for audio routing
+
+ printk(KERN_INFO "bttv%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
+ btv->nr, has_radio? "yes":"no ", has_remote? "yes":"no ", tuner, gpio);
+ printk(KERN_INFO "bttv%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n",
+ btv->nr, is_lr90?"yes":"no ", has_tda9820_tda9821?"yes":"no ",
+ is_capture_only?"yes":"no ");
+
+ if(tuner!= -1) // only set if known tuner autodetected, else let insmod option through
+ btv->tuner_type = tuner;
+ btv->has_radio = has_radio;
+
+ // LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80
+ // LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00
+ // Audio options: from tuner, from tda9821/tda9821(mono,stereo.sap), from tda9874, ext., mute
+ if(has_tda9820_tda9821) btv->audio_hook = lt9415_audio;
+ //todo: if(has_tda9874) btv->audio_hook = fv2000s_audio;
}
int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1,
@@ -1329,86 +1425,98 @@
int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1,
1,1,1,1, 1,1,1,0, 0,0,0,0, 0,0,0,0 };
+static void miro_pinnacle_gpio(struct bttv *btv)
+{
+ int id,msp;
+
+ id = ((btread(BT848_GPIO_DATA)>>10) & 31) -1;
+ msp = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx");
+ btv->tuner_type = miro_tunermap[id];
+ if (0 == (btread(BT848_GPIO_DATA) & 0x20)) {
+ btv->has_radio = 1;
+ if (!miro_fmtuner[id]) {
+ btv->has_matchbox = 1;
+ btv->mbox_we = (1<<6);
+ btv->mbox_most = (1<<7);
+ btv->mbox_clk = (1<<8);
+ btv->mbox_data = (1<<9);
+ btv->mbox_mask = (1<<6)|(1<<7)|(1<<8)|(1<<9);
+ }
+ } else {
+ btv->has_radio = 0;
+ }
+ if (-1 != msp) {
+ if (btv->type == BTTV_MIRO)
+ btv->type = BTTV_MIROPRO;
+ if (btv->type == BTTV_PINNACLE)
+ btv->type = BTTV_PINNACLEPRO;
+ }
+ printk(KERN_INFO "bttv%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
+ btv->nr, id+1, btv->tuner_type,
+ !btv->has_radio ? "no" :
+ (btv->has_matchbox ? "matchbox" : "fmtuner"),
+ (-1 == msp) ? "no" : "yes");
+}
+
/* initialization part one -- before registering i2c bus */
void __devinit bttv_init_card1(struct bttv *btv)
{
- if (btv->type == BTTV_HAUPPAUGE || btv->type == BTTV_HAUPPAUGE878)
+ switch (btv->type) {
+ case BTTV_HAUPPAUGE:
+ case BTTV_HAUPPAUGE878:
boot_msp34xx(btv,5);
- if (btv->type == BTTV_VOODOOTV_FM)
- boot_msp34xx(btv,20);
+ break;
+ case BTTV_VOODOOTV_FM:
+ boot_msp34xx(btv,20);
+ break;
+ case BTTV_HAUPPAUGEPVR:
+ pvr_boot(btv);
+ break;
+ }
}
-/* initialization part one -- after registering i2c bus */
+/* initialization part two -- after registering i2c bus */
void __devinit bttv_init_card2(struct bttv *btv)
{
- /* miro/pinnacle */
- if (btv->type == BTTV_MIRO ||
- btv->type == BTTV_MIROPRO ||
- btv->type == BTTV_PINNACLE ||
- btv->type == BTTV_PINNACLEPRO) {
- int id,msp;
- id = ((btread(BT848_GPIO_DATA)>>10) & 31) -1;
- msp = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx");
- btv->tuner_type = miro_tunermap[id];
- if (0 == (btread(BT848_GPIO_DATA) & 0x20)) {
- btv->has_radio = 1;
- if (!miro_fmtuner[id]) {
- btv->has_matchbox = 1;
- btv->mbox_we = (1<<6);
- btv->mbox_most = (1<<7);
- btv->mbox_clk = (1<<8);
- btv->mbox_data = (1<<9);
- btv->mbox_mask = (1<<6)|(1<<7)|(1<<8)|(1<<9);
- }
- } else {
- btv->has_radio = 0;
- }
- if (-1 != msp) {
- if (btv->type == BTTV_MIRO)
- btv->type = BTTV_MIROPRO;
- if (btv->type == BTTV_PINNACLE)
- btv->type = BTTV_PINNACLEPRO;
- }
- if (bttv_verbose)
- printk(KERN_INFO "bttv%d: miro: id=%d tuner=%d "
- "radio=%s stereo=%s\n",
- btv->nr, id+1, btv->tuner_type,
- !btv->has_radio ? "no" :
- (btv->has_matchbox ? "matchbox" : "fmtuner"),
- (-1 == msp) ? "no" : "yes");
-#if 0
- if (btv->has_matchbox) {
- if (bttv_verbose)
- printk(KERN_INFO "Initializing TEA5757...\n");
- init_tea5757(btv);
- }
-#endif
- }
+ btv->tuner_type = -1;
- if (btv->type == BTTV_FLYVIDEO_98 ||
- btv->type == BTTV_FLYVIDEO ||
- btv->type == BTTV_TYPHOON_TVIEW ||
- btv->type == BTTV_CHRONOS_VS2 ||
- btv->type == BTTV_FLYVIDEO_98FM ||
- btv->type == BTTV_FLYVIDEO2000 ||
- btv->type == BTTV_FLYVIDEO98EZ)
+ switch (btv->type) {
+ case BTTV_MIRO:
+ case BTTV_MIROPRO:
+ case BTTV_PINNACLE:
+ case BTTV_PINNACLEPRO:
+ /* miro/pinnacle */
+ miro_pinnacle_gpio(btv);
+ break;
+ case BTTV_FLYVIDEO_98:
+ case BTTV_MAXI:
+ case BTTV_LIFE_FLYKIT:
+ case BTTV_FLYVIDEO:
+ case BTTV_TYPHOON_TVIEW:
+ case BTTV_CHRONOS_VS2:
+ case BTTV_FLYVIDEO_98FM:
+ case BTTV_FLYVIDEO2000:
+ case BTTV_FLYVIDEO98EZ:
+ case BTTV_CONFERENCETV:
+ case BTTV_LIFETEC_9415:
flyvideo_gpio(btv);
-
- if (btv->type == BTTV_HAUPPAUGE || btv->type == BTTV_HAUPPAUGE878) {
+ break;
+ case BTTV_HAUPPAUGE:
+ case BTTV_HAUPPAUGE878:
+ case BTTV_HAUPPAUGEPVR:
/* pick up some config infos from the eeprom */
bttv_readee(btv,eeprom_data,0xa0);
hauppauge_eeprom(btv);
- }
-
- if (btv->type == BTTV_AVERMEDIA98 || btv->type == BTTV_AVPHONE98) {
+ break;
+ case BTTV_AVERMEDIA98:
+ case BTTV_AVPHONE98:
bttv_readee(btv,eeprom_data,0xa0);
avermedia_eeprom(btv);
- }
-
- if (btv->type == BTTV_PXC200)
+ break;
+ case BTTV_PXC200:
init_PXC200(btv);
-
- if (btv->type == BTTV_VHX) {
+ break;
+ case BTTV_VHX:
btv->has_radio = 1;
btv->has_matchbox = 1;
btv->mbox_we = 0x20;
@@ -1416,20 +1524,13 @@
btv->mbox_clk = 0x08;
btv->mbox_data = 0x10;
btv->mbox_mask = 0x38;
- }
-
- if (btv->type == BTTV_LIFETEC_9415) {
- if (btread(BT848_GPIO_DATA) & 0x4000)
- printk("bttv%d: lifetec: tv mono/fm stereo card\n", btv->nr);
- else
- printk("bttv%d: lifetec: stereo(TDA9821) card\n",btv->nr);
- }
-
- if (btv->type == BTTV_MAGICTVIEW061) {
- if(btv->cardid == 0x4002144f) {
+ break;
+ case BTTV_MAGICTVIEW061:
+ if (btv->cardid == 0x4002144f) {
btv->has_radio=1;
printk("bttv%d: radio detected by subsystem id (CPH05x)\n",btv->nr);
}
+ break;
}
/* pll configuration */
@@ -1465,17 +1566,22 @@
}
}
- /* tuner configuration (from card list / insmod option) */
+ /* tuner configuration (from card list / autodetect / insmod option) */
if (-1 != bttv_tvcards[btv->type].tuner_type)
- btv->tuner_type = bttv_tvcards[btv->type].tuner_type;
+ if( -1 == btv->tuner_type)
+ btv->tuner_type = bttv_tvcards[btv->type].tuner_type;
if (-1 != tuner[btv->nr])
btv->tuner_type = tuner[btv->nr];
if (btv->tuner_type != -1)
bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
+ printk("bttv%d: using tuner=%d\n",btv->nr,btv->tuner_type);
if (bttv_tvcards[btv->type].has_radio)
btv->has_radio=1;
+ if (bttv_tvcards[btv->type].audio_hook)
+ btv->audio_hook=bttv_tvcards[btv->type].audio_hook;
+
/* try to detect audio/fader chips */
if (!bttv_tvcards[btv->type].no_msp34xx &&
bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx") >=0) {
@@ -1597,6 +1703,85 @@
btv->tuner_type, radio ? "yes" : "no");
}
+/* ----------------------------------------------------------------------- */
+
+/*
+ * minimal bootstrap for the WinTV/PVR -- upload altera firmware.
+ *
+ * The hcwamc.rbf firmware file is on the Hauppauge driver CD. Have
+ * a look at Pvr/pvr45xxx.EXE (self-extracting zip archive, can be
+ * unpacked with unzip).
+ */
+static char *firm_altera = "/usr/lib/video4linux/hcwamc.rbf";
+MODULE_PARM(firm_altera,"s");
+MODULE_PARM_DESC(firm_altera,"WinTV/PVR firmware "
+ "(driver CD => unzip pvr45xxx.exe => hcwamc.rbf)");
+
+/* drivers/sound/sound_firmware.c => soundcore.o */
+extern int mod_firmware_load(const char *fn, char **fp);
+
+#define PVR_GPIO_DELAY 10
+
+#define BTTV_ALT_DATA 0x000001
+#define BTTV_ALT_DCLK 0x100000
+#define BTTV_ALT_NCONFIG 0x800000
+
+static int __devinit pvr_altera_load(struct bttv *btv, u8 *micro, u32 microlen)
+{
+ u32 n;
+ u8 bits;
+ int i;
+
+ btwrite(BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG,
+ BT848_GPIO_OUT_EN);
+ btwrite(0,BT848_GPIO_DATA);
+ udelay(PVR_GPIO_DELAY);
+
+ btwrite(BTTV_ALT_NCONFIG,BT848_GPIO_DATA);
+ udelay(PVR_GPIO_DELAY);
+
+ for (n = 0; n < microlen; n++) {
+ bits = micro[n];
+ for ( i = 0 ; i < 8 ; i++ ) {
+ btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ if (bits & 0x01)
+ btor(BTTV_ALT_DATA,BT848_GPIO_DATA);
+ else
+ btand(~BTTV_ALT_DATA,BT848_GPIO_DATA);
+ btor(BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ bits >>= 1;
+ }
+ }
+ btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ udelay(PVR_GPIO_DELAY);
+
+ /* begin Altera init loop (Not necessary,but doesn't hurt) */
+ for (i = 0 ; i < 30 ; i++) {
+ btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ btor(BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ }
+ btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA);
+ return 0;
+}
+
+int __devinit pvr_boot(struct bttv *btv)
+{
+ u32 microlen;
+ u8 *micro;
+ int result;
+
+ microlen = mod_firmware_load(firm_altera, (char**) µ);
+ if (!microlen)
+ return -1;
+
+ printk(KERN_INFO "bttv%d: uploading altera firmware [%s] ...\n",
+ btv->nr, firm_altera);
+ result = pvr_altera_load(btv, micro, microlen);
+ printk(KERN_INFO "bttv%d: ... upload %s\n",
+ btv->nr, (result < 0) ? "failed" : "ok");
+ vfree(micro);
+ return result;
+}
/* ----------------------------------------------------------------------- */
/* AVermedia specific stuff, from bktr_card.c */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)