static void pcireadCall(const iocshArgBuf *args) { pciread(args[0].ival, args[1].ival, args[2].ival); }
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; }