【问题标题】:Easiest way to use DMA in Linux在 Linux 中使用 DMA 的最简单方法
【发布时间】:2016-03-15 06:58:10
【问题描述】:

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

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

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

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

更新

经过深夜的实验,我得到了一个基本的 hello world 内核模块,可以正确加载,所以我想我会走正确的路,写一个小的设备驱动 shim,它从用户空间获取大量数据(部分在这种情况下为图像),如果 IC 通过 DMA api 将其传递给 FPGA 部分

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

【问题讨论】:

  • 你没有说它是连接的。是PCIe吗? USB? UNIBUS?
  • @stark 以上都不是;它直接映射到内存中。 Zynq 是一个不寻常的设备。 :)
  • 好吧,我猜我应该解释得更好;)在 ZYNQ 臂处理器和 FPGA 上位于同一个硅芯片上,它们通过 AXI 总线连接; AXI 是 ARM 控股的 BUS 协议,它是 AMBA 4 的版本
  • 内核中DMA引擎的驱动已经很久了。在您的案例中,您必须了解谁是 DMA 资源的客户。看起来您正在 FPGA 上实现特定的 IP,因此,您必须为该 IP 编写驱动程序。如果它是用户空间驱动程序,您仍然需要编写一些可以为您的用户空间驱动程序提供硬件资源的东西。
  • 请记住,您还需要考虑缓存一致性。

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


【解决方案1】:

一种可能的选择是使用UIO interface(另见blog article

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

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

由于您没有指定您想要做什么,我无法更具体。 但是你需要弄清楚如何在内核中初始化你的内存(请参阅标签 wiki 以获取关于 LDD3 的文档很棒)。

【讨论】:

  • 恐怕您没有阅读文档的内容。在UIO框架中,文本中单词DMA的实例为零(与DMA资源无关)。
  • @AndyShevchenko UIO 框架不用于初始化 DMA,而是作为将内存暴露给用户空间的简单方法。每个 UIO 设备可以使一个或多个内存区域可用于内存映射。每个映射在 sysfs 中都有自己的目录 .... 因为我不 know Zync 我不知道如何访问 DMA 部分,但是将其包装在 UIO 模块中可以更轻松地用户空间访问它。
  • 是的,但还是有人需要运行硬件,我认为 UIO 在这种情况下会有所帮助。无论如何,大多数东西都将在驱动程序的内核部分中。我什至不确定图像/视频过滤的某些部分在用户空间是否有意义(例如图像通过 V4L2 接口来自相机),我想知道是否可以扩展 UIO 框架以支持 DMA 引擎 API。跨度>
  • @AndyShevchenko 这真的取决于我认为的硬件。虽然公开 DMA 配置绝对是可能的,但这只是工作的一半。如果您的驱动程序需要中断工作或确实需要一些高性能逻辑,您也需要公开它。创建基于 DSL 的驱动程序框架绝对是可能的(例如,usb gadget fs 执行用户空间驱动程序,您可以在其中通过文件描述符配置驱动程序,linux-usb.org/gadget
  • 我相信 configfs 的例子在这里很糟糕。在任何情况下,主题发起人都必须详细说明他们在做什么以及为什么这样做。
【解决方案2】:

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

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

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

Connectal 在 github 上可用:

相关驱动在这里:

有几种选择:

【讨论】:

    【解决方案3】:

    该特定平台肯定有一个dmaengine 驱动程序。 您需要做的就是创建一个小型内核模块,让用户空间可以访问 dmaengine 客户端的 API。

    请阅读: dmaengine client

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 2021-10-24
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2010-10-23
      • 2014-08-23
      相关资源
      最近更新 更多