重新提交DMA引擎事务

问题描述 投票:0回答:2

我正在为嵌入式SoC编写一个定制的高速Linux SPI驱动程序。要将数据发送到SPI外设(DMA_MEM_TO_DEV),我就是Linux DMA引擎API。

https://www.kernel.org/doc/Documentation/dmaengine/client.txt

根据文档,设置和执行DMA事务的步骤如下:

  1. 分配DMA从属通道:dma_request_channel
  2. 设置从站和控制器特定参数:dmaengine_slave_config
  3. 获取tranesaction的描述符:dmaengine_prep_slave_single
  4. 提交交易:dmaengine_submit
  5. 发出待处理请求并等待回调通知:dma_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请求的任何信息。

c linux linux-device-driver dma
2个回答
1
投票

不需要重复步骤1和2。可以针对多个事务重复步骤3到5。例如,请参阅补丁here。 dspi_dma_xfer函数可以多次调用dspi_next_xfer_dma_submit,重做步骤3到5。既然你想要dma_addr_t buf是相同的,据我所知,这就是你想要的。


1
投票

您需要至少重新初始化内存源地址,目标地址和长度寄存器,因为它们将在DMA事务过程中发生变化。我认为每次重做所有事情的速度同样快 - 它的设置不是很多,因此花费的时间是微不足道的。

© www.soinside.com 2019 - 2024. All rights reserved.