|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
[这个贴子最后由sunyzs在 2004/08/08 02:48pm 第 1 次编辑]
#include "stdio.h"
typedef unsigned long DWORD;
typedef unsigned short WORD;
DWORD DWORD_In(WORD io_Port)
{
DWORD val;
_asm {
mov dx,io_Port
in eax,dx
mov val,eax
}
return val;
}
DWORD DWORD_Out(WORD io_Port,DWORD val)
{
_asm {
mov dx,io_Port
mov eax,val
out dx,eax
}
return 0;
}
int main()
{
DWORD io_CF8; // port 0xcf8
DWORD io_CFC; // port 0xcfc
int i;
io_CF8=0x80000000; //because the first bit is enable/disable
for(;;) //so must be 1,so from 0x800000000
{
DWORD_Out(0xcf8,io_CF8);
io_CFC=DWORD_In(0xcfc);
if (io_CFC!=0xffffffff) //if =0xffffffff,then is a invalid
{ //bus number and device number
printf("\nPCI device has found,the pci config address=%lx\n",io_CF8);
printf("its Bus Numer is %lx \n",(io_CF8&0x00ff0000)/0x10000);
printf("its Device Number is %lx \n",(io_CF8&0x0000f800)/0x800);
printf("its Functin Number is %lx \n",(io_CF8&0x700)/0x100);
printf("this device's deviceID and vendorID=%lx\n",io_CFC);
for (i=0 ;i<=15;i++)
{
DWORD_Out(0xcf8,io_CF8+4*i); //read DWORD
switch (i)
{
case 0:
printf("Device Number and Vendor Number=");
break;
case 1:
printf("Status and Command =");
break;
case 2:
printf("Class Code and Revision ID=");
break;
case 3:
printf("Bist and Header Type and Latency Timer and CacheLineSize=");
break;
case 4: //PCI Configration has 6 base address
case 5: //register
case 6:
case 7:
case 8:
case 9:
printf("Base Address Register=");
break;
case 10:
case 11:
case 13:
case 14:
printf("Reserved =");
break;
case 12:
printf("Expansion ROM Base Address=");
break;
case 15: //attention:the interrupt IRQ= this result&0xff
printf("Max_Lat Min_Gnt Interrupt Pin Interrupt line=");
break;
}
printf("%lx\n",DWORD_In(0xcfc));
}
}
io_CF8+=0x800;
if (io_CF8>=0x80FFFF00)
break;
}
return 0;
}
|
|