! c: ]# c `0 q$ k3.13 DMA控制器DMA控制器(DMA Controller,DMAC)使用一个AXI主接口,在系统存储器和外设之间的传输数据。 3.13.1 DMA控制器结构及特性DMAC包含一个小的指令集,它为指定的DMAC操作提供了一个灵活的方法。这比基于固定能力的链接列表项(Linked-List Item,LLI)的DMA控制器来说,提供了更大的灵活性。程序代码保存在系统存储器空间范围内,DMAC使用它的AXI主设备接口访问程序代码。DMAC能配置最多8个通道,每个通道能支持一个单独并发的DMA操作线程。DMAC有一个DMA管理器,用于初始化DMA通道线程。当一个DMA通道线程执行一个加载或者保存指令时,DMAC将指令添加到相关的读或者写队列中。 在AXI总线上发布命令时,DMAC使用这些队列作为一个指令存储缓冲区。在一个DMA传输过程中,DMAC也包含一个多通道先进先出队列(Multichannel Fisrt-in-First-Out,MFIFO)数据缓冲区,用于保存读或者写数据。对于一个程序,它看上去好像是一个可变深度的FIFO集。每个通道都有一个FIFO集,其限制是所有FIFO总的深度不能超过MFIFO的大小。 DMAC可以在没有CPU干预的情况下,在存储器之间移动数据。源和目的存储器应该是PS或者PL系统内的任何存储器资源。 对带有PS存储器的传输流量控制是使用AXI互联。带有PL外设的访问可以使用AXI流控制或者DMAC的 PL外设请求接口。没有外设请求接口直接指向PS I/O外设。对于PL外设的AXI交易,运行在CPU上的软件使用中断或轮询的可编程I/O方法。 控制器有两套控制和状态寄存器。一套在安全模式下访问,另一套在非安全模式下访问。软件通过控制器的32位APB从接口访问这些寄存器。整个控制器工作在安全或者非安全模式下。在一个通道中,不存在安全和非安全的混合模式。安全配置的改变由slcr寄存器控制。并且,要求复位控制器使得这些改变发生作用。 DMAC具有以下特性。 (1) DMA引擎处理器带有一个灵活的指令集,用于DMA传输: ①灵活地分散-聚集存储器传输; ②充分地控制用于源和目的的寻址; ③定义AXI交易属性; ④管理字节流。 (2) 支持8个缓存行,每个缓存行是4个深度。 (3) 支持8个并发的DMA通道: ①允许并行执行多个线程; ②发布命令,最多8个读和8个写AXI交易。 (4) 8个到PS中断控制器和PL的中断。 (5) 在DMA引擎程序代码内的8个事件。 (6) 用于数据缓冲的128(64位)字MFIFO。在一个传输过程中控制器读或写MFIFO。 (7) 安全性: ①专用的APB从接口,用于安全寄存器的访问; ②将整个控制器配置为安全的或者不安全的。 (8) 存储器-存储器的DMA传输。 (9) 四个PL外设请求接口,用于控制进入或者从PL逻辑输出的流。每个接口支持最多4个活动的请求。 图3.14给出了DMA控制器的系统视图。 图 3.14 DMA控制器系统视图 图3.15给出了DMA控制器的块图。下面将介绍该DMA控制器的内部结构。 图 3.15 DMA控制器块图 1. DMA指令执行引擎(操作状态) DMAC包含一个指令处理模块,用来处理用于控制一个DMA传输的程序代码。DMAC为每个线程都保留一个独立的状态机。 2. 指令缓存 DMAC暂时将指令保存在缓存中。当一个线程请求来自一个地址的指令时,缓存执行查找。如果缓存命中,则缓存立即提供数据。否则,停止线程, DMAC使用AXI接口执行一个来自系统存储器的缓存行填充。如果指令大于四个字节或者跨过缓存行的结尾,则执行多个缓存访问来取出指令。 注: 当正在进行缓冲行填充时,DMAC使能其他线程访问缓存。但是,如果发生其他缓存缺失,停止流水线,直到完成第一个缓存行的填充。
3. 读/写指令队列 当一个DMA通道线程执行一个加载或者保存指令时,DMAC添加指令到相关的读或者写队列中。在AXI中央互连上发布指令前,DMAC使用这些队列作为保存一个指令的缓冲区。 4. 多通道数据FIFO 在DMA传输期间,如果DMAC执行读或写操作,则DMAC使用多通道先进先出MFIFO数据缓冲区保存数据。 5. 用于取指和DMA传输的AXI主接口 程序代码保存在系统存储器的区域内,这个AXI主接口用于访问DMAC。AXI主接口也可以使能DMAC,将数据从一个源AXI从设备传输到一个目的AXI从设备。 6. 用于访问寄存器的APB从接口 DMAC提供了这些APB接口: (1) 非安全的APB从接口; (2) 安全的APB从接口。 APB从接口将DMAC连接到APB。并且,微处理器能够访问这些寄存器。 7. 控制和状态寄存器 使用这些寄存器,一个微处理器具有以下功能: (1) 访问DMA管理器的状态; (2) 访问DMA通道线程的状态; (3) 使能或者清除中断; (4) 使能事件; (5) 发布一个指令,用于DMAC执行。 8. PL外设DMA请求接口 外设请求接口支持PL内,有DMA能力的外设连接。每个外设请求接口和其他外设请求接口之间是异步的,并且和DMA本身也是异步的。 9. 中断接口 中断接口用于事件和中断控制器之间高效地通信。 10. 复位初始化接口 当退出复位时,这个接口使能用户初始化DMAC的操作状态。当DMAC从复位退出时: (1) 它读取SLCR寄存器TZ_DMA_NS的状态,用来设置DMA管理器的安全性; (2) 它读取SLCR寄存器TZ_DMA_PERIPH_NS的状态,用来将每个外设请求接口分配到安全状态; (3) 它读取SLCR寄存器TZ_DMA_IRQ_NS的状态,用来将每一个irq[x]信号分配到安全状态; (4) 它等待来自其中一个APB接口的指令。 3.13.2 DMA控制器功能所有的DMA交易均使用AXI主接口移动数据。如果PL内一个有DMA能力的外设参与到交易中,使用四个外设请求接口中的一个接口,用于控制AXI上的数据流,以避免上溢或者下溢的问题。如图3.16所示,这里有两个类别的DMA交易: 图 3.16 DMAC读/写DDR,OCM和PL外设 (1) 存储器到存储器交易; (2) 存储器和PL之间的交易。 当DMAC工作在实时情况下,用户只能发布下面有限的指令子集: (1) DMAG: 使用用户指定的一个DMA通道,开始DMA交易。 (2) DMASEV: 使用用户指定的一个事件号,发送一个事件或发生中断的信号。 (3) DMAKILL: 终止一个线程。 必须使用合适的APB接口。这取决于DMA管理器在对寄存器TZ_DMA_NS初始化时所设置的安全状态。例如,如果DMA管理器处于安全状态时,必须使用在安全APB接口的指令,否则DMAC将忽略这些指令。当DMA管理器在非安全状态时,建议使用非安全的APB接口,用于启动或者重新启动一个DMA通道。安全APB接口可以工作在非安全模式下。 在使用调试指令寄存器或者DBGCMD寄存器发布指令前,必须读DBGSTATUS寄存器,以确保调试器处于空闲状态。否则,DMA管理器将忽略这些指令。 当DMA管理器从APB从接口接收到一条指令时,需要一些时钟周期才能处理这条指令。例如,此时流水线正忙于处理其他指令。 在发布DMAGO指令前,系统存储器必须包含一个合理的程序,该程序用于执行DMA通道线程。由DMAGO指定通道线程的开始地址。 1. 存储器-存储器交易 控制器使用AXI中央互联开关上的一个主设备访问系统内的存储器,包括: (1) OCM; (2) DDR。 通过相同的AXI中央互联,控制器也能访问绝大多数的外设子系统。如果可以将一个目标外设看作存储器映射的一个区域(或者存储器的端口位置),并且不需要使用FIFO进行流量控制,此时DMAC就可以用于读/写目标外设。典型的例子如下: (1) 线性地址空间的QSPI; (2) NOR Flash; (3) NAND Flash。 2. 存储器-PL外设交易 绝大多数的外设允许通过FIFO进行传输数据。必须管理这些FIFO,以避免上溢和下溢条件。由于这个原因,四个指定的外设请求接口可用于将DMAC连接到PL内的DMA设备中。这些接口中的每一个都能分配到任意一个DMA通道。 配置DMAC,使得其可以为每一个外设接口接受最多四个活动的请求。一个活动的请求是指: DMAC还没有开始所要求的AXI数据传输。DMAC有一个请求FIFO,用于每个外设接口,它用来捕获来自一个外设的请求。当一个请求FIFO填满时,DMAC设置相应的DMA{3:0}_DRREADY为低,用来发信号表示DMAC不能再接受任何来自外设的请求。 注: 在PS内没有外设请求接口直接指向I/O外设(IOP)。这需要处理器的干预,以避免在目标PS外设内FIFO出现上溢或者下溢的条件。
这里有两种不同的方法来管理DMAC和外设之间数据流的数量。 (1) PL外设长度管理: 在一个DMA周期内,PL外设控制所包含数据的数量。 (2) DMAC长度管理: 在一个DMA周期内,DMAC控制所包含数据的数量。 3. 外设请求接口 图3.17给出了外设请求接口,它由外设请求总线和一个DAMC响应总线构成。 图 3.17 在外设请求接口上的请求和响应总线 1) 使用的前缀 (1) DR: 外设请求总线。 (2) DA: DMAC响应总线。 所有的总线使用AXI协议中所描述的有效-准备(valid-ready)握手信号。 外设使用DMA{3:0}_DRTYPE[1:0]寄存器: (1) 请求一个单个AXI交易; (2) 请求一个AXI猝发交易; (3) 响应一个刷新请求。 DMAC使用DMA{3:0}_DATYPE[1:0]: (1) 当完成一个请求的单次传输后,发信号; (2) 当完成一个请求的猝发传输后,发信号; (3) 发布一个刷新请求。 PL外设使用DMA{3:0}_DRLAST: 当最后一个DMA传输开始时,发信号给DMAC。 2) 握手规则 DMAC使用表3.31给出的DMA握手规则。当一个DMA通道线程是活动时,即不在停止状态。 表 3.31 握手规则 规则 描述(1) 9 a9 ]: u- l- H' D% A, F% C
1 在任何DMA{3:0}_ACLK周期,DMA{3:0}_DRVALID能从低到高变化; 但是当DMA{3:0}_DRREADY为高时,只能从高到低变化 4 N, }8 l& o. @, D( x
2 只有下面情况,DMA{3:0}_DRTYPE才能发生变化:
6 n, \1 W7 l; H, [5 A1. DMA{3:0}_DRREADY为高
2 K! q# |! v; f# m! A2. DMA{3:0}_DRVALID为低
) M3 |3 E; E* Q- T3 只有下面情况,DMA{3:0}_DRLAST才能发生变化:
2 E' M9 J, a$ a0 a1 S, I0 L1. DMA{3:0}_DRREADY为高+ t2 M2 T. |' a, W1 c) V! G- Y! v& b
2. DMA{3:0}_DRVALID为低时 9 O( c7 p! d3 E5 L# x
4 在任何DMA{3:0}_ACLK周期,DMA{3:0}_DAVALID能从低到高变化; 但是当DMA{3:0}_DAREADY为高时,只能从高到低变化 6 }8 y: i1 U8 {1 p
5 只有下面情况,DMA{3:0}_DATYPE才能发生变化:
$ t- V$ Y, d1 @3 ^1 j1. DMA{3:0}_DAREADY为高
( |" d# i4 d1 l( M: e2. DMA{3:0}_DAVALID为低时 注: 所有的信号与DMA{3:0}_ACLK同步。
3) 将PL外设接口映射到DMA通道 通过DMAC,使得软件能将一个外设请求接口分配给任何一个DMA通道。当一个DMA通道线程执行DMAWFP时,外设[4:0]位域所编程的值表明和该DMA通道相关的设备。 4) PL外设长度管理 外设请求接口用来使能外设,控制一个DMA周期所包含数据的数量。而DMAC不需要知道所包含需要传输的数据个数。通过使用下面的信号设置,实现PL外设控制AXI交易。 (1) DMA{3:0}_DRTYPE[1:0]: 选择单个或者猝发传输。 (2) DMA{3:0}_DRLAST: 在当前传输序列中,当它开始最后的请求时,通知DMAC。 当DMAC执行一个DMAWFP指令时,它停止执行线程。并且,等待外设发送一个请求。当外设发送请求时,DMAC根据下面的信号设置请求标志的状态: (1) DMA{3:0}_DRTYPE[1:0]。DMAC设置request_type标志: ①=b00,request_type{3:0}=Single; ②=b01,request_type{3:0}=Burst。 (2) DMA{3:0}_DRLAST。DMAC设置request_last标志: ①=0,request_last{3:0}=0。②=1,request_last{3:0}=1。 如果DMAC执行一个DMAWFP 单个或者DMAWFP猝发指令,则DMAC设置: (1) request_type{3:0}标志为Single或者Burst; (2) request_last{3:0}标志为0。 DMALPFE是一个汇编器命令,用来强制将相关DMALPEND指令的nf比特位设置为0。这用来创建一个程序循环,不使用循环计数器终止循环。当request_last标志设置为1时,DMAC退出循环。 (1) 根据request_type和request_last标志的状态,DMAC有条件的执行下面的指令: DMALD,DMAST,DMALPEND(2) 当这些指令使用可选的B|S后缀时,如果与request_type标志不匹配,则DMAC执行DMANOP: DMALDP<B|S>,DMASTP<B|S>(3) 如果request_type标志不匹配B|S后缀时,DMAC执行一个DMANOP指令: DMALPEND当nf比特为零时,如果设置request_last标志,则DMAC执行一个DMANOP指令。 当DMAC接收到一个猝发请求(即DMA{3:0}_DRTYPE[1:0]=b01)时,如果要求DMAC发布一个猝发传输,则使用DMALDB、DMALDPB、DMASTB和DMASTPB指令。CCRn寄存器的值控制DMAC传输数据的数量。 当DMAC接收到一个单个请求(即DMA{3:0}_DRTYPE[1:0]=b00)时,如果要求DMAC发布一个单个传输,则使用DMALDS、DMALDPS、DMASTS和DMASTPS指令。DMAC忽略CCRn寄存器中src_burst_len和dst_burst_len域的值。并且,设置arlen[3:0]和awlen[3:0]总线为0x0。 5) DMAC长度管理 通过DMAC长度管理,DMAC控制传输数据的总个数。使用外设请求接口,当按照所要求的一个方向传输数据时,一个外设通知DMAC。DMA通道线程控制DMAC如何响应外设请求。 对于DMAC长度管理,有下面的约束: (1) 来自一个外设的用于所有单个请求的总的数据量,必须小于来自那个外设的一个猝发请求的数据量。 (2) CCRn寄存器控制用于一个猝发请求和一个单个请求所传输数据的个数,ARM推荐: 当正在处理通道n的传输时,不要更新CCRn寄存器。 (3) 当外设发送一个猝发请求后,外设不得发送一个单个请求,直到DMAC响应完成了猝发请求为止。 当要求停止程序线程,就要使用DMAWFP单个指令,直到外设请求接口接收到任何请求类型。如果在请求FIFO中的头部入口的请求类型是: (1) 单个: DMAC从FIFO弹出入口,继续执行程序。 (2) 猝发: DMAC在 FIFO中留下入口,继续执行程序。 注: 猝发请求入口保留在请求FIFO中,直到DMAC执行DMAWFP猝发指令或者DMAFLUSTP指令。
当要求停止程序线程,就要使用DMAWFP猝发指令,直到外设请求接口接收到一个猝发请求类型。如果在请求FIFO中的头部入口的请求类型是: (1) 单个: DMAC从FIFO移除入口,程序的执行保持停止。 (2) 猝发: DMAC从FIFO弹出入口,继续程序的执行。 当完成一个AXI读交易,要求DMAC发送一个响应给PL外设时,应该使用DMALDP指令。类似地,当完成一个AXI写交易,要求DMAC发送一个响应给PL外设时,应该使用DMASTP指令。DMAC使用DMA{3:0}_DATYPE[1:0]总线,发送一个到PL外设{3:0}的交易响应。 当rvaild和rlast为高时,DAMC为读交易发送响应; 当bvalid为高时,DMAC为写交易发送一个响应。如果系统能缓冲AXI写交易时,DAMC可能给外设发送一个响应。但是,到终端目的写数据仍然在进行。 DMAFLUSHP指令用于复位外设请求接口的请求FIFO命令。当DMAC执行DMAFLUSHP时,它忽略外设请求,直到外设响应刷新请求。这使得DMAC和外设互相同步。 6) 外设请求接口时序 图3.18给出了当一个外设请求一个猝发传输时,使用前面介绍的握手,外设请求接口的操作的例子。 (1) T1周期: DMAC检测到一个用于猝发传输的请求。 (2) T2~T6周期: DMAC执行一个猝发传输。 (3) T7: DMAC设置DMA{3:0}_DAVALID为高,设置DMA{3:0}_DATYPE[1:0]表示完成猝发传输。 图 3.18 猝发请求信号 4. 多通道数据FIFO MFIFO是一个由当前所有活动通道共享的,基于先进先出的共享资源。对于一个程序,它看上去是深度可变的并行FIFO的集合。每个通道都有一个FIFO。但是,所有FIFO的总的深度不能超过MFIFO的大小。DMAC最大的MFIFO深度为128(64位)的字。 控制器能将源数据重新对齐到目的。例如,从地址0x103读一个字,写到地址0x205时,DMAC将数据移动两个字节。由目的地址和传输的特征来确定MFIFO中数据的保存和封装。 当一个程序指定将要执行一个到目的递增交易时,DMAC将数据打包到MFIFO,以使用最少的MFIFO入口。例如,当DMAC有一个64位的AXI数据总线,程序使用0x100的源地址和0x200的目的地址时,DMAC将两个32位的字打包到MFIFO的单个入口。 在某些条件下,要求保存来自源数据的入口个数,不是简单地通过总的源数据除以MFIFO的宽度的计算得到。当下面情况发生时,计算入口的个数并不简单: (1) 源地址没有对齐AXI总线宽度; (2) 目的地址没有对齐AXI总线宽度; (3) 到一个固定目的的交易,即非递增的地址。 DMALD和DMAST指令指明了将要执行的一个AXI总线交易。根据CCRn寄存器编程的值和交易的地址,决定一个AXI总线交易所要传输的数据的个数。 5. 事件和中断 DMAC支持16个事件。这些事件中的前8个可以用于中断信号IRQs[7:0]。8个中断的每一个可以同时输出到PS中断控制器和PL。表3.32给出了DMAC IRQ#和系统IRQ#之间的映射。 表 3.32 事件/中断源 DMAC IRQ# 系统IRQ#(到处理器) 系统IRQ#(到PL) DMA引擎事件# * N8 h+ h$ @! I$ Q+ G! _
0~3 46~49 20~23 0~3
( F5 }. Y0 `$ L# k4~7 72~75 24~27 4~7
0 s; I( h# |$ s) a+ ^9 `: Y8~15 N/A N/A 8~15 当DMAC执行一个DMASEV指令时,它修改用户指定的事件/中断: (1) 如果INTEN寄存器将事件/中断源作为一个事件时,DMAC为指定的事件/中断源产生一个事件。当DMAC为相同的事件-中断源执行一个DMAWFE指令后,清除事件。 (2) 如果INTEN寄存器将事件/中断源作为一个中断时,DMAC 将irq<事件号>设置为高。其中,事件号为指定事件源的编号。用户通过写INTCLR寄存器来清除中断。 6. 退出 通过IRQ#45,给CPU发送退出; 以及通过IRQP2F[28]信号,给PL外设发送退出。表3.33给出了所有可能引起退出的原因。表3.34给出了当一个退出条件后,DMAC的行为。当发生退出条件时,DMAC所采取的行为取决于线程的类型。表3.35给出了当接收到退出条件时,处理器或者PL外设必须产生的行为。 表 3.33 退出类型和条件 退出类型 | 条件 | 精确的: DMAC用创建退出指令的地址更新PC寄存器
9 S+ C- I" ?/ }. c6 Y X( C注意,当DMAC发出精确的退出后,不执行触发退出的指令; 取而代之的是DMAC执行一个DMANOP | 通道控制寄存器的安全冲突: 一个非安全状态下的一个DMA通道线程,尝试对通道控制寄存器编程和产生一个安全的AXI交易 | 事件的安全冲突: 在一个非安全状态下的一个DMA通道线程执行DMAWFE或者DMASEV指令,用于设置为安全的事件。SLCR寄存器的TZ\_DMA\_IRQ\_NS控制着一个事件的安全状态 | 外设请求接口的安全冲突: 在一个非安全状态下的一个DMA通道线程执行DMAWFP、DMALDP、DMASTP或者DMAFLUSHP指令,用于设置为安全的外设请求接口,SLCR寄存器的TZ\_DMA\_PERIPH\_NS控制着一个外设请求接口的安全状态 | DMAGO的安全冲突: 在一个非安全状态下,DMA管理器执行DMAGO,尝试启动一个安全的DMA通道线程 | AXI主接口的错误: 当执行一个取指时,在AXI主接口上DMAC接收到一个ERROR响应。比如尝试访问保留的存储器空间 | 执行引擎的错误: 一个线程执行一个未定义的指令或者执行带有一个无效操作数的用于配置DMAC的指令 | 不精确的: PC寄存器可能包含没有引起退出发生指令的地址 | 数据加载错误: 当执行一个数据加载时,在AXI主接口上DMAC接收到一个ERROR响应 | 数据存储错误: 当执行一个数据存储时,在AXI主接口上DMAC接收到一个ERROR响应 | MFIFO错误: 一个DMA线程执行一个DMALD,但是MFIFO太小以至于不能保存数据; 或者执行DMAST,MFIFO没有足够的数据用来完成数据的传输 | 看门狗退出: 当正在执行一个或者多个DMA通道程序时,MFIFO太小以至于不能满足DMA程序保存的要求时,锁定DMAC
% B& {/ K# p2 N4 O/ t* `; x( lDMAC包含逻辑,用来阻止其一直保持在不能完成一个DMA传输的状态
3 l8 v5 |# X2 H当下面的所有条件发生时,DMAC检测锁定: ①加载队列为空; ②保存队列为空;③由于MFIFO没有足够的空闲空间或者其他通道拥有加载锁,阻止所有的运行通道执行一个DMALD指令
6 B$ p+ ?* ^2 }7 T! |, D当DMAC检测到一个锁定时,它发一个中断信号,也能放弃当前使用的通道。DMAC的行为取决于WD寄存器中wd\_irq\_only比特位的状态 |
表 3.34 退出处理 线程类型 | DMAC行为 | 通道线程 | 设置IRQ#45和IRQ#28为高 | 停止执行用于DMA通道的指令 | 用于DMA通道的所有缓存入口无效 | 更新通道程序计数器的寄存器,用来包含退出指令的地址,该地址是精确类型退出的地址 | 不产生对任何保留在读队列和写队列指令的AXI访问 | 允许完成当前活动的AXI交易 | DMA管理器 | 设置IRQ#45中断和IRQ#28信号为高 |
表 3.35 线程终止 读DMA管理器寄存器的故障状态,用来确定DMA管理器所处的故障状态,以及确定引起退出的原因 | 读DMA通道寄存器的故障状态,用来确定DMA通道所处的故障状态,以及确定引起退出的原因 | 编程调试指令- 0寄存器 | 写调试命令寄存器 |
7. 安全性 当DMAC从复位退出时,复位状态初始化接口信号配置安全性,用于: (1) DMA管理器(SLCR寄存器TZ_DMA_NS); (2) 事件/中断源(SLCR寄存器TZ_DMA_IRQ_NS); (3) PL外设请求接口(SLCR寄存器TZ_DMA_PERIPH_NS)。 当DMA管理器为DMA执行DMAGO指令时,它设置ns比特位来设置通道的安全状态。通道的状态由通道状态寄存器内的动态非安全比特CNS提供。 表3.36给出了对于ARM的命名,在本章中的命名规则。表3.37和表3.38分别给出了用于DMA管理器和DMA通道线程的安全性。 表 3.36 安全用法命名规则 ARM名字 XILINX名字 描述 0 K, M5 L0 ?3 H0 a7 `/ r5 D) j; l
DNS TZ_DMA_NS内的DMAC_NS 当DMAC从复位退出时,这个信号控制DMA管理器的安全状态
2 S. A* j+ ^9 Z5 B3 i n: ^0: DMA管理器运行在安全状态下
) W: q+ V4 `) ?5 |+ u1: DMA管理器运行在非安全状态下
1 |" b+ B- p$ Q y$ K8 O- X! M- cINS TZ_DMA_IRQ_NS内的DMAC_IRQ_NS<x> 当DMAC从复位退出时,这个信号控制事件/中断的安全性
8 v* I: Z9 D3 d" A; w$ }5 J) \$ _2 S0: DMA中断/事件比特位在安全状态下
2 r( }2 l' `8 g1: DMA中断/事件比特位在非安全状态下
/ q& q0 \4 I" {3 fPNS TZ_DMA_PERIPH_NS内的DMAC_PERIPH_NS<x> 当DMAC从复位退出时,这个信号控制外设请求接口安全性
u' f! g# A m& A+ P8 X. t6 \5 `) M0: DMA外设请求接口处于安全状态下
4 d( f# x9 p) g1: DMA外设请求接口处于非安全状态下
, I4 r7 ?; y% T5 b+ P+ J3 xns DMAGO指令内的ns DMAGO指令的1比特! `& }9 P* [3 P; F3 }# ^5 w
0: 在安全状态下启动DMA通道线程
# U0 |2 t: ^ r: f6 ~4 o1 H1: 在非安全状态下启动DMA通道线程
4 `) d- s( |% Z8 J; N J8 O( ACNS CSR<x>内的CNS 通道状态寄存器的CNS比特位为每个DMA通道的安全状态提供. B4 d4 x* k& C/ V8 N% g* y+ ?
0: DMA通道线程工作在安全状态下
2 c, P0 v) x2 Y' p$ e! \1: DMA通道线程工作在非安全状态下 表 3.37 用于DMA管理器的安全性 - g- y5 d# I; |7 z
| DNS | 指令 | PNS | INS | 描述 | DMA
, Q3 T E6 U/ T- M- P) d* x管理器 | 0 | DMAGO | 0 | — | 使用安全APB接口,发布指令,在安全状态下,启动DMA通道线程(CNS=0) | 1 | — | 使用安全APB接口,发布指令,在非安全状态下,启动DMA通道线程(CNS=1) | DMASEV | — | × | 使用安全APB接口,发布指令,它发出合适的事件信号,这和INS位无关 | 1 | DMAGO | 0 | — | 使用非安全APB接口,发布指令,退出 | 1 | — | 使用非安全APB接口,发布指令,DMA通道线程处于非安全状态(CNS=1) | DMASEV | — | 0 | 使用非安全APB接口,发布指令,退出 | — | 1 | 使用非安全APB接口,发布指令,它发出合适的事件信号 |
表 3.38 用于DAM通道线程的安全性 : N& _& {. @) H* q
| DNS | 指令 | PNS | INS | 描述 | DMA通道线程 | 0 | DMAWFE | — | × | 出现事件,继续执行,不考虑INS比特 | DMASEV | — | × | 给合适的事件发信号,不考虑INS比特 | DMAWFP | × | — | 出现外设请求,继续执行,不考虑PNS比特 | DMALP,DMASTP | × | — | 发消息给PL外设,告诉外设,DMA传输的最后一个AXI交易已经完成,不考虑PNS比特 | DMAFLUSH | × | — | 清除外设的状态,给外设发送一个消息,重新发送它的级别状态,不考虑PNS比特 | 1 | DMAWFE | — | 0 | 退出 | — | 1 | 出现事件,继续执行 | DMASEV | — | 0 | 退出 | — | 1 | 给合适的事件发信号 | DMAWFP | 0 | — | 退出 | 1 | — | 出现外设请求,继续执行 | DMALP,DMASTP | 0 | — | 退出 | 1 | — | 给外设发消息,告诉DMA传输的最后一个AXI交易已经完成 | DMAFLUSHP | 0 | — | 退出 | 1 | — | 它只清除外设的状态,发送消息给外设,重新发送它的级状态 | 3.13.3 外部信号1. 外设请求接口 外设请求接口支持连接具有DMA能力的外设。在无须处理器干预的情况下,可以进行存储器-外设和外设到存储器的DMA传输。这些外设必须在PL内,连接到M_AXI_GP接口。所有的外设请求接口信号和各自的时钟同步。表3.39给出了PL外设请求接口信号线。 表 3.39 PL外设请求接口信号 类型 | I/O | 名字 | 描述 | 时钟 | I | DMA{3:0}_ACLK | 用于DMA请求传输的时钟 | DMA请求 | I | DMA{3:0}_DRVALID | 当外设提供有效的控制信息时,指示
, j" D3 C% X' k# c d" X4 t, O8 j. r0: 没有可用的控制信息1 p( E, P @7 X: S4 v- t
1: DMA{3:0}_DRTYPE[1:0]和DMA{3:0}_DRLAST包含用于DMAC的有效信息 | I | DMA{3:0}_DRLAST | 指示外设正在发送用于当前DMA传输的最后的AXI数据交易/ g) d( S4 B# N
0: 最后一个数据请求不在进行中
0 m2 E8 s. m+ p1: 最后一个数据请求正在进行中
s2 Q C7 A0 z) G注意,当DMA{3:0}_DRTYPE[1:0]=00或者01时,DMAC只使用这个信号 | I | DMA{3:0}_DRTYPE[1:0] | 指示一个响应或者请求的类型,外设发信号- c' U# G& ~1 A2 a: w; j( H
00: 单个级请求7 T. y5 a6 q A) v8 d w
01: 猝发级请求
/ K' @: i% V8 _& S10: 响应一个刷新请求,这个请求为DAMC请求
0 M0 J- V: c( R5 {11: 保留 | O | DMA{3:0}_DRREADY | 指示DMAC是否能接收信息,这个信息由外设通过DMA{3:0}_DRTYPE[1:0]提供: C6 O6 S$ y4 G9 P$ J L
0: DMAC没有准备好
! K l& b- Y, \1: DMAC准备好 | DMA响应 | O | DMA{3:0}_DAVALID | 当DMAC提供有效的控制信息时,指示" I+ y+ @5 s+ N9 W
0: 没有可用的控制信息) W# Q% d, E3 o" i F
1: DMA{3:0}_DATYPE[1:0]包含用于外设的有效信息 | I | DMA{3:0}_DAREADY | 指示外设是否能接收信息,这个信息由DMAC通过DMA{3:0}_DATYPE[1:0]提供
+ K) i. ?0 h1 R/ {4 j0: 外设没有准备好
- x; a- d" P; C+ ?2 I1 W1: 外设准备好 | I | DMA{3:0}_DATYPE[1:0] | 指示一个响应或者请求的类型,DMAC发信号
, Y5 n t( I5 ^2 \: ?2 D00: DMAC已经完成了单个AXI交易
* P7 G: R! J. H ?/ w5 l& Z" N) M7 Z01: DMAC已经完成了AXI猝发交易
: i) h- y% s( `) Q# D10: DMAC请求一个外设执行一个刷新请求* S) _( c& V; d) V9 u
11: 保留 |
2. AXI主接口 DMAC包含一个AXI主接口,使得能够从一个源AXI从接口将数据传输到一个目的AXI从接口。 3. 复位初始化接口 表3.40给出了用于编程DMAC安全状态的配合信号。根据复位后SLCR寄存器的状态,将DMA配置成安全或者非安全模式。 表 3.40 DMAC初始化信号 名字 类型 源 描述
7 a7 b# s: H2 s! n( Yboot_manager_ns 输入 SLCR 寄存器TZ_DMA_NS 当DMAC从复位退出时,控制DMA管理器的安全状态8 A/ ]# k) o6 M' b1 g; y# N* }8 I
0: 给DMA管理器分配安全状态
& w: k/ S, I7 k: A1: 给DMA管理器分配非安全状态
* R5 r8 L; o9 `6 Sboot_irq_ns[15:0] 输入 SLCR 寄存器TZ_DMA_IRQ_NS 当DMAC从复位退出时,控制事件-中断源的安全状态
: U6 U0 \+ R5 [7 i* e' @1. boot_irq_ns[x]为低时,给事件<x>或irq<x>分配安全状态% a! _: F) T3 R; k2 a5 V2 a1 j
2. boot_irq_ns[x]为高时,给事件<x>或irq<x>分配非安全状态 7 X) L! P* o/ D6 F9 o1 D& _
boot_periph_ns[3:0] 输入 SLCR 寄存器TZ_DMA_PERIPH_NS 当DMAC从复位退出时,控制外设请求接口的安全状态, k. x% q% F! i& e5 P" J* E
1. boot_periph_ns[x]为低时,给外设请求接口x分配安全状态
+ S+ ?9 F+ a, y3 P; J6 W% w: ?2. boot_periph_ns[x]为高时,给外设请求接口x分配非安全状态
) e* T5 B- I- tboot_addr[31:0] 输入 硬连接线32'h0 当DMAC从复位退出时,配置包含DMAC执行的第一条指令的地址的位置
5 v4 j/ K$ _" s1 K注意,当boot_from_pc为高时,DMAC只使用这个地址 3 F/ h. Y) v3 [: s% E
boot_from_pc 输入 硬连接线1'b0 当DMAC从复位退出时,控制DMAC执行它的初始化指令的位置' @. E! ]) o2 S$ B e* F! r- h& M% q
0: DMAC等待来自一个APB接口的指令5 L) m$ E J# A* }$ t
1: DMA管理器执行一个指令,该指令位于boot_addr[31:0]所提供的地址的位置上 3.13.4 寄存器描述表3.41给出了DMAC寄存器的概述。 表 3.41 DMA控制器的寄存器 功能 寄存器名字 概述 5 H1 ]: h, W$ O5 T( f% e
DMAC控制 dmac.XDMAPS_DS
5 ~. n! A( U; pdmac.XDMAPS_DPC 提供安全状态和程序计数器 + y N7 N$ H! `. e6 @6 |# ?/ ]
中断和事件 dmac.INT_EVENT_RIS/ s9 c9 y# V4 M' n* \' p* r/ n
dmac.INTCLR% {5 [5 p5 g. k- u( x
dmac.INTEN
2 \+ z z( s k7 admac.INTMIS 使能/禁止检测中断,屏蔽发送到中断控制器的中断,读原始的中断状态 h5 P5 W" d+ ]
故障状态和类型 dmac.FSRD& S9 B. n/ k5 Q$ u2 Y5 j
dmac.FSRC# c' T* M+ i) A4 X- X0 c: @
dmac.FTRD" k$ E d3 V U/ E+ Z4 t/ N
dmac.FTR{7:0} 提供用于管理器和通道的故障状态和类型 * I2 G6 _; x' U3 r- v) t. ?
通道线程状态 dmac.CPC{7:0}5 J! [5 B' h8 r" x+ X0 R
dmac.CSR{7:0}% j% A1 \2 G2 l4 [+ l# g
dmac.SAR{7:0}
6 `8 I4 z+ }2 e# b" L' [" q7 Idmac.DAR{7:0}! p8 ^5 _2 v7 J. V9 ^, P; p
dmac.CCR{7:0}
' ]2 v T- f! z" U; ^' Hdmac.LC0_{7:0} dmac.LC1_{7:0} 这些寄存器提供了DMA通道线程的状态
+ n0 L9 e; p! j& {调试 dmac.DBGSTATUS
, h7 E* W4 A. x4 p R, R' Admac.DBGCMD
0 W9 H% z& z) C Ldmac.DBGINST{1,0} 这些寄存器使能用户发送指令到通道线程
& S, F" C8 Y6 X) P) p$ x# V9 TIP配置 dmac.XDMAPS_CR{4:0}( ~! L- {# X* l% X
dmac.XDMAPS_CRDN 这些寄存器使能系统固件发现DMAC的“硬连线”配置
1 g% A: r- t/ O2 @% E看门狗 dmac.WD 当检测到一个锁定条件时,控制DMAC如何响应
/ j0 j7 @9 F9 F8 ]6 R系统级 slcr.DMAC_RST_CTRL
( c7 D! d7 N/ f: R% ~# V! qslcr.TZ_DMAC_NS( N0 o5 Z! u, U; y
slcr.TZ_DMA_IRQ_NS* p) D# u3 h. g& M, J% }: a+ E
slcr.TZ_DMAC_PERIPH_NS8 k- X1 g, U; B l3 S
slcr.DMAC_RAM( d9 T* h+ h+ Q/ r+ ^
slcr.APER_CLK_CTRL 控制复位、时钟和安全状态 3.13.5 用于管理器和命令的指令集参考表3.42和表3.43总结了DMA引擎指令和命令。 表 3.42 DMA引擎指令总结 指令 | 助记符 | 线程使用: M=DMA管理器C=DMA通道 | 加半字 | DMAADDH | — | C | 加负半字 | DMAADNH | — | C | 结束 | DMAEND | — | C | 刷新和通知外设 | DMAFLUSHP | — | C | 去 | DMAGO | M | — | 杀死 | DMAKILL | M | C | 加载 | DMALD | — | C | 加载和通知外设 | DMALDP | — | C | 循环 | DMAALP | — | C | 循环结束 | DMAALPEND | — | C | 无限循环 | DMAALPFE | — | C | 移动 | DMAMOV | — | C | 无操作 | DMANOP | M | C | 读存储器屏障 | DMARMB | — | C | 发送事件 | DMASEV | M | C | 保存 | DMAST | — | C | 保存和通知外设 | DMASTP | — | C | 保存零 | DMASEV | — | C | 等待事件 | DMAWFE | — | C | 等待外设 | DMAWFP | — | C | 写存储器屏障 | DMAWMB | — | C |
表 3.43 汇编器提供的额外的命令 指令 助记符
3 f; L; `* J i; S放置一个32位立即数 DCD # U' J9 o+ z6 A4 C
放置一个8位立即数 DCB + f7 U" ]7 I, [3 G& }+ s' [
循环 DMALP
" I. K/ N" m* }0 t循环永远 DMALPFE 1 _4 y3 C6 E0 R8 y0 u9 m- x
循环结束 DMALPEND
& X' a8 A0 s0 o8 Z8 h6 B8 L$ p移动CCR DMAMOVCCR 3.13.6 编程模型参考1. 存储器到存储器 这部分给出了DMAC执行的微码的例子,用于执行对齐、非对齐和固定传输。表3.44给出的是对齐传输; 表3.45给出的是非对齐传输; 表3.46给出的是固定传输。也给出了MFIFO的利用率。 表 3.44 对齐传输 描述 代码 MFIFO使用 ! J$ G. y. J% X, P* L2 [7 @
简单对齐程序:在这个程序中,源地址和目的地址对齐AXI数据总线宽度 DMAMOV CCR, SB4 SS64# l$ }" a0 ^. s2 k# d6 x# R: I R
DB4 DS64
: Y8 C4 F, P7 UDMAMOV SAR, 0x1000& e9 ]& c4 ]9 e
DMAMOV DAR, 0x4000
' u7 Z, c+ d6 W! eDMALP 16
7 E7 n8 l& W7 N/ G6 W: uDMALD8 b6 A! g7 i0 U. A1 e1 f5 e
DMAST4 t0 e) G; C, s y% r
DMALPEND
. A# m' ^1 p/ N9 KDMAEND 每个DMALD要求四个入口,每个DMAST移除四个入口; 这个例子是一个静态的要求零MFIFO入口和动态的要求四个MFIFO入口 - [! E2 \; q- x* O! ~
带有多个加载的对齐的非对称程序:下面的程序为每个保存执行四个加载,源地址和目的地址对齐AXI数据总线宽度 DMAMOV CCR, SB1 SS64; W/ @$ h2 k0 J( b2 z1 l; t, ?
DB4 DS64
; G* `& B" j0 [# ~" ~9 |DMAMOV SAR, 0x1000, D# f, ^. ~, F7 N/ p& ^
DMAMOV DAR, 0x4000! }2 C. X+ p% K* }( P* x" W; v. }6 F
DMALP 16
2 |. d x2 i( O& l# x O( J/ `DMALD* W# \% \* g. O5 C% m' v
DMALD' ^1 j) y8 u& l: E4 W6 w
DMALD. v) N+ M( t8 m6 P* d
DMALD3 w; a+ z' k9 j+ ? T7 A9 F2 \
DMAST. J6 @1 {* k+ _
DMALPEND 每个DMALD要求四个入口和每个DMAST移除一个入口; 这个例子一个静态的要求零MFIFO入口和动态地要求四个MFIFO入口 * T9 C, h- R) y
带有多个保存的对齐的非对称程序: 在这个程序中,源地址对齐AXI数据总线宽度,但是没有对齐目的地址。目的地址没有对齐到目标的猝发大小,这样第一个DMAST指令移出的数据比第一个DMALD指令所读取的数据少,因此要求一个单字的最终的DMAST,用于清除来自MFIFO的数据 DMAMOV CCR, SB4 SS640 q4 [/ a9 k' S0 J: E x. p
DB1 DS64; j. G0 T3 l% k3 C, w: T) G
DMAMOV SAR, 0x1000
8 m. |; H, }4 \$ U5 yDMAMOV DAR, 0x4000
# I4 T m& Z8 L6 wDMALP 16( v# J) J3 ^! h8 q4 q; w7 D
DMALD
: L, @ K7 ?9 f! R) v7 GDMAST
1 g/ a& E' q; P' lDMAST- Y' @) }& O! j
DMAST: \- `# [& U8 e Z: C
DMAST3 B6 \3 Y- W. Z( [! @
DMALPEND) C) _9 L5 M! L5 l5 Y! g' x
DMAEND 每个DMALD要求四个入口,每个DMAST移除一个入口; 这个例子是一个静态的要求零MFIFO入口和动态的要求四个MFIFO入口 表 3.45 非对齐传输 描述 代码 MFIFO使用 2 {1 w4 H5 `# K/ U' Q
对齐的源地址到非对齐的目的地址: 在这个程序中,源地址对齐AXI数据总线宽度; 但是目的地址没有对齐。目的地址没有对齐到目标的猝发大小,这样第一个DMAST指令移出的数据比第一个DMALD指令所读取的数据少,因此要求一个单字最终的DMAST,用于清除来自MFIFO的数据 DMAMOV CCR, SB4 SS64
# M5 S. E+ }; b2 d1 EDB4 DS645 p6 b3 \1 P; p# U4 D# `
DMAMOV SAR, 0x1000
]" E3 e9 u( D p+ Y U* `DMAMOV DAR, 0x40041 ]) E- x$ V( ]3 x
DMALP 16
0 q8 g) t' a( i9 K6 ^& @2 p, v0 HDMALD: e- o& R2 [, `, D/ m( ?, S
DMAST5 A; ^2 c# Z' {9 {: v, {$ E+ u
DMALPEND: _& i* K3 z! n6 N% f1 N$ f$ e
DMAMOV CCR, SB4 SS64
1 b: A9 _6 W+ LDB1 DS321 T# O. h1 n& ~" L' M. P' t
DMAST
4 D; ^1 {; x! z9 w2 oDMAEND 第一个DMALD指令加载四个双字; 但是由于目的地址非对齐,DMAC将其移动四个字节,因此它使用MFIFO五个入口,每个DMAST只要求四个数据入口。因此,在程序期间,使用保留的额外入口,直到由最后的DMAST清空为止。这个例子是一个静态的要求一个MFIFO入口和动态的要求四个MFIFO入口
9 M& f8 x% K) H; |- }6 f n非对齐的源地址到对齐的目的地址: 在这个程序中,源地址没有对齐AXI数据总线宽度。但是,对齐目的地址。源地址没有对齐到源猝发大小,这样第一个DMALD指令读出的数据比DMAST所要求的要少。因此,要求一个额外的DMALD来满足第一个 DMAST DMAMOV CCR, SB4 SS64% j" X0 B- M/ Q" h5 I, \
DB4 DS64, n: [: W& z1 F0 }1 k. L
DMAMOV SAR, 0x1004
4 p$ \4 _' ]# zDMAMOV DAR, 0x4000: Y5 j8 H8 H% }5 ^8 q& ?
DMALD( \9 n h2 e+ U# O
DMALP 15
) w& M$ W! y6 J z$ D" G7 N; C: R9 NDMALD- V1 p$ Z' \- S9 g8 M6 n: j E
DMAST
5 H- n- @& W" V* W8 P8 sDMALPEND
- S- @. f, e9 e1 V( MDMAMOV CCR, SB1 SS32
( Y# o$ `% `+ ?& a- N& gDB4 DS64
0 B2 z8 k7 }+ n& j2 `8 [% ~DMALD
9 F9 J. |1 y9 I, QDMAST+ f6 k1 g, M. L( T3 t2 T4 \
DMAEND 第一个DMALD指令加载5拍数据,使能DMAC执行第一个DMAST。当第一个DMALD后,随后的DMALD并没有对齐源猝发大小。例如,第二个DMALD从地址0x10读。当循环后,最后两个DMALD读取要求的数据,以满足最后的DMAST。这个例子是一个静态的要求一个MFIFO入口和动态的要求四个MFIFO入口 " O+ v- u' d+ H5 W+ A# X
非对齐的源地址到对齐的目的地址,超过最初的加载: 这个程序是对前面所描述的非对齐的源地址和对齐的目的地址的一个替代。程序使用了一个不同的源猝发序列,可能不是高效的,但是要求较少的MFIFO入口 DMAMOV CCR, SB5 SS64
0 H; D, ]& \) PDB4 DS64
! f/ ~. y% V4 h4 l1 S, iDMAMOV SAR, 0x1004( U, ^7 G u9 T8 h3 v5 k
DMAMOV DAR, 0x4000
" Q4 p/ v) P$ t2 N* ]DMALD7 s3 A1 P: p+ t
DMAST
4 P" Q7 C! G% Q! _+ O: Q0 N eDMAMOV CCR, SB4 SS647 `8 m! N. ^! Q# G
DB4 DS64- ]6 D5 X |9 D% Z7 N* K0 [
DMALP 14
7 W7 g" \3 ?# u" S7 QDMALD. h. j$ Y2 k' G% A3 D- z, K
DMAST
8 o1 [+ w* v/ M `; b$ a* ^( q f/ m6 GDMALPEND% v5 a" u5 o) k' \- J& M2 z
DMAMOV CCR, SB3 SS64( Z O8 H2 I$ D8 w/ d$ i2 N
DB4 DS64
3 L) O* M T9 H5 U& EDMALD+ D" c/ u; \2 [4 N8 @
DMAMOV CCR, SB1 SS32) F$ _0 v* q$ w4 F
DB4 DS64) c+ C3 E5 |; ]
DMALD
# z6 r W! A/ V+ V8 h4 I" bDMAST
: z3 _( F; r* S) M* kDMAEND 第一个DMALD指令加载5拍数据,使能DMAC执行第一个DMAST。当第一个DMALD后,随后的DMALD并没有对齐源猝发大小,例如,第二个DMALD从地址0x10读。当循环后,最后两个DMALD读取要求的数据满足最后的DMAST。这个例子是一个静态的要求一个MFIFO入口和动态的要求四个MFIFO入口
8 L; I0 {1 f h对齐的猝发大小,非对齐的MFIFO: 在这个程序中,目的地址比MFIFO的宽度要窄,对齐猝发大小。但是,没有对齐MFIFO宽度 DMAMOV CCR, SB4 SS327 G8 h0 [) z% W& t2 ~, r
DB4 DS32
! T* H3 f4 ?) A- h( B$ @9 ZDMAMOV SAR, 0x1000
5 ~& @9 d4 p- p5 I P4 ]DMAMOV DAR, 0x4004
8 E/ N7 C U% d9 o/ i* bDMALP 16
9 s, c! z* ~, r. j# wDMALD4 f( Q( ]* {, R3 B+ C$ T* d
DMAST. s: q$ o! M: i
DMALPEND
* K7 e" o9 z+ p8 k, C: b# eDMAEND 如果DMAC配置有一个32位的AXI数据总线宽度,则这个程序要求四个MFIFO入口。然而,在这个例子中,DMAC有一个64位的AXI数据宽度,因为目的地址不是64位对齐,它要求3个而非两个MFIFO入口。这个例子是一个静态的要求零个MFIFO入口和动态的要求三个MFIFO入口 表 3.46 固定传输 描述 代码 MFIFO使用
1 z; v# Z6 h7 x' i- {* w9 j固定目的对齐地址: 在这个程序中,源地址和目的地址对齐AXI数据总线宽度,目的地址是固定的 DMAMOV CCR, SB2 SS64/ V( w# u# D! u* U( ~8 K& o @
DB4 DS32 DAF) v1 W; h7 G% |( X8 J1 Y
DMAMOV SAR, 0x10001 V+ l; J: g/ t8 j' J8 g! I
DMAMOV DAR, 0x4000; m7 L3 e% j7 C5 G
DMALP 16 A2 l3 f4 n/ q8 B7 }3 x9 z1 `
DMALD
4 @+ J2 ]) C* H* p6 QDMAST
7 G: I) K3 P1 H5 J {3 P8 v3 Q/ `DMALPEND3 H" M4 m2 K* c- B, `& b; j
DMAEND 程序中的每个DMALD加载两个64位的数据传输到MFIFO。由于目的地址是32位的固定地址,则DMAC将每个64位的数据项分割穿过MFIFO的两个入口。这个例子是一个静态的要求零个MFIFO入口和动态的要求四个MFIFO入口 2. 存储器和外设之间 这里有两个不同的方法处理DMAC和外设之间的数据流的数量。 1) 外设长度管理 外设控制一个DMA周期内所包含的数据的数量,DMAC无须知道它包含所需要传输数据的个数。 2) DMAC长度管理 DMAC控制一个DMA周期内数据的数量。 下面分别给出外设长度管理和DAMC长度管理的例子。 1) 外设长度管理 下面的例子给出了一个DMAC程序,当外设发送一个猝发请求(DMA{3:0}_DRTYPE =b01)时,从存储器传输64个字到外设0。当外设发送单个请求(DMA{3:0}_DRTYPE =b00)时,DMAC程序从存储器传输1个字到外设零。 为了传输64个字,程序引导DAMC执行16 个AXI传输。每个AXI传输由4拍猝发组成(SB=4,DB=4),每一拍移动一个数据字(SS=32,DS=32)。 在这个例子中,程序给出了下面指令的用法: (1) DMAWFP指令。DMAC等待来自外设的猝发或者单个请求; (2) DMASTPB和DMASTPS指令。当传输完成后DMAC通知外设。 代码清单3-1 # 设置猝发传输(4拍猝发,于是SB4和DB4), # (字数据宽度, 于是SS32和DS32)DMAMOV CCR SB4 SS32 DB4 DS32DMAMOV SAR ...DMAMOV DAR ... # 初始化外设 '0'DMAFLUSHP P0 # 执行外设传输 # 外部循环 – DMAC响应外设请求,直到外设设置drlast_0 = 1DMALPFE # 等待请求,DMAC设置request_type0标志,取决于它接收到的请求类型DMAWFP 0, periph # 为猝发请求设置循环: 16个交易最开始的15个 # 注意: B后缀-有条件的执行,只有如果request_type0标志为burstDMALP 15DMALDBDMASTB # 如果服务一个猝发,循环返回,否则当作一个NOPDMALPENDB # 执行最后一个交易(16个中的第16个),给外设发送猝发请求完成响应DMALDBDMASTPB P0 #如果外设发送单个请求信号,执行交易 # 注意: S后缀-有条件的执行,只有如果request_type0标志为SingleDMALDSDMASTPS P0 # 如果DMAC接收到最后请求,即drlast_0 = 1,退出循环DMALPENDDMAEND2) DMAC长度管理 这个例子给出了当外设发送16个连续的猝发请求和3个连续的单个请求时,一个DMAC程序传输1027个字。 代码清单3-2 # 设置AXI猝发传输 # (4拍猝发,于是SB4和DB4), (字数据宽度,于是SS32和DS32)DMAMOV CCR SB4 SS32 DB4 DS32DMAMOV SAR ...DMAMOV DAR ... # 初始化外设 '0'DMAFLUSHP P0 #执行外设传输 # 猝发请求循环,传输1024个字DMALP 16 # 等待外设发送一个猝发请求信号 # DMAC传输64个字,用于每个猝发请求DMAWFP 0, burst # 为猝发请求设置循环: 16个交易的最开始的15个DMALP 15DMALDDMASTDMALPEND # 执行最后的交易(16个交易中的第16个) #发送猝发请求完成的外设相应信号DMALDDMASTPB 0 #完成猝发循环DMALPEND # 设置AXI单个传输(字数据宽度, 于是SS32和DS32)DMAMOV CCR SB1 SS32 DB1 DS32#单个请求循环传输3个字DMALP 3 # 等待外设发送一个单个请求信号. DMAC传输一个字DMAWFP 0, single #为单个请求执行交易,并且发送完成响应信号到外设DMALDSDMASTPS P0 #完成单个循环DMALPEND # 刷新外设,防止单个传输响应一个猝发请求DMAFLUSHP 0DMAEND3. 使用一个事件重新启动DMA通道 当编程INTEN寄存器产生一个事件时,DMASEV和DMAWFE指令可以用来重新启动一个或者多个DMA通道。 下面给出了出现这些情况时,DMAC的行为: (1) 在DMASEV之前,DMAC执行DMAWFE; (2) 在DMAWFE之前,DMAC执行DMASEV。 1) 在DMASEV之前,DMAC执行DMAWFE 重新启动一个单个DMA通道: (1) 第一个DMA通道执行DMAWFE指令。然后停止,等待发生事件。 (2) 其他通道使用相同的事件号,执行DMASEV指令。这样产生一个事件,重新启动第一个DMA通道。它执行完一个DMASEV后,DMAC需要一个DMA{3:0}_ACLK周期清除事件。 可以编程多个通道,用来等待相同的事件。例如,如果四个DMA通道为事件12,都执行DMAWFE,则当另一个DMA通道为事件12执行DMASEV时,在同一时间重新启动所有的四个DMA通道。它执行完一个DMASEV后,DMAC需要一个时钟周期清除事件。 2) 在DMAWFE之前,DMAC执行DMASEV 在另一个通道执行DMAWFE之前,如果DMAC执行了DMASEV,则事件保持等待处理,直到DMAC执行DMAWFE。当DMAC执行DMAWFE时,它停止执行一个DMA{3:0}_ACLK周期,清除事件,然后继续执行通道线程。 例如,如果DMAC执行DMASEV6,并且没有其他线程执行DMAWFE6,则事件保持等待处理。如果DMAC为通道4执行了DMAWFE6指令,然后为通道3执行了DMAWFE6指令,则 (1) DMAC停止执行通道4线程,一个DMA{3:0}_ACLK周期; (2) DMAC清除事件6; (3) DMAC继续执行通道4的线程; (4) 当执行DMASEV后,DMAC停止通道周期的执行。 4. 中断一个处理器 DMAC提供了irq[7:0]信号,用于到外部微处理器的高电平敏感的中断。当编程INTEN寄存器用于产生一个中断时,在DMAC执行DMASEV后,它将相应的irq[7:0]信号设置为高。 通过写中断清除寄存器,一个外部处理器可以清除中断。 执行DMAWFE不能清除中断。 当DMAC完成一个DMALD或者DMAST指令时,如果DMASEV指令用于通知一个微处理器,ARM推荐在DMASEV之前,插入一个存储器屏障指令。否则,DMAC可能在AXI传输完成以前发送一个中断信号。 下面的例子说明了这个问题。 代码清单3-3 DMALDDMAST # 发布一个写存储器屏障 #在DMAC能发布一个中断前,等待完成AXI写传输DMAWMB # DMAC发布中断 DMASEV3.13.7 编程限制下面给出了两个编程限制。 1. 在一个DMA周期内,更新DMA通道控制寄存器 在DMAC执行DMALD和DMAST序列前,用户写入CCRn寄存器、SARn寄存器和DARn寄存器的值,用来在DMAC执行的过程中(即将数据从源地址传输到目的地址),控制对数据字节通道的操作。 可以在一个DMA周期内更新这些寄存器。但是,如果修改了某个寄存器的域,DMAC可能放弃数据。下面描述了寄存器域可能对数据传输有一个不利的影响。 1) 更新影响目的地址 如果使用DMAMOV指令,更新DARn或者CCRn寄存器,一部分是在DMA周期,可能会发生目标数据流的不连续。如果下面的任何一个发生变化,则发生不连续: (1) dst_inc比特; (2) 当dst_inc=0(固定地址猝发),dst_burst_szie域; (3) DARn寄存器,它修改目的字节通道对齐,例如,当总线宽度为64位,修改DARn寄存器的[2:0]位。 当发生目的数据流的不连续时,DMAC: (1) 停止执行DMAC通道线程; (2) 完成为通道的所有读和写操作(只是看上去好像DMAC执行DMARMB和DMAWMB指令); (3) 放弃任何驻留在MFIFO内的数据; (4) 继续执行DMA通道线程。 2) 更新影响源地址 如果使用DMAMOV指令,更新SARn或者CCRn寄存器,一部分是在DMA周期,可能会发生源数据流的不连续。如果下面的任何一个发生变化,则发生不连续: (1) src_inc比特; (2) src_burst_szie域; (3) SARn寄存器,它修改目的字节通道对齐,例如,当总线宽度为32位,修改SARn寄存器的[1:0]位。 当发生目的数据流的不连续时,DMAC: (1) 停止执行DMAC通道线程; (2) 完成为通道的所有读操作(只是看上去好像DMAC执行DMARMB指令); (3) 继续执行DMA通道线程。没有丢弃来自MIFIFO的数据。 2. 在DMA通道内,共享资源 DMA通道程序共享MFIFO数据存储资源。一个并发运行的DMA通道程序集,在启动时,不能要求资源超过MFIFO的大小。如果超过了这个限制,DMAC可能锁定和产生一个看门狗退出。 DMAC包含一个称为加载-锁机制,确保正确地使用MFIFO资源。加载-锁或者由一个通道拥有,或者它是自由的。拥有加载-锁的通道能成功地执行DMALD指令。没有拥有加载-锁的通道,在执行DMALD指令时暂停,直到它拥有加载-锁。 当下面情况时,一个通道声明拥有加载锁: (1) 它执行一个DMALD或者DMALDP指令; (2) 当前没有通道拥有加载-锁。 当下面情况时,一个通道释放对加载-锁的拥有: (1) 它执行DMAST、DMASTP或者DMASTZ; (2) 它达到一个障碍,即它执行DMARMB或者DMAWMB; (3) 它等待,即它执行DMAWFP或者DMAWFE; (4) 它正常地终止,即它执行DMAEND; (5) 由于任何原因的退出,包括DMAKILL。 一个DMA通道程序对MFIFO资源的使用是在MFIFO入口测量。当处理程序的时候,增加或者减少。通过使用静态要求和动态要求(该要求被加载-锁影响),描述一个DMA通道程序所要求的MFIFO资源。 ARM定义在通道做下面事情前,静态要求一个通道当前正在使用MIFIFO入口的最大数目: (1) 执行一个WFP或者WFE指令; (2) 声称拥有加载-锁。 ARM定义了动态要求,即任何时候在执行一个通道程序时,要求的最大MFIFO入口的数量。 计算总的MFIFO要求,将最大的动态要求增加到所有静态要求的和。 为了避免DMAC锁定,通道程序所要求总的MFIFO大小必须等于或者小于最大的MFIFO深度。DMAC最大的MFIFO深度为每个一个字(64位)。 3.13.8 DMAC IP配置选项Xilinx使用表3.47的IP配置选项实现DMAC。 表 3.47 DMAC IP配置选项 IP配置选项 值 ) Y9 U/ C" y0 C* k" _; S
数据宽度(比特) 64
; e9 t+ V8 q% f通道个数 8
3 b" J D9 t0 m2 X中断个数 16(8中断,8事件)
6 j1 K7 N8 ], K# d) x5 |& ^外设个数 4(到可编程逻辑) ; U0 @* u4 p4 m5 b
缓存行个数 8 8 ]5 k. f7 p8 r2 U" b( a
缓存行宽度(字) 4
& |* ^6 ^3 @! _! z4 b* V" \* W U( _缓冲深度(MFIFO深度) 1 0 e' u2 o ?; u1 o' J5 r6 y* d4 Y
读队列深度 16 2 f7 u; i( ?7 a! q; @1 u
写队列深度 16
0 G9 B- G" u" J ]读发布能力 8
9 E8 n9 ? y7 c' F. ]- e写发布能力 8
# O4 f* f9 W0 K4 X) g, |' I外设请求能力 所有能力 ( U4 _. x X4 X: q ]: ^
安全APB基地址 0xF800_3000 9 s8 r$ E+ U2 i# M5 Z
非安全APB基地址 0xF800_4000 思考题3-18: 请说明Zynq-7000内的DMA控制器的结构特点及实现什么功能?
' N) y F# Q- |* ~ |