我们有一个原型PCIe端点,我们通过带外外部连接(即连接到电路板的USB电缆,让我们加载FPGA,执行寄存器访问,加载和调试固件等)来控制。我们正在考虑过渡到通过PCIe连接本身在带内执行至少一些这些动作。
但是,我在这方面的知识(PCIe)相当有限。因此,在沿着一条或另一条路径前往潜水之前,我想确保我们没有采取故意困难的路线或遗漏一些明显的东西。
从最基本的意义上说,能够使用端点的固件随意传递32位值就足够了。换句话说,如果我们想要执行“读取”,我们可以向设备发送“地址”值,并检索“数据”值。没有DMA,没有花哨的东西 - 只是偷看和戳固件的交易。就是这样。
我还没有找到任何通用方法来实现PCIe - 相比之下,如果我想(比如说)做类似于SCSI设备的事情,我可以用CDB的形式做事。我能找到的唯一模糊的方法是访问PCIe端点的配置空间;将“值”写入某个已知位置,并轮询完成/数据。但这种能力似乎仅限于司机。这使得事情变得非常复杂,尤其是64位版本中需要更严格的限制(更不用说编写第一个驱动程序所需的固有复杂性)。
所以,两个真正的问题。
这适用于基于Windows的环境。限制到Vista / 7及更高版本可能是安全的(无论如何大多数测试机器都是W7),但如果可能的话,它应该可以在32位和64位上进行。 Linux兼容性不是问题。
提前谢谢。
答案 0 :(得分:0)
您可以在内核中使用uio_pci_generic驱动程序将设备公开给用户空间,然后可以直接从用户空间使用设备。它需要在内核中进行最少的配置,以使设备连接到uio_pci_generic驱动程序,然后通过不太硬的接口即可将PCIe BAR映射到用户空间内存,并从那里进行简单的内存读/写。
我正在通过SPDK和DPDK使用NVMe和网络设备,您可以在这些示例中找到如何利用uio_pci_generic。对于更简单的设备,您可能还会找到其他示例。