dw_axi_dmac简介

参考资料:
【注】:关于dw_axi_dmac的理解是我个人理解,无法保证理解的正确性
 
基本概念:
DMA:全称direct memory access,即直接存储器访问。dma可以在中央处理器CPU不参与的情况下,实现外设和内存之间的数据直接传输,从而提高数据传输效率
0
 
外设与计算机内存之间的数据传输,一般可通过程序查询方式和中断方式进行
  1. 在程序查询方式时,CPU要反复测试外设状态,在外设未准备好的情况下,CPU就处于等待状态,直到外设准备好,才进行数据传送
  2. 中断方式下,每实现一次数据传送,CPU都要进入中断处理程序、保护断点、保护现场、恢复现场、返回主程序的操作
这两种方式都是在CPU的控制下,通过CPU执行指令来完成的。数据传送方向为外设->CPU->内存。这两种方式没传送一字节都需要耗用较长时间
 
使用CPU搬运外设数据的缺点:
  • CPU的工作速度与外设的工作速度相差很大,降低系统的效率
  • CPU操作一次总线只能进行一次存取
  • 搬运数据时需要先把数据放在寄存器,然后再从寄存器搬到另一个地址
  • 外设数据类型繁多,CPU无法直接存取,需要进行格式转换
 
使用DMA搬运数据的效果:
  • 多通道同时可以传输,提高搬运效率
  • 基于burst类型传输,操作一次总线可进行多个数据的读写
  • 搬运外设数据时,数据可先存放在通道内部的fifo,再转发
  • 可以根据外设的数据格式设置后进行读写搬运数据
 
DMA概念介绍:
1、源外设:DMA搬运数据的起点,读取数据的地方
2、目的外设:DMA搬运数据的终点,写入数据的地方
3、通道channel:DMA多个通道,每个通道配置后都可以进行数据的搬运。可理解为传输数据的管道
4、master接口:作为master访问读写数据的接口,一般使用AXI接口
5、slave接口:CPU读写配置DMA的接口,一般使用AHB或者APB
6、硬件握手:外设与DMA交互时的握手信号,例如dma_req、dma_single、dma_last等信号
7、流控:决定DMA传输中,传输的数据量、传输结束的控制信号等
 
数据流向简介:
下图展示的是源外设到目的外设的数据流向:
0
1、CPU通过APB/AHB总线将DMA具体的配置进行配置,上图选择channel0,通过AHB配置传输的源地址、目的地址、传输的数据量等
2、源外设,发送DMA握手信号之后,DMA才会启动传输,在此之前会等待硬件握手信号
 
传输层次
针对非内存外设的DMA传输层次结构:
0
DMA传输中,分为block为传输,对应的就是Block Transfer level,DMA Transaction Level的Burst Transaction指的是外设配置的channel CTL寄存器中的msize,会根据msize的设置进行burst/signal传输;AMBA Transfer Level相当于AXI总线传输层次上面的,这个跟arlen/awlen的设置相关。如果想自己设置可通过channel CTL寄存器中的awlen/arlen设置,如果没设置或者设置异常则会由dma随机设置。
针对内存外设的DMA传输层次结构:
0
 
传输类型:
DMA的作用就是实现数据的直接传输,主要涉及四种情况的数据传输。四种传输情况如下:
1、外设到内存
2、内存到外设
3、外设到外设
4、内存到内存
上面四种传输情况,可根据具体的使用情况分为两种流控方式:DMA流控、外设流控
 
DMA硬件握手信号:
1、dma_req:外设burst请求信号
2、dma_singal:外设single请求信号
3、dma_last:外设流控时信号有效,指示此次传输为最后一次burst/single传输
4、dma_ack:dma回应外设信号
5、dma_finish:dma传输完成信号
 
0
当DMA流控的时候,dma_last信号是会被忽略的,会根据block_ts传输完成之后,就会给外设发出dma_finish信号,表示传输完成
当外设流控的时候,当外设传输最后一块数据时,就发送dma_last信号给到DMA,DMA收到dma_last信号就知道传输的是最后一块数据,传输完成之后发送dma_finish信号给到外设,表示传输完成
0
 
DMA传输类型:
DMA single block:
contiguous:连续地址访问的方式,按照地址递增的方式传输数据
 
DMA multi blocks传输:
shadow register:阴影寄存器方式,block传输之前会将信息重新从寄存器中读取再进行传输
auto-reload:自动重载方式,每一个block传输开始前重新加载初始传输信息,重新传输
lllp:链表方式进行multi-block类型传输时,下一个block传输的信息会存储在链表指向的地址中
 
 
对DMA不同传输方式的理解:
1、contiguouts进行源地址、目的地址递增的数据传输,最常见的就是读写memory的方式
2、atuo-reload是传输完成之后又会回到起始状态,加载的数据量、源地址和目的地址都不变
3、shadow和llp都需要将传输block信息配置好,区别是llp要分配一块内存,但可以构造较多的即将传输的block信息,shadow不会用到系统内存,但只能提前构造下一块传输的block信息
4、llp模块可以静态创建一块链表,也可以动态扩展
 
 
posted @ 2024-03-24 14:11  lethe1203  阅读(440)  评论(0编辑  收藏  举报