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

📄 pci配置信息读取.txt

📁 单片机源程序精华包
💻 TXT
字号:
使用WINIO进行端口操作,读取PCI配置信息可参看89c51ProDlg.h PCIConfig.cpp,下列是读出RTL8139 I/O基地址信息的代码

PCIConfig fig;
if(fig.GetPCIConfig(0x10ec,0x8139)==1)
{
	ADDR8139=(fig.PCIConf.BaseAddressRegister[0])&0xfffffffe;//这里我偷了个懒,保险期间应该从BaseAddressRegister[0]到BaseAddressRegister[5]来搜索I/O地址空间,方法是如果是I/O地址,其最低位应该永远都是1.
}
else
{
	ADDR8139=0xffff;
	AfxMessageBox("没有找到rtl8139");
	
}

UINT PCIConfig::GetPCIConfig(DWORD VendorID, DWORD DeviceID)//用VendorID,DeviceID得到配置信息
{
	DWORD DeviceVendor=(DeviceID<<16)+VendorID;
	DWORD INPCIC=0; 
	DWORD PCIbuf[16];
	memset(PCIbuf,0,64);
	DWORD * pPCIbufpos=PCIbuf;
	DWORD PCIConfBaseAddr=0x80000000;
	UINT i=0;
	for(;;)
	{
		SetPortVal(0xcf8,PCIConfBaseAddr,4);
		GetPortVal(0xcfc,&INPCIC,4);
		if(INPCIC==DeviceVendor)
		{
			pPCIbufpos=PCIbuf;
			 for(i=0;i<16;i++,pPCIbufpos++)
			 {
				SetPortVal(0xcf8,PCIConfBaseAddr+4*i,4);
				GetPortVal(0xcfc,pPCIbufpos,4);
			 }
				PCIConf.VendorID=PCIbuf[0]&0xffff;
				PCIConf.DeviceID=((PCIbuf[0]&0x0000ffff)>>16);
				PCIConf.Command=PCIbuf[1]&0xffff;
				PCIConf.Status=((PCIbuf[1]&0x0000ffff)>>16);
				PCIConf.RevisionID=PCIbuf[2]&0xff;
				PCIConf.ClassCode=((PCIbuf[2]&0xffffff00)>>8);
				PCIConf.CacheLineSize=PCIbuf[3]&0xff;
				PCIConf.LatencyTimer=((PCIbuf[3]&0xff00)>>8);
				PCIConf.HeaderType=((PCIbuf[3]&0xff0000)>>16);
				PCIConf.BIST=((PCIbuf[3]&0xff000000)>>24);
				PCIConf.BaseAddressRegister[0]=PCIbuf[4];
				PCIConf.BaseAddressRegister[1]=PCIbuf[5];
				PCIConf.BaseAddressRegister[2]=PCIbuf[6];
				PCIConf.BaseAddressRegister[3]=PCIbuf[7];
				PCIConf.BaseAddressRegister[4]=PCIbuf[8];
				PCIConf.BaseAddressRegister[5]=PCIbuf[9];
				PCIConf.CardbusCISPointer=PCIbuf[10];
				PCIConf.SubsystemVendorID=PCIbuf[11]&0xffff;
				PCIConf.SubsystemID=((PCIbuf[11]&0xffff0000)>>16);
				PCIConf.ExpansionROMBaseAddress=PCIbuf[12];
				PCIConf.CapabllltlesPolnter=PCIbuf[13]&0xff;
				PCIConf.Reserved0=((PCIbuf[13]&0xffffff00)>>8);
				PCIConf.Reserved1=PCIbuf[14];
				PCIConf.InterruptLine=PCIbuf[15]&0xff;
				PCIConf.InterruptPin=((PCIbuf[15]&0xff00)>>8);
				PCIConf.Min_Gnt=((PCIbuf[15]&0xff0000)>>16);
				PCIConf.Max_Lat=((PCIbuf[15]&0xff000000)>>24);

				return 1;
		}
		if(PCIConfBaseAddr>=0x80ffffff)
		{
			return 0;
		}
		PCIConfBaseAddr=PCIConfBaseAddr+0x800;//枚举PCI设备,16到23位表示总线号,第11到15位代表了插槽号
	}
	return 0;
}
						AthlonxpX86(桃源村)
                                                 2004.7.16

⌨️ 快捷键说明

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