1. DMA外設(shè)特點(diǎn):
1. DMA引擎擁有一個(gè)靈活的指令設(shè)置DMA的傳輸;
2. 擁有8個(gè)cache線,每一個(gè)cache線寬度是4個(gè)字;
3. 擁有8個(gè)可以并行的DMA通道線程;
4. 擁有8個(gè)中斷給中斷控制器;
5. 擁有8個(gè)DMA觸發(fā)事件并且可以編碼控制;
6. 128個(gè)(64bit)的MFIFO,在傳輸?shù)臅r(shí)候讀寫端可寫入到此FIFO;
7. 支持任意內(nèi)存到內(nèi)存的傳輸;
整個(gè)系統(tǒng)中的DMA控制器如圖1所示:
圖1 DMA控制器系統(tǒng)圖
DMAC包含一個(gè)指令處理單元,其能夠編碼控制DMA傳輸,每一個(gè)線程包含一個(gè)獨(dú)立的狀態(tài)機(jī)處理各自的DMA事件,包括通道仲裁,通道優(yōu)先級(jí)。
當(dāng)一個(gè)通道線程執(zhí)行加載或者存儲(chǔ)指令的時(shí)候控制器會(huì)將指令增加到讀隊(duì)列和寫隊(duì)列中,控制器使用這些隊(duì)列來存儲(chǔ)指令,并且按隊(duì)列指令順序在AXI總線上完成傳輸。
2. DMA在AXI總線上傳輸:
所有的DMA傳輸使用AXI接口移動(dòng)數(shù)據(jù),包括片上內(nèi)存的移動(dòng),DDR內(nèi)存,以及PL上的從外設(shè)內(nèi)存。PL端的從外設(shè)正常連接到DMAC外設(shè)接口上控制其數(shù)據(jù)流。DMAC在PS端可以訪問到IOPs,但是正常情況下不會(huì)使用,因?yàn)檫@些路徑不會(huì)提供數(shù)據(jù)流信號(hào)。DMAC數(shù)據(jù)路徑正常使用情況如圖2所示,沒一個(gè)AXI路徑可以執(zhí)行一個(gè)讀或者一個(gè)寫,其中擁有好多組合,典型的DMA傳輸有:
內(nèi)存到內(nèi)存的傳輸(片上內(nèi)存到DDR內(nèi)存);
內(nèi)存到PL端外設(shè)或者PL端外設(shè)到內(nèi)存(DDR內(nèi)存到PL端外設(shè))。
圖2 數(shù)據(jù)流傳輸
3. DMA的管理:
DMAC實(shí)時(shí)操作時(shí),用戶可以通過下面的指令設(shè)置DMA的傳輸:
DMAGO:開始一個(gè)用戶指定通道的DMA傳輸;
DMASEV:用戶指定的一個(gè)事件或者中斷發(fā)生時(shí)給出信號(hào);
DMAKILL:終止一個(gè)線程。
當(dāng)DMA管理器接受到一個(gè)從APB從接口的指令后,會(huì)等待若干個(gè)時(shí)鐘周期,在執(zhí)行指令之前(pipeline是處于忙的狀態(tài),在執(zhí)行其他指令)。
4. 多通道數(shù)據(jù)FIFO(MFIFO)
MFIFO是一個(gè)當(dāng)前所有活動(dòng)通道共享的,基于先進(jìn)入先服務(wù)的共享資源。對(duì)于編程角度來講,它是以份額深度可變的并行的FIFO集合,每個(gè)通道都有一個(gè)FIFO,但是所有FIFO的總深度不能超多MFIFO的大小,DMAC的MFIFO深度最大為128個(gè)64bit的大小。
5. 事件和中斷:
DMAC支持16個(gè)事件,開始的8個(gè)事件是中斷信號(hào),IRQs[7:0],這8個(gè)中斷都會(huì)輸出到PS或者PL的中斷控制器。這些事件使用內(nèi)部的DMA引擎通道與通道之間的傳輸。EMAC的中斷事件表如圖3所示。
圖3 事件與中斷
DMA的配置實(shí)例
配置DMA做內(nèi)存到內(nèi)存的傳輸實(shí)例。
DMA配置步驟:
1. 初始化dma的命令數(shù)據(jù)結(jié)構(gòu),主要配置傳輸源地址,目的地址,傳輸長(zhǎng)度,burst的大小等信息;
2. 通過DMA的ID信息,找到DMA外設(shè)信息;
3. 初始化dma的數(shù)據(jù)結(jié)構(gòu);
4. 連接到硬件中斷,將GIC中斷映射到中斷向量表中;
5. 通過GIC的ID信息,找到GIC外設(shè)信息;
6. 鏈接DMA中斷和GIC,將DMA中斷映射到GIC控制器上;
7. 時(shí)能GIC中斷;
8. 使能硬件中斷;
9. 設(shè)置中斷服務(wù)函數(shù)的映射配置;
10. 開始DMA的傳輸;
11. 等待DMA的傳輸完成;
程序源碼:
XDmaPs_Config *DmaConfigPtr; XScuGic_Config *GicConfigPtr; XDmaPs_Cmd DmaCmd; volatile int Checked = 0; int Index = 0; memset(&DmaCmd, 0, sizeof(XDmaPs_Cmd)); DmaCmd.ChanCtrl.SrcBurstSize = 4; DmaCmd.ChanCtrl.SrcBurstLen = 4; DmaCmd.ChanCtrl.SrcInc = 1; DmaCmd.ChanCtrl.DstBurstSize = 4; DmaCmd.ChanCtrl.DstBurstLen = 4; DmaCmd.ChanCtrl.DstInc = 1; DmaCmd.BD.SrcAddr = (u32) Src; DmaCmd.BD.DstAddr = (u32) Dst; DmaCmd.BD.Length = DMA_LENGTH * sizeof(int); //find device DmaConfigPtr = XDmaPs_LookupConfig (XPAR_XDMAPS_1_DEVICE_ID); //config xdmaps data XDmaPs_CfgInitialize(&Dma,DmaConfigPtr,DmaConfigPtr->BaseAddress); //config gic //config hardware interrupt Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,(void *)&Gic); //find device GicConfigPtr = XScuGic_LookupConfig (XPAR_SCUGIC_SINGLE_DEVICE_ID); //config gic data XScuGic_CfgInitialize(&Gic,GicConfigPtr,GicConfigPtr->CpuBaseAddress); //connect gic handler XScuGic_Connect(&Gic,XPAR_XDMAPS_0_FAULT_INTR,(Xil_InterruptHandler)XDmaPs_FaultISR, (void *)&Dma); XScuGic_Connect(&Gic,DMA_DONE_INTR_0,(Xil_InterruptHandler)XDmaPs_DoneISR_0, (void *)&Dma); //enable gic XScuGic_Enable(&Gic,XPAR_XDMAPS_0_FAULT_INTR); XScuGic_Enable(&Gic,DMA_DONE_INTR_0); //enable hardware interrupt Xil_ExceptionEnable(); //handler connect XDmaPs_SetDoneHandler(&Dma,0,(XDmaPsDoneHandler)DmaDoneHandler,(void *)&Checked); /* Initialize source */ for (Index = 0; Index
編輯:hfy
-
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
100743 -
DDR內(nèi)存
+關(guān)注
關(guān)注
0文章
20瀏覽量
6867
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論