将数据传入/传出PCIe设备

时间:2018-02-12 20:36:23

标签: windows pci-e

我们有一个原型PCIe端点,我们通过带外外部连接(即连接到电路板的USB电缆,让我们加载FPGA,执行寄存器访问,加载和调试固件等)来控制。我们正在考虑过渡到通过PCIe连接本身在带内执行至少一些这些动作。

但是,我在这方面的知识(PCIe)相当有限。因此,在沿着一条或另一条路径前往潜水之前,我想确保我们没有采取故意困难的路线或遗漏一些明显的东西。

从最基本的意义上说,能够使用端点的固件随意传递32位值就足够了。换句话说,如果我们想要执行“读取”,我们可以向设备发送“地址”值,并检索“数据”值。没有DMA,没有花哨的东西 - 只是偷看和戳固件的交易。就是这样。

我还没有找到任何通用方法来实现PCIe - 相比之下,如果我想(比如说)做类似于SCSI设备的事情,我可以用CDB的形式做事。我能找到的唯一模糊的方法是访问PCIe端点的配置空间;将“值”写入某个已知位置,并轮询完成/数据。但这种能力似乎仅限于司机。这使得事情变得非常复杂,尤其是64位版本中需要更严格的限制(更不用说编写第一个驱动程序所需的固有复杂性)。

所以,两个真正的问题。

  1. 最简单的方法(从实施的角度来看)通过PCIe连接进行基本的偷看交易?速度和效率是较少关注的问题而不是易于实施和可靠性 - 这主要是一个开发环境。 (但它确实必须基于代码 - 我不能只使用WinDbg来转储内容。)
  2. 如果要求驱动程序完成#1,是否可以通过过滤器驱动程序完成,而不是创建一个完整的驱动程序?电源管理之类的东西将被处理其他人,甚至是默认的司机;实现设备功能的整个功能集超出了我需要做的范围。在这种情况下,我只想在众所周知的大门中用脚将数据发送到目标设备。
  3. 这适用于基于Windows的环境。限制到Vista / 7及更高版本可能是安全的(无论如何大多数测试机器都是W7),但如果可能的话,它应该可以在32位和64位上进行。 Linux兼容性不是问题。

    提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在内核中使用uio_pci_generic驱动程序将设备公开给用户空间,然后可以直接从用户空间使用设备。它需要在内核中进行最少的配置,以使设备连接到uio_pci_generic驱动程序,然后通过不太硬的接口即可将PCIe BAR映射到用户空间内存,并从那里进行简单的内存读/写。

我正在通过SPDK和DPDK使用NVMe和网络设备,您可以在这些示例中找到如何利用uio_pci_generic。对于更简单的设备,您可能还会找到其他示例。