PCI配置空间简介(转贴)

上传人:飞*** 文档编号:40368727 上传时间:2018-05-26 格式:DOCX 页数:36 大小:89.39KB
返回 下载 相关 举报
PCI配置空间简介(转贴)_第1页
第1页 / 共36页
PCI配置空间简介(转贴)_第2页
第2页 / 共36页
PCI配置空间简介(转贴)_第3页
第3页 / 共36页
PCI配置空间简介(转贴)_第4页
第4页 / 共36页
PCI配置空间简介(转贴)_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《PCI配置空间简介(转贴)》由会员分享,可在线阅读,更多相关《PCI配置空间简介(转贴)(36页珍藏版)》请在金锄头文库上搜索。

1、PCI 配置空间简介 作者:敏行PCI 有三个相互独立的物理地址空间:设备存储器地址空间、I/O 地址空间和配置空间。配置空间是 PCI 所特有的一个物理空间。由于 PCI 支持设备即插即用,所以 PCI 设备不占用固定的内存地址空间或 I/O 地址空间,而是由操作系统决定其映射的基址。系统加电时,BIOS 检测 PCI 总线,确定所有连接在 PCI 总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的 PCI 设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。PCI 总线规范定义的配置空间总长度为 256 个字节,配置信息按一定的顺序和大小依次存放。前 64 个字

2、节的配置空间称为配置头,对于所有的设备都一样,配置头的主要功能是用来识别设备、定义主机访问 PCI 卡的方式(I/O 访问或者存储器访问,还有中断信息)。其余的 192 个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。访问 PCI 配置空间方法一访问 PCI 配置空间可通过两个访问寄存器,CONFIG_ADDRESS 寄存器和CONFIG_DATA 寄存器。这两个寄存器在 PC 中分别对应着 CF8h 和 CFCh 端口,并且是 32 位端口,即读写要用的 32 为 IN 和 OUT 汇编指令。每个 PCI 设备可应用三个信息进行定位,即 Bus Number、De

3、vice Number 和Function Number。另外,PCI 配置空间一共是 256 个字节,被分割成 64 个 4字节的寄存器,从 0-63 编号。每次要访问 PCI 配置空间时,先设置 CONFIG_ADDRESS 寄存器,这时CONFIG_DATA 存储器的内容就对应着该 PCI 配置空间中的相应的寄存器。访问 PCI 配置空间方法二第二种访问配置空间的方法是通过 HalGetBusData 和 HalSetBusData 两个内核函数。这两个函数将方法进行了封装,不需要程序员对 PCI 空间进行直接读取。DDK 提供了两个内核函数 HalGetBusData 和 HalSet

4、BusData,分别用于读取PCI 设备的配置空间和设置 PCI 配置空间。ULONG HalGetBusData(IN BUS_DATA_TYPE BusDataType,IN ULONG BusNumber,IN ULONG SlotNumber,IN PVOID Buffer,IN ULONG Length);注解: BusDataType:该参数指定总线类型。HalGetBusData 函数可以查询各个总线的情况,对于 PCI 总线,这里设置为 PCIConfiguration。 BusNumber:该参数指定 Bus 的总线号. SlotNumber:该参数由 Device 号和功能

5、号共同组成。 Buffer:该参数是得到的 PCI 配置空间的首地址。 Length:该参数是 PCI 配置空间的大小。访问 PCI 配置空间方法三(本例仅限于 WDM 驱动,比较广泛使用)方法二适用于 NT 式驱动,但并不适用于 WDM 驱动。WDM 中使用 IRP 获得 PCI配置空间。此方法不需要了解 PCI 具体的配置空间结构,WDM 驱动程序已经帮助程序员从 PCI 配置空间中分析出有用信息,并通知给程序员。WDM 会为不同总线上的设备提供一个 PDO 设备,当程序员所写的功能驱动挂接在 PDO 之上的时候,就可以将 IRP_MN_START_DEVICE 传递给底层的 PDO 去处

