DMAC接口
APB slave interfaces
non-secure APB slave interfac
secure APB slave interface.
每个APB接口分配了4KB内存,memory map参考“编程模型”
AXI master interface
一个AXI master接口用于传输数据,从源AXI slave到目的AXI slave
当一个DMA channel线程访问AXI接口时,DMAC发起的AXI ID TAG和DMAC channel号一样。例如,当DMA channel 5的线程执行一个DMA store操作时,DMAC会设置AWID[2:0]和WID[2:0] 为b101(5)
当DMA管理线程访问AXI接口时,DMAC发起的AXI ID TAG和DMAC所提供的DMA channel号一样。例如,如果DMAC被配置为提供8个DMA channel,那么当DMA管理线程执行读操作时,DMAC设置ARID[3:0]为b1000(8)。
Peripheral request interfaces
外设请求接口支持连接DMA-capable外设。
Interrupt interface
Reset initialization interface
工作状态机
DMAC从reset状态退出后,所有DMA channel线程都在Stopped状态。DMA管理线程状态根据boot_from_pc的状态控制:
boot_from_pc为LOW: DMA管理线程进入Stopped状态
boot_from_pc为HIGH:DMA管理线程进入Executing状态
Stopped | 线程有非法PC值,没有取指令。根据线程类型不同,转换到Executing状态的方法不同: DMA管理线程 - 写Debug Command Register DMA channel线程 - 编程DMA管理线程去执行某个处于Stopped状态的DMAchannel线程的DMAG0命令 |
Executing | 线程有合法PC值,DMAC在仲裁时会包含这个线程 |
Executing -> other states | Stopped: DMA管理线程执行DMAEND命令 Cache miss:任意线程在指令cache不包含下一条该线程使用的指令的时候 Updating PC: 当DMAC计算cache中下一次访存的地址的时候 Waiting for event:任意线程执行DMAWFE At barrier: DMA channel线程执行DMARMB,DMAWMB或DMAFLUSHP DMAC更新MFIFO数据buffer或类似的内部控制功能 Waiting for peripheral: DMA channel线程执行DMAWFP Killing:DMA channel线程执行DMAKILL Faulting completing:当DMAC在执行一个DMA传输时如果发生了一个AXI bus error。这个状态只对DMA channel线程有用。 Faulting: 当DMAC在取一条指令时发生了AXI bus error DMAC执行了一条未定义指令 Completing: DMA channel线程执行DMAEND |
Cache miss | DMAC正在做cache line fill,线程被停住。当cache line fill完成后线程返回Executing状态 |
Updating PC | DMAC正在计算cache里下一次访存的地址。计算完PC后线程返回Executing状态 |
Waiting for event | 线程被停住,等待DMAC执行DMASEV(使用对应的事件编号)。对应事件发生后线程返回Executing状态 |
At barrier | DMA channel线程被停住,DMAC正在等待AXI bus上的事务结束。当AXI事务结束后,线程返回Executing状态 |
Waiting for peripheral | DMA channel线程被停住,DMAC正在等待外设提供请求的数据。当外设提供数据后线程返回Executing状态 |
Faulting completing | DMA channel线程正在等待AXI 接口发出信号表明outstanding的load或store事务结束。当事务结束后线程进入Faulting状态。 关于AXI outstanding理解 https://zhuanlan.zhihu.com/p/376525373 |
Faulting | 线程被不确定地停住了。当使用Debug Command寄存器来让DMAC对这个线程执行DMAEND或DMAKILL的时候,线程进入Stopped状态 |
Completing | DMA channel线程正在等待AXI接口发信号表明outstanding的load或store事务结束。 |
初始化DMAC
设置DMA管理器的安全状态 | boot_manager_ns信号是唯一的设置DMA管理器安全状态的方法。当DMAC退出复位状态时,它会读取boot_manager_ns状态并且设置DMA管理器的安全性。 安全状态一旦被设置,会保持到DMAC被复位。 |
设置DMAC执行的第一条指令地址 | 当DMAC退出复位状态时,boot_from_pc信号会控制DMAC:
更新DMA PC寄存器,地址值由boot_addr[31:0]提供 根据DMA PC寄存器里的地址取出指令执行 (必须确保boot_addr[31:0]信号所对应的地址指向包含了DMAC启动程序的系统内存地址;如果boot_manager_ns也设置了,DMA管理器会工作在非安全态,启动程序必须处于非安全内存区域)
必须通过使用slave APB接口中的一个来提供第一条指令给DMAC |
设置中断输出的安全状态 | DMAC提供了boot_irq_ns[x:0]信号,来对每个irq[x]的安全状态来进行启用或禁用。 一旦irq[x]的安全状态被设置,状态会保持到DMAC复位 |
设置外设请求接口的安全状态 | DMAC提供了boot_periph_ns[x:0]信号,来对每个外设请求接口的安全状态进行启用或禁用。 同理,安全状态会保持到DMAC复位 |
使用APB slave接口
APB slave接口链接了DMAC和APB,能够让微处理器访问“编程模型”里描述的寄存器。利用这些寄存器,微处理器能够:
访问DMA管理线程的状态
访问DMA channel线程的装填
启用或清除中断
启用事件
通过编程下列debug寄存器让DMAC执行一条指令:
Debug Command寄存器
Debug Instruction-0寄存器
Debug Instruction-1寄存器
使用APB接口发起指令到DMAC
当DMAC正在实时工作中时,只能发起有限的指令:
DMAG0 使用指定的DMA channel启动一个DMAC事务
DMASEV 使用指定的事件号发起信号通知事件或中断的发生
DMAKILL 终止一个线程
必须确保使用的APB接口是合适的,这里主要是指安全状态(boot_manager_ns)。对于安全状态,必须使用安全APB接口,否则DMAC会忽略指令。对于非安全状态,可以使用安全APB接口或非安全APB接口。
在使用debug instruction寄存器或debug command寄存器前,必须读取Debug Status寄存器来确保debug处于idle状态
当DMAC从APB slave接口接收到一条指令时,在处理指令前它可能会延迟几个时钟周期,比如在流水线正在忙于处理其它指令的时候。
在发起DMAG0前,必须确保系统内存包含一个DMAC用于执行的适合的程序,起始地址由DMAG0所指定。
例子,使用debug instruction寄存器启动一个DMA channel
使用DMAC的一个APB接口,编程一条DMAG0指令:
DMAG0的指令byte 0 DMAG0的指令byte 1 debug线程bit设置为0,选择DMA管理线程
DMAG0指令byte[5:2]的数据。这四个byte是第2步程序的第一条指令的地址。 让DMAC执行debug instruction寄存器里的指令
当DMAC完成指令执行后它会清除dbgstatus到0 |