基本概念:
DMA:全稱direct memory access,即直接存儲器訪問。dma可以在中央處理器CPU不參與的情況下,實現外設和內存之間的數據直接傳輸,從而提高數據傳輸效率
外設與計算機內存之間的數據傳輸,一般可通過程序查詢方式和中斷方式進行
- 在程序查詢方式時,CPU要反復測試外設狀態,在外設未準備好的情況下,CPU就處于等待狀態,直到外設準備好,才進行數據傳送
- 中斷方式下,每實現一次數據傳送,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傳輸中,傳輸的數據量、傳輸結束的控制信號等
數據流向簡介:
下圖展示的是源外設到目的外設的數據流向:
1、CPU通過APB/AHB總線將DMA具體的配置進行配置,上圖選擇channel0,通過AHB配置傳輸的源地址、目的地址、傳輸的數據量等
2、源外設,發送DMA握手信號之后,DMA才會啟動傳輸,在此之前會等待硬件握手信號
傳輸層次
針對非內存外設的DMA傳輸層次結構:
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傳輸層次結構:
傳輸類型:
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傳輸完成信號
當DMA流控的時候,dma_last信號是會被忽略的,會根據block_ts傳輸完成之后,就會給外設發出dma_finish信號,表示傳輸完成
當外設流控的時候,當外設傳輸最后一塊數據時,就發送dma_last信號給到DMA,DMA收到dma_last信號就知道傳輸的是最后一塊數據,傳輸完成之后發送dma_finish信號給到外設,表示傳輸完成
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模塊可以靜態創建一塊鏈表,也可以動態擴展