AM335X EDMA3

DMA

DMA(Direct Memory Access)直接存储器存取技术是指外部设备不通过CPU直接访问内存,这是CPU可以继续做其他工作。外部设备向DMA控制器发出DMA请求,DMA控制器向CPU发出中断获取总线控制权,访问内存,发出中断释放总线控制权。

EDMA3

增强型直接内存访问(EDMA3)控制器的主要目的是为设备上两个内存映射从属端点之间的用户编程数据传输提供服务。EDMA3控制器由两块组成,EDMA3 channel controller (EDMA3CC)与EDMA3 transfer controller(s) (EDMA3TC)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-naDfmsD9-1627115554471)(C:\Users\ZYuandy\AppData\Roaming\Typora\typora-user-images\image-20210723213910752.png)]

EDMA3 channel controller (EDMA3CC)

特点:

  • 64个DMA channels
  • 8个QDMA channels
  • 64个Direct Mapped Events 分别对应64个channels

在这里插入图片描述

  • 32个Crossbar Mapped Events可以通过配置TPCC_EVT_MUX_x_x寄存器来确定事件映射到哪个channel

在这里插入图片描述

  • 128个PaRAM用于保存Event的参数信息(源地址,目的地址,数据长度等),与channel的关系可以通过DCHMAP_0 to DCHMAP_63寄存器进行配置

  • 3个Queue用于Event的排队,每个Queue最多可以由16个Event排队,默认优先级关系Queue0>Queue1>Queue2,可以通过QUEPRI寄存器来改变三个Queue的优先级
    在这里插入图片描述
    DMA请求有三种触发方式:

  1. 事件触发(Event trigger),就是外部设备自动触发DMA请求,在ERR/EERH寄存器使能某个事件的前提下,该事件编号会存到ER/ERH寄存器中,优先级最高
  2. 手动触发(Manual trigger),ESR/ESRH寄存器一共32位,每一位代表一个Event,比如向第十位写入1就代表手动触发Event number为10的DMA请求,优先级小于事件触发,大于链接触发
  3. 链接触发(Chain trigger),由一个DMA通 道的传输结束来触发和启动DMA通道的下一次传输,优先级最小

事件被触发之后会进入对应的Queue进行排队,若是同时触发,在priority encoder中会按照事件优先级进行选择,哪个Event先进入对应的Queue,规则是Event number越小的Event优先级越高,Event到哪个Queue中排队可以通过DMAQNUM_0 to DMAQNUM_7寄存器进行配置,排队之后会按照FIFO的顺序被处理,按照规定,Queue0上的Event会被提交到TC0(以TR的形式提交),Queue1上的Event会被提交到TC1,Queue2上的Event会被提交到TC2

EDMA3 transfer controller(s) (EDMA3TC)

在这里插入图片描述

EDMA3TC接收到EDMA3CC的请求之后,根据PaRAM中的信息进行数据传输,数据传输完成后会给EDMA3CC返回一个传输完成码(OPT中的TCC),EDMA3CC通过该码,产生传输完成中断或传输错误中断或链接触发

传输模式

EDMA3传输始终以三维形式定义。下图显示了EDMA3传输使用的三个维度。这三个维度定义为:

•第一维-Array(A):一个Array包含ACNT个字节

•第二维-Frame(B):一个Frame包含BCNT个Array

•第三维-block(C):一个Block包含CCNT个Frame

在这里插入图片描述

支持两种传输模式:A-Synchronized Transfers与AB-Synchronized Transfers

A-Synchronized Transfers:

在这里插入图片描述

一个Array作为一个TR,所以需要发送ACNT * BCNT * CCNT次请求,Array的地址可以通过同一Frame中的前一个Array的地址+SRCBIDX/DSTBIDX得到,如果是第一个Array,可以通过前一个Frame的最后一个Array的地址+SRCCIDX/DSTCIDX得到

AB-Synchronized Transfers:

在这里插入图片描述

一个Frame作为一个TR,所以需要发送ACNT * BCNT * CCNT次请求,Array的地址可以通过同一Frame中的前一个Array的地址+SRCBIDX/DSTBIDX得到,如果是第一个Array,可以通过前一个Frame的第一个Array的地址+SRCCIDX/DSTCIDX得到

