获取PCI总线上任何配置头信息
书上用的是传到驱动层,然后在操作端口,获取的数据在应用层显示。不过这种方法不是很喜欢,比较喜欢在驱动层开启I/O位图位,然后让应用层拥有端口操作权限。所以,在看本博文之前,请先熟悉之前的关于在应用层开启端口操作权限的相关函数讲解的博文,写好一个驱动,能开启端口读取权限。然后再继续阅读本文。
以下是类型0的PCI配置结构:
如果看不懂,那需要回去复习数据结构基础哦。这个图很简单,总共256个字节。自己可以写一个结构去接受这个数据,但是书上给了现成的,我也就偷偷懒,注释了1一个重要的地方(40h-FFh)。下面来看看书上结构的巧妙之处。下面三个常量,便是3种类型中基地址数组大小。(下面结构是一起的,只是分了几张图发,方便讲解)
类型0配置头不同的地方
类型1配置头不同的地方
类型2配置头的不同
这里充分说明union联合声明的好用。
书上定义了一个_PCI_SLOT_NUMBER结构位结构,但是没定义完,还要自己进行位操作。为了方便,我直接把这个结构完善了,每次填写就可以了。
这个定义来自于以下结构图
当然,如果不喜欢定义结构,那么得定义一个宏如下
#define CONFIG_ADDRESS(f, Bus, Device, Function, Registery)
((f<31) | (Bus<24) | (Device<16) | (Function<8) | (Registry<2))
关于这几个参数的含义:
Bus Number(总线):
有256个Bus可供查询.当扫描硬件时,最好扫描256个Bus(从0开始编号)
Device Number:
挂载在Bus上的设备,可以是显卡,声卡,北桥等.一个Bus最多被挂载32个设备.(从0开始编号)
Function Number:
每个Device至少含有1个或者多个Function.(从0开始编号)
Register Number:
最多有256个注册标识.
好了,一切准备就绪后就可以开始PCI配置信息获取和显示了。
先看看应用程序中调用获取和现实两个函数的代码,包括了如何填写_PCI_SLOT_NUMBER结构
注释很清楚,ConfigData存放的是数据,不是数据指针,大家要小心!Out_32和In_32是用C语言和汇编混编的函数,大家参考《windows驱动开发技术详解》里面的代码。
然后便是DisplayPciCommonConfig函数代码
如果有闲心,可以完成一个类型1,类型2,类型0三种配置头的信息显示。
最后来看看显示结果:(正如前面声明的,bus=0,device=0,function=0,enable=1,register=0)
PCI总线配置头信 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)