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

(请保留-> 作者: 罗冰   luobing4365的博客_CSDN博客-UEFI开发,汇编语言探索,嵌入式开发领域博主)

我所用的测试卡是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下已经有了类似功能的命令。之前开发的时候我并不清楚,是在写博客的时候慢慢了解到的,可见写博客真是种学习的好方法。

Shell下pci内置在运行环境中,是\ShellPkg\Library\UefiShellDebug1CommandsLib下pci.*编译出来的,在模拟环境中执行:

图2 Nt32模拟器中执行shell命令pci

很遗憾,无法执行。这也意味着我们编写的pci列举程序无法在nt32下执行,最好还是以x64方式编译,在实际环境中执行。

UEFI Spec中有两个protocol可以访问PCI设备,PCI Root Bridge I/O Protocol和PCI I/O Protocol。这两个Protocol有什么区别,到现在我理解得还是不深刻。

从实践中知道,PCI I/O Protocol可以访问改在在主板上的所有PCI设备,而PCI Root Bridge I/O Protocol不能访问PCI to PCI桥设备。两种Protocol都可以访问上一篇博客描述的测试板卡。

这次用PCI Root Bridge I/O Protocol来获取找到的PCI 设备的信息。

参照UEFI spec 2.8 page 649,了解PCI Root Bridege I/O Protocol的用法。描述太长了,就不贴图出来了。

代码仍旧放在了百度云上。核心函数为:

EFI_STATUS PciDevicePresent (
  IN  EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL     *PciRootBridgeIo,
  OUT PCI_TYPE00                          *Pci,
  IN  UINT8                               Bus,
  IN  UINT8                               Device,
  IN  UINT8                               Func
  )

代码中以此函数,获取所有能找到的PCI设备。不过Nt32中无法演示,旁边也没有机器可以测试,运行结果就不演示了。

Gitee地址:https://gitee.com/luobing4365/uefi-explorer
项目代码位于:/05 ListPCIMessage-01下。

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luobing4365

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值