如何从 Linux 访问 Xilinx Axi DMA?
Posted
技术标签:
【中文标题】如何从 Linux 访问 Xilinx Axi DMA?【英文标题】:How to access Xilinx Axi DMA from Linux? 【发布时间】:2022-01-13 13:12:41 【问题描述】:我是一名软件开发人员,但我是嵌入式软件开发的新手。 我有一块 Zynq Ultrascale 板,它的硬件中有一个 Axi DMA,我想从 Linux 访问这个 DMA。 我知道我应该使用 DMA-Engine 在 Linux 中访问 DMA,我发现以下链接是 Xilinx DMA 驱动程序,但我无法将这些文件添加到我的 qt 项目中而没有任何错误,并且我收到的文件(头文件)不是发现错误。 drivers/dma/xilinx/xilinx_dma.c
我有一些关于 DMA 驱动程序、设备树和 DMA 引擎的零散信息,但我不知道如何利用这些信息访问硬件 DMA。
我构建了一个 Petalinux 项目并将 DMA-Engine 和 DMA Test 客户端添加到其内核中。
我不知道将 DMAEngine 添加到 Petalinux 项目就足够了,或者我也应该有一个驱动程序。
我不知道将硬件规范(通过 .xsa 文件和 .bit 文件)添加到 Petalinux 项目就足够了,或者我应该在我的 Linux 中添加一个设备树来检测 DMA
我查找了有关如何设置 Linux 和 qt creator 以访问 DMA 的分步教程, 或者至少是我的目标的清晰路线图。
提前谢谢你。
【问题讨论】:
【参考方案1】:首先,您在将 xilinx_dma.c 添加到 Qt 项目时会遇到错误,因为该文件旨在作为内核的一部分或作为内核模块进行编译。
将 DMA 引擎添加到 Petalinux 不足以从用户空间使用 DMA。 DMA Engine 只提供了一个标准化的 API 来让不同的 DMA 集成到内核中。您还需要添加客户端驱动程序。据我所知,Xilinx 提供了一个名为DMA Proxy Driver 的简单客户端驱动程序。它还包括一些简单的示例,展示了如何从用户空间访问 DMA。但是,如果您的应用程序需要高带宽,您可能需要考虑其他选项。
还有an open source client driver 用于 Axi DMA,与代理 DMA 驱动程序相比,它实现了更高的带宽。它的用户空间 API 还允许您注册一个回调函数,以便在事务完成时调用。
第三个选项是在用户空间实现驱动。这可以通过将 DMA 定义为设备树中的 UIO 设备并直接从用户空间访问其寄存器映射来完成。这种情况下,需要在内核空间分配一些连续的内存块,避免MMU出现复杂情况,不能从用户空间处理。
【讨论】:
谢谢 Sohail,AFAIU 最简单的方法是使用 DMA Proxy DMA,但是对于 xilinx_dma.c,Petalinux 不应该为我做吗?而且因为它需要内核编译,所以在 Ubuntu 上不容易使用?我说的对吗? @hamed 您需要通过 menuconig 启用 CONFIG_XILINX_DMA,以便 Petalinux 包含 Xilinx 的 DMA 引擎实现。我猜如果您使用 xsa 文件创建了 Petalinux 项目,那么该配置已经启用。如果您的意思是在 Zynq 本身上运行 Ubuntu,我没有任何经验。以上是关于如何从 Linux 访问 Xilinx Axi DMA?的主要内容,如果未能解决你的问题,请参考以下文章
带你快速入门AXI4总线--AXI4-Stream篇----XILINX AXI4-Stream接口IP源码仿真分析
带你快速入门AXI4总线--AXI4-Full篇----XILINX AXI4-Full接口IP源码仿真分析(Master接口)