案例說明
案例功能:ARM端基于PCIe總線(開啟PCIe DMA)對FPGABRAM進行讀寫測試。應用程序通過ioctl函數發送命令開啟PCIe DMA傳輸數據后,等待驅動上報input事件;當應用層接收到input事件,說明DMA傳輸數據完成。
ARM端案例位于產品資料“4-軟件資料Demoplatform-demosdma_memcpy_demo”目錄下,FPGA端案例位于產品資料“4-軟件資料DemoFPGA-demosbram_pcie”目錄下,具體說明如下:
表 1
備注:dma_memcpy_demo案例同時支持使用CPU DMA對DDR進行讀寫測試,詳情請查看“基于CPU DMA的DDR讀寫測試”小節。
程序流程如下圖所示。
圖 1
程序原理說明:
ARM端:
采用PCIe DMA方式;
將數據寫入至dma_memcpy/pcie_dma_memcpy驅動申請的連續內存空間(位于DDR);
配置PCIe DMA,如源地址、目標地址、傳輸的數據大小等;
寫操作:通過ioctl函數啟動PCIe DMA,通過PCIe總線將數據搬運至FPGA BRAM;
程序接收驅動上報input事件后,將通過ioctl函數獲取PCIe DMA搬運數據耗時,并計算DMA傳輸速率(即寫速率);
讀操作:通過ioctl函數啟動PCIe DMA,通過PCIe總線將FPGA BRAM中的數據搬運至dma_memcpy/pcie_dma_memcpy驅動申請的連續內存空間(位于DDR);
程序接收驅動上報input事件后,將數據從內核空間讀取至用戶空間,然后校驗數據,同時通過ioctl函數獲取PCIe DMA搬運數據耗時,并計算DMA傳輸速率(即讀速率)。
FPGA端:
實現PCIeEndpoint功能;
處理PCIeRC端發起的PCIeBAR0空間讀寫事務;
將PCIeBAR0讀寫數據緩存至FPGA BRAM中。
案例測試
請將創龍科技TLZU-EVM評估板PCIe(CON25)接口連接至TL3588-EVM評估板PCIeRC(CON21)接口,硬件連接如下圖所示。
圖 2
請將創龍科技TLZU-EVM評估板上電啟動,加載運行FPGA案例"bram_pciebin"目錄下的可執行程序。
請將案例"dma_memcpy_demodtsbin"目錄下的boot-dma-memcpy.img內核鏡像文件拷貝至評估板文件系統。執行如下命令,替換內核鏡像文件至系統啟動卡,評估板重啟生效。
備注:如需固化至eMMC,請將設備節點修改為"/dev/mmcblk0p3"。
Target# dd if=boot-dma-memcpy.imgof=/dev/mmcblk1p3
Target# sync
Target# reboot
圖 3
請將案例"bindma_memcpy_demo"可執行程序和"driverbinpcie_dma_memcpy.ko"PCIe DMA驅動程序拷貝至文件系統任意目錄下。
圖 4
執行如下命令,賦予可執行程序dma_memcpy_demo執行權限。
Target# chmod a+x dma_memcpy_demo
圖 5
進入評估板文件系統,在可執行程序所在目錄執行如下命令查看程序參數。
Target# ./dma_memcpy_demo -h
參數解析:
-a:設置DDR或PCIe地址;
-s:設置傳輸數據大小(單位:Byte);
-c:設置循環讀寫次數;
-d:設置輸入設備;
-v:顯示版本信息;
-h:顯示幫助內容。
圖 6
執行如下命令,查看PCIeBAR空間地址。從下圖可見,PCIeBAR空間映射至0xf0200000地址,大小為128KByte,并查看PCIe設備連接狀態。
備注:若打印信息與"Speed 5GT/s(ok),Width x4(ok)"不一致,可能是接觸不良導致,需斷電后擦拭金手指部分,重新插拔。
Target# lspci -s 01:00.0 -vv
圖 7
進入評估板文件系統執行如下命令,加載PCIe DMA驅動程序。
Target# insmod -f pcie_dma_memcpy.ko
圖 8
執行如下命令,查看事件號。
Target# cat /proc/bus/input/devices
圖 9
圖 10
執行如下命令,調整打印級別,避免調試串口終端打印內核信息影響觀察測試結果。
Target# echo 1 4 1 7 > /proc/sys/kernel/printk
圖 11
執行如下命令,使能PCIe設備。
Target# echo 1 > /sys/class/pci_bus/0000:01/device/0000:01:00.0/enable
圖 12
執行如下命令,將隨機數據先寫入FPGABRAM,再從FPGABRAM讀出。測試完成后,程序將會打印最終測試結果,包含讀寫平均傳輸耗時、讀寫平均傳輸速率、讀寫錯誤統計等信息。
Target# ./dma_memcpy_demo -a 0xf0200000 -s 131072-c 100-d /dev/input/event8
圖 13
表 2
PCIeGen2編碼開銷為8b/10b,PCIeGen2傳輸數據的開銷如下:
(1)物理層:Start(1Byte)、End(1Byte)
(2)數據鏈路層:Sequence(2Byte)、LCRC(4Byte)
(3)傳輸層:Header(12Byte或16Byte)、ECRC(4Byte)
PCIe理論帶寬計算如下:
寫速率:rate = 5Gb/s x num-lanes x 編碼開銷x (MPS/ (MPS + 傳輸數據的開銷))
讀速率:rate = 5Gb/s x num-lanes x 編碼開銷x (RCB/ (RCB + 傳輸數據的開銷))
MaxPayload為128Byte,RCB為64Byte,為了計算協議消耗更高的理論帶寬,取TLP header size =16Byte,因此可計算到PCIeGen2傳輸數據的開銷為28字節。
若num-lanes為2,則計算得到理論速率為:
寫速率:rate = 5Gb/s x 2x 8/10 x (128 / (128 + 28)) ≈840.20MB/s
讀速率:rate = 5Gb/s x 2x 8/10 x (64 / (64 + 28)) ≈712.34MB/s
若num-lanes為4,則計算得到理論速率為:
寫速率:rate = 5Gb/s x 4x 8/10 x (128 / (128 + 28)) ≈1640.4MB/s
讀速率:rate = 5Gb/s x 4x 8/10 x (64 / (64 + 28)) ≈1424.68MB/s
案例編譯(ARM端)
請將產品資料“4-軟件資料Demoplatform-demosdma_memcpy_demo”案例源碼拷貝至Ubuntu工作目錄。
(1)應用程序編譯
進入案例應用程序源碼目錄,執行如下命令,配置應用程序交叉編譯工具鏈環境變量,然后進行編譯,編譯完成將會在當前目錄下生成dma_memcpy_demo可執行程序。
Host# export PATH=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH
Host# make
圖 14
(2)驅動程序編譯
進入案例驅動程序源碼目錄,執行如下命令,配置驅動程序交叉編譯工具鏈環境變量,然后進行編譯,編譯完成將會在當前目錄下生成dma_memcpy.ko、pcie_dma_memcpy.ko驅動程序。
Host# export PATH=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/extra-tools/gcc-linaro-10.2.1-2021.01-x86_64_aarch64-linux-gnu/bin/:$PATH
Host# make KDIR=/home/tronlong/RK3588/rk3588_linux_release_v1.2.1/kernel/
圖 15
(3)設備樹編譯
請將案例"dtssrctl3588-evm-dma-memcpy.dts"設備樹源文件拷貝至LinuxSDK源碼目錄"kernel/arch/arm64/boot/dts/rockchip/"。
圖 16
備注:案例"armdtssrctl3588-evm-dma-memcpy.dts"設備樹源文件主要新增dma_memcpy節點,用于加載dma_memcpy或pcie_dma_memcpy驅動,具體如下圖所示。內核鏡像文件"armdtsbinboot-dma-memcpy.img"已包含tl3588-evm-dma-memcpy.dts編譯生成的設備樹鏡像文件。
圖 17
由于tl3588-evm-dma-memcpy.dts設備樹源文件需要引用reserved-mempcy節點,因此需要新增reserved-mempcy節點別名。進入LinuxSDK源碼目錄,執行如下命令,修改"rk3588-evb7-lp4.dtsi"文件。
Host# vi kernel/arch/arm64/boot/dts/rockchip/rk3588-evb7-lp4.dtsi
圖 18
修改內容如下:
reserved_memory:reserved-memory { //新增內容
圖 19
修改完成后,保存退出,請按照《Debian系統使用手冊》文檔Debian系統鏡像編譯、生成章節,替換設備樹并重新編譯內核,將生成的內核鏡像文件拷貝至評估板文件系統進行固化。該內核鏡像已包含tl3588-evm-dma-memcpy.dts對應的設備樹鏡像文件。
關鍵代碼說明(ARM端)
(1)打開設備節點。
圖 20
(2)寫數據操作。
圖 21
圖 22
圖 23
(3)讀取數據操作。
圖 24
圖 25
基于CPU DMA的DDR讀寫測試
本小節使用dma_memcpy_demo案例,通過CPU DMA對DDR進行讀寫,并計算傳輸速率。
備注:本次測試由CPU對DDR進行讀寫,未使用PCIe總線。
請將案例"bindma_memcpy_demo"可執行程序和"driverbindma_memcpy.ko"驅動程序拷貝至文件系統任意目錄下。
圖 26
執行如下命令,賦予可執行程序dma_memcpy_demo執行權限。
Target# chmod a+x dma_memcpy_demo
圖 27
進入評估板文件系統執行如下命令,加載CPU DMA驅動程序。
Target# insmod -f dma_memcpy.ko
圖 28
執行如下命令,查看事件號。
Target# cat /proc/bus/input/devices
圖 29
圖 30
執行如下命令,調整打印級別,避免調試串口終端打印內核信息影響觀察測試結果。
Target# echo 1 4 1 7 > /proc/sys/kernel/printk
圖 31
執行如下命令,進行DDR讀寫測試。測試完成后,程序將會打印最終測試結果,包含讀寫平均傳輸耗時、讀寫平均傳輸速率、讀寫錯誤統計等信息。其中,寫速率為2575.41MB/s,讀速率為2583.04MB/s。
Target# ./dma_memcpy_demo-a 0x80000000-s 4194304 -c 100-d /dev/input/event8
圖 32
表 3
備注:0x80000000為預留的DDR地址空間,如下圖所示,大小為128MByte。
圖 33?tl3588-evm-dma-memcpy.dts
PCIe通信案例(非DMA方式)
案例說明
案例功能:ARM端通過PCIe總線(非DMA方式)對FPGABRAM進行數據讀寫測試,同時校驗數據和計算讀寫速率。
ARM端案例位于產品資料“4-軟件資料Demobase-demosdevmem_rw”目錄下,FPGA端案例位于產品資料“4-軟件資料DemoFPGA-demosbram_pcie”目錄下,具體說明如下:
表 4
程序流程說明:
(1)ARM端通過PCIe總線將數據寫入FPGA BRAM;
(2)ARM端通過PCIe總線從FPGA BRAM讀取數據;
(3)判斷寫入與讀取數據的正確性,并計算讀寫速率。
圖 34
案例原理說明:
ARM端:
ARM端使用mmap函數對物理地址進行轉換;
可根據指定的訪問操作類型按字節(Byte)、按半字(Halfword)進行訪問。
FPGA端:
實現PCIeEndpoint功能;
處理PCIeRC端發起的PCIeBAR0空間讀寫事務;
將PCIeBAR0讀寫數據緩存至FPGA BRAM中。
案例測試
請將創龍科技TLZU-EVM評估板PCIe(CON25)接口連接至TL3588-EVM評估板PCIeRC(CON21)接口,硬件連接如下圖所示。
圖 35
請將創龍科技TLZU-EVM評估板上電啟動,加載運行FPGA案例"bram_pciebin"目錄下的可執行程序。
評估板默認內核鏡像未支持PCIe RC接口測試,請將產品資料“4-軟件資料DebianKernelimagelinux-5.10.160-[版本號]-[Git序列號]”目錄下boot-enable-pcie.img文件(支持PCIe RC接口測試)拷貝至評估板文件系統,執行如下命令將其固化至系統啟動卡。
備注:若從eMMC啟動系統,請將設備節點"mmcblk1p3"修改為"mmcblk0p3"。
Target# dd if=boot-enable-pcie.img of=/dev/mmcblk1p3
Target# sync
Target# reboot
圖 36
執行如下命令,查看PCIeBAR空間地址。從下圖可見,PCIeBAR空間映射至0xf0200000地址,大小為128KByte,并查看PCIe設備連接狀態。
備注:若打印信息與"Speed 5GT/s(ok),Width x4(ok)"不一致,可能是接觸不良導致,需斷電后擦拭金手指部分,重新插拔。
Target# lspci -s 01:00.0 -vv
圖 37
請將ARM端案例"devmem_rwbin"目錄下的可執行程序devmem_rw拷貝至文件系統任意目錄,在devmem_rw可執行程序所在目錄執行如下命令,查看程序參數。
Target# ./devmem_rw-h
參數解析:
-t:表示測試模式。先寫后讀,并檢驗數據的準確性。
-r:讀模式,從參數"-a
"指定的內存空間地址處,讀出參數"-s "指定長度的數據(以字節為單位)。
-w:寫模式,從參數"-f "指定的文件獲取數據,寫入參數"-a
"指定的內存空間地址。
-a
:指定內存空間地址。
-s :指定數據的長度,以字節為單位。
-o:以字節或半字方式訪問內存空間。
-f :指定文件。用于寫模式測試。
圖 38
執行如下命令,使能PCIe設備。
Target# echo 1 > /sys/class/pci_bus/0000:01/device/0000:01:00.0/enable
圖 39
執行如下命令,將隨機數據先寫入FPGABRAM,再從FPGABRAM讀出,校驗數據并統計讀寫速率。
Target# ./devmem_rw -t -a 0xf0200000-s 131072 -o halfword
圖 40
重復三次測試,調試串口終端打印"Testpass!"信息,表示讀寫測試通過。
備注:由于本案例采用非DMA方式對FPGA BRAM進行數據讀寫測試,可能會出現速率波動較大的情況。
案例編譯(ARM端)
請將產品資料“4-軟件資料Demobase-demosdevmem_rwsrc”案例源碼拷貝至Ubuntu工作目錄。進入案例源碼目錄,執行如下命令進行編譯,編譯完成將會在當前目錄下生成可執行程序。
Host# source /home/tronlong/RK3588/rk3588_linux_release_v1.2.1/debian/sysroots/environment
Host# make CC=aarch64-linux-gnu-gcc
圖 41
關鍵代碼(ARM端)
(1)將內存設備地址映射至虛擬地址。
圖 42
(2)根據指定的操作方式進行數據讀取。
圖 43
(3)根據指定的操作方式進行數據寫入。
圖 44
審核編輯 黃宇
-
FPGA
+關注
關注
1660文章
22408瀏覽量
636201 -
ARM
+關注
關注
135文章
9552瀏覽量
391821 -
瑞芯微
+關注
關注
27文章
792瀏覽量
54277 -
RK3588
+關注
關注
8文章
556瀏覽量
7318
發布評論請先 登錄
全面拆解瑞芯微RK3588:一款撐起8K、AI與邊緣計算的高端ARM芯片
【技術分享】RK3588如何搭建xenomai3+ethercat
一文搞懂?RK3588 PCIe:從硬件資源到拆分配置?+?避坑指南(含腦圖)
瑞芯微 RK3588 平臺 Debian 系統開發案例與使用說明
瑞芯微RK3588與RK3576技術參數詳解
RK這2款旗艦芯片RK3588 PK RK3576,誰是最優選
干貨分享 | RK3588 Ubuntu系統Docker容器使用指南
迅為iTOP-RK3588S開發板/核心板瑞芯微RK3588S處理器6TOPS算力內置NPU
NPU性能深度評測:瑞芯微RK3588、RK3576、RK3568、RK3562
RK3588主板:多元場景的硬核“芯”力量
基于瑞芯微 RK3588 的 ARM 與 FPGA 交互通信實戰指南
評論