gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:42:29 25 4
gpt4 key购买 nike

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

如果我对 ldd3 的理解是正确的,RAM 到 RAM 的复制不可能通过 Linux 的 DMA API 实现,但是 driver/dma/dmaengine.c 为“DMA 传输类型”提供了一个标志 DMA_MEMCPY ",所以应该有办法。

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

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

最佳答案

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

Supported transaction types

The next thing you need is to set which transaction types your device (and driver) supports.

Our dma_device structure has a field called cap_mask that holds the various types of transaction supported, and you need to modify this mask using the dma_cap_set function, with various flags depending on transaction types you support as an argument.

All those capabilities are defined in the dma_transaction_type enum, in include/linux/dmaengine.h

Currently, the types available are:

  • DMA_MEMCPY
    • The device is able to do memory to memory copies

总结一下:

  • 这取决于您的 DMA Controller 。有些能够进行 RAM 到 RAM 事务,有些则不能。

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

    dma_cap_set(DMA_MEMCPY, od->ddev.cap_mask);
  • 这样您以后可以在您的驱动程序中检查它(如果您的 DMA Controller 能够进行 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 .

关于linux - 如何通过 DMA 将数据从 RAM 传输到 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766230/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com