6、理。PCI 总线的 PDO 就会得到 PCI 配置空间,并从中得到有用信息,如中断号、设备物理内存及 I/O 端口等信息。在处理完 IRP_MN_START_DEVICE 后,驱动程序会将处理结果存储在 IRP 的设备堆栈中,从 I/O 堆栈可以取出 CM_FULL_RESOURCE_DESCRIPTOR 数据结构,从 CM_FULL_RESOURCE_DESCRIPTOR 中可以取出CM_PARTIAL_RESOURCE_LIST 数据结构,而在 CM_PARTIAL_RESOURCE_LIST中又可以取出 CM_PARTIAL_RESOURCE_DESCRIPTOR 数据结构。CM_FUL

7、L_RESOURCE_DESCRIPTOR数据结构就是 PDO 帮助程序员从 256字节的 PCI 配置空间中获取的有用信息,这其中包括终端号、设备物理内存、I/O 端口等信息。访问 PCI 配置空间方法四(本例仅限于 WDM 驱动)方法三没有完整的的获取到 256 字节的 PCI 配置空间,需要自己创建IRP_MN_READ_CONFIG 或者 IRP_MN_WRITE_CONFIG,然后将创建好的即插即用 IRP 发送到底层的 PDO,并等待 PDO 的处理。该方法获取完整的 PCI 配置空间。配置空间 操作系统 PCI 总线推出以来,以其独有的特性受到众多厂商的青睐,已经成为计算机扩展总

8、线的主流。目前,国内的许多技术人员已经具备开发 PCI 总线接口设备的能力。但是 PCI 总线的编程技术,也就是对 PCI 总线设备的操作技术,一直是一件让技术人员感到头疼的事情。PCI 总线编程的核心技术是对相应板卡配置空间的理解和访问。一般软件编程人员基于对硬件设备原理的生疏,很难理解并操作配置空间,希望硬件开发人员直接告诉他们怎样操作;而 PCI 总线硬件开发人员虽深刻地理解了其意义,在没有太多编程经验地前提下,也难于轻易地操作 PCI 板卡。结果大多是硬件技术人员花费大量时间和精力去学习 DDK、WINDRVER 等驱动程序开发软件。作者在开发 PCI 总线接口设备时,经过对 PCI

9、总线协议的深入研究,从协议本身的角度出发,找到一种方面而快捷的 PCI 配置空间操作方法,只使用简单的 I/O命令即可找到特定的 PCI 总线设备并对其所有的配置空间进行读写操作。一旦读得其配置空间的内容,即可中得到担任系统对该 PCI 总线设备的资源分配。1 PCI 总线配置空间及配置机制为避免各 PCI 设备在资源的占用上发生冲突,PCI 总线采用即插即用协议。即在系统建立时由操作系统按照各设备的要求统一分配资源,资源分配的信息由系统写入各 PCI 设备的配置空间寄存器,并在操作系统内部备份。各 PCI 设备有其独自的配置空间,设计者通过对积压设备(或插槽)的 ISDEL 引脚的驱动区分不

10、同设备的配置空间。配置空间的前 64 个字节称为配置空间的预定自区,它对每个设备都具有相同的定义且必须被支持;共后的空间称为设备关联区,由设备制造商根据需要定义。与编程有关的配置空间信息主要有:(1)设备号(Device ID)及销售商号(VendorID),配置空间偏移量为 00h,用于对各 PCI 设备的区分和查找。为了保证其唯一性,VendorID 应当向 PCI 特别兴趣小组(PCI SIG)申请而得到。(2)PCI 基地址(PCI Base Address),配置空间偏移量为 1024h,设备通过设定可读写的高位数值来向操作系统指示所需资源空间的大小。比如,某设备需要 64K 字节的

11、内存空间,可以将配置空间的某基地址寄存器的高 16 位设成可读写的,而将低 16 位置为 0(只可读)。操作系统在建立时,先向所有位写 1,实际上只有高 16 位被接收而被置成了 1,低 16 位仍为 0.这样操作系统读取该寄存器时,返回值为 FFFF0000h,据此操作系统可以断定其需要的空间大小是 64K 字节,然后分配一段空闲的内存空间并向该寄存器的高 16 位填写其地址。其它可能与编程有关的配置空间的定义及地址请参阅参考文献1。由于 PC-AT 兼容系统 CPU 只有内存和 I/O 两种空间,没有专用的配置空间,PCI 协议规定利用特定的 I/O 空间操作驱动 PCI 桥路转换成配置空

