源设备。DMA通过AXI总线读取该设备的数据,并将数据保存到通道FIFO中。
目的设备。DMA将通道FIFO的数据写入该设备。数据是先前从Source peripheral读取的。
内存设备。用于DMA传输的一类源/目的设备,但是DMA不需要通过握手接口和这类设备进行交互。(我理解这类设备为系统内存)
通道。在源设备和目的设备之间的、经过通道FIFO的读写数据通路,源设备和目的设备可以在相同的AXI总线上,也可以不在相同的AXI总线上。
如果源设备不是内存设备,那么该通道需要源握手接口;如果目的设备不是内存设备,那么该通过需要目的握手接口。
通过可编程通道寄存器,源和目的的握手接口可以动态分配。
主设备接口。在AXI总线上,DMA控制器作为主设备,从源设备中读取数据,并将该数据写入目的设备。最大支持两个主设备接口,因此最大支持两个独立的源/目的通道同时工作。每个通道使用主设备接口必须要通过仲裁。如果源设备和目的设备在不同的AXI总线上,那就需要多个主设备接口。
从设备接口。DMA控制器编程接口。从设备接口可以和主设备接口在相同的AXI总线上,或者和主设备连接的AXI总线不一样。
握手接口。用于实现DMA控制器和源/目的设备之间的握手协议,可以是一组硬件信号或者软件寄存器。握手协议用于*协助*DMA和源/目的设备之间的一次操作(该操作可能是single类型,也可能是突发类型)控制。
DMA的通道可以接收来自源/目的设备的请求,并在完成请求之后,给源/目的设备发送确认。握手接口有两种类型:硬件和软件。
注意:QSPI使用硬件握手信号方式。
流量控制器。用于计算DMA块传输长度,并控制何时终止块传输。如果在通道使能之前就确定了块长度,那么DMA控制器这边负责流控;否则,由源/目的设备负责流控。
注意:QSPI负责流控,因此DMA控制器可以不需要流控。
数据传输层次结构。传输被分为四个层级:DMA传输级、块传输级、操作级和AXI总线级。这种技术主要是为了能充分提升DMA的数据传输性能;当某个源/目的设备速率比较慢时,DMA可以在多个源/目的设备之间进行分时复用。
如果源/目的设备不是内存设备,包含了全部的四层结构。(QSPI用的这种方式)
如果源/目的设备是内存设备,只包含了DMA传输级、块传输级和AXI总线级三层结构。
针对源/目的设备不是内存设备的情况,DMA基本传输操作,由硬件或软件握手接口来定义。这种基本传输操作具有两种类型:
单个类型的传输操作,长度总是为1,对应突发长度为1的INCR AXI总线传输。
突发类型的传输操作,长度可编程,对应AXI突发传输的序列。这种传输操作的长度一般与DMA和源/目的设备的FIFO长度有关。
DMA数据块,一个数据块长度由流量控制器来计算。
当源/目的设备是内存设备时,数据块直接分成突发传输序列;
当源/目的设备不是内存设备时,数据块先被分成基本操作序列,继而分为AXI总线传输序列。
软件控制的DMA块序列。一旦DMA传输完成,硬件就会关闭通道并触发中断。
单块的DMA传输,只有一个DMA数据块。
多块的DMA传输,多个DMA数据块组成。主要组件包括块链表block chaining(linked list pointers),通道寄存器的自装载,影子寄存器和连续的DMA数据块。源/目的可以独立配置。
LLP指向一块系统主存区域,该系统主存区域存放下一个linked list item LLI。 LLI包括了一组寄存器,描述了下一个DMA块描述和LLP寄存器。
当block chaining使能时,在每个DMA块传输开始时,DMA控制器会先读取LLI。
在每次块传输结束后,DMA控制器自动将通道寄存器复位到通道第一使能的状态。
两个相邻的DMA数据块,前一个数据块的结束地址和后一个数据块的起始地址被认为是连续。
在每次DMA块传输结束,DMA控制器自动将影子寄存器内容加载到通道寄存器。软件可以对影子寄存器编程,哪怕当前还由DMA块在传输。
在DMA传输、块传输、或者操作(单模式或突发模式)过程中,软件通过主设备总线接口仲裁器的锁机制,从而占用AXI总线接口。