天天看點

zynq - ps端的pcie ep功能測試

參考資料:

Zynq UltraScale+ MPSoC PS-PCIe End Point Driver - Xilinx Wiki - Confluence

PCIe Tips and Tricks - Xilinx Wiki - Confluence

1.枚舉

如果硬體連接配接沒有問題,在vivoda中配置好ping,在rc端使用lspci查找裝置,就可以能看到ep節點了。

zynq - ps端的pcie ep功能測試
[email protected]:~# lspci
80:08.0 PCI bridge: Huawei Technologies Co., Ltd. Device d103 (rev 45)
81:00.0 Memory controller: Xilinx Corporation Device a808
           

2.ps端配置

ps端配置注意device id,要和驅動中的ZYNQMP_DMA_DEVID1對應,interrupt settings中斷的設定,有legacy,msi和msi-x三種,應該和rc端有關,如果加載驅動時出現錯誤,看錯誤資訊排查問題。

zynq - ps端的pcie ep功能測試

3.編譯rc端驅動

按上面的參考資料編譯出ps_pcie_dma.ko并加載驅動,成功加載會出現下面5個裝置檔案,如果不成功檢視log排查問題。

[email protected]:~# ls /dev/ps_pcie_
ps_pcie_dmachan0_0  ps_pcie_dmachan2_0  ps_pcie_pio_0
ps_pcie_dmachan1_0  ps_pcie_dmachan3_0
           

4.在kernel中預留ddr空間

因為我們要用dma方式傳輸資料,是以需要在ep端預留一部分記憶體供pcie讀寫使用。在petalinux-config中添加u-boot參數“mem=1024M”,表示kerenl隻使用1G的記憶體。比如我闆子上接的是2G的ddr,ddr位址空間是0~0x7fff ffff。那麼這樣設定後kernel隻使用0~0x3fff ffff這部分的ddr。0x4000 0000~0x7fff ffff這部分的空間是空閑的。

zynq - ps端的pcie ep功能測試

5.測試發送資料

資料中有2個例子,simple_test和pci_pio_test,對應pcie2種傳輸方式。

1.DMA(Direct Memory Access)模式:直接記憶體通路,該模式下資料傳送不是由CPU負責處理,而是由一個DMA控制器來完成,占用較少的CPU資源。

2.PIO(Programmed Input-Output)模式:可程式設計IO,該模式下資料傳送由CPU執行I/O端口指令來處理,占用大量的CPU資源,資料傳輸速度也大大低于DMA模式。

dma方式rc直接将資料寫入ep的ddr中,ep端口不需要運作程式配置,pio方式需要在ep端開啟BAR,然後将BAR中的資料再寫到ddr中。

// 運作例子
./simple_test -c 0 -a 0x40000000 -l 4194304 -d s2c
write return value is 4194304
Total time taken for transferring 4194304 bytes of data is 3300 micro seconds
           

可以看到rc寫4MByte資料到ep,耗時3300us,是以速度達到了1212MByte每秒。

pio傳輸的方式還沒搞明白,如果有懂的歡迎指教。

繼續閱讀