STM32MP157F的dmaengine_prep_dma_cyclic内存到内存DMA无法运行求助
STM32 MP157F MDMA循环传输无法启动问题求助
背景与优化过程
我们基于STM32 MP157F的MDMA引擎(32个DMA通道)实现了自定义驱动,用于将FMC接口(挂载FPGA)映射区域的数据通过DMA复制到RAM,FPGA内置小型FIFO作为数据源。
高速数据采集场景下,DMA事务的建立时间直接影响数据完整性:
- 最初采用工作队列创建下一个DMA事务,但因必要IO操作需等待,无法在
dma_completed原子上下文直接执行,导致DMA事务间停顿最长达5ms,引发FPGA FIFO溢出。 - 改用
dmaengine_prep_dma_memcpy后,通过合并DMA映射页、提前准备DMA页、双通道切换三项优化,DMA间停顿通常低于1ms,但仍存在FIFO接近溢出的峰值情况。
当前问题
为实现无停顿的持续DMA传输,我们尝试使用dmaengine_prep_dma_cyclic,但遇到异常:
- 可正常获取dma_cookie,通道状态始终显示
DMA_IN_PROGRESS - 事务永不完成,回调函数也未触发
- 对比之下,
dmaengine_prep_dma_memcpy可正常完成传输
查看内核源码stm32-mdma.c发现:dmaengine_prep_dma_cyclic调用的stm32_mdma_set_xfer_param()始终配置硬件请求,而dmaengine_prep_dma_memcpy有独立的参数设置流程。
求助问题
- 是否可通过软件触发,使用
dmaengine_prep_dma_cyclic实现内存到内存的DMA事务? - 是否存在FPGA与SOC间未连接的信号(如缺少TSEL设置)导致该问题?
注:可提供最小驱动源码示例,该问题具有强硬件特异性。
内容的提问来源于stack exchange,提问作者Gunther
相关产品推荐
相关产品推荐

