本原創文章由深圳市小眼睛科技有限公司創作,版權歸本公司所有,如需轉載,需授權并注明出處(www.meyesemi.com)
1.案例簡介
案例功能描述:ARM端利用 PCIe總線對 FPGA的 DRAM執行讀寫操作。應用程序通過 ioctl函數觸發 DMA數據傳輸后,將等待驅動程序發出的 input事件作為響應。應用程序接收到該事件時,表示 DMA數據傳輸已經結束。
2.測試程序執行流程
(1)ARM端
1.將數據寫至 dma_memcpy驅動申請的連續內存空間(位于 DDR)。配置 DMA,如源地址、目標地址、傳輸的數據大小等;
2.寫操作:通過 ioctl函數啟動 DMA,通過 PCIe總線將數據搬運至 FPGA DRAM;程序接收驅動上報 input事件后,將通過 ioctl函數獲取 DMA搬運數據耗時,并計算DMA寫速率;
3.讀操作:通過 ioctl函數啟動 DMA,通過 PCIe總線將 FPGA DRAM中的數據搬運至 dma_memcpy驅動申請的連續內存空間(位于 DDR);程序接收驅動上報 input事件后,將數據從內核空間讀取至用戶空間,然后校驗數據,同時通過 ioctl函數獲取DMA搬運數據耗時,并計算 DMA讀速率。
(2) FPGA端
1.實現 PCIe Endpoint功能;
2.處理 PCIe RC端發起的 PCIe BAR0空間讀寫事務;
3.將 PCIe BAR0讀寫數據緩存至 FPGA DRAM中。
3.操作流程
?打開終端,將本案例 bin目錄下( 05-開發資料 \軟件開發資料\linux_demo\mes_fpga_dma_memcpy_demo\bin ) 的 可 執 行 程 序mes_dma_memcpy_demo拷貝至開發板文件系統(源碼可以在 src路徑下查看)。#修改 Linux內核日志的顯示級別,內核的日志級別被設置為只顯示緊急或更高級別的消息
echo 1 4 1 7 > /proc/sys/kernel/printk
在終端執行如下指令,切換到 mes_dma_memcpy_demo可執行程序所在目錄
#切換到 mes_fpga_fspi_demo可執行程序所在目錄
cd ‘可執行文件所在目錄’
#查看 mes_dma_memcpy_demo是否在該目錄下
ls
若可執行文件 mes_dma_memcpy_demo在當前目錄下,則修改可執行文件的權限#修改文件權限
chmod 777 mes_dma_memcpy_demo
#查詢是否修改成功
ls -ld mes_dma_memcpy_demo
查詢確認文件修改權限成功后,執行 ./mes_dma_memcpy_demo -h可以查看該程序的幫助信息
#查看幫助信息
./mes_dma_memcpy_demo -h #-a:設置 PCIe 地址; #-s:設置傳輸數據大小(單位:Byte); #-c:設置循環讀寫次數; #-d:設置輸入設備;#-v:顯示版本信息; #-h:顯示幫助內容。 執行結果如下圖:
?執行以下命令,查看 PCIe BAR 空間地址。從下圖可見,PCIe BAR 空間映射至 0xf0200000 地址,大小為 64KByte,并查看 PCIe 設備連接狀態。
lspci -s 0002:21:00.0 -vv
?執行以下命令,使能 PCIe設備。
echo 1 > /sys/class/pci_bus/0002\:21/device/0002\:21\:00.0/enable
應用程序通過 ioctl函數發送命令開啟 DMA傳輸數據后,等待驅動上報 input事件;當應用層接收到 input事件,說明 DMA傳輸數據完成。執行以下指令以查看 input輸入事件接口。如圖所示,input事件接口為/dev/input/event0。
evetest
?
?執行以下指令,將隨機生成的數據寫入 FPGA的 DRAM,隨后從 FPGA的 DRAM中讀取數據。測試結束后,通過/dev/input/event0接收事件通知,輸出測試結果,其中包括平均讀寫時間、平均傳輸速率以及讀寫錯誤數量等統計信息。執行結果如下圖。./dma_memcpy_demo -a 0xf0200000 -s 65536 -c 100 -d /dev/input/event6#這里的 event0根據 evetest查詢到的結果更改。