我已经编写了一些 Linux 设备驱动程序,但我仍然处于新手 hack 的水平。我可以让他们工作,但这就是我所能声称的。到目前为止,我已经能够将它们变成使用 write() 写入数据和使用 read() 读取数据的模型。我偶尔会使用 ioctl 进行更精细的控制。
现在我想在 FPGA 逻辑中构建一个协处理块,并在同一个 FPGA 中为 ARM 处理器编写一个设备驱动程序,以将工作从 ARM 卸载到 FPGA。我很难弄清楚如何最好地设计这个界面。
如果对协处理器的访问是独占的,则可以将数据写入驱动程序,处理将在 FPGA 架构中进行,并通过调用读取来检索数据。然而,对协处理硬件的独占访问将是一种浪费。理想情况下,任何用户空间进程都可以使用可用的硬件。我相信如果政策要求用户空间进程打开设备、写入数据、读取结果然后关闭文件,它会起作用。似乎每次需要访问协处理器时打开和关闭文件的开销抵消了首先卸载工作的好处。
我知道在设备驱动程序代码中需要处理很多问题,以安全地处理对硬件的多次访问。但从高层次来看,我希望看到一个概念可以使这个接口工作并遵守 Linux 设备驱动程序的良好实践。
暂时抛开所有复杂性,理想的系统似乎是一个任何进程都可以打开设备并具有将数据写入设备的访问点,也许是在阻塞调用中,并且在协处理器完成后读取数据,这很神奇。驱动程序将处理硬件访问,调用进程可以在需要时保持设备文件打开。绝对任何见解或指导将不胜感激!
如果有人关心或者它在某种程度上有用或有趣,这些都是额外的信息:
这个特殊的 FPGA 是 Xilinx 的 Zynq 器件。它在与 FPGA 结构(基于其 Kintex 系列)相同的硅片上具有双核 Cortex ARM A9。该系统正在运行用于 ARM 的 Arch Linux,并且已经运行一年了。我使用通用名称“协处理器硬件”,因为这个想法是随着时间的推移,这块硬件将获得能力,而它的设备驱动程序的用户空间接口保持相当稳定。例如,您将能够编写 1024 个样本并让该模块执行低通滤波操作、FFT 等,并比处理器本身更快地获得结果。
谢谢!这是我在这里的第一个问题,因此我为违反协议和固有的无知道歉。
--蒂姆