文章目录
- 1、简介
- 1. EDMA3概述
- 2、EDMA3的组成
- 3、EDMA3的工作流程
- 4、EDMA3通道控制器(EDMA3CC)
- 5、触发方式
- 2、EDMA3的传输
- 1、传输数据块的定义
- 2、传输类型
- 3、参数PaRAM
- 4、通道
- 5、OPT参数
- 3、补充
- 1、EDMA3通道控制器区域
1、简介
1. EDMA3概述
基于C66x的内核处理器主要具有两种DMA传输:IDMA、EDMA3。
IDMA:只提供核内部(L1P、L1D、L2、CFG)的数据移动服务。C6678处理器中,IDMA具有两个通道。
EDMA3:服务外部内存(比如DDR)、服务芯片内的内存(比如:L2 SRAM)、服务外设,比如:串口
2、EDMA3的组成
EDMA3控制器主要由两部分构成:EDMA3通道控制器(EDMA3CC)和EDMA3传输控制器(EDMA3TC)
EDMA3通道控制器(EDMA3CC),充当EDMA3控制器的用户接口,EDMA3CC包括:参数RAM(PaRAM)通道控制寄存器、中断控制寄存器。EDMA3CC负责软件请求或外设事件的优先级管理,向传输控制器发布传输请求(TRs)。
EDMA3传输控制器(EDMA3TC),依附于EDMA3通道控制器,负责数据传输,EDMA3TC向编程传输的源和目的地址发布读写请求。
EDMA3TC的大多数寄存器是只读的,用户一般不会对这些寄存器进行编程。EDMA3CC有高度的可编程性,用户可以设置各种传输方式。
EDMA具有三个通道控制器(CC0、CC1、CC2)和10个传输控制器(CC0TC0、CC0TC1,CC1TC0、CC1TC1、CC1TC2、CC1TC3,CC2TC0、CC2TC1、CC2TC2、CC2TC3)。
CC0有16个DMA通道,8个QDMA通道,16个中断通道,2个事件队列,队列深度为16,2个传输控制TC,一个事件队列对应一个TC;CC1有64个DMA通道,8个QDMA通道,64个中断通道,4个事件队列,队列深度为16,4个传输控制TC,一个事件队列对应一个TC;CC2有64个DMA通道,8个QDMA通道,64个中断通道,4个事件队列,队列深度为16,4个传输控制TC,一个事件队列对应一个TC。如下图所示
3、EDMA3的工作流程
首先编程者先配置DMA/QDMA通道逻辑参数,然后参数传送给事件队列,事件队列获取PaRAM参数,探后提交传输请求到传输控制器。传输控制器来完成传输。传输完成后通道控制器的传输完成检测会收到传输控制器的请求,通道控制器向CPU提交传输完成中断。
4、EDMA3通道控制器(EDMA3CC)
EDMA3有3中触发方式,事件触发、手动触发、链接触发,它们由寄存器配置。事件触发后会通过优先级编码器仲裁,将高优先级送往队列,经过队列后,通道映射根据事件所对应的通道来选择参数集(在此之前通道和参数集已经做了映射了),然后提交传输请求。传输完成后通道控制器的传输完成检测会收到传输控制器的请求,通道控制器向CPU提交传输完成中断。
5、触发方式
1、DMA通道有3种触发方式:
事件触发:当一个触发事件锁存到ER寄存器就会启动相应通道的EDMA3(CPU必须先通过EER使能该事件)
手动触发:CPU可以通过写ESR启动一个EDMA3通道
链接触发:由一个EDMA3通道的结束来触发,启动另一个EDMA3
2、QDMA通道有触发方式:
自动触发:PaRAM里设置为触发字的域被写入值后,触发传输(通过QCHMAPn寄存器设置PaRAM的哪个域作为触发域)。
QDMA与DAM的主要的不同就是触发方式的不同
2、EDMA3的传输
1、传输数据块的定义
每一个EDMA3传输数据都是可以看做一个三维的数据,这个数据的大小
由ACNT,BCNT,CCNT来描述。
第1维或阵列(A):一个传输的第1维是由ACNT个连续字节。
第2维或帧(B):一个传输的第2维是由BCNT个ACNT字节的阵列。第2维里的每个阵列传输通过一个索引彼此分开,这个索引使用SRCBIDX和DSTBIDX来配置。
第3维或块(C):一个传输的第3维是由CCNT个帧,每个帧由BCNT个阵列,而每个阵列有ACNT个连续字节。第2维里的每个传输由以一个索引同前一个分开,这个索引使用SRCCIDX或DSTCIDX来配置。
2、传输类型
A传输类型:每次传输一个阵列,也就是ACNT个字节。传输一个ACNT x BCNT x CCNT的数据块总共需要传输BCNT x CCNT次。
如果EDMA3搬运的是一片连续的内存,则SRCBIDX=DSTBIDX=ACNT,SRCCIDX=DSTCIDX=ACNT。
AB传输类型:每次传输一帧,也就是ACNTxBCNT个字节。传输一个ACNT x BCNT x CCNT的数据块总共需要传输 CCNT次。
如果EDMA3搬运的是一片连续的内存,则SRCBIDX=DSTBIDX=ACNT,SRCCIDX=ACNTxBCNT。
3、参数PaRAM
参数RAM存放每个EDMA3通道需要的传输控制参数。每个EDMA3事件对应一个参数组,每组包括8个字(32字节),在C6678中总共有512个参数组。
OPT 传输配置选项
SRC 数据来源端的字节地址
ACNT 一个array中的连续字节数
BCNT 一帧中的array数
DST 数据目的端的字节地址
SRCBIDX 源BCNT索引值,用于指示传输帧中,数据源的阵列array的间隔
DSTBIDX 目的BCNT索引值,用于指示传输帧中,数据目的端的阵列array的间隔
LINK 用于链式传输,一个通道的DMA3传输完成后,下一个EDMA3传输的PaRAM参数的地址
BCNTRLD A同步传输时,BCNT减到0时的重载值
SRCCIDX 源CCNT索引值,用于指示传输帧中,数据源的帧间的间隔
DSTCIDX 目的CCNT索引值,用于指示传输帧中,数据目的端的帧间的间隔
CCNT 一个传输块中的帧数
4、通道
EDMA通道编号:控制器0是16个DMA通道加8个QDMA通道,编号顺序是0-23; 控制器1/2是64个DMA通道加8个QDMA通道,编号顺序是0-71;QDMA的通道编号在最后8个。
通道需要和参数集做映射,这样传输通道才可以根据通道映射来选择参数集。
/*函数名称: int edma3Transfer(const tEdmaTransCfg *cfg);中的部分代码*/
/* 打开指定的QDMA 通道*/
chParam.regionNum = regionNum;
chParam.chaNum = cfg->chanNo;
hChannel = CSL_edma3ChannelOpen(&chObj0, cfg->edmaNo, &chParam, &edmaStat);
/* 将QDMA 通道 映射到指定的参数入口*/
chSetup.paramNum = chParam.chaNum;
CSL_edma3HwChannelSetupParam(hChannel, chSetup.paramNum);
/* 获取指定的参数入口句柄 */
paramHandle = CSL_edma3GetParamHandle(hChannel, chSetup.paramNum, &edmaStat);
/* 使用paramSetup信息来配置参数入口 */
CSL_edma3ParamSetup(paramHandle, ¶mSetup);
/* 使能指定通道 */
CSL_edma3HwChannelControl(hChannel, CSL_EDMA3_CMD_CHANNEL_ENABLE, NULL);
5、OPT参数
FWID:FIFO 宽度,应用于SAM 或者DAM 至少有一个设置成固定地址模式
DAM:目的地址模式。
置0:递增(INCR)模式。目的地址在一个数列里是递增的。目的不是一个FIFO。
置1:固定地址(CONST)模式。目的地址在一个FIFO 中循环。
SAM:源地址模式。
置0:递增(INCR)模式。源地址在一个数列里是递增的。源不是一个FIFO。
置1:固定地址(CONST)模式。源地址在一个FIFO 中循环。
SYNCDIM:同步传输模式。
置0:A-同步传输。每个触发事件传输一个数列(ACNT 字节)。
置1:AB-同步传输。每个触发事件传输BCNT个数列(ACNT x BCNT字节)。
STATIC:静态PaRAM集。
置0:RAM 参数集非静态:TR 被提交后RAM 参数集将更新或链接。0 值用于DMA 通道或QDMA 传输连接列表中的非最终的传输。
置1:RAM 参数集为静态:TR 被提交后RAM 参数集不发生更新或链接。1 值用于单独的QDMA 传输或者QDMA传输连接列表中的最终的传输。
如果数据块可以一次性传输玩,则不需要更新,如果数据块需要多次传输才能传输完,则需要更新。例如:一个数据块的大小如果只有一个阵列,那么A同步传输一次就传输完了,那么RAM就不需要更新了,但是如果是一个帧,那么用A传输模式就需要传输BCNT次,并且每次传输完成后,下一次传输的源地址和目的地址都会相应的改变,并且BCNT会减1,所以RAM中的参数需要更新。
TCC:传输完成编码,这6 位用于设置链接使能寄存器的相应位(CER[TCC])用于链接或者中断挂起寄存器相应位(IPR[TCC])用于中断.
TCCMOD:传输完成编码模式。:
置0:正常完成模式。在数据完全被传输后,才算一个传输完成
置1:提前完成模式。当EDMA3CC 提交一个传输请求给EDMA3TC 时就算一个传输完成.触发中断或者链接时传输请求可能仍然在传输数据。
ITCINTEN:内部传输完成中断使能,当使能,每当完成PaRAM集里的一个TR(PaRAM集里最后一个TR除外),就会产生一次传输完成中断。
置0:禁止内部传输完成中断
置1:使能内部传输完成中断
TCINTEN:传输完成中断使能。当使能,当完成PaRAM集里最后一个TR才产生一次
完成中断。
置0:禁止传输完成中断
置1:使能传输完成中断
ITCCHEN:内部传输完成链接使能。当使能,每当完成PaRAM集里的一个TR(PaRAM集
里最后一个TR除外),就会产生一次链接。
置0:禁止内存传输完成链接
置 1:使能内部传输完成链接
TCCHEN:传输完成链接使能。当使能,当完成PaRAM集里最后一个TR才产生一次
链接。
禁止传输完成级联
使能传输完成级联
链接(Link)传输的配置:STATIC必须为0;LINK地址设置;TCCHEN置1(一般不会用到ITCCHEN置1);
Chain链接模式和Link连接模式是完全不同的模式,Chain模式中没有PaRAM set 的参数的更新,而是一个通道的传输完成直接触发了另一个通道,实现连续的数据的搬运的效果,但是Link模式就是同一个通道上的参数的不断的更新,从而达到连续的数据搬运的效果。
/***EDMA传输中配置项结构体****/
typedef struct T_EDMA_TRANS_CFG
{
/**@brief 数据传输的源地址模式 INCR/CONST */
unsigned short srcAddrMode;
/**@brief 数据传输的目的地址模式 INCR/CONST */
unsigned short dstAddrMode;
/**@brief FIFO宽度,仅在CONST地址模式下有效*/
unsigned short fifoWidth;
/**@brief 数据的超时等待时间,ms为单位 */
unsigned short timeOut;
/**@brief EDMA控制器编号,0-2 */
unsigned short edmaNo;
/**@brief EDMA通道编号*/
unsigned short chanNo;
/**@brief EDMA传输的源地址 */
unsigned int srcAdrs;
/**@brief EDMA传输的目的地址 */
unsigned int dstAdrs;
/**@brief EDMA传输的一维数据长度参数 */
unsigned short aCnt;
/**@brief EDMA传输的二维ARRAY数量参数 */
unsigned short bCnt;
/**@brief EDMA传输的二维FRAME数量参数 */
unsigned short cCnt;
/**@brief 二维EDMA传输的源地址的修改参量 */
short srcBIndex;
/**@brief 二维EDMA传输的端地址的修改参量 */
short dstBIndex;
/**@brief 三维EDMA传输的源地址的修改参量 */
short srcCIndex;
/**@brief 三维EDMA传输的端地址的修改参量 */
short dstCIndex;
/**@brief 1:阻塞模式,0:中断模式,非阻塞 */
unsigned char isBlocking;
}tEdmaTransCfg;
3、补充
1、EDMA3通道控制器区域
EDMA3CC 内存映射寄存器可以被分为三个主要类型:
- 全局寄存器
- 全局区域通道寄存器
- 影子区域通道寄存器
全局寄存器的地址是唯一固定的,这些寄存器控制着EDMA3的资源映射。
通道寄存器是通道控制相关的寄存器,可以通过全局通道区域访问,也可以通过影子通道访问。影子通道寄存器就是全局通道区域寄存器的备份,配置影子通道寄存器的数据,最终还是会被写入到全局区域寄存器中。
EDMA3 通道控制器(EDMA3CC)将地址空间分为多个影子区域(region)。在多核设备中可以减少资源冲突
DRAEm:寄存器的每一个位对应一个DMA通道。
QRAEm:寄存器的每一个位对应一个QDMA通道。
参考:http://www.digoboy.com/video/id_4438.html
https://blog.csdn.net/u012384044/article/details/51939829