如何从 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。但是,如果您的应用程序需要高带宽,您可能需要考虑其他选项。
Axi DMA 也有 an open source client driver,与代理 DMA 驱动程序相比,它实现了更高的带宽。它的用户 space API 还允许您注册一个回调函数,以便在交易完成时调用。
第三个选项是在用户中实现驱动程序space。这可以通过在设备树中将 DMA 定义为 UIO 设备并直接从用户 space 访问其寄存器映射来完成。在这种情况下,您需要在内核中分配一些连续的内存块 space 以避免 MMU 的复杂性,用户无法处理 space.
我是一名软件开发人员,但我是嵌入式软件开发的新手。 我有一个 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。但是,如果您的应用程序需要高带宽,您可能需要考虑其他选项。
Axi DMA 也有 an open source client driver,与代理 DMA 驱动程序相比,它实现了更高的带宽。它的用户 space API 还允许您注册一个回调函数,以便在交易完成时调用。
第三个选项是在用户中实现驱动程序space。这可以通过在设备树中将 DMA 定义为 UIO 设备并直接从用户 space 访问其寄存器映射来完成。在这种情况下,您需要在内核中分配一些连续的内存块 space 以避免 MMU 的复杂性,用户无法处理 space.