【问题标题】:How to transfer data via DMA from RAM to RAM?如何通过 DMA 将数据从 RAM 传输到 RAM?
【发布时间】:2016-06-11 16:48:10
【问题描述】:

我想编写一个内核模块,可以通过 DMA 将数据从 RAM 传输到 RAM。有一些帖子讨论了这个,但我真的不明白。有人说有可能其他人说不是。

如果我对 ldd3 的理解正确,则无法使用 linux 的 DMA API 将 RAM 复制到 RAM,但 driver/dma/dmaengine.c 为“DMA 传输类型”提供了标志 DMA_MEMCPY ",所以应该有办法。

这是正确的,我可以使用 dma 引擎将数据从一个 ram 地址传输到另一个吗?

如果它依赖于硬件,我如何确定我的系统是否支持 dma memcpy?

【问题讨论】:

    标签: linux linux-kernel dma


    【解决方案1】:

    正如您正确指出的那样,DMA_MEMCPY 应该用于执行 RAM 到 RAM 的复制。它在Documentation/dmaengine/provider.txt 中有描述。这里只是一个相关的摘录,更多细节请查看整个文件:

    支持的交易类型

    接下来您需要设置设备的交易类型 (和驱动程序)支持。

    我们的dma_device 结构有一个名为cap_mask 的字段,其中包含 支持各种类型的事务,你需要修改这个 使用dma_cap_set 函数的掩码,不同的标志取决于 您支持作为参数的交易类型。

    所有这些功能都在dma_transaction_type 枚举中定义, 在include/linux/dmaengine.h

    目前可用的类型有:

    • DMA_MEMCPY
      • 设备能够进行内存到内存的复制

    总结一下:

    • 这取决于您的 DMA 控制器。有些能够进行 RAM 到 RAM 的交易,有些则不能。

    • 例如,对于基于 OMAP 的 SoC,DMA 控制器会执行此操作(drivers/dma/omap-dma.c 文件,在 omap_dma_probe() 函数中):

      dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
      
    • 这样您以后可以在驱动程序中检查它(如果您的 DMA 控制器能够进行 RAM 到 RAM 事务)。在drivers/dma/dmatest.cdmatest_add_channel() 函数中查看它是如何完成的:

      if (dma_has_cap(DMA_MEMCPY, dma_dev->cap_mask)) {
      

    如果您需要有关如何使用 DMA API 执行 RAM 到 RAM 事务的示例,请参阅drivers/dma/dmatest.c

    【讨论】:

    • 我会添加几件事,即 a) 如果驱动程序未设置 DMA_PRIVATE,则 memcpy 通常可以由 DMA 支持,b) drivers/dma/dmatest.c i> 将是如何做到这一点的一个例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2022-07-05
    • 2022-11-11
    • 1970-01-01
    • 2017-09-20
    • 2012-12-22
    • 1970-01-01
    相关资源
    最近更新 更多