-
直接寄存器模式
访问DMACR,SA,DA,length寄存器初始化DMA传输,当传输完成,相关通道的DMASR.IOC_Irq有效(前提是使能该中断,DMACR.IOC_IrqEn使能)。
MM2S 通道启动流程:
- MM2S_DMACR.RS=1,运行DMA
- 使能MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn
- 配置有效的MM2S_SA和MM2S_SA_MSB寄存器
- 写非零的数值到MM2S_LENGTH寄存器,启动读DDR发送至AXIS端口。该数值为读取内存的字节数量
S2MM通道启动流程:
- S2MM_DMACR.RS=1,运行DMA
- 使能S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn
- 配置有效的S2MM_DA和S2MM_SA_MSB寄存器
- 写非零的数值到S2MM_LENGTH寄存器,启动AXIS端口数据写入DDR。此数值需要大于等于一包数据的字节数。
在直接寄存器模式下,上述启动流程需要循环使用,每读写一次,均需要重新配置以上寄存器。
每个流程的结束,会产生中断告知CPU数据操作完成,需要CPU清除IOC_Irq寄存器中断标志。
-
SG模式
配置控制寄存器和描述符之后,SG模式启动。可以极大的提高DMA性能。
MM2S通道启动流程:
- 配置MM2S_CURDESC和MM2S_CURDESC_MSB寄存器,写入开始操作符的地址。
- 配置MM2S_DMACR.RS=1,运行DMA
- 寄存器MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn使能
- 配置MM2S_TAILDESC和MM2S_TAILDESC_MSB,此时DMA启动读取内存中的描述符
- DMA自动处理操作符并读取内存数据通过AXIS端口输出
S2MM通道启动流程:
- 配置S2MM_CURDESC和S2MM_CURDESC_MSB寄存器,写入开始操作符的地址。
- 配置S2MM_DMACR.RS=1,运行DMA
- 寄存器S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn使能
- 配置S2MM_TAILDESC和S2MM_TAILDESC_MSB,此时DMA启动读取内存中的描述符
- DMA自动处理操作符并接收AXIS端口数据写入内存中
每个流程结束(DMA接收到带有EOF的操作符),DMA产生中断至CPU,需要CPU清除IOC_Irq寄存器中断标志,重新操作上述流程。
-
循环DMA模式
此模式下,DMA可以处理相同的缓冲描述符,并不产生中断。此模式下DMA持续工作,除非出现异常停止或者复位。
此模式的关键是,tail描述符指向first描述符。设置Cyclic BD Enable为1(需要在DMA运行之前配置)。
其余流程与SG模式一致。
版权声明:本文为CSDN博主「yindq1220」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yindq1220/article/details/122448292
暂无评论