1.概述 EDMA3控制器的基本用处是:独立于CPU批量的进行数据传输。 典型的用法: a:服务外部内存(比如DDR) b:服务芯片内的内存(比如:L2 SRAM) c:服务外设,比如:串口 主要目的:减轻DSP 的数据传输任务。 EDMA3控制器由2个主要模块组成: EDMA3通道控制器(EDMA3CC),充当EDMA3控制器的用户接口,EDMA3CC包括:参数RAM(PaRAM)通道控制寄存器、中断控制寄存器。EDMA3CC负责软件请求或外设事件的优先级管理,向传输控制器发布传输请求(TRs)。 EDMA3传输控制器(EDMA3TC),依附于EDMA3通道控制器,负责数据传输,EDMA3TC向编程传输的源和目的地址发布读写请求。 2:结构 2.1 EDMA3通道控制器(EDMA3CC)
图2:EDMA3传输控制器方块图
2.3 EDMA的传输类型 EDMA3传输总是以三维来定,这3维定义为: 第1维或阵列(A):一个传输的第1维是由ACNT个连续字节。 第2维或帧(B):一个传输的第2维是由BCNT个ACNT字节的阵列。第2维里的每个阵列传输通过一个索引彼此分开,这个索引使用SRCBIDX和DSTBIDX来配置。 第3维或块(C):一个传输的第3维是由CCNT个帧,每个帧由BCNT个阵列,而每个阵列有ACNT个连续字节。第2维里的每个传输由以一个索引同前一个分开,这个索引使用SRCCIDX或DSTCIDX来配置。 注意,索引的参考点取决于同步类型,一旦收到一个触发/同步事件而引起传输的数据数量由同步类型(在OPT里的SYNCDIM位)来控制,在三个维中,仅支持2个同步类型:A-同步传输和AB-同步传输。
图3:ACNT, BCNT, 和CCNT 的定义
2.3.1 AB同步模式 在AB-同步传输中,每个EDMA3同步事件引起2个维的传输,或者说是一帧的传输。换句话来说就是每个事件/TR包包含有一个整帧(1个帧有BCNT个阵列,每个阵列ACNT字节)的信息。,这样,为了这样,为了完整地服务一个PaRAM集,需要CCNT个事件。 阵列总是由SRCBIDX和DSTBIDX分开,见图5,帧总是由SRCCIDX和DSTCIDX分开。 注意,对AB-同步传输,在帧的TR发布之后,地址更新是通过把SRCCIDX/DSTCIDX加到这一帧的第一个阵列的起始地址。这一点与A-同步是不同的。也就是说,在A-同步传输和AB-同步传输中,SRCCIDX/DSTCIDX的意义是完全不一样的,这一点务必注意。 图5显示了3(CCNT)个帧,每帧4(BCNT)个阵列,每阵列n(ACNT)个字节的AB-同步传输。在这个例子里,为了完成一个PaRAM集的传输需要3(CCNT)个同步事件。
图5:AB同步模式传输(ACNT = n, BCNT = 4, CCNT = 3) 2.4 PaRAM EDMA3控制器是基于RAM的结构,DMA或QDMA通道的传输上下文(源/目的地址、计数、索引等)用一个参数RAM表来编程,这个RAM在EDMA3CC中,被称之为PaRAM,PaRAM表被分段成多个PaRAM集,每个PaRAM集包括8个4字节的PaRAM集条目(也就是说每个PaRAM集总共32个字节),它包括典型的DMA传输参数,如:源地址、目的地址、传输个数、索引、选项等。 PaRAM结构支持灵活的Ping-Pong、循环缓冲、通道链接和自动加载(linking)。 PaRAM的内容如下: a:128个参数集。 b:直接映射的64个通道,和能被用作link,或如果不用作DMA通道的话可以作为QDMA集。 c:余下的64通道的可作为link或QDMA集。
图6:PaRAM的参数集对应地址 2.4.1PaRAM参数集 每个PaRAM参数集是8个32bit的字结构,见如图7的描述,每个PaRAM集参数由16bit和32bit的参数构成。
图7:PaRAM参数集
参数的配置: OPT:通道选项参数 SRC:数据传输源地址 ACNT:一维数据的维度 BCNT:二维数据的维度 DST:目的地址首地址 DSTBICX:目的地址二维索引 SRCBIDX:源地址二维索引 BCNTRLD和LINK:LINK模式参数设置 DSTCICX和SRCCIDX:源和目的地址三维地址索引 CNNT:三维维度设置
2.4.2 OPT参数配置
OPT主要参数配置: ITCCHEN:一次TC完成链接使能。3维模式AB同步模式必须使能,用来更新三维数据地址。 A同步模式2维3维数据传输必须都使能,用来更新首地址。 TCCHEN: 传输完成链接使能,即最后一个TR完成产链接。 ITCINTEN:一次TC完成产生中断使能,就是每完成一次TC产生一次中断。 TCINTEN:传输完成产生中断,就是最后一次TC完成产生中断。 TCC:传输完成代码,用于告诉EDMAC3CC传输完成的代码,用于chain模式链接下一通道,和中断的产生。 TCCMODE:传输完成代码发送模式,包括 常规模式和提前完成模式,常规模式就是正常的传输完成后发送TCC,提前完成模式就是在EDMA3CC 提交一个TC后即发送TCC认为传输完成,这种模式下,TC可能还在传输数据当chain 或 中断被触发。 FWID: FIFO 的宽度设置,用于SAM或DAM设置为固定地址模式。 STATIC:PaRAM参数的静态设置, 0 代表非静态:当一次TC传输完成后PaRAM 的参数集是否更新或连接,AB模式三维模式设置为非静态,A模式二维和三维模式都设置为非静态。 SYNCDIM:传输的同步模式的设置,A同步模式或 AB同步模式。 DAM:目的地址模式,地址递增模式和固定地址模式。 SAM:源地址模式,地址递增模式和固定地址模式。 2.5 EDMA3 的触发方式: EDAM3有三种触发方式:事件触发方式,手动触发方式,链接触发方式 事件触发方式通常服务于外设,系统,或者一些产生外部事件的请求, EDMA与串口之间的数据传送就可以通过事件触发。 手动触发方式:通过CPU向ESR寄存器相应为置位来触发相应的传输。 链接触发方式:是一个传输完成后自动的触发其他传输的触发方式。 QDMA与DAM的主要的不同就是触发方式的不同,QDMA通道在触发字写入的时候自动触发,PaRAM集中的触发字是可以编程指定的。 2.6 Linking 传输 EDMA的通道控制提供了一种连接传输的模式,它其中的所有的参数集中的任何一个参数集都可以被PaRAM MAP中的其他的参数集重载,他主要的应用就是应用在ping-pong buffer,和一些循环传输,不需要CPU中断的传送。Linking 模式的设置为将OPT中的STATIC位置位1,即PaRAM参数设置为非静态模式。 一个传送必须连接到其他的PaRAM,如果是结束这个传送,必须把PaRAM连接到NULL。 2.6 Chain传输 EDMA在一个通道的数据搬运完成后,可以链接到其他通道,继续传送数据,不需要CPU发送命令,时间的响应为DMA事件响应中的三种响应方式的Chain事件响应。 Chain链接模式和Link连接模式是完全不同的模式,Chain模式中没有PaRAM set 的参数的更新,而是一个通道的传输完成直接触发了另一个通道,实现连续的数据的搬运的效果,但是Link模式就是同一个通道上的参数的不断的更新,从而达到连续的数据搬运的效果。 同时在Chain模式中还可以设置两种不同的方式:transfer complection Chaining 就是在这个通道的这次数据搬运结束后链接到其他通道。 intermediate transfer completion chaining 就是在这个通道的这个次数据搬运的一次TR结束后自动链接到这个通道。 两种模式对应OPT中的TCCHEN 和ITCCHEN 2.7传输队列 EDMA有三个传输队列:事件的队列也是EDMA3通道控制器的一部分,EDMACC通过队列控制器将数据搬运事件送到EDMATC开始数据搬运的。每个传输队列都是16个事件的深度。 Q0是和TC0相关联的,Q1是和TC1相关联的,Q2是和TC2相关联的,每一个队列都是一个FIFO的队列,当一个事件到达队列的头部的时候队列控制器就将传输事件交个EDMATC来控制传输。 可以通过8个DMAQNUMn来控制64个DMA通道放入不同的队列,默认放入Q0的事件的优先级是最高的,Q1次之,Q2的优先级最低,但是三个队列优先级都可以通过设置QUEPRI寄存去来更改。 2.8中断 EDMA传输数据能产生两种不同的中断:final transfer completion 和intermediate transfer completion 这两种中断模式通过OPT 中的TCINTEN 和 ITCINTEN 来控制,如果TCINTEN=1 ITCINTEN=0,中断在最后一次TC传输完成产生,如果TCINTEN=0 ITCINTEN =1 中断在每一TC完成后产生一次。 例如ACNT = 3, BCNT = 4, CCNT = 5.
3: DDR与SRAM间数据搬运寄存器配置 3.1 一维数据搬运 表3.1.1:OPT配置
表3.1.2:PaRAM参数集配置
3.2 二维数据搬运 A 同步模式: 表3.2.1:OPT配置
AB同步模式: 表3.2.2:OPT配置
表3.2.3:PaRAM参数集配置
3.3 三维数据搬运 表3.3.1:OPT配置
表3.3.2:PaRAM参数集配置
3.4数据搬运效率测试 数据搬运效率的测试: a: EDMA3 A同步模式和AB同步模式的效率搬运测试 利用cycle函数测试一个128*128字节的数据的搬运,在AB模式下消耗9116个周期,A模式下需要25830,AB同步模式是比A同步模式快了很多的,将近3倍的时间。
b: EDMA 在DDR间数据的搬运的效率的测试:(样例代码Edma_Effciency_Test();) 示例代码搬运的目标为16*1024的一块数据,在AB同步模式下,直接用memcpy()进行数据的拷贝,消耗了16371个cycle。 当利用DMA 来进行数据的搬运的时候需要30897个周期的时间。 当利用DMA将这16K 的数据放到不同的16块的地方的时候需要的是33944个周期的时间。 可以看出DDR在不是相邻的地址间的寻址相对于相邻地址间的寻址是慢了很多的。 由于EDMA是运行在DSP的1/3分频的频率下的,即在197MHZ的频率下,所以EDMA在数据搬运上是慢于CPU直接进行数据的拷贝的,但是,EDMA在数据搬运中是不需要CPU干涉的,实际上是不消耗cycle的,所以说EDMA还是大大的提高了CPU的工作效率的。
3.5 DDR与SRAM间数据搬运Cache一致性问题 DDR之间数据搬运寄存器设置,DDR和SRAM间搬运的寄存器设置,SRAM间搬运的寄存器设置是相同的。只需要更改源和目的地址即可。 但是一旦目的地址是DDR就设置到DDR和SRAM一致性的问题。 Cache无效:由于EDMA是在CPU不干扰的情况下进行数据搬运,但是CPU读取数据的时候是通过Cache来读取数据的,当EDMA将目的地址设置为DDR时,CPU并不知道DDR的数据已经改变,当然也不会去更新Cache中的内容,于是当CPU读取该块DDR内容的时候仍然是Cache中原来没有更新的数据,这种情况的时候需要将原来的DDR那块数据对应的Cache置位无效,从新写入Cache的值,就可以保证DDR和Cache的一致性了。而对应的Cache无效函数是:Cache_Invalid(); Cache 回写:同样DMA在搬运数据的时候还可能存在另一种情况,处理器在处理数据的时候会将数据先存放到Cache 中,此时Cache中的数据可能还没有来的急写入到内存中去,这时候DMA要向外设写入由处理器提供的数据的时候,DMA会直接从DDR中获得数据,搬运到外设,而这个数据并不是想要搬运的数据,这种情况下要调用Cache回写函数,在DMA进行数据搬运之前要将Cache中的数据回写到DDR中,保证DDR和Cache 的数据的一致性。 4:EDMA控制DDR与串口间数据搬运 由于EDMA的64个事件和外设有固定的通道的对应。测试程序发送采用25通道,接收采用24通道。
图9:事件触发固定的UART事件对应固定的通道。 首先写出来EDMA通道设置的相关的参数设置,UART只能采用A同步模式进行数据搬运。下面是OPT 参数的设置:(接收和发送都可以按照这种设置)
表4.1:UART发送DDR内数据OPT配置
表4.2:UART发送DDR内数据PaRAM参数集配置
表4.3:UAR接收数据存入DDR内OPT配置
表4.4:UAR接收数据存入DDR内PaRAM参数集配置
UART和DDR数据搬运UART寄存器设置: UART的FCR寄存器必须设置为FIFOEN模式,而且DMAMODE1模式设置为1。 事件的触发:采用事件触发的模式。 发送模式:即由UART发送事件触发信号,当FIFO为空的时候即向EDMA发送触发信号,开始数据搬运。数据搬运结束后EDMA产生数据搬运完成中断。 接收模式:UART接收数据,同时检测是否达到EDMA设置的触发宽度,当达到后产生触发事件,开始搬运。样例代码设置的触发宽度为14byte。 5:LINK模式参数配置: link模式是EDMA 连续搬运数据中的一种,是通过Param参数的重载来完成的,测试代码是首先完成31通道的数据搬运,然后将Param的参数重新载入31通道继续进行数据搬运。所谓的PINGPONG模式就是将两个Param的参数集的数据相互LInk,就可以不间断的数据搬运。下面是PaRam31 和PaRam127 的OPT的设置: 表5.1:PaRam31和PaRam127 的OPT的配置
表5.2:PaRam31和PaRam127参数配置
6:Chain模式参数配置 chain模式就是,一个通道的数据搬运完成之后自动的触发另外一个通道继续搬运数据,达到连续搬运的效果,下面是两个通道的OPT 参数的设置。其他PaRam参数都不需要更改。 表6.1:通道31和通道32的OPT的配置
7:问题记录 1:Null PaRAM Set(空参数RAM集)和 Dummy PaRAM Set(虚参数RAM 集): 空参数RAM集:当一个参数RAM 集中所有计数域(ACNT,BCNT,CCNT)都清零时,称之为空参数RAM 集。如果EDMA3CC服务的通道参数RAM 集是个空参数集,事件丢失寄存器(EMR 或QEMR)中相应位置1,相关次要事件寄存器(SER 或QSER)中相应位也会保持置1。这样会导致EDMA3CC 忽略同一通道中任何后续的事件,需要清零SER 和QSER 中相应位.这会被认为一种错误条件,因为通道中的事件是不希望被配置为一个空的传输。 虚参数RAM 集:当一个参数RAM 集中所有计数域(ACNT,BCNT,CCNT)都至少有一个是0 并且至少有一个非零时,称之为虚参数RAM 集.如果EDMA3CC 服务的通道参数RAM 集是个虚参数集,事件丢失寄存器(EMR 或QEMR)中相对应通道(DMA/QDMA)的相应位不会置1,相关次要事件寄存器(SER 或QSER)中相应位也会被清零,与一次普通的传输很像。 EDMA3CC对待一个虚和空传输请求有一些不同.一个空的传输请求是一个错误条件,然后一个虚拟传输是一个传输0 字节的合法传输. 一个空传输会导致EMR 寄存器中相应的错误位(En)被设置,SER 寄存器中的En会保留设置,基本可以保证该通道的后续事件在错误寄存器位不清除之前传输. 在寄存器配置的时候如果最后一次传输的PaRAM传输完成将自动的连接到Null PaRAM Set,一般在最后一个PaRA配置时的CCNT是要大于实际要配置的CCNT,这样参数集就不会连接到 Null PaRAM Set而是连接到Dummy PaRAM Set。不会产生阻塞事件,这样才可以正常的下一次触发事件对应的通道。
2:串口通过EDMA进行数据搬运: 只能配置为A同步模式,采用事件触发。PaRAM参数的静态设置,配置为非静态参数。
3:chain 和 link 的不同: Link和 chain 模式都能够实现连续的数据搬运,但是实现的方式是完全不同的,link模式是通过不断的更行PaRAM(参数集)来实现一个通道的连续的数据的搬运,它可以实现在没有CPU的干扰下维持pingpong传输,循环传输和重复/连续传输。 Chain模式,是EDMA3允许一个EDMA3通道的传输完成来触发另一个EDMA3通道的传输。目的是允许用户通过一个事件来链接多个事件。
4:通道进入阻塞状态: 在一次传输完成后,如果在PaRAM会自动映射到NULL PaRAM参数集,于是传输通道就进入阻塞状态,而且会产生错误中断,于是需要下一次触发该通道的时候,就不能正常的触发,需要使用EMCR 和SECR来清除错误。 5:3位数据搬运的配置: 由于需要更新ACNT 和 BCNT 的值,所以在静态参数的配置。要配置为0,就是要配置为非静态参数。
|
|