HI3531由DMA 發起PCIe 事務
Hi3531 PCIe 控製器內含DMA 控製器,DMA 控製器包含有兩個DMA 通道(一個
DMA 讀通道和一個DMA 寫通道)。PCIe 控製器內包含的DMA 控製器用於大數據量
的存儲器讀寫事務,以提高數據傳輸的速率。
DMA 控製器可以實現如下的存儲器讀寫事務:
DMA 控製寄存器
軟件可通過DMA 控製寄存器來配置DMA 傳輸,也可以通過DMA 控製寄存器啟動和
停止DMA 傳輸。DMA 控製寄存器位於PCIe 控製器的配置寄存器空間內,DMA 控製
寄存器的定義請參考本章的PCIe 寄存器描述。
注意中提到的部分DMA 控製寄存器包含:
DMA_CH_CTRL 寄存器;
DMA_TRANS_SIZE 寄存器;
DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器;
DMA_DAR_LOW 和DMA_DAR_HIGH 寄存器;
DMA_LINK_PT_LOW 和DMA_LINK_PT_HIGH 寄存器。
1. 軟件設置DMA_CH_INDEX[ch_dir]=1,表明後續操作目標寄存器為讀通道控製寄存
器。
2. 軟件設置DMA_TRANS_SIZE=0x400,表明傳輸長度為1024Byte。
DMA 讀/寫通道使能
DMA 通道在係統複位後默認是沒有使能的,要使用PCIe 的DMA 通道,需使能DMA
的讀寫通道。
通過設置DMA_RD_ENGINE_EN[dma_rd_engine_en]為1,使能DMA 讀通道。
通過設置DMA_WR_ENGINE_EN[dma_wr_engine_en]為1,使能DMA 寫通道。
DMA 源地址和目標地址
DMA 寫:源地址(SAR)為本地內存空間,目標地址(DAR)為對端設備內存空間。
DMA 讀:源地址(SAR)為對端設備內存空間,目標地址(DAR)為本地內存空間。
配置DMA 讀或寫通道的DMA_SAR_LOW 和DMA_SAR_HIGH 寄存器可以指定DMA
傳輸的源地址,配置DMA 讀或寫通道的DMA_DAR_LOW 和DMA_DAR_HIGH 寄存
器可以指定DMA 傳輸的目的地址。DMA 源地址和目的地址寄存器請參看PCIe DMA
控製寄存器定義。
DMA 傳輸過程中,源地址和目的地址寄存器隨著傳輸過程而遞增。可以通過讀取源地
址和目的地址寄存器的值來確定DMA 當前傳輸所獲取數據的源地址和當前所寫數據
的目標地址。
DMA 源地址和DMA 目的地址都是雙字節對齊的,因此最低兩比特都必須設置為0。
在傳輸過程中此最低兩比特也一直為0。
DMA 傳輸長度
DMA 讀或寫操作的傳輸長度由DMA 讀或寫通道的DMA_TRANS_SIZE 寄存器來指
定。該寄存器的值表示DMA 請求傳輸的數據的字節數。在DMA 傳輸過程,此寄存器
的值會隨著傳輸過程遞減,可以通過讀取此寄存器確定當前還有多少字節未傳輸。傳
輸成功結束後此寄存器值應該為0。
DMA 傳輸長度取值範圍為:最小為1 個字節,最大為4G 字節。
啟動DMA 傳輸
在配置好DMA 讀通道的控製寄存器之後,通過向
DMA_RD_DOORBELL[rd_doorbell_num]寫入0 來啟動DMA 讀傳輸。
在配置好DMA 寫通道的控製寄存器之後,通過向
DMA_WR_DOORBELL[wr_doorbell_num]寫入0 來啟動DMA 寫傳輸。
停止DMA 傳輸
在DMA 傳輸過程中如果需要停止DMA 傳輸,可以通過如下寄存器控製來手動停止
DMA 讀或者DMA 寫傳輸:
通過向DMA_RD_DOORBELL[dma_rd_stop]寫入1 來停止DMA 讀傳輸。
通過向DMA_RD_DOORBELL[dma_wr_stop]寫入1 來停止DMA 讀傳輸。
如果DMA 傳輸過程中沒有發生錯誤,DMA 傳輸將在所有的數據傳輸完成後自動停
止。
HI_MPI_SYS_SetReg(0x20800A6C,0x00000000);//bit31 0 WRITE DMA_CH_INDEX
HI_MPI_SYS_SetReg(0x20800A78,0x00000010);//DMA_TRANS_SIZE 10
HI_MPI_SYS_SetReg(0x2080097c,0x00000001);//使能寫操作
HI_MPI_SYS_SetReg(0x20800A7c,0xc0000000);// 源地址—低位
HI_MPI_SYS_SetReg(0x20800A80,0x00000000);// 源地址—高位
HI_MPI_SYS_SetReg(0x20800A84,0x0544f000);// 目標地址—低位 PC機申請的物理地址
HI_MPI_SYS_SetReg(0x20800A88,0x00000000);// 目標地址—高位
HI_MPI_SYS_SetReg(0x20800980,0x00000000);//啟動寫操作
最後更新:2017-04-03 08:26:15