0

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

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

我构建了一个 Petalinux 项目并将 DMA-Engine 和 DMA Test 客户端添加到其内核中。

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

我不知道向 Petalinux 项目添加硬件规范(通过 .xsa 文件和 .bit 文件)就足够了,或者我应该在我的 Linux 中添加一个设备树来检测 DMA

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

先感谢您。

4

1 回答 1

1

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

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

还有一个用于 Axi DMA 的开源客户端驱动程序,与代理 DMA 驱动程序相比,它实现了更高的带宽。它的用户空间 API 还允许您注册一个回调函数,以便在事务完成时调用。

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

于 2021-12-09T22:15:25.343 回答