12、间的操作。目前存在两种转换机制,即配置机制 1#和配置机制 2#。配置机制 2#在新的设计中将不再被采用,新的设计应使用配置机制 1#来产生配置空间的物理操作。这种机制使用了两个特定的 32 位 I/O 空间,即 CF8h 和 CFCh。这两个空间对应于 PCI 桥路的两个寄存器,当桥路看到 CPU 在局部总线对这两个 I/O 空间进行双字操作时,就将该 I/O 操作转变为 PCI 总线的配置操作。寄存器 CF8h 用于产生配置空间的地址(CONFIG-ADDRESS),寄存器 CFCh 用于保存配置空间的读写数据(CONFIG-DATA)。配置空间地址寄存器的格式如图 1。CF8H(局部总线

13、):当 CPU 发出对 I/O 空间 CFCh 的操作时,PCI 桥路将检查配置空间地址寄存器CF8h 的 31 位。如果为 1,就在 PCI 总线上产生一个相应的配置空间读或写操作,其地址由 PCI 桥路根据配置空间地址寄存器的内容作如图 2 所示的转换。CFCh (局部总线):设备号被 PCI 桥路译码产生 PCI 总线地址的高位地址,它们被设计者用作IDSEL 信号来区分相应的 PCI 设备。6 位寄存器号用于寻址该 PCI 设备配置空间62 个双字的配置寄存器(256 字节)。功能号用于区分多功能设备的某特定功能的配置空间,对常用的单功能设备为 000。某中 PCI 插槽的总线号随系统

14、(主板)的不同稍有区别,大多数 PC 机为 1,工控机可能为 2 或 3。为了找到某设备,应在系统的各个总线号上查找,直到定位。如果在 05 号总线上不能发现该设备,即可认为该设备不存在。理解了上述 PCI 协议里的配置机制后,就可以直接对 CF8h 和 CFCh 两个双字的 I/O 空间进行操作,查找某个 PCI 设备并访问其配置空间,从而得到操作系统对该 PCI 设备的资源分配。2 用 I/O 命令访问 PCI 总线配置空间要访问 PCI 总线设备的配置空间,必须先查找该设备。查找的基本根据是各PCI 设备的配置空间里都存有特定的设备号(DeviceID)及销售商号(Vendor ID),

15、它们占用配置空间的 00h 地址。而查找的目的是获得该设备的总线号和设备号。查找的基本过程如下:用 I/O 命令写配置空间的地址寄存器 CF8h,使其最高位为 1,总线号及设备为 0,功能号及寄存器号为0,即往 I/O 端口 CF8h80000000h;然后用 I/O 命令读取配置空间的数据寄存器CFCh。如果该寄存器值与该 PCI 设备的 DeviceID 及 Vendor ID 不相符,则依次递增设备号/总线号,重复上述操作直到找到该设备为止。如果查完所有的设备号/总线号(15)仍不能找到该设备,则应当考虑硬件上的问题。对于多功能设备,只要设备配置寄存器相应的功能号值,其余步骤与单功能设备

16、一样。如查找设备号为 9054h,销售商号为 10b5 的单功能 PCI 设备,用 VC+6.0编写的程序如下:char bus;char device;unsigned int ioa0,iod;int scan( )bus=0;device=0;for(char i=0;i #include typedef unsigned char BYTE; typedef unsigned int WORD; typedef unsigned long DWORD;/* PCI 设备索引。bus/dev/func 共 16 位,为了方便处理可放在一个 WORD 中 */ #define PDI_BUS_SHIFT 8 #define PDI_BUS_SIZE 8 #define PDI_BUS_MAX 0xFF #define PDI_BUS_MASK 0xFF00 #define PDI_DEVICE_SHIFT 3 #define PDI_DEVICE_SIZE 5 #define PDI_DEVICE_MAX 0x1F#

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号