在Linux中使用DMA的最简单方法

时间:2015-12-09 20:29:24

标签: c linux-kernel linux-device-driver embedded-linux xilinx

我是EE和一个项目在uni我正在FPGA(Xilinx ZYNQ)上开发硬件辅助图像/视频滤波,该设备内部还有一个双核ARM A9处理器,更重要的是还有一个ARM Primecell PL330 DMA控制器

我正在使用Yocto构建一个基本的linux环境,我可以在处理器上使用Xilinx的自定义内核内核分支。

现在如果我理解正确我不能直接使用内核DMA API,但我必须编写一个自定义内核驱动程序,这就是问题,因为我没有足够的内核知识能够这样做(特别是为自定义模块设置构建环境)...

那么是否存在某种类型的库/ API /任何可以从用户空间进行DMA传输的东西? (特别是从内存到内存映射外设(zynq上PS和PL之间的AXI4端口)

更新

经过一些深夜的实验,我得到了一个基本的hello world内核模块才能正确加载,所以我想我会采用正确的方式编写一个小的设备驱动垫片,从用户空间获取一大块数据(部分如果IC通过DMA api

,则将其传递给FPGA部分

我会报告我的成功或失败;)

3 个答案:

答案 0 :(得分:1)

一个潜在的选择可能是使用UIO interface(另请参阅此blog article

链接中有一些示例代码,但代码的一般结构是:

  • 你有一个小内核模块来处理IO init并暴露DMA。 (见documentation
  • 您的用户空间程序然后处理您需要的所有IO以使其正常工作。 (另见example code

由于你没有指定你想做什么,所以我不能更具体。 但是你需要弄清楚如何在内核中初始化你的内存(请参阅标记wiki,了解LDD3上的文档很棒。)

答案 1 :(得分:0)

对于该特定平台肯定有dmaengine驱动程序。 您需要做的就是创建一个小内核模块,为用户提供对dmaengine客户端API的访问权限。

请阅读: dmaengine client

答案 2 :(得分:0)

几年前,当我拿到Zedboard时,我很惊讶我需要编写一个设备驱动程序才能将我的应用程序连接到可编程逻辑。

所以我开始研究Connectal Framework来解决这个问题。 Connectal为Zynq FPGA和通过PCI Express连接的Xilinx或Altera FPGA提供通用设备驱动程序。设备驱动程序使用户模式软件能够对硬件的控制接口进行存储器映射,并与硬件共享存储器(通过DMA)。它还为可编程逻辑提供MMU,以便应用程序和可编程逻辑可以将相同的线性偏移用于共享内存对象。

Connectal使用Bluespec Systems Verilog作为其硬件库,这可能会使您的应用程序难以使用该框架或其设备驱动程序,但它可用,我们很乐意更详细地解释和记录硬件接口。 / p>

Connectal可在github上找到:

相关的驱动程序在这里:

有几种选择: