引言
在涉及Xilinx Zynq UltraScale+ MPSoC的項(xiàng)目中,實(shí)現(xiàn)設(shè)備間高速、低延遲的數(shù)據(jù)傳輸往往是核心需求之一。PCIe(尤其PS側(cè))結(jié)合DMA(直接內(nèi)存訪問)正是滿足這類需求的理想技術(shù)方案。
在近期支持的客戶項(xiàng)目中,其核心需求在于:在一款PCB單板上,集成兩顆Zynq MPSoC器件,并利用其PS側(cè)的PCIe控制器,直接構(gòu)建點(diǎn)對(duì)點(diǎn)DMA數(shù)據(jù)傳輸鏈路,從而避免引入額外的PCIe交換芯片。為了驗(yàn)證該方案的可行性并積累經(jīng)驗(yàn),我們使用兩塊ZCU102開發(fā)板成功搭建并測(cè)試了一個(gè)工作Demo。
這篇文章將聚焦這一實(shí)戰(zhàn)過程,手把手帶你完成:環(huán)境搭建、硬件配置、驅(qū)動(dòng)移植、系統(tǒng)編譯到最終的上板測(cè)試驗(yàn)證,目標(biāo)是幫你快速在你的MPSoC項(xiàng)目上實(shí)現(xiàn)類似的高速DMA互連!
一、實(shí)戰(zhàn)準(zhǔn)備:軟硬件環(huán)境搭建
1.1硬件準(zhǔn)備
開發(fā)板:兩塊Xilinx ZCU102開發(fā)板。
連接線:一根PCIe公對(duì)公延長(zhǎng)線纜。
角色分配
板卡1:配置為RC(Root Complex)。
板卡2:配置為EP(Endpoint)。
物理連接:將兩塊板的PS側(cè)PCIe插槽通過延長(zhǎng)線纜直接相連(如下圖所示)。

1.2 軟件準(zhǔn)備
軟件版本
Vivado:2021.2(用于硬件設(shè)計(jì)和比特流生成)。
PetaLinux:2021.2(用于嵌入式Linux系統(tǒng)構(gòu)建)。
1.3 驅(qū)動(dòng)準(zhǔn)備
(Xilinx PCIe Root and EndPoint - Xilinx Wiki - Confluence[1])我們需對(duì)其進(jìn)行交叉編譯以生成適用于ARM64架構(gòu)的內(nèi)核模塊(.ko)。
注:
[1]https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/85983409/Xilinx+PCIe+Root+and+EndPoint(復(fù)制到瀏覽器打開)

二、詳細(xì)實(shí)現(xiàn)過程拆解
2.1 硬件設(shè)計(jì)(RC端配置-Vivado)
① 創(chuàng)建block design后,添加“Zynq Ultrascale+ MPSoC” IP。
② 運(yùn)行Block automation,進(jìn)行基礎(chǔ)配置。
③ 注意將自動(dòng)生成的“maxihpm0_fpd_aclk”和“maxihpm1_fpd_aclk”與“pl_clk0”連線,否則會(huì)導(dǎo)致后面validate不通過。
④ Vivado通常已自動(dòng)分配管腳,默認(rèn)模式為RC,使用GT Lane 0。在“IO Configuration”的頁(yè)面可以看到,PCIE默認(rèn)配置為Gen2 x1,其他GT Lane分別配置給DP/USB3.0/SATA。本實(shí)驗(yàn)使用默認(rèn)配置。

⑤ PCIE高級(jí)配置,勾選“Switch To Advanced Mode”。
確保Class Code值設(shè)置為0x060400(代表PCI-to-PCI Bridge)。如果使用錯(cuò)誤的類代碼,Linux在枚舉時(shí)可能導(dǎo)致BAR分配失敗!其余高級(jí)配置一般可用默認(rèn)值。

⑥ 配置完成后,按照“Generate Output Products” ->“Create HDL Wrapper”->“Generate Bitstream”的流程。成功生成比特流后,導(dǎo)出.xsa文件,用于PetaLinux系統(tǒng)構(gòu)建。
2.2 構(gòu)建Linux系統(tǒng)(RC端-Petalinux)
① petalinux工程創(chuàng)建
petalinux-create --type project -s xilinx-zcu102-v2021.2-final.bsp -n zcu102_rc
② 導(dǎo)入硬件描述(.xsa)
petalinux-config -- get-hw-description = (path of zcu102_rc.xsa)
③ 配置Linux內(nèi)核
petalinux-config -c kernel
由于內(nèi)核配置中默認(rèn)開啟了ps PCIe的DMA,為了避免后面安裝外部驅(qū)動(dòng)時(shí)沖突,這里需要去掉Xilinx PS PCIe DMA support的默認(rèn)勾選。

④ 編譯工程
petalinux-build
⑤ 打包文件
petalinux-package --boot --fsbl zynqMP_fsbl --u-boot u-boot.elf --force
生成BOOT.BIN、image.ub、boot.scr等關(guān)鍵啟動(dòng)文件。將上述生成的啟動(dòng)文件復(fù)制到SD卡的boot分區(qū)。
2.3 編譯移植PS PCIE DMA驅(qū)動(dòng)(RC端)
① 獲取并修改驅(qū)動(dòng)源碼:從Xilinx Wiki獲取驅(qū)動(dòng)源碼。由于官方提供的驅(qū)動(dòng)源碼是在X86 host上編譯執(zhí)行的,還需要將其修改為可在ARM上執(zhí)行的ko文件,即交叉編譯。
② 修改Makefile,將KERNEL_DIR指定為本地內(nèi)核代碼所在路徑。內(nèi)核路徑示例(請(qǐng)根據(jù)實(shí)際路徑修改):
/home/your_user_name/petalinux_pro/peta_2021/zcu102_rc/build/tmp/work/zynqmp_generic-xilinx-linux/linux-xlnx/5.10+gitAUTOINC+568989d441-r0/linux-zynqmp_generic-standard-build。
③ 在驅(qū)動(dòng)源碼目錄執(zhí)行make命令,成功編譯后會(huì)生成ps_PCIe_dma.ko內(nèi)核模塊文件。
④ 將編譯生成的ko文件、apps路徑下的simple_test應(yīng)用文件以及petalinux打包好的Boot.bin、image.ub和boot.scr都拷貝至SD。
2.4 硬件準(zhǔn)備(EP端)
① vivado配置(類似RC,但關(guān)鍵點(diǎn)不同)
a.在IO configuration中明確將PCIe模式設(shè)置為Endpoint。
b.關(guān)鍵修改,將Device ID修改為“0XA808”。此值必須與驅(qū)動(dòng)源碼中ZYNQMP_DMA_DEVID1定義的預(yù)期設(shè)備ID嚴(yán)格匹配,否則驅(qū)動(dòng)無(wú)法正常運(yùn)行。

② 生成并導(dǎo)出硬件設(shè)計(jì)。
③ 創(chuàng)建EP端Boot文件,在vitis中:基于導(dǎo)出的.xsa文件新建Vitis平臺(tái)工程。創(chuàng)建一個(gè)簡(jiǎn)單的Hello World應(yīng)用程序工程(僅用于加載運(yùn)行基本固件)。將其復(fù)制到EP板SD卡。
2.5上板實(shí)測(cè)
① 上電啟動(dòng):
將準(zhǔn)備好的SD卡(含boot文件)分別插入兩塊ZCU102。
兩塊板均設(shè)置為SD卡啟動(dòng)模式。
連接RC板的串口到主機(jī)終端(如PuTTY或minicom)。
② EP枚舉觀察(RC串口輸出):
給兩塊板上電。
在RC板的串口終端中,你應(yīng)該能看到類似XXX:PCI host bridge /PCIe@fd0e0000 ranges:和XXX:PCIe:Link up的日志信息,這表明PCIe鏈路已成功建立并枚舉到EP設(shè)備。

