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

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

我是一名电子工程师,在 uni 的一个项目中,我正在 FPGA (Xilinx ZYNQ) 上开发硬件辅助图像/视频过滤,该设备内部还有一个双核 ARM A9 处理器,更重要的是还有一个ARM Primecell PL330 DMA Controller

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

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

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

更新

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

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

最佳答案

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

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

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

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

关于c - 在 Linux 中使用 DMA 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34188369/

相关文章:

c - #定义一个指针a->b指向另一个指针c

c - 内存中的静态全局

linux - 如何使 bond0/eth0 接口(interface) UP

linux - 在 linux 中是否可以从任何用户空间程序注册中断处理程序?

c - 从不同的 UART 驱动读取数据

c - 数据类型冲突错误

c - 从用户那里获取输入

linux - 使 oldconfig 覆盖 .config 中的值

c - 如何从 shell 触发内核模块?

linux - 在 Yocto 中修改内核配置