PaRAM

在这里插入图片描述
在这里插入图片描述

PaRAM描述:

在这里插入图片描述

  1. OPT传输配置选项:
    在这里插入图片描述

SAM:源地址模式,0表示递增(INCR)模式,源地址在一个Array里是递增的,1表示固定地址(CONST)模式:源地址在一个FIFO中循环

DAM:目的地址模式,0表示递增(INCR)模式,目的地址在一个Array里是递增的,1表示固定地址(CONST)模式:目的地址在一个FIFO中循环

FWID:FIFO深度,当SAM/DAM中至少一个设置为固定模式时生效

SYNCDIM:设置传输模式,0表示A-Synchronized Transfers,1表示AB-Synchronized Transfers

STATIC:静态PaRAM配置,0表示非静态,TR被提交后PaRAM set通过 LINK的方式更新,1表示静态,TR被提交后PaRAM set不会通过 LINK的方式更新

TCCMODE:传输完成编码模式,0表示正常完成模式,所有的TR都传输完毕之后才算传输完成,1表示提前完成模式,一个TR传输完毕就算传输完成

TCC:传输完成码,有EDMA3TC返回,与ITCINTEN、TCINTEN、TCCHEN配合使用

ITCINTEN:中间传输完成中断启用

TCINTEN:传输完成中断启用

TCCHEN:传输完整链接启用

通道链接触发配置:

TCINTEN=1、ITCINTEN=0:最后一个TR传输完成后,触发链接传输(CER/CERH寄存器中的第TCC位被自动置1),channel编号为TCC的channel将会被传输

TCINTEN=0、ITCINTEN=1:每个内部TR传输完成后,触发链接传输(CER/CERH寄存器中的第TCC位被自动置1),channel编号为TCC的channel将会被传输

TCINTEN=1、ITCINTEN=1:每个TR传输完成后,触发链接传输(CER/CERH寄存器中的第TCC位被自动置1),channel编号为TCC的channel将会被传输

中断触发配置:

TCINTEN=1、ITCINTEN=0:最后一个TR传输完成后,产生传输完成中断(IPR/IPRH寄存器中的第TCC位被自动置1)

TCINTEN=0、ITCINTEN=1:每个内部TR传输完成后,产生传输完成中断(IPR/IPRH寄存器中的第TCC位被自动置1)

TCINTEN=1、ITCINTEN=1:每个TR传输完成后,产生传输完成中断(IPR/IPRH寄存器中的第TCC位被自动置1)

  1. SRC:32位源地址

  2. DST:32位目的地址

  3. ACNT:Array中的字节数量

  4. BCNT:Frame中的Array数量

  5. CCNT:Block中的Frame数量

  6. BCNTRLD:BCNTRLD是一个16位无符号值,用于在A-Synchronized Transfers中的最后一个数组后重新加载BCNT字段,每次传输一个Array后,BCNT会自减,减到零之后会使用BCNTRLD值重新加载BCNT的值

  7. LINK:EDMA3CC提供了一种称为linking的机制,用于在当前PaRAM set自然终止时(即count字段减为零之后),重新加载新的PaRAM set,16位的LINK指定参数中的字节地址偏移量,在链接期间,EDMA3CC从中加载/重新加载下一个PaRAM set

    NOTE:linking是一个channel的数据传输结束之后,加载另一个PaRAM set,并且在同一个channel上进行传输。chaining是一个channel的数据传输结束之后,跑到另一个channel上传输数据,channel发生了改变

参数更新

在传输过程中参数会改变,B-Update就是BCNT的自减,每传输一个Array之后会自减,C-Update就是CCNT的自减,每传输一个Frame之后会自减,上图展示了A-Synchronized Transfers与AB-Synchronized Transfers模式下,在传输过程中哪些参数发生了改变

内存映射寄存器

EDMA3通道控制器内存映射寄存器分为三大类:

1.全局寄存器(Global registers)

2.全局区域通道寄存器(Global region channel registers)

