如何通过DMA将数据从RAM传输到RAM?

时间:2016-06-11 16:48:10

标签: linux linux-kernel dma

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

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

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

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

1 个答案:

答案 0 :(得分:4)

正如您正确指出的那样,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.c函数中查看dmatest_add_channel()中的完成情况:

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

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