我正在调整基于FPGA的PCIe卡的Windows / Linux驱动程序。 (使用带有PCIe端点的LatticeECP3) 我需要添加一个驱动程序函数来允许主机驱动的比特流更新 之后不需要重新启动 主机
的FPGA。即。闪存后,我需要重置FPGA以重新加载比特流。 这当然会导致PCIe端点的配置空间设置丢失。
我的第一个方法是实施以下步骤:
我的问题:
答案 0 :(得分:1)
在Widows上,您需要通过设备管理器“禁用/启用”,但需要以编程方式。因此,您的PCIe设备将被Windows重新枚举,并且PCI cfg空间将获得正确的值(不一定与“禁用”之前相同)。
SetupDiChangeState()
是你的朋友,它完全符合你的需要。在Windows驱动程序开发工具包中查看 DevCon 示例。它显示了如何对此进行编码(示例显示除了禁用/启用之外的很多好东西,我相信你会喜欢:))。
您需要注意的一件事是:如果重新刷新PCIe端点需要更大的内存资源,则可能需要更改系统范围内的PCIe内存资源平衡,在这种情况下,最简单的方法就是重新启动。简而言之,避免因重新刷新而调整内存资源的大小。
在Linux上,并不容易。用户模式关键字是“Linux hotplug子系统”。内核模式关键字包括pci_enable_device()和pci_disable_device()。也许这个链接会有所帮助:How can the linux kernel be forced to enumerate the PCI-e bus?