我想编写一个内核模块,可以通过DMA将数据从RAM传输到RAM。有一些帖子讨论这个,但我真的没有。有人说有可能其他人说它不是。
如果我理解ldd3正确,使用linux的DMA API无法进行RAM到RAM复制,但 driver / dma / dmaengine.c 为“DMA传输类型”提供了标志DMA_MEMCPY “,所以应该有办法。
这是否正确,我可以使用dma引擎将数据从一个ram地址传输到另一个ram地址吗?
如果它取决于硬件,如何确定我的系统是否支持dma memcpy?
答案 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。