我正在为嵌入式SoC编写一个自定义的高速Linux驱动程序。要向SPI外围设备(DMA_MEM_TO_DEV)发送数据,我是Linux引擎API。
https://www.kernel.org/doc/Documentation/dmaengine/client.txt
根据这些文档,设置和执行DMA事务的步骤如下:
dma_request_channeldmaengine_slave_configdmaengine_prep_slave_singledmaengine_submitdma_async_issue_pending我把它用于单个DMA事务。但是我需要基于一些硬件流控制(GPIO)从相同大小的内存位置(dma_addr_t buf)发送多个DMA事务(size_t len)。
首先,我尝试对每个DMA事务重做步骤1-5。因此,每当流量控制GPIO IRQ触发时,我重新分配DMA从通道,重新设置从和控制器的特定参数,
这似乎也有效,但我不确定这是否是最有效的方法。
我想知道我是否可以重新提交事务处理(dmaengine_submit)和再次发布(dma_async_issue_pending)?这样会更有效率吗?
我似乎找不到任何关于如何在内核文档中任何地方重新提交完全相同的DMA请求的信息。
发布于 2019-03-07 02:52:45
不需要重复步骤1和步骤2。对于多个事务,可以重复步骤3至5。例如,请参见修补程序这里。dspi_next_xfer_dma_submit dspi_dma_xfer函数可以多次调用,步骤3至5被重做。因为您希望dma_addr_t buf是相同的,据我理解,这就是您想要的。
发布于 2019-03-06 07:04:08
您至少需要重新输入内存源地址、目标地址和长度寄存器,因为它们将在DMA事务过程中发生更改。我认为每次只重做每一次都是同样快的--这并不是很容易设置,因此花费的时间是很小的。
https://stackoverflow.com/questions/55015366
复制相似问题