如何从 Linux 访问 Xilinx Axi DMA?

How to access Xilinx Axi DMA from Linux?

我是一名软件开发人员,但我是嵌入式软件开发的新手。 我有一个 Zynq Ultrascale 板,其硬件中有一个 Axi DMA,我想从 Linux 访问这个 DMA。 我知道我应该使用 DMA-Engine 访问 Linux 中的 DMA,我发现以下 link 这是 Xilinx DMA 驱动程序,但我无法将这些文件添加到我的 qt 项目中而没有任何错误和我收到文件(头文件)未找到错误。 drivers/dma/xilinx/xilinx_dma.c

我有一些关于 DMA 驱动程序、设备树和 DMA 引擎的零散信息,但我不知道如何利用这些来访问硬件 DMA。

我构建了一个 Petalinux 项目并将 DMA 引擎和 DMA 测试客户端添加到它的内核中。

我不知道将 DMAEngine 添加到 Petalinux 项目是否足够,或者我也应该有一个驱动程序。

我不知道向 Petalinux 项目添加硬件规范(通过 .xsa 文件和 .bit 文件)是否足够,或者我应该向我的 Linux 添加设备树以检测 DMA

我查找了有关如何设置 Linux 和 qt creator 以访问 DMA 的分步教程, 或者至少为我的目标制定清晰的路线图。

提前致谢。

首先,您在将 xilinx_dma.c 添加到 Qt 项目时遇到错误,因为此文件将作为内核的一部分或内核模块进行编译。

将 DMA 引擎添加到 Petalinux 不足以使用来自用户 space 的 DMA。 DMA Engine 只提供了一个标准化的 API 让不同的 DMA 集成到内核中。您还需要添加客户端驱动程序。据我所知,Xilinx 已经提供了一个名为 DMA Proxy Driver 的简单客户端驱动程序。它还包括一些简单示例,展示如何从用户 space 访问 DMA。但是,如果您的应用程序需要高带宽,您可能需要考虑其他选项。

A​​xi DMA 也有 an open source client driver,与代理 DMA 驱动程序相比,它实现了更高的带宽。它的用户 space API 还允许您注册一个回调函数,以便在交易完成时调用。

第三个选项是在用户中实现驱动程序space。这可以通过在设备树中将 DMA 定义为 UIO 设备并直接从用户 space 访问其寄存器映射来完成。在这种情况下,您需要在内核中分配一些连续的内存块 space 以避免 MMU 的复杂性,用户无法处理 space.