红联Linux门户
Linux帮助

linux下通过/dev/port访问pci

发布时间:2008-08-17 22:24:47来源:红联作者:williamrgy403
我知道linux下通过访问I/O端口来访问pci有两种途径;一:inl(),outl()函数.二:通过/dev/port.
第一种方法我已经搞定.问题出在第二种方法上.
我想把所有的pci设备都列出来,方法是把所有可能的pci地址放进端口0xcf8,从端口0xcfc读出配置空间地址00h的内容判断是否有效.
可是我的程序一运行,系统就重启,我却找不到毛病在什么地方,希望懂的人可以帮个忙,先谢谢了!我的程序如下:
void list_PCI_devices()
{unsigned int bus,dev,fun;
unsigned int bbus,bdev,bfun;
unsigned int addr,data;
unsigned int fp;
printf("bus#\tdev#\tfun#\tvendor ID\tdevice ID\n");

for(bus=0;bus<=0xff;bus++)
{
for(dev=0;dev<=0x1f;dev++)
{
for(fun=0;fun<=0x7;fun++)
{bbus=bus,bdev=dev,bfun=fun;
addr=0x80000000|bbus<<16|bdev<<11|bfun<<8;
fp=open("/dev/port",O_RDWR);
lseek(fp,0xcf8,SEEK_SET);
write(fp,&addr,4);
lseek(fp,0xcfc,SEEK_SET);
read(fp,&data,4);
close(fp);
if(data!=0xffffffff && data!=0)/*identify vendor ID*/
{
printf(" %02lX\t %02lX\t %02lX\t",bus,dev,fun);

printf(" %X\t\t %04X\n",(short)data,data>>16);
}
}
}
}
}
文章评论

共有 3 条评论

  1. williamrgy403 于 2008-08-21 09:32:56发表:

    我发现拉一个mistake. lseek failed.

  2. williamrgy403 于 2008-08-18 20:28:38发表:

    本来抱着很大的希望来的.
    怎么没有一个人给个建议?
    这叫什么狗屁论坛啊?

  3. williamrgy403 于 2008-08-18 16:24:43发表:

    怎么到现在都没有人回复.
    我只好自己顶一把楼!
    0:w(5(