3.阴影区通道寄存器(Shadow region channel registers)

前两个都是正常的寄存器,阴影区域通道寄存器需要解释一下,一共有八块阴影区域,个人理解是全局区域复制了八份,寄存器内容是一样的,但是地址不同,这样做的目的是满足某些场景的需求,例如在多核场景下,为每一个核分配一个单独的阴影区域,这样其中一个阴影区域中的配置就不会影响到其他内核,起到了屏蔽的作用,下图是阴影区域中的寄存器的地址

在这里插入图片描述
在这里插入图片描述

八个阴影区域(Shadow region)的访问每个都由DRAEn/DRAEHn寄存器控制,每个寄存器有32位,分别对应着32个channel,向DRAEn/DRAEHn寄存器第m位写1表示可以通过阴影区域n访问channel number为m的channel

中断

EDMA3中断分为两类:传输完成中断和错误中断

在这里插入图片描述

发送流程

步骤1.启动DMA/QDMA信道

  (a) 确定要使用的信道类型(QDMA或DMA)

  (b) 通道映射

​    (i) 如果使用QDMA信道,则使用信道映射到的参数集编号和触发字对QCHMAP进行编程

    (ii)如果使用DMA信道,则使用信道映射到的参数集编号对DCHMAP进行编程

  (c) 如果通道在阴影区域的上下文中使用,请确保该区域的DRAE/DRAEH设置正确,以允许对阴影区域内存映射中的事件寄存器和中断寄存器中的位进行读写访问。此过程中的后续步骤应使用相应的阴影区域寄存器来完成

  (d) 确定使用的触发类型

    (i) 如果外部事件用于触发(DMA通道),则通过写入EESR/EESRH来启用EER/EERH中的相应事件

    (ii)如果使用QDMA通道,通过写入QEESR启用QEER中的通道

  (e) 队列设置

    (i) 如果使用QDMA通道,请设置QDMAQNUM以将通道映射到相应的事件队列

    (ii)如果使用DMA信道,则设置DMAQNUM以将事件映射到相应的事件队列

步骤2.参数设置

  (a) 编程与通道相关的参数集编号。请注意,如果是QDMA通道,则配置为触发字的PaRAM条目将写入最后一个,或者,在写入触发字之前启用QDMA通道(上面的步骤1-b-ii)有关不同类型传输的参数集字段设置,请参见EDMA传输示例。参见链接部分(第11.3.8节)和中断完成(第11.3.9节)关于如何设置最终/中间完工链和/或中断

步骤3.中断设置

  (a) 通过写入IESR/IESRH启用IER/IERH中的中断。

  (b) 确保在设备中断控制器中正确启用EDMA3CC完成中断(全局或阴影区域中断)。

  (c) 确保设备中断控制器中的EDMA3CC完成中断(指全局中断或阴影区域中断)已正确启用。

  (d) 正确设置中断控制器以接收预期的EDMA3中断。

步骤4.启动转移

  (a) 此步骤高度依赖于事件触发器源:

    (i) 如果源是来自外设的外部事件,则外设将能够开始生成可锁定到ER传输的相关EDMA3事件。

    (ii)对于QDMA事件,写入触发字(上述步骤2-a)将启动传输。

    (iii)手动触发的传输将通过写入事件集寄存器(ESR/ESRH)来启动。

    (iv)当先前的传输返回等于链接通道号的传输完成代码时,链触发事件启动。

步骤5.等待完成

  (a) 如果中断如上述步骤3所述被启用,则每当传输完成导致在中断挂起寄存器(IPR/IPRH)中设置相应位时,EDMA3C将向CPU生成一个完成中断。必须通过写入ICR\ICRH中的相应位来清除IPR\IPRH中的设置位。

  (b) 如果轮询完成(设备控制器中未启用中断),则应用程序代码可以等待在IPR\IPRH中设置的预期位。同样,在为相同的传输完成码值执行下一组传输之前,必须通过ICR\ICRH手动清除IPR\IPRH中的设置位。

参考资料:am335x数据手册

资料下载地址:am335x数据手册

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值