③ 加載驅(qū)動(dòng)(RC端命令):
在RC板的Linux命令行中,進(jìn)入存放驅(qū)動(dòng)的目錄。
執(zhí)行:insmod ps_pcie_dma.ko
檢查設(shè)備節(jié)點(diǎn):成功加載后,/dev/PCIe(例如/dev/ps_pcie_epdma0)等設(shè)備節(jié)點(diǎn)應(yīng)被創(chuàng)建。

④ 運(yùn)行DMA測(cè)試程序(RC端命令):
執(zhí)行命令進(jìn)行傳輸測(cè)試(以下僅為示例命令,具體參數(shù)需看程序說(shuō)明):./simple_test

⑤ 測(cè)試結(jié)果解讀:
程序運(yùn)行后,終端會(huì)打印傳輸?shù)乃俣葦?shù)據(jù)。
在我們的測(cè)試中(Gen2 x1鏈路):
RC -> EP(寫入EP內(nèi)存):傳輸4MB數(shù)據(jù),平均速度約為372MB/s。
EP -> RC(寫入RC內(nèi)存):傳輸4MB數(shù)據(jù),平均速度約為378MB/s。
本文詳細(xì)展示了如何利用兩塊Xilinx Zynq UltraScale+ MPSoC ZCU102開發(fā)板,通過配置其PS側(cè)PCIe控制器分別作為RC和EP,最終實(shí)現(xiàn)了兩者之間基于DMA驅(qū)動(dòng)的高速數(shù)據(jù)互傳功能。該方案驗(yàn)證了在MPSoC設(shè)計(jì)中直接利用片上PCIe資源構(gòu)建高速點(diǎn)對(duì)點(diǎn)鏈路的可行性。
關(guān)于安富利
安富利是全球領(lǐng)先的技術(shù)分銷商和解決方案提供商,在過去一個(gè)多世紀(jì)里一直秉持初心,致力于滿足客戶不斷變化的需求。通過遍布全球的專業(yè)化和區(qū)域化業(yè)務(wù)覆蓋,安富利可在產(chǎn)品生命周期的每個(gè)階段為客戶和供應(yīng)商提供支持。安富利能夠幫助各種類型的公司適應(yīng)不斷變化的市場(chǎng)環(huán)境,在產(chǎn)品開發(fā)過程中加快設(shè)計(jì)和供應(yīng)速度。安富利在整個(gè)技術(shù)價(jià)值鏈中處于中心位置,這種獨(dú)特的地位和視角讓其成為了值得信賴的合作伙伴,能夠幫助客戶解決復(fù)雜的設(shè)計(jì)和供應(yīng)鏈難題,從而更快地實(shí)現(xiàn)營(yíng)收。
-
安富利
+關(guān)注
關(guān)注
6文章
500瀏覽量
63656 -
dma
+關(guān)注
關(guān)注
3文章
580瀏覽量
105649 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6211瀏覽量
115902 -
Zynq
+關(guān)注
關(guān)注
10文章
629瀏覽量
49325
原文標(biāo)題:AMD技術(shù)干貨|雙Zynq MPSoC PS側(cè)PCIe高速DMA互連
文章出處:【微信號(hào):AvnetAsia,微信公眾號(hào):安富利】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
基于AMD Versal器件實(shí)現(xiàn)PCIe5 DMA功能
看門狗在Zynq MPSoC上的使用技巧
如何利用ZYNQ MPSoC玩DOOM?
請(qǐng)問Zynq Ultrascale + MPSOC本身是否存在問題?
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
ZYNQ中不同應(yīng)用的DMA總結(jié)
Ti推出面向Zynq UltraScale+ MPSoC的電源參考設(shè)計(jì)
Zynq UltraScale MPSOC數(shù)據(jù)手冊(cè)免費(fèi)下載
米爾科技Zynq UltraScale+ MPSoC技術(shù)參考手冊(cè)介紹
FPGAs,Zynq和Zynq MPSoC器件的特點(diǎn)
Zynq UltraScale ZU19EG MPSOC評(píng)估板
AMD MPSoC PS PCIe使用要點(diǎn)
雙Zynq MPSoC PS側(cè)PCIe高速DMA互連解決方案
評(píng)論