首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新提交DMA引擎事务

重新提交DMA引擎事务
EN

Stack Overflow用户
提问于 2019-03-06 04:02:27
回答 2查看 442关注 0票数 1

我正在为嵌入式SoC编写一个自定义的高速Linux驱动程序。要向SPI外围设备(DMA_MEM_TO_DEV)发送数据,我是Linux引擎API。

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

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

  1. 分配DMA从信道:dma_request_channel
  2. 设置从参数和控制器特定参数:dmaengine_slave_config
  3. 获取事务处理的描述符: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请求的信息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-07 02:52:45

不需要重复步骤1和步骤2。对于多个事务,可以重复步骤3至5。例如,请参见修补程序这里dspi_next_xfer_dma_submit dspi_dma_xfer函数可以多次调用,步骤3至5被重做。因为您希望dma_addr_t buf是相同的,据我理解,这就是您想要的。

票数 1
EN

Stack Overflow用户

发布于 2019-03-06 07:04:08

您至少需要重新输入内存源地址、目标地址和长度寄存器,因为它们将在DMA事务过程中发生更改。我认为每次只重做每一次都是同样快的--这并不是很容易设置,因此花费的时间是很小的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55015366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档