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

📄 main.c

📁 讲述linux的初始化过程
💻 C
📖 第 1 页 / 共 2 页
字号:
				    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);	}	/*	 ** 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);	fx_init(card);		/* initialize effects engine */	card->tankmem.size = 0;	card->virtualpagetable.size = MAXPAGES * sizeof(u32);	if ((card->virtualpagetable.addr = pci_alloc_consistent(card->pci_dev, card->virtualpagetable.size, &card->virtualpagetable.dma_handle)) ==	    NULL) {		ERROR();		return -1;	}	card->silentpage.size = EMUPAGESIZE;	if ((card->silentpage.addr = pci_alloc_consistent(card->pci_dev, card->silentpage.size, &card->silentpage.dma_handle)) == NULL) {		ERROR();		pci_free_consistent(card->pci_dev, card->virtualpagetable.size, card->virtualpagetable.addr, card->virtualpagetable.dma_handle);		return -1;	}	for (pagecount = 0; pagecount < MAXPAGES; pagecount++)		((u32 *) card->virtualpagetable.addr)[pagecount] = (card->silentpage.dma_handle * 2) | pagecount;	/* Init page table & tank memory base register */	sblive_writeptr_tag(card, 0,			    PTB, 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 | (card->silentpage.dma_handle * 2),				    MAPB, MAP_PTI_MASK | (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 */	sblive_rmwac97(card, AC97_MASTERVOLUME, 0x8000, 0x8000);	sblive_writeac97(card, AC97_MASTERVOLUME, 0);	sblive_writeac97(card, AC97_PCMOUTVOLUME, 0);	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);	/* FIXME: TOSLink detection */	card->has_toslink = 0;/*	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;}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 -> 0x%x\n", emu10k1_readfn0(card, HCFG));	return 0;}static void __devexit midi_exit(struct emu10k1_card *card){	tasklet_unlock_wait(&card->mpuout->tasklet);	kfree(card->mpuout);	tasklet_unlock_wait(&card->mpuin->tasklet);	kfree(card->mpuin);	return;}static void __devinit emu10k1_exit(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);	}	/* 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);	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);	return;}/* 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;	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));	if (!pci_dma_supported(pci_dev, EMU10K1_DMA_MASK)) {		printk(KERN_ERR "emu10k1: architecture does not support 32bit PCI busmaster DMA\n");		kfree(card);		return -ENODEV;	}	if (pci_enable_device(pci_dev)) {		kfree(card);		return -ENODEV;	}	pci_set_master(pci_dev);	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");		kfree(card);		return -ENODEV;	}	pci_set_drvdata(pci_dev, card);	PCI_SET_DMA_MASK(pci_dev, EMU10K1_DMA_MASK);	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");		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 0x%x found, IO at 0x%04lx-0x%04lx, IRQ %d\n",		card_names[pci_id->driver_data], card->chiprev, card->model, card->iobase,		card->iobase + card->length - 1, card->irq);	pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);	card->isaps = (subsysvid == EMU_APS_SUBID);	spin_lock_init(&card->lock);	init_MUTEX(&card->open_sem);	card->open_mode = 0;	init_waitqueue_head(&card->open_wait);	/* Register devices */	if ((card->audio_num = register_sound_dsp(&emu10k1_audio_fops, -1)) < 0) {		printk(KERN_ERR "emu10k1: cannot register first audio device!\n");		goto err_dev0;	}	if ((card->audio1_num = register_sound_dsp(&emu10k1_audio_fops, -1)) < 0) {		printk(KERN_ERR "emu10k1: cannot register second audio device!\n");		goto err_dev1;	}	if ((card->mixer_num = register_sound_mixer(&emu10k1_mixer_fops, -1)) < 0) {		printk(KERN_ERR "emu10k1: cannot register mixer device!\n");		goto err_dev2;	}	if ((card->midi_num = register_sound_midi(&emu10k1_midi_fops, -1)) < 0) {		printk(KERN_ERR "emu10k1: cannot register midi device!\n");		goto err_dev3;	}	if (emu10k1_init(card) < 0) {		printk(KERN_ERR "emu10k1: cannot initialize device!\n");		goto err_emu10k1_init;	}	if (midi_init(card) < 0) {		printk(KERN_ERR "emu10k1: cannot initialize midi!\n");		goto err_midi_init;	}	audio_init(card);	mixer_init(card);	if (card->isaps)		emu10k1_ecard_init(card);	list_add(&card->list, &emu10k1_devs);	return 0;      err_midi_init:	emu10k1_exit(card);      err_emu10k1_init:	unregister_sound_midi(card->midi_num);      err_dev3:	unregister_sound_mixer(card->mixer_num);      err_dev2:	unregister_sound_dsp(card->audio1_num);      err_dev1:	unregister_sound_dsp(card->audio_num);      err_dev0:	free_irq(card->irq, card);      err_irq:	release_region(card->iobase, card->length);	kfree(card);	return -ENODEV;}static void __devexit emu10k1_remove(struct pci_dev *pci_dev){	struct emu10k1_card *card = pci_get_drvdata(pci_dev);	midi_exit(card);	emu10k1_exit(card);	unregister_sound_midi(card->midi_num);		unregister_sound_mixer(card->mixer_num);	unregister_sound_dsp(card->audio1_num);	unregister_sound_dsp(card->audio_num);	free_irq(card->irq, card);	release_region(card->iobase, card->length);	list_del(&card->list);	kfree(card);	pci_set_drvdata(pci_dev, NULL);}MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@opensource.creative.com)");MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "\nCopyright (C) 1999 Creative Technology Ltd.");static struct pci_driver emu10k1_pci_driver = {	name:"emu10k1",	id_table:emu10k1_pci_tbl,	probe:emu10k1_probe,	remove: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);

⌨️ 快捷键说明

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