📄 bttv-cards.c
字号:
},{ /* Daniel Herrington <daniel.herrington@home.com> */ name: "Phoebe TV Master Only (No FM) CPH060", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0xe00, muxsel: { 2, 3, 1, 1}, audiomux: { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 }, needs_tvaudio: 1, pll: PLL_NONE, tuner_type: TUNER_TEMIC_4036FY5_NTSC,},{ /* Matti Mottus <mottus@physic.ut.ee> */ name: "TV Capturer (CPH03X)", video_inputs: 4, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0x03000F, muxsel: { 2, 3, 1, 0}, audiomux: { 2,0,0,0,1 }, pll: PLL_28, tuner_type: 0,},{/* ---- card 0x3c ---------------------------------- */ /* Philip Blundell <philb@gnu.org> */ name: "Modular Technology MM100PCTV", video_inputs: 2, audio_inputs: 2, gpiomask: 11, muxsel: { 2, 3, 1, 1}, audiomux: { 2, 0, 0, 1, 8}, pll: PLL_NONE, tuner_type: TUNER_TEMIC_PAL,},{ /* Adrian Cox <adrian@humboldt.co.uk */ name: "AG Electronics GMV1", video_inputs: 2, audio_inputs: 0, tuner: -1, svhs: 1, gpiomask: 0xF, muxsel: { 2, 2}, audiomux: { }, no_msp34xx: 1, needs_tvaudio: 0, pll: PLL_28, tuner_type: -1,},{ /* 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)", video_inputs: 3, audio_inputs: 2, tuner: 0, svhs: 2, gpiomask: 0xFF, muxsel: { 2, 3, 1, 0}, audiomux: { 1, 0, 4, 4, 9}, needs_tvaudio: 0, pll: PLL_28, tuner_type: TUNER_PHILIPS_PAL,},{ /* Lukas Gebauer <geby@volny.cz> */ name: "ATI TV-Wonder", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0xf03f, muxsel: { 2, 3, 1, 0 }, audiomux: { 0xbffe, 0, 0xbfff, 0, 0xbffe}, pll: PLL_28, tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL,},{/* ---- card 0x40 ---------------------------------- */ /* Lukas Gebauer <geby@volny.cz> */ name: "ATI TV-Wonder VE", video_inputs: 2, audio_inputs: 1, tuner: 0, svhs: -1, gpiomask: 1, muxsel: { 2, 3, 0, 1}, audiomux: { 0, 0, 1, 0, 0}, no_msp34xx: 1, pll: PLL_28, tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL,},{ /* DeeJay <deejay@westel900.net (2000S) */ name: "FlyVideo 2000S", video_inputs: 3, audio_inputs: 3, tuner: 0, svhs: 2, gpiomask: 0x18e0, muxsel: { 2, 3, 0, 1}, /* Radio changed from 1e80 to 0x800 to make Flyvideo2000S in .hu happy (gm)*/ /* -dk-???: set mute=0x1800 for tda9874h daughterboard */ audiomux: { 0x0000,0x0800,0x1000,0x1000,0x1800, 0x1080 }, audio_hook: fv2000s_audio, no_msp34xx: 1, no_tda9875: 1, needs_tvaudio: 1, pll: PLL_28, tuner_type: 5,},{ name: "Terratec TValueRadio", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0xffff00, muxsel: { 2, 3, 1, 1}, audiomux: { 0x500, 0x500, 0x300, 0x900, 0x900}, needs_tvaudio: 1, pll: PLL_28, tuner_type: TUNER_PHILIPS_PAL, has_radio: 1,},{ /* TANAKA Kei <peg00625@nifty.com> */ name: "GV-BCTV4/PCI", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0x010f00, muxsel: {2, 3, 0, 0}, audiomux: {0x10000, 0, 0x10000, 0, 0, 0}, no_msp34xx: 1, pll: PLL_28, tuner_type: TUNER_SHARP_2U5JF5540_NTSC, audio_hook: gvbctv3pci_audio,},{/* ---- card 0x44 ---------------------------------- */ name: "3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA)", // try "insmod msp3400 simple=0" if you have // sound problems with this card. video_inputs: 4, audio_inputs: 1, tuner: 0, svhs: -1, gpiomask: 0x4f8a00, // 0x100000: 1=MSP enabled (0=disable again) // 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) audiomux: {0x947fff, 0x987fff,0x947fff,0x947fff, 0x947fff}, // tvtuner, radio, external,internal, mute, stereo /* tuner, Composit, SVid, Composit-on-Svid-adapter*/ muxsel: { 2, 3 ,0 ,1}, tuner_type: TUNER_MT2032, pll: PLL_28, has_radio: 1,},{ /* Philip Blundell <pb@nexus.co.uk> */ name: "Active Imaging AIMMS", video_inputs: 1, audio_inputs: 0, tuner: -1, tuner_type: -1, pll: PLL_28, muxsel: { 2 }, gpiomask: 0},{ /* Tomasz Pyra <hellfire@sedez.iq.pl> */ name: "PV-BT878P+", video_inputs: 3, audio_inputs: 4, tuner: 0, svhs: 2, gpiomask: 15, muxsel: { 2, 3, 1, 1}, audiomux: { 0, 0, 11, 7, 13, 0}, needs_tvaudio: 1, pll: PLL_28, tuner_type: 25,},{ name: "Flyvideo 98EZ (capture only)", video_inputs: 4, audio_inputs: 0, tuner: -1, svhs: 2, muxsel: { 2, 3, 1, 1}, // AV1, AV2, SVHS, CVid adapter on SVHS pll: PLL_28, no_msp34xx: 1,},{/* ---- card 0x48 ---------------------------------- */ /* Dariusz Kowalewski <darekk@automex.pl> */ name: "Prolink PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0x3f, muxsel: { 2, 3, 0, 1 }, audiomux: { 0x01, 0x00, 0x03, 0x03, 0x09, 0x02 }, needs_tvaudio: 1, no_msp34xx: 1, no_tda9875: 1, pll: PLL_28, tuner_type: -1, audio_hook: pvbt878p9b_audio, has_radio: 1,},{ /* Clay Kunz <ckunz@mail.arc.nasa.gov> */ /* you must jumper JP5 for the card to work */ name: "Sensoray 311", video_inputs: 5, audio_inputs: 0, tuner: -1, svhs: 4, gpiomask: 0, muxsel: { 2, 3, 1, 0, 0}, audiomux: { 0 }, needs_tvaudio: 0, tuner_type: -1,},{ /* Miguel Freitas <miguel@cetuc.puc-rio.br> */ name: "RemoteVision MX (RV605)", video_inputs: 16, audio_inputs: 0, tuner: 0, svhs: 0, gpiomask: 0x00, gpiomask2: 0x07ff, muxsel: { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03, 0xd3, 0xb3, 0xc3, 0x63, 0x93, 0x53, 0x83, 0xa3 }, no_msp34xx: 1, no_tda9875: 1, tuner_type: -1, muxsel_hook: rv605_muxsel,},{ name: "Powercolor MTV878/ MTV878R/ MTV878F", video_inputs: 3, audio_inputs: 2, svhs: 2, gpiomask: 0x1C800F, // Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset muxsel: { 2, 1, 1, }, audiomux: { 0, 1, 2, 2, 4 }, needs_tvaudio: 0, tuner_type: TUNER_PHILIPS_PAL, pll: PLL_28, has_radio: 1,},{/* ---- card 0x4c ---------------------------------- */ /* Masaki Suzuki <masaki@btree.org> */ name: "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)", video_inputs: 3, audio_inputs: 1, tuner: 0, svhs: 2, gpiomask: 0x140007, muxsel: { 2, 3, 1, 1 }, audiomux: { 0, 1, 2, 3, 4, 0 }, tuner_type: TUNER_PHILIPS_NTSC, audio_hook: windvr_audio,},{ name: "GrandTec Multi Capture Card (Bt878)", video_inputs: 4, audio_inputs: 0, tuner: -1, svhs: -1, gpiomask: 0, muxsel: { 2, 3, 1, 0 }, audiomux: { 0 }, needs_tvaudio: 0, no_msp34xx: 1, 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,}};const int bttv_num_tvcards = (sizeof(bttv_tvcards)/sizeof(struct tvcard));/* ----------------------------------------------------------------------- */static unsigned char eeprom_data[256];/* * identify card */void __devinit bttv_idcard(struct bttv *btv){ unsigned int gpiobits; int i,type; unsigned short tmp; /* read PCI subsystem ID */ pci_read_config_word(btv->dev, PCI_SUBSYSTEM_ID, &tmp); btv->cardid = tmp << 16; pci_read_config_word(btv->dev, PCI_SUBSYSTEM_VENDOR_ID, &tmp); btv->cardid |= tmp; if (0 != btv->cardid && 0xffffffff != btv->cardid) { /* look for the card */ for (type = -1, i = 0; cards[i].id != 0; i++) if (cards[i].id == btv->cardid) type = i; if (type != -1) { /* found it */ printk(KERN_INFO "bttv%d: detected: %s [card=%d], " "PCI subsystem ID is %04x:%04x\n", btv->nr,cards[type].name,cards[type].cardnr, btv->cardid & 0xffff, btv->cardid >> 16); btv->type = cards[type].cardnr; } else { /* 404 */ printk(KERN_INFO "bttv%d: subsystem: %04x:%04x (UNKNOWN)\n", btv->nr, btv->cardid&0xffff, btv->cardid>>16); printk(KERN_DEBUG "please mail id, board name and " "the correct card= insmod option to kraxel@bytesex.org\n"); } } /* let the user override the autodetected type */ if (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards) btv->type=card[btv->nr]; /* print which card config we are using */ sprintf(btv->video_dev.name,"BT%d%s(%.23s)", btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "", bttv_tvcards[btv->type].name); printk(KERN_INFO "bttv%d: using: %s [card=%d,%s]\n",btv->nr, btv->video_dev.name,btv->type, (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards) ? "insmod option" : "autodetected"); /* overwrite gpio stuff ?? */ if (-1 == audioall && -1 == audiomux[0]) return; if (-1 != audiomux[0]) { gpiobits = 0; for (i = 0; i < 5; i++) { bttv_tvcards[btv->type].audiomux[i] = audiomux[i]; gpiobits |= audiomux[i]; } } else { gpiobits = audioall; for (i = 0; i < 5; i++) { bttv_tvcards[btv->type].audiomux[i] = audioall; } } bttv_tvcards[btv->type].gpiomask = (-1 != gpiomask) ? gpiomask : gpiobits; printk(KERN_INFO "bttv%d: gpio config override: mask=0x%x, mux=", btv->nr,bttv_tvcards[btv->type].gpiomask); for (i = 0; i < 5; i++) { printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->type].audiomux[i]); } printk("\n");}/* * (most) board specific initialisations goes here */static void flyvideo_gpio(struct bttv *btv){ int gpio,outbits; int tuner=-1,ttype; outbits = btread(BT848_GPIO_OUT_EN); btwrite(0x00, BT848_GPIO_OUT_EN); udelay(8); // without this we would see the 0x1800 mask gpio=btread(BT848_GPIO_DATA); btwrite(outbits, BT848_GPIO_OUT_EN); // all cards provide GPIO info, some have an additional eeprom // lowest 3 bytes are remote control codes (no handshake needed) ttype=(gpio&0x0f0000)>>16; switch(ttype) { case 0: tuner=4; // None break; case 4: tuner=5; // Philips PAL break; case 6: tuner=37; // LG PAL (newer TAPC series) break; case 0xC: tuner=3; // Philips SECAM(+PAL) break; default: 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; }int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1, 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 };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 };/* initialization part one -- before registering i2c bus */void __devinit bttv_init_card1(struct bttv *btv){ if (btv->type == BTTV_HAUPPAUGE || btv->type == BTTV_HAUPPAUGE878) boot_msp34xx(btv,5); if (btv->type == BTTV_VOODOOTV_FM) boot_msp34xx(btv,20);}/* initialization part one -- 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; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -