> 文章列表 > UEFI开发探索13 – 访问PCI/PCI-E设备1

UEFI开发探索13 – 访问PCI/PCI-E设备1

UEFI开发探索13 – 访问PCI/PCI-E设备1

我所用的测试卡是PCI-E设备,公司商用的产品也是PCI-E设备。所以,我很早就“被迫”去读那些PCI spec。

从软件工程师的角度,我觉得只要解决几个问题就行了,其余的细节不妨碍编程。

  1.  PCI/PCI-E设备是如何定位的,也即程序如何找到设备;
    
  2.  系统把它认作什么设备;
    
  3.  如何访问设备的内部寄存器(一般要去读所使用的PCI-E芯片的资料);
    
  4.  商用化的产品,需要考虑设备对ACPI的各种电源事件的处理。
    

前三个问题需要仔细研究下PCI设备配置空间

图1 PCI配置空间(PCI spec2.3)

除了主PCI桥之外,其他PCI设备都应该实现PCI设备配置空间。配置空间包括一系列的PCI配置寄存器,其实现位置可以在PCI配置空间中,或者IO空间,也可以直接在申请的memory空间中实现。

一般情况下,操作系统使用这些配置寄存器的内容来决定为PCI设备加载什么驱动程序:供应商ID、设备ID、版本号、类别代码、子系统供应商、子系统ID。具体的含义可以参考PCI/PCI-E的Spec手册。

隔离卡/还原卡的开发中,最让人印象深刻的就是类别代码寄存器了。它规定了你的设备是大容量存储设备还是网络设备,或者其他设备。主板有时候会找不到你的设备,无法加载Option ROM代码,改一种类型就可以了。

这个章节主要实现列举PCI设备的代码。

实际上,uefi shell下已经有了类似功能的命令。之前开发的时候我并不清楚,是