Пример #1
0
static void pcireadCall(const iocshArgBuf *args)
{
    pciread(args[0].ival, args[1].ival, args[2].ival);
}
Пример #2
0
void 
soundcardinit(ushort addr)
{
	uint tmp, cur, vendorID;
	ushort vendorID1, vendorID2;
	
	//Initializing the Audio I/O Space
	tmp = pciread(addr, PCI_CONFIG_SPACE_STA_CMD);
	pciwrite(addr, PCI_CONFIG_SPACE_STA_CMD, tmp | 0x5);

	SOUND_NAMBA_DATA = pciread(addr, PCI_CONFIG_SPACE_NAMBA) & (~0x1);
	SOUND_NABMBA_DATA = pciread(addr, PCI_CONFIG_SPACE_NABMBA) & (~0x1);
	cprintf("AUDIO I/O Space initialized successfully!\n");
	
	//Removing AC_RESET
	outb(SOUND_NABMBA_DATA + NABMBA_GLOB_CNT, 0x2);
	cprintf("AC_RESET removed successfully!\n");
	
	//Reading Codec Ready Status
	cur = 0;
	cprintf("Waiting for Codec Ready Status...\n");
	while (!(inw(SOUND_NABMBA_DATA + NABMBA_GLOB_STA) & 0X100) && cur < 1000)
	{
		cur++;
	}
	if (cur == 1000)
	{
		cprintf("\nAudio Init Failed\n");
		return;
	}
	cprintf("Codec is ready!\n");
	
	//Determine Audio Codec
	tmp = inw(NAMBA_PCMV);
	cprintf("%x\n", tmp);
	outw(NAMBA_PCMV, 0x8000);
	if (inw(NAMBA_PCMV) != 0x8000)
	{
		cprintf("Audio Codec Function not found!\n");
		return;
	}
	outw(NAMBA_PCMV, tmp);
	cprintf("Audio Codec Function is found, current volume is %x.\n", tmp);
	
	//Reading the Audio Codec Vendor ID
	vendorID1 = inw(SOUND_NAMBA_DATA + NAMBA_PCVID1);
	vendorID2 = inw(SOUND_NAMBA_DATA + NAMBA_PCVID2);
	cprintf("Audio Codec Vendor ID read successfully!\n");
	
	//Programming the PCI Audio Subsystem ID
	vendorID = (vendorID2 << 16) + vendorID1;
	pciwrite(addr, PCI_CONFIG_SPACE_SID_SVID, vendorID);
	
	//Initailize Interruption
	initlock(&soundLock, "audio");
	picenable(IRQ_SOUND);
	ioapicenable(IRQ_SOUND, ncpu - 1);	
	
	outw(NAMBA_PCMV, 0x1f1f);

    soundQueue = 0;
}