首页 EDM3总结

EDM3总结

举报
开通vip

EDM3总结EDMA3总结 增强型直接内存存取(EDMA),Enhanced Direct Memory Access,是数字信号处理器(DSP)中用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输的能力,能够满足实时图像处理中高速数据传输的要求。总体来说就是负责数据搬移的控制器。 1.EDMA3控制器由两部分组成: (1)​  EDMA channel controller (EDMA3CC) (2)​ EDMA transfer controller (EDMA3TC) ​ EDMA channel cont...

EDM3总结
EDMA3总结 增强型直接内存存取(EDMA),Enhanced Direct Memory Access,是数字信号处理器(DSP)中用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输的能力,能够满足实时图像处理中高速数据传输的要求。总体来说就是负责数据搬移的控制器。 1.EDMA3控制器由两部分组成: (1)​  EDMA channel controller (EDMA3CC) (2)​ EDMA transfer controller (EDMA3TC) ​ EDMA channel controller (EDMA3CC) EDMA3CC充当EDMA3控制器的用户接口,提供优先的软件请求和外设事件请求服务,并且将传输请求信号发送给EDMA3TC控制器。EDMA3CC主要由(PaRAM)、事件接收 、传输完成检测和中断控制寄存等三部分组成。 EDMA3CC中包含两种类型的通道: (1)64通道的DMA通道 (2)8通道的QDMA通道 1.1 EDMA和QDMA的不同点: 1.1.1 EDMA与QDMA的主要区别在于两者的触发方式不同: EDMA的触发方式:    (1)event-triggered transfer request:EDMA3的典型用法,允许外设、系统或外部产生的事件触发传输请求,(EESR, EESRH的相应位设置为1)     (2)manually-triggered transfer request:由CPU手动向事件设置寄存器(ESR/ESRH)的对应bit位写1,以此触发传输请求;    (3)chain-triggered transfer request:通过配置链式传输寄存器,一个传输结束后,自动触发下一个传输请求(需要设置Opt中TCCHEN ITCCHEN相应位为1,同时设置OPT中TCC来设置下一次要触发的通道). QDMA的触发方式:     (1)autotriggered transfer request:预先编程设定传输启动触发word,当向该word写值时就自动触发传输请求(设置PaRam中8个数据中的一个)同时要设置QEESR相应位为1,OPT.static位也要设置;  (2)link-triggered transfer requests:配置链式传输后,写入触发字就自动连续传输. 1.1.2 QDMA和EDMA通道映射PARam不同点 EDMA的通道映射到PARam是(只对于dm6437)固定的,一一对应,通道1只能映射到PARam1上。而QDMA通道和PARam的映射是可以变化的。是可以通过编程QCHMAPn寄存器中的PAENTRY来改变相互的映射关系,QDMA是通过触发字来启动一次传输,通过QCHMAPn 的TR WORD 来设置触发字,只要触发字中的值改变 ,就会启动一次传输。映射PARam的结构图如下: 1.2事件队列 DM6437 中有3个事件队列Q0,Q1,Q2. Q0 对应于TC0 ,Q1对应TC1,Q2对应TC2。每个事件队列是一个FIFO,16级深度,可以存放16个事件请求。事件在同一个事件队列里是按顺序提交TR(传输请求),而在不同的事件队列的事件是并行的。3个事件队列中Q0的优先级最高,Q2的优先级最低。 事件在队列中先后顺序排列的,一旦事件到达队列的队首且传输控制器已经准备接收一个TR,则事件就会从队列中出列,这出列事件的PaRam就会被处理并且提交一个TRP(传输请求包)给EDMA传输控制器。 Q0,Q1,Q2 所有队列的事件的状态可读的,通过Q0E0 Q0E1……Q2E15寄存器,寄存器中包含每个事件的触发类型和事件号(方便调试). 1.3 Shadow Region (阴影区) Shadow Region主要用于解决在多设备之间对EDMA3资源利用冲突,DM6437有4个Shadow Region,但是只有两个可用. 四组Shadow Region 的寄存器都有自己单独的地址,相当于一个寄存器有四个可访问的地址,可以通过编程DRAE/DRAEH/QRAE寄存器来确定使用哪一组Shadow Region,影射图如下: ​ EDMA transfer controller (EDMA3TC) EDMA3TC主要负责数据的搬移操作,发出一些读写命令到源地址和目的地址启动一次传输。 EDMA3TC主要包括: (1)​ DMA program register set 用来设置从EDMA3CC发送的传输请求TR (2)​ Read controller 发送读数据命令到源地址 (3)​ DMA source active register set:设置与读数据相关请求 (4)​ Destination FIFO register set:设置与写数据相关的请求 (5)​ Data FIFO:数据暂存 (6)​ Completion interface:传输完成接口,发送到EDMA3CC 控制器 EDMA3CC的结构框图如下: 2.EDMA数据传输类型: (1)传输类别 阵列传输(array)传输的最小单元ACNT,地址必须连续。 帧传输 (frame) BCNT个array ,地址是SRCBIDX为索引递增或递减。 块传输 (block) CCNT个frame 地址是SRCCIDX为递增或递减。 传输的模块图如下: (2)​ A-sys 和AB-sys同步传输 OPT. SYNCDIM位用来设置传输时的触发类型,置位为AB同步,为0时A同步。 A同步和AB同步的主要区别: 1)​ 如果是A同步,触发一次传输只传输一个array,传输完成就会提交一个TR请求。要传输BCNT*CCNT次才能把所有数据传输完。同时SRCCIDX/DSTCIDX的设置是以上一帧数据的最后一个array的起始地址来计算的。 2)AB同步,每触发一次传输一个frame ,因此要完成一次传输,需要CCNT个触发事件。同时SRCCIDX/DSTCIDX的设置是以上一帧数据的第一个array的起始地址来计算的。 3)A同步和AB同步的中断次数(如果设置了TCINTEN位)不同。其中ACNT = 3, BCNT = 4, CCNT = 5 (3)​ PaRam 参数表 DM6437有128个PaRam参数表,其中DMA映射到0-63个通道,QDMA映射到0-127个通道,link通道64-127。 每个PaRam有8个寄存器,用来设置数据传输源地址、目的地址、索引等参数,见下图: Opt寄存器各bit位 ​ SRC/DST 源和目的地址设置寄存器 有两种模式,通过Opt中的SAM、 DAM位来设置,但是DM6437只支持递增模式。 一种是递增的地址。不需要对齐。 另一种是常量地址。常量地址模式下:地址一定要以256bit对齐 ​ ACNT:是一个16bit无符号的数,代表一维的字节数,每个元素的字节数,如果ACNT为0,会被认为是空传输或者虚假传输。 ​ BCNT:是一个16bit的无符号数,代表一帧中ACNT的个数。范围是1-65535,如果等于0,被认为是一个空或者虚假传输。 ​ CCNT:一个block中帧的个数, 范围1-65535 如果等于0 ,表示空或者虚假传输。 ​ BCNTRLD:一旦一帧中最后一个array传输完毕,BCNTRLD就会重载BCNT,不过它只在A同步模式下有效。在这种模式下,每一次TR提交,BCNT的值就减1,当BCNT减到0时,CCNT也要减一,同时BCNTRLD寄存器要重载BCNT。 ​ DSTBIDX/SRCBIDX:当前源array的起始字节到下一个源array的起始偏移字节数,范围是-32768-32767, 应用于A-synchronized and AB-synchronized transfers ​ SRCCIDX/DSTCIDX:范围是-32768-32767,它的设置要根据 A-synchronized and AB-synchronized transfers的模式来设置,具体设置见A 同步和AB同步小结。 ​ LINK: 在当前PaRAM自然终止使用后,LINK寄存器能重载PaRAM,它指定了字节偏移数。 LINK地址是要32字节对齐,因此低5位要清零。 NULL和DUMMY传输: NULL:是指ACNT,BCNT,CCNT都设置为0。是一个错误传输,会导致EMR置1,SER保留1,阻止下一步传输。 Dummy:三个中最少有一个不是0。是合法的传输,会自动清除SER.,从而进行下一步传输。 PaRam寄存器配置实例: ​ 水平传输 ACNT是一个连续的单元,所以ACNT可以配置为4个字节,也可以配置为1个字节,一个字节的配置如下图: 如果配置为4个字节,则是传输一个array,一维的传输,所以BIDX和CIDX都为0。如果配置为1个字节,则传输为一个frame ,二维的传输,所以BIDX为上一个array起始地址到下一个array的起始地址的大小,CIDX为0。第二种配置传输的效率低,但是在与一些外设传输数据中不得不使用这种方法,比如串口只能一个字节一个字节的传输。 ​ 垂直传输 由于要传输的数据不是连续的,ACNT只能是1个字节,BCNT=4,是二维传输,所以CIDX为0 ,SRCBIDX是上一个array的起始地址与下一个array的起始地址的差,14-8=6。 ​ 块传输 上图为A同步模式下的三维传输,如果是AB同步模式下,则SRCCIDX的值为12,DSTCIDX的值为8,同样这里也可以配置为二维的传输。 (4)EDMA中断 当一次传输完成,TCC(Transfer Complete Code )就会生成,生成TCC用有两种模式:Early mode(常用于chain触发)和Normal 模式(常用于中断完成准备读取数据)。 产生中断的条件如下图: 如果OPT.TCINTEN置位,数据传输完成,生成TCC ,TCC的值就会置位CIPR的相应位,比如TCC等于14,则CIPR的14位就会置1,CIPR是数据传输完成标志(如果是查询模式,需要手动清除改位),如果IER(EDMA中断使能寄存器)设置为1 ,则EDMA中断请求提交给CPU,请求CPU中断,如果CPU 中的IER(中断使能寄存器)和CSR寄存器(全局中断使能寄存器)中的GIE为1,则将产生CPU中断。 硬件中断可以使用DSP/BIOS来配置,中断服务程序可以使用tccCb编写中断服务程序 (5)EDMA3 Low Level Driver LLD是TI的DVSDK包提供的EDMA3 驱动,LLD主要由RM 和DRV两层驱动构成,比较接近硬件层的驱动。RM层主要是管理硬件资源和中断,DRV是管理EDMA3的资源配置和资源需求。 LLD和ACPY3 的用途:一般LLD用于设备驱动,ACPY3用于算法拷贝。 使用LLD驱动需要包括三个lib库: 两个头文件 edma3_drv.h // LLD header file bios_edma3_drv_sample.h // OS-specific and device-specific header file 主要用于创建EDMA驱动对象,包括芯片寄存器初始化,全局配置的等。 (1)​ phyCtrllerInstId是设备的句柄号,也就是EDMA3中的标号(如果系统中有几个EDMA3),一般在DM6437中设置为0。 (2)​ gblCfgParams芯片中EDMA参数配置,比如EDMA的通道数,QDMA通道数,有一个默认的配置在edma3__cfg.c,如果这个参数为NULL 则系统会采用默认配置。一般都设置NULL. 比如默认配置: (3)​ param保留以后使用 设置为NULL 打开一个EDMA3句柄, 获取EDMA3 的基地址。 (1)​ phyCtrllerInstId 设备句柄号为0 (2)​ initCfg initCfg.isMaster = TRUE; initCfg.regionId = (EDMA3_RM_RegionId)1u; initCfg.drvSemHandle = &sem; /需要使用DSP/BIOS创建一个sem旗语,在不同的用户之间共享(通道 PaRam )资源 /* Driver instance specific config NULL */ initCfg.drvInstInitConfig = NULL; initCfg.gblerrCb = NULL; initCfg.gblerrData = NULL; (3)​ error返回错误类型 请求DMA/QDMA/LINK逻辑通道。 (1)​ hEdma 是EDMA3_DRV_open()返回的句柄。 (2)​ pLCh 请求逻辑通道的id EDMA3_DRV_HW_CHANNEL_EVENT_0-63,请求一个主通道映射到外部事件0-63 EDMA3_DRV_DMA_CHANNEL_ANY, 请求一个没有外设映射的主通道 EDMA3_DRV_QDMA_CHANNEL_0-7,请求QDMA通道0-7 EDMA3_DRV_QDMA_CHANNEL_ANY请求任何一个QDMA主通道 EDMA3_DRV_LINK_CHANNEL, 请求一个链接通道 (3)​ pTcc 配置TCC的值用于当数据传输完成置位CIPR EDMA3_DRV_HW_CHANNEL_EVENT_0-63,EDMA3_DRV_TCC_ANY (4)​ evtQueue 指定第几个队列。Dm6437有0-2 (5)​ tccCb 中断服务函数 (6)​ cbData 中断服务函数参数 用于设置PaRam的8个寄存器。 用于触发一次数据传输,触发模式: EDMA3_DRV_TRIG_MODE_MANUAL 事件触发方式 EDMA3_DRV_TRIG_MODE_QDMA  CPU写触发字 EDMA3_DRV_TRIG_MODE_MANUAL  CPU写ESR寄存器触发方式 用于设置OPT中各位的值 用于设置QDMA的触发字,比如111 设置为CCNT为触发字,只要CCNT改变,一次传输将会自动触发 将逻辑通道1的link指针指向逻辑通道2。即通道1的链接地址为通道2。 设置为chain触发,当通道1完成自动触发通道2 对应OPT中的TCChen,itcchen,tcinten,itcinten相应位的设置。 其他的API可以参考EDMA3 Driver API. (6)使用LLD编写EDMA3应用程序一般步骤: 1.edma3Result = EDMA3_DRV_create (edma3InstanceId, NULL, NULL);创建一个对象 2.hEdma = EDMA3_DRV_open ( edma3InstanceId, (void *) &initCfg,&edma3Result); 打开对象获取EDMA3的基地址。 3. EDMA3_DRV_requestChannel ( hEdma, &chId[i], &tcc, (EDMA3_RM_EventQueue)0, &callback, &myCbData[i] ) 请求一个逻辑通道。如果有链接需要请求一个链接通道。 4.EDMA3_DRV_setSrcParams ( hEdma, ChId[i], (unsigned int)(src[i]), EDMA3_DRV_ADDR_MODE_INCR, EDMA3_DRV_W32BIT ) 设置PaRam参数 EDMA3_DRV_setDestParams ( hEdma, ChId[i], (unsigned int)(dst[i]), EDMA3_DRV_ADDR_MODE_INCR, EDMA3_DRV_W32BIT ) EDMA3_DRV_setSrcIndex ( hEdma, ChId[i], 4096, 1 ) EDMA3_DRV_setDestIndex ( hEdma, ChId[i], 4096, 1 ) EDMA3_DRV_setOptField ( hEdma, ChId[i], EDMA3_DRV_OPT_FIELD_TCINTEN,1u) 等8个参数。 5.EDMA3_DRV_enableTransfer( hEdma, chId[i], EDMA3_DRV_TRIG_MODE_MANUAL )触发通道传输数据。 6.如果是查询方式查询数据是否传输完成,则使用EDMA3_DRV_waitAndClearTcc(hEdma,tcc),如果使用中断,则需要设置中断使能寄存器,同时callback函数就是中断服务函数,在callback中写入中断处理函数。 (7)直接配置寄存器编程EDMA的一般步骤: 1. 初始化一个DMA/QDMA通道 ​ 确定通道类型:QDMA或DMA ​ 通道映射: 如果使用QDMA,编程QCHMAP:确定通道对应哪个参数集号和触发字 如果使用DMA通道,编程DCHMAP:确定通道对应哪个参数集号。 如果通道使用阴影区域,确保DRAE/DRAEH配置合适,以便通过阴影区域寄存器来存取事件寄存器和中断寄存器。随后步骤都应该是使用阴影区域寄存器 确定触发类型: 如果外部事件被用于触发(DMA通道),通过写EESR/EESRH来使能EER/EERH里对应的事件 如果QDMA被使用,通过写QEESR来使能QEER里的通道 ​ Queue设置: 如果使用QDMA通道,通过设置QDMAQNUM来映射通道到对应的事件队列里 如果使用DMA通道,通过设置DMAQNUM来映射通道到对应的事件队列里 2. 参数设置 编程通道对应的PaRAM集。如果是QDMA,则触发字最后写。或者在写触发字之前先使能QDMA通道。 3. 中断设置 通过写IESR/IESRH使能IER/IERH 确保EDMA3CC完成中断(全局或阴影区域中断)在DSP的中断控制器里被使能 正确配置中断控制器接收预期的EDMA3中断 4. 启动传输 这一步取决于事件触发源: 如果源是来自外设的外部事件,外设能启动产生相关的EDMA3的事件。 对于QDMA,写触发字,会触发传输 手动触发:写ESR/ESRH寄存器对应位。 链接触发事件触发:发生在先前的传输返回一个传输完成码等于链接的通道号时。 5. 等待传输完成 如果按上面提到的第3步使能了中断,那么EDMA3CC会给CPU产生一个传输完成中断,IPR/IPRH的相应位置位,这一位必须通过ICR/ICRH相应位清楚。 如果是查询是否完成,就是说程序等待IPR/IPRH位置位。为了下次传输,这位必须通过ICR/ICRH手动来清0。 附录: 在学习EDMA的过程中,通过实验验证了EDMA的三种用法: (1)​ DMA模式 (2)​ QDMA模式 (3)​ DMA的ping pong buffer(包括link 和chain) 三个程序在一个工程中,通过宏定义来分别操作define.h中 #define PINGPONG_MODE 1 //#define NORMAL_MODE 1 //#define QDMA_MODE 1 如果需要改变PaRam参数只需要修改main.c中 edma_object_t EdmaObj = { EDMA3_DRV_TRIG_MODE_MANUAL,//Triger mode SrcBuf, //source address DstBuf1, //destination address 720*2, //Srcbidx 10, //Drcbidx 0, //Srccidx 0, //Dstcidx 10, // Acnt 5, // Bcnt 1, // Ccnt 5, // Bcntload EDMA3_DRV_SYNC_AB //frame sysnc }; // iTcc: use ANY TCC 对象中的参数。 第一种方式是将DDR2 中的SrcBuf[720*480]中的数据抽出5*5的块数据存到DstBuf1[25], SrcBuf[720*480]通过 实验后DstBuf1的数据: 第二种方式是QDMA,通过CPU启动触发字触发。将DDR2中SrcBuf[720*480]的数据从起始地址开始搬5*5块,每触发一次,源地址+5,然后再搬5*5的数据,在中断中改变源地址。 下面是单步调试结果:触发次数可以改变。 第三种方式是自动触发方式,只要使能传输,EDMA会一直工作。 将DDR2中SrcBuf[720*480]的数据从起始地址开始搬5*5块,奇数次传输搬到DstBuf[0][15]的数组里,偶数次传输搬到DstBuf[1][15]中。相当于pingpomg buffer 将整个SrcBuf[720*480]从头到尾办完后,通过设置禁止chain传输,将EDMA停止。 EDMA编程注意: (1)​ LLD的API编写的程序不能放在main()中 (2)​ QDMA编程中要先写触发字函数EDMA3_DRV_setQdmaTrigWord()再写PaRam。
本文档为【EDM3总结】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_990890
暂无简介~
格式:doc
大小:1MB
软件:Word
页数:26
分类:互联网
上传时间:2011-08-15
浏览量:99