⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
				    IP, 0,				    VTFT, 0xffff,				    CVCF, 0xffff,				    PTRX, 0,				    //CPF, 0,				    CCR, 0,				    PSST, 0,				    DSL, 0x10,				    CCCA, 0,				    Z1, 0,				    Z2, 0,				    FXRT, 0xd01c0000,				    ATKHLDM, 0,				    DCYSUSM, 0,				    IFATN, 0xffff,				    PEFE, 0,				    FMMOD, 0,				    TREMFRQ, 24,	/* 1 Hz */				    FM2FRQ2, 24,	/* 1 Hz */				    TEMPENV, 0,				    /*** These are last so OFF prevents writing ***/				    LFOVAL2, 0,				    LFOVAL1, 0,				    ATKHLDV, 0,				    ENVVOL, 0,				    ENVVAL, 0,                                    TAGLIST_END);		sblive_writeptr(card, CPF, nCh, 0);		/*		  Audigy FXRT initialization		  reversed eng'd, may not be accurate.		 */		if (card->is_audigy) {			sblive_writeptr_tag(card,nCh,					    0x4c,0x0,					    0x4d,0x0,					    0x4e,0x0,					    0x4f,0x0,					    A_FXRT1, 0x3f3f3f3f,					    A_FXRT2, 0x3f3f3f3f,					    A_SENDAMOUNTS, 0,					    TAGLIST_END);		}	}		/*	 ** Init to 0x02109204 :	 ** Clock accuracy    = 0     (1000ppm)	 ** Sample Rate       = 2     (48kHz)	 ** Audio Channel     = 1     (Left of 2)	 ** Source Number     = 0     (Unspecified)	 ** Generation Status = 1     (Original for Cat Code 12)	 ** Cat Code          = 12    (Digital Signal Mixer)	 ** Mode              = 0     (Mode 0)	 ** Emphasis          = 0     (None)	 ** CP                = 1     (Copyright unasserted)	 ** AN                = 0     (Digital audio)	 ** P                 = 0     (Consumer)	 */	sblive_writeptr_tag(card, 0,			    /* SPDIF0 */			    SPCS0, (SPCS_CLKACCY_1000PPM | 0x002000000 |				    SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),			    /* SPDIF1 */			    SPCS1, (SPCS_CLKACCY_1000PPM | 0x002000000 |				    SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),			    /* SPDIF2 & SPDIF3 */			    SPCS2, (SPCS_CLKACCY_1000PPM | 0x002000000 |				    SPCS_CHANNELNUM_LEFT | SPCS_SOURCENUM_UNSPEC | SPCS_GENERATIONSTATUS | 0x00001200 | SPCS_EMPHASIS_NONE | SPCS_COPYRIGHT),			    TAGLIST_END);	if (card->is_audigy && (card->chiprev == 4)) {		/* Hacks for Alice3 to work independent of haP16V driver */		u32 tmp;		//Setup SRCMulti_I2S SamplingRate		tmp = sblive_readptr(card, A_SPDIF_SAMPLERATE, 0);		tmp &= 0xfffff1ff;		tmp |= (0x2<<9);		sblive_writeptr(card, A_SPDIF_SAMPLERATE, 0, tmp);		/* Setup SRCSel (Enable Spdif,I2S SRCMulti) */		emu10k1_writefn0(card, 0x20, 0x600000);		emu10k1_writefn0(card, 0x24, 0x14);		/* Setup SRCMulti Input Audio Enable */		emu10k1_writefn0(card, 0x20, 0x6E0000);		emu10k1_writefn0(card, 0x24, 0xFF00FF00);	}	ret = fx_init(card);		/* initialize effects engine */	if (ret < 0)		return ret;	card->tankmem.size = 0;	card->virtualpagetable.size = MAXPAGES * sizeof(u32);	card->virtualpagetable.addr = pci_alloc_consistent(card->pci_dev, card->virtualpagetable.size, &card->virtualpagetable.dma_handle);	if (card->virtualpagetable.addr == NULL) {		ERROR();		ret = -ENOMEM;		goto err0;	}	card->silentpage.size = EMUPAGESIZE;	card->silentpage.addr = pci_alloc_consistent(card->pci_dev, card->silentpage.size, &card->silentpage.dma_handle);	if (card->silentpage.addr == NULL) {		ERROR();		ret = -ENOMEM;		goto err1;	}	for (pagecount = 0; pagecount < MAXPAGES; pagecount++)		((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32(((u32) card->silentpage.dma_handle * 2) | pagecount);	/* Init page table & tank memory base register */	sblive_writeptr_tag(card, 0,			    PTB, (u32) card->virtualpagetable.dma_handle,			    TCB, 0,			    TCBS, 0,			    TAGLIST_END);	for (nCh = 0; nCh < NUM_G; nCh++) {		sblive_writeptr_tag(card, nCh,				    MAPA, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),				    MAPB, MAP_PTI_MASK | ((u32) card->silentpage.dma_handle * 2),				    TAGLIST_END);	}	/* Hokay, now enable the AUD bit */	/* Enable Audio = 1 */	/* Mute Disable Audio = 0 */	/* Lock Tank Memory = 1 */	/* Lock Sound Memory = 0 */	/* Auto Mute = 1 */	if (card->is_audigy) {		if (card->chiprev == 4)			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AC3ENABLE_CDSPDIF | HCFG_AC3ENABLE_GPSPDIF | HCFG_AUTOMUTE | HCFG_JOYENABLE);		else			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_AUTOMUTE | HCFG_JOYENABLE);	} else {		if (card->model == 0x20 || card->model == 0xc400 ||		 (card->model == 0x21 && card->chiprev < 6))	        	emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE);		else			emu10k1_writefn0(card, HCFG, HCFG_AUDIOENABLE  | HCFG_LOCKTANKCACHE_MASK | HCFG_AUTOMUTE | HCFG_JOYENABLE);	}	/* Enable Vol_Ctrl irqs */	emu10k1_irq_enable(card, INTE_VOLINCRENABLE | INTE_VOLDECRENABLE | INTE_MUTEENABLE | INTE_FXDSPENABLE);	if (card->is_audigy && (card->chiprev == 4)) {		/* Unmute Analog now.  Set GPO6 to 1 for Apollo.		 * This has to be done after init ALice3 I2SOut beyond 48KHz.		 * So, sequence is important. */		u32 tmp = emu10k1_readfn0(card, A_IOCFG);		tmp |= 0x0040;		emu10k1_writefn0(card, A_IOCFG, tmp);	}		/* FIXME: TOSLink detection */	card->has_toslink = 0;	/* Initialize digital passthrough variables */	card->pt.pos_gpr = card->pt.intr_gpr = card->pt.enable_gpr = -1;	card->pt.selected = 0;	card->pt.state = PT_STATE_INACTIVE;	card->pt.spcs_to_use = 0x01;	card->pt.patch_name = "AC3pass";	card->pt.intr_gpr_name = "count";	card->pt.enable_gpr_name = "enable";	card->pt.pos_gpr_name = "ptr";	spin_lock_init(&card->pt.lock);	init_waitqueue_head(&card->pt.wait);/*	tmp = sblive_readfn0(card, HCFG);	if (tmp & (HCFG_GPINPUT0 | HCFG_GPINPUT1)) {		sblive_writefn0(card, HCFG, tmp | 0x800);		udelay(512);		if (tmp != (sblive_readfn0(card, HCFG) & ~0x800)) {			card->has_toslink = 1;			sblive_writefn0(card, HCFG, tmp);		}	}*/	return 0;  err1:	pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);  err0:	fx_cleanup(&card->mgr);	return ret;}static int __devinit emu10k1_init(struct emu10k1_card *card){	/* Init Card */	if (hw_init(card) < 0)		return -1;	voice_init(card);	timer_init(card);	addxmgr_init(card);	DPD(2, "  hw control register -> %#x\n", emu10k1_readfn0(card, HCFG));	return 0;}static void emu10k1_cleanup(struct emu10k1_card *card){	int ch;	emu10k1_writefn0(card, INTE, 0);	/** Shutdown the chip **/	for (ch = 0; ch < NUM_G; ch++)		sblive_writeptr(card, DCYSUSV, ch, 0);	for (ch = 0; ch < NUM_G; ch++) {		sblive_writeptr_tag(card, ch,				    VTFT, 0,				    CVCF, 0,				    PTRX, 0,				    //CPF, 0,				    TAGLIST_END);		sblive_writeptr(card, CPF, ch, 0);	}	/* Disable audio and lock cache */	emu10k1_writefn0(card, HCFG, HCFG_LOCKSOUNDCACHE | HCFG_LOCKTANKCACHE_MASK | HCFG_MUTEBUTTONENABLE);	sblive_writeptr_tag(card, 0,                            PTB, 0,			    /* Reset recording buffers */			    MICBS, ADCBS_BUFSIZE_NONE,			    MICBA, 0,			    FXBS, ADCBS_BUFSIZE_NONE,			    FXBA, 0,			    FXWC, 0,			    ADCBS, ADCBS_BUFSIZE_NONE,			    ADCBA, 0,			    TCBS, 0,			    TCB, 0,			    DBG, 0x8000,			    /* Disable channel interrupt */			    CLIEL, 0,			    CLIEH, 0,			    SOLEL, 0,			    SOLEH, 0,			    TAGLIST_END);	if (card->is_audigy)		sblive_writeptr(card, 0, A_DBG,  A_DBG_SINGLE_STEP);	pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);	pci_free_consistent(card->pci_dev, card->silentpage.size, card->silentpage.addr, card->silentpage.dma_handle);		if(card->tankmem.size != 0)		pci_free_consistent(card->pci_dev, card->tankmem.size, card->tankmem.addr, card->tankmem.dma_handle);	/* release patch storage memory */	fx_cleanup(&card->mgr);}/* Driver initialization routine */static int __devinit emu10k1_probe(struct pci_dev *pci_dev, const struct pci_device_id *pci_id){	struct emu10k1_card *card;	u32 subsysvid;	int ret;	if (pci_set_dma_mask(pci_dev, EMU10K1_DMA_MASK)) {		printk(KERN_ERR "emu10k1: architecture does not support 29bit PCI busmaster DMA\n");		return -ENODEV;	}	if (pci_enable_device(pci_dev))		return -EIO;	pci_set_master(pci_dev);	if ((card = kmalloc(sizeof(struct emu10k1_card), GFP_KERNEL)) == NULL) {                printk(KERN_ERR "emu10k1: out of memory\n");                return -ENOMEM;        }        memset(card, 0, sizeof(struct emu10k1_card));	card->iobase = pci_resource_start(pci_dev, 0);	card->length = pci_resource_len(pci_dev, 0); 	if (request_region(card->iobase, card->length, card_names[pci_id->driver_data]) == NULL) {		printk(KERN_ERR "emu10k1: IO space in use\n");		ret = -EBUSY;		goto err_region;	}	pci_set_drvdata(pci_dev, card);	card->irq = pci_dev->irq;	card->pci_dev = pci_dev;	/* Reserve IRQ Line */	if (request_irq(card->irq, emu10k1_interrupt, SA_SHIRQ, card_names[pci_id->driver_data], card)) {		printk(KERN_ERR "emu10k1: IRQ in use\n");		ret = -EBUSY;		goto err_irq;	}	pci_read_config_byte(pci_dev, PCI_REVISION_ID, &card->chiprev);	pci_read_config_word(pci_dev, PCI_SUBSYSTEM_ID, &card->model);	printk(KERN_INFO "emu10k1: %s rev %d model %#04x found, IO at %#04lx-%#04lx, IRQ %d\n",		card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,		card->iobase + card->length - 1, card->irq);	if (pci_id->device == PCI_DEVICE_ID_CREATIVE_AUDIGY)		card->is_audigy = 1;	pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);	card->is_aps = (subsysvid == EMU_APS_SUBID);	spin_lock_init(&card->lock);	init_MUTEX(&card->open_sem);	card->open_mode = 0;	init_waitqueue_head(&card->open_wait);	ret = emu10k1_audio_init(card);	if (ret < 0) {                printk(KERN_ERR "emu10k1: cannot initialize audio devices\n");                goto err_audio;        }	ret = emu10k1_mixer_init(card);	if (ret < 0) {		printk(KERN_ERR "emu10k1: cannot initialize AC97 codec\n");                goto err_mixer;	}	ret = emu10k1_midi_init(card);	if (ret < 0) {		printk(KERN_ERR "emu10k1: cannot register midi device\n");		goto err_midi;	}	ret = emu10k1_init(card);	if (ret < 0) {		printk(KERN_ERR "emu10k1: cannot initialize device\n");		goto err_emu10k1_init;	}	if (card->is_aps)		emu10k1_ecard_init(card);	ret = emu10k1_register_devices(card);	if (ret < 0)		goto err_register;	/* proc entries must be created after registering devices, as	 * emu10k1_info_proc prints card->audio_dev &co. */	ret = emu10k1_proc_init(card);	if (ret < 0) {		printk(KERN_ERR "emu10k1: cannot initialize proc directory\n");                goto err_proc;	}		list_add(&card->list, &emu10k1_devs);	return 0;err_proc:	emu10k1_unregister_devices(card);err_register:	emu10k1_cleanup(card);	err_emu10k1_init:	emu10k1_midi_cleanup(card);err_midi:	emu10k1_mixer_cleanup(card);err_mixer:	emu10k1_audio_cleanup(card);err_audio:	free_irq(card->irq, card);err_irq:	release_region(card->iobase, card->length);	pci_set_drvdata(pci_dev, NULL);err_region:	kfree(card);	return ret;}static void __devexit emu10k1_remove(struct pci_dev *pci_dev){	struct emu10k1_card *card = pci_get_drvdata(pci_dev);	list_del(&card->list);	emu10k1_unregister_devices(card);	emu10k1_cleanup(card);	emu10k1_midi_cleanup(card);	emu10k1_mixer_cleanup(card);	emu10k1_proc_cleanup(card);	emu10k1_audio_cleanup(card);		free_irq(card->irq, card);	release_region(card->iobase, card->length);	kfree(card);	pci_set_drvdata(pci_dev, NULL);}MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@lists.sourceforge.net)");MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "\nCopyright (C) 1999 Creative Technology Ltd.");MODULE_LICENSE("GPL");static struct pci_driver emu10k1_pci_driver = {	.name		= "emu10k1",	.id_table	= emu10k1_pci_tbl,	.probe		= emu10k1_probe,	.remove		= __devexit_p(emu10k1_remove),};static int __init emu10k1_init_module(void){	printk(KERN_INFO "Creative EMU10K1 PCI Audio Driver, version " DRIVER_VERSION ", " __TIME__ " " __DATE__ "\n");	return pci_module_init(&emu10k1_pci_driver);}static void __exit emu10k1_cleanup_module(void){	pci_unregister_driver(&emu10k1_pci_driver);	return;}module_init(emu10k1_init_module);module_exit(emu10k1_cleanup_module);#ifdef EMU10K1_SEQUENCER/* in midi.c */extern int emu10k1_seq_midi_open(int dev, int mode, 				void (*input)(int dev, unsigned char midi_byte),				void (*output)(int dev));extern void emu10k1_seq_midi_close(int dev);extern int emu10k1_seq_midi_out(int dev, unsigned char midi_byte);extern int emu10k1_seq_midi_start_read(int dev);extern int emu10k1_seq_midi_end_read(int dev);extern void emu10k1_seq_midi_kick(int dev);extern int emu10k1_seq_midi_buffer_status(int dev);static struct midi_operations emu10k1_midi_operations ={	THIS_MODULE,	{"EMU10K1 MIDI", 0, 0, SNDCARD_EMU10K1},	&std_midi_synth,	{0},	emu10k1_seq_midi_open,	emu10k1_seq_midi_close,	NULL,	emu10k1_seq_midi_out,	emu10k1_seq_midi_start_read,	emu10k1_seq_midi_end_read,	emu10k1_seq_midi_kick,	NULL,	emu10k1_seq_midi_buffer_status,	NULL};#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -