Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308654
  • 博文数量: 321
  • 博客积分: 10055
  • 博客等级: 上将
  • 技术积分: 3780
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-29 13:03
文章分类

全部博文(321)

文章存档

2012年(1)

2010年(7)

2009年(1)

2008年(312)

我的朋友

分类: LINUX

2008-09-21 10:45:22

我知道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);
}
}
}
}
}
阅读(1324) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~