打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux下通过/dev/port访问pci

linux下通过/dev/port访问pci

我知道linux下通过访问I/O端口来访问pci有两种途径;一:inl(),outl()函数.二:通过/dev/port.
第一种方法我已经搞定.问题出在第二种方法上.0 Y+ g6 \; d$ ?- D( G& b
我想把所有的pci设备都列出来,方法是把所有可能的pci地址放进端口0xcf8,从端口0xcfc读出配置空间地址00h的内容判断是否有效.8 X& k) n& a9 T$ p7 [( z8 V% n
可是我的程序一运行,系统就重启,我却找不到毛病在什么地方,希望懂的人可以帮个忙,先谢谢了!我的程序如下:* N+ e+ Z: J0 P/ o7 W" Z/ f
void list_PCI_devices()8 R+ ]+ k# U% c! x
{unsigned int bus,dev,fun;9 T  n6 g8 k; F$ J% `
unsigned int bbus,bdev,bfun;0 ?5 e4 Q7 ^9 A: R! j
unsigned int addr,data;
unsigned int fp;* z' L( H; a/ x3 H
printf("bus#\tdev#\tfun#\tvendor ID\tdevice ID\n");2 j- }9 v; C4 j' w; P2 G. h6 n

for(bus=0;bus<=0xff;bus++)
{, W  j* t# x4 n& M( f: K/ `2 F. ~( x
for(dev=0;dev<=0x1f;dev++)! w9 q! j5 W5 I8 j, ^" @' h
{1 h& k2 N% J/ d% l2 X2 b" Y
for(fun=0;fun<=0x7;fun++)
{bbus=bus,bdev=dev,bfun=fun;0 F- q, r8 P) K  z" C
addr=0x80000000|bbus<<16|bdev<<11|bfun<<8;! Q0 `3 @0 F# Z( {1 I
fp=open("/dev/port",O_RDWR);
lseek(fp,0xcf8,SEEK_SET);9 J' K2 c. E6 z9 e& B
write(fp,&addr,4);
lseek(fp,0xcfc,SEEK_SET);. c# M* m0 O" j: K, R/ M
read(fp,&data,4);) @" B( X# G& Z2 V' P
close(fp);% `# m* S) M: H. `# o9 Q: O0 D9 w
if(data!=0xffffffff && data!=0)/*identify vendor ID*/0 r! C/ x* ]. n( u( B% v" y
{
printf(" %02lX\t %02lX\t %02lX\t",bus,dev,fun);/ j7 I$ \% s. F  s; U" z- C, f

printf(" %X\t\t %04X\n",(short)data,data>>16);5 H- |! ?4 c# o# A" u# M: p& E
}" m% c' r+ `7 ~% `
}
}
}( l9 E, O( x& w2 N/ _/ v; _; u- O
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C语言-遍历pci设备
LINUX DEVICE 第三版(快速参考)
Linux 那些事儿之我是EHCI主机控制器
I2C 的 4 个结构体
linux gpio模拟i2c的使用/用GPIO模拟I2C总线
网桥的工作流程(数据转发和STP协议)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服