如何為ADRV9009 + ZCU102構(gòu)建自定義PetaLinux映像
這一切都開(kāi)始于一個(gè)“簡(jiǎn)單”的HDL調(diào)整-你知道,只是添加一個(gè)小的自定義IP和一個(gè)額外的DMA。Vivado很高興,比特流產(chǎn)生了,ZCU102的燈像迪斯科舞廳一樣閃爍。接下來(lái)是真正的boss大戰(zhàn):讓Linux啟動(dòng)。
Petalinux非常引人注目,它拋出了警告、依賴性發(fā)脾氣和“設(shè)備樹(shù)不匹配”,這可能會(huì)讓任何工程師質(zhì)疑他們的生活選擇。
如果您對(duì)這個(gè)故事感到熟悉,那么恭喜您,您已經(jīng)進(jìn)入了adi公司ADRV9009平臺(tái)定制工程師精英俱樂(lè)部。
本教程是您的健康路線圖:我們將使用Vivado和Petalinux 2024.2重新構(gòu)建ADRV9009 + ZCU102的Linux映像,為您的自定義HDL設(shè)計(jì)完美調(diào)整-沒(méi)有隱藏腳本,沒(méi)有黑魔法,只是干凈,可重復(fù)的步驟。
2. 概述:我們正在構(gòu)建的內(nèi)容
那么,任務(wù)是什么?我們不是在這里從頭開(kāi)始編寫內(nèi)核或召喚Linux之神-我們只是想要一個(gè)穩(wěn)定的,可引導(dǎo)的Petalinux映像,它可以與基于Analog Devices的ADRV9009 + ZCU102參考設(shè)計(jì)的自定義HDL設(shè)計(jì)無(wú)縫協(xié)作。
Ob jective
重建一個(gè)Linux鏡像(BOOT.BIN + image. zip)。b)與您修改的HDL項(xiàng)目兼容,其中包括:
ADRV9009收發(fā)鏈
?自定義IP塊(AXI流接口)
?一個(gè)額外的ADI DMA IP (AXI內(nèi)存映射接口)
?Zynq UltraScale+ MPSoC (ZCU102)
最后,你會(huì)得到:
?在硬件上運(yùn)行Linux的可引導(dǎo)SD卡
?為RF前端正確加載IIO驅(qū)動(dòng)程序
To ols & Environment
專業(yè)提示:始終匹配您的Vivado和Petalinux版本-混合工具鏈就像跨線程BNC連接器:它可能適合,但您稍后會(huì)后悔。
最終目標(biāo)
在本教程結(jié)束時(shí),您將擁有一個(gè)經(jīng)過(guò)驗(yàn)證的Linux映像:
?成功啟動(dòng)您的定制HDL設(shè)計(jì)
?識(shí)別ADRV9009, SPI, IIO和DMA設(shè)備
?啟用調(diào)試、流和用戶空間測(cè)試
3. 先決條件
在繼續(xù)之前,確保只準(zhǔn)備好這兩件事:
?已安裝Petalinux 2024.2并獲取其環(huán)境源
?自定義HDL硬件(.xsa)文件(帶比特流)從Vivado導(dǎo)出
就是這樣,您已經(jīng)為構(gòu)建做好了準(zhǔn)備。
4. 搭建環(huán)境
用你的。xsa準(zhǔn)備好了,Petalinux也安裝好了,現(xiàn)在是準(zhǔn)備構(gòu)建工作區(qū)的時(shí)候了。
創(chuàng)建工作目錄
首先,讓我們創(chuàng)建一個(gè)父文件夾,這個(gè)文件夾將包含所有的圖像構(gòu)建材料和克隆的元圖層文件夾,然后移動(dòng)到這個(gè)文件夾。
Petalinux環(huán)境的源代碼
現(xiàn)在將petalinux工具鏈源到petalinux安裝目錄下的這個(gè)文件夾中,特別是settings.sh文件。
克隆所需存儲(chǔ)庫(kù)
現(xiàn)在通過(guò)模擬設(shè)備將meta-adi yocto層克隆到父文件夾
創(chuàng)建一個(gè)新的Petalinux項(xiàng)目
現(xiàn)在在父文件夾中創(chuàng)建一個(gè)petalinux項(xiàng)目
5. 使用自定義硬件構(gòu)建Linux映像
現(xiàn)在讓我們開(kāi)始建造吧,我假設(shè)你。從您的vivado成功構(gòu)建Xsa文件。
提示:確保指向包含。Xsa文件-不是。Xsa文件本身。否則,您將遇到AMD Xilinx更新的Petalinux構(gòu)建工作流中引入的SDT錯(cuò)誤。
在我的例子中命令是這樣的:
這將打開(kāi)Petalinux System Configuration GUI,如圖5所示。導(dǎo)航到Y(jié)octo設(shè)置→用戶層→用戶層0(新),并輸入克隆存儲(chǔ)庫(kù)的路徑:
. . / meta-adi / meta-adi-xilinx
然后Save and Exit應(yīng)用更改。完整的流程如下圖所示。
提示一:
大多數(shù)設(shè)置都是根據(jù)XSA中指定的硬件設(shè)計(jì)細(xì)節(jié)自動(dòng)配置的。我發(fā)現(xiàn)自己在大多數(shù)PetaLinux項(xiàng)目中更新的主要硬件配置設(shè)置位于Image Packaging configuration選項(xiàng)卡下。這是配置根文件系統(tǒng)類型和相關(guān)引導(dǎo)設(shè)置的地方。特別是對(duì)于基于zynqmp的設(shè)計(jì),我的根文件系統(tǒng)位于SD卡上。我還希望它是持久的(即-它保持電力循環(huán)之間的變化)。因此,在根文件系統(tǒng)類型下,將其更改為EXT4 (SD/eMMC/SATA/USB)。
圖11顯示了保存并退出后應(yīng)該看到的日志。
(b)到目前為止,我們已經(jīng)成功添加了meta-adi-xilinx Yocto用戶層?,F(xiàn)在,我們需要通過(guò)將內(nèi)核指向正確的設(shè)備樹(shù)配置來(lái)更新默認(rèn)設(shè)備樹(shù)配置。dts文件。您可以使用以下命令直接從終端執(zhí)行此操作:
echo "KERNEL_DTB=\"${dts_to_use}\"" >> project-spec/meta-user/conf/petalinuxbsp.conf .
這確保了Petalinux構(gòu)建使用ADRV9009 + ZCU102設(shè)計(jì)的預(yù)期設(shè)備樹(shù)blob (DTB)。
在這個(gè)例子中,對(duì)于adi公司的ADRV9009 + ZCU102參考設(shè)計(jì),我使用的設(shè)備樹(shù)文件是:
zynqmp-zcu102-rev10-adrv9009-jesd204-fsm
注意:請(qǐng)確保不包含任何文件擴(kuò)展名(如。dts或。Dtb)在名稱的末尾-只有基本文件名。
下圖顯示了在我的設(shè)置中使用的確切終端命令。
重要提示:運(yùn)行命令后,打開(kāi)project-spec/meta-user/conf/petalinuxbsp.conf文件,檢查是否正確添加了完整的設(shè)備樹(shù)名稱。有時(shí)名稱的某些部分可能會(huì)被截?cái)?,這可能導(dǎo)致在構(gòu)建過(guò)程中出現(xiàn)無(wú)盡的“未找到文件”錯(cuò)誤-因此值得仔細(xì)檢查!
(c)“有趣”部分-自定義設(shè)備樹(shù)修改
好了,現(xiàn)在是這個(gè)過(guò)程中最“令人愉快”的部分——編輯設(shè)備樹(shù)。
首先,我們有意地讓第一個(gè)構(gòu)建失敗(是的,是有意的)。這將生成pl.dtsi文件——Petalinux基于.xsa創(chuàng)建的自動(dòng)生成的設(shè)備樹(shù)。
現(xiàn)在,這里有一個(gè)問(wèn)題:雖然AMD/Xilinx在處理自己的ip方面做得很好,但其他方面……我們只能說(shuō)Petalinux對(duì)第三方區(qū)塊的猜測(cè)充其量是樂(lè)觀的。
換句話說(shuō),您通常會(huì)為您的ADI ip得到一個(gè)可愛(ài)的垃圾節(jié)點(diǎn)集合。
為了解決這個(gè)問(wèn)題,Analog Devices采取了干凈的路線——他們刪除了petalinux為ADI ip生成的節(jié)點(diǎn),并用正確的參數(shù)覆蓋他們自己的設(shè)備樹(shù)。
我們將遵循同樣的理念:
?檢查Petalinux生成了哪些節(jié)點(diǎn)。
?使用清理文件刪除不正確的。
在system-user中添加正確的ADI設(shè)備樹(shù)節(jié)點(diǎn)。Dtsi文件-位于其他所有文件之上的文件。
因?yàn)闆](méi)有什么比刪除您的工具剛剛自豪地構(gòu)建的一半更能說(shuō)明“定制嵌入式Linux”了。
在項(xiàng)目目錄中導(dǎo)航到構(gòu)建文件夾并鍵入
從現(xiàn)在開(kāi)始,喝一大杯(或三杯)咖啡——這部分將是一場(chǎng)馬拉松。錯(cuò)誤會(huì)像打地鼠一樣彈出,但不要擔(dān)心—我們將一個(gè)接一個(gè)地查找它們,直到Petalinux最終揮動(dòng)白旗并構(gòu)建。錯(cuò)誤1:License Checksum Mismatch
jsd -status-dev-r0 do_populate_lic: QA問(wèn)題:jsd -status: LIC_FILES_CHKSUM不匹配file://license .txt;md5 = 38 c01601d5c4b84986a8f48ece946aa1
jed -status:新的md5校驗(yàn)和為982e522e7ec5a0beed8de5114ebfea50
啊,是的——經(jīng)典的LIC_FILES_CHKSUM不匹配。這通常發(fā)生在包中的許可文本被更新,但配方仍然引用舊的校驗(yàn)和時(shí)。
修復(fù):只需復(fù)制錯(cuò)誤日志中顯示的新MD5校驗(yàn)和,并替換導(dǎo)致問(wèn)題的配方文件中的舊校驗(yàn)和。
在我的例子中,錯(cuò)誤指向:
meta-adi / meta-adi-xilinx recipes-support / jesd-status / jesd-status_dev.b
于是,我打開(kāi)了。并將舊的MD5替換為新的MD5:
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5 = 982 e522e7ec5a0beed8de5114ebfea50”
對(duì)于顯示相同問(wèn)題的任何其他包重復(fù)此操作。這是一個(gè)無(wú)害的“歡迎來(lái)到Y(jié)octo”時(shí)刻——乏味,但卻是入會(huì)儀式的一部分。此外,不要取消構(gòu)建,即使它正在繼續(xù)執(zhí)行一些其他任務(wù)
錯(cuò)誤2:取回錯(cuò)誤
錯(cuò)誤:linux-xlnx-6.6.40-adi-v2025.1+git-r0 do_fetch: Fetcher失?。?
獲取命令export PSEUDO_DISABLED=1;出口SSL_CERT_DIR =…
這是典型的“獲取失敗”——基本上是Petalinux在說(shuō)“我無(wú)法連接互聯(lián)網(wǎng),請(qǐng)修復(fù)你的Wi-Fi”。
修復(fù):只要確保你有一個(gè)穩(wěn)定的互聯(lián)網(wǎng)連接,然后重新運(yùn)行構(gòu)建:
petalinux-build
十有八九,這個(gè)錯(cuò)誤會(huì)在連接正常的那一刻消失——不需要深入調(diào)試。
錯(cuò)誤3:內(nèi)核版本完整性檢查失敗
錯(cuò)誤:linux-xlnx-6.6.40- di-v2025.1+git-r0 do_kernel_version_sanity_check:
包版本(6.6.40-adi-v2025.1+git)與正在構(gòu)建的內(nèi)核(6.12)不匹配。
請(qǐng)更新PV變量以匹配內(nèi)核源或集
你的配方中的KERNEL_VERSION_SANITY_SKIP="1"。
啊,臭名昭著的內(nèi)核版本不匹配——Petalinux用這種方式提醒我們,它希望所有東西都完美匹配(即使它無(wú)關(guān)緊要)。
解決辦法:這個(gè)是無(wú)害的。構(gòu)建環(huán)境中的內(nèi)核版本與配方中指定的內(nèi)核版本不一致。要使警告靜音(并保持完整),只需將這一行添加到Linux配方文件中:
Kernel_version_sanity_skip = “1”
您將在錯(cuò)誤日志的最后一行找到正確的配方位置,例如:
meta-xilinx / meta-xilinx-core recipes-kernel / linux / linux-xlnx_6.6.40-v2024.2.bb
編輯完成后,保存文件并重新構(gòu)建:
petalinux-build
Petalinux將高興地停止抱怨版本不匹配——因?yàn)橛袝r(shí)候,無(wú)知是福。
(d)修改設(shè)備樹(shù)
最后——構(gòu)建失敗。好消息:這正是我們想要的。為什么?因?yàn)榇斯收仙蓀l.dtsi文件—從.xsa派生的自動(dòng)生成的設(shè)備樹(shù)。
在我定制的ADRV9009 + ZCU102參考設(shè)計(jì)中,我添加了:
基于軸流的DSP IP
ADI axis - dma控制器IP(內(nèi)存映射)。
當(dāng)Petalinux創(chuàng)建設(shè)備樹(shù)時(shí),新的DMA綁定到一個(gè)名為misc_clk_0的時(shí)鐘。但是ADI的Yocto層包含一個(gè)清除機(jī)制,可以刪除許多自動(dòng)生成的節(jié)點(diǎn)——包括這個(gè)時(shí)鐘。結(jié)果:構(gòu)建失敗。(圖12顯示了“misc_clk_0 not found”錯(cuò)誤。)
目標(biāo)是什么?
我們將遵循ADI的清理流程,使我們的自定義硬件運(yùn)行良好:
生成pl.dtsi(通過(guò)失敗的構(gòu)建完成)。
識(shí)別其中的自定義IP節(jié)點(diǎn)。
通過(guò)ADI的pl-delete文件顯式刪除這些節(jié)點(diǎn)。
在system-user.dtsi中添加這些節(jié)點(diǎn)的正確的手寫版本。
步驟1 -識(shí)別自定義節(jié)點(diǎn)
導(dǎo)航到:
組件/ plnx_workspace /設(shè)備樹(shù)/設(shè)備樹(shù)
打開(kāi)pl.dtsi并查找屬于自定義ip的節(jié)點(diǎn)。就我而言:
axi_dmac_0: axi_dmac@80000000 {
clock-names = "m_dest_axi_aclk", "s_axi_aclk", "s_axis_aclk";
clocks = <&zynqmp_clk 72>, <&zynqmp_clk 71>, <&misc_clk_0>;
compatible = "xlnx,axi-dmac-1.0";
reg = <0x0 0x80000000 0x0 0x10000>;
};
這是我們自動(dòng)生成的節(jié)點(diǎn),我們將很快用一個(gè)干凈的節(jié)點(diǎn)替換它。
步驟2 -添加節(jié)點(diǎn)到ADI的刪除列表
進(jìn)入ADI層:
meta-adi / meta-adi-xilinx / recipes-bsp /設(shè)備樹(shù)/文件/打開(kāi):
pl-delete-nodes-zynqmp-zcu102-rev10-adrv9009-jesd204-fsm.dtsi
在頂部,你會(huì)看到包含如下內(nèi)容:
/ include /“pl-delete-nodes-zynqmp-zcu102-hdl-adrv9009.dtsi”
第二個(gè)文件實(shí)際上包含刪除命令。pl-delete-nodes-zynqmp-zcu102-hdl-adrv9009開(kāi)放。Dtsi并添加節(jié)點(diǎn)的刪除行:
/ delete-node / &axi_dmac_0;
為什么:這告訴Petalinux在構(gòu)建期間從pl.dtsi中刪除自動(dòng)生成的DMA節(jié)點(diǎn)。稍后,我們將在system-user.dtsi中重新添加一個(gè)正確定義的版本。
(圖13顯示了修改后的刪除節(jié)點(diǎn)文件。)
步驟3—在system-user.dtsi中添加Clean Node
現(xiàn)在編輯:
說(shuō)明/ meta-user / recipes-bsp /設(shè)備樹(shù)/文件/ system-user.dtsi
將新的DMA節(jié)點(diǎn)附加到其余內(nèi)容下面:
/include/ "system-conf.dtsi"
/ {
};
&fpga_axi {
pdm_dmac: dma-controller@8000000 {
compatible = "adi,axi-dmac-1.00.a";
reg = <0x8000000 0x10000>; // Base address and size
dma-controller;
interrupts-extended = <>;
#dma-cells = <1>;
#clock-cells = <0>;
dma-coherent;
clocks = <&zynqmp_clk 73>;
};
};
提示:此頂級(jí)文件覆蓋已刪除的節(jié)點(diǎn),并在構(gòu)建時(shí)注入干凈的定義。這就是ADI層保持模塊化的方式——所有自定義的東西都在這里,而不是直接在pl.dtsi中。
最后指出
在pl-delete-nodes中刪除…確保ADI的清理不會(huì)重新生成錯(cuò)誤的自動(dòng)生成配置。
添加到system-user。dtsi確保Linux完全按照預(yù)期看到您的DMA和時(shí)鐘綁定。
在這之后,cd…從構(gòu)建文件夾中重新運(yùn)行構(gòu)建:
petalinux-build
再抓一個(gè)——這次,它會(huì)過(guò)去的。瞧!構(gòu)建成功了!
如果一切順利(并且在此過(guò)程中沒(méi)有意外地刪除理智),Petalinux將最終完成構(gòu)建。
現(xiàn)在,您應(yīng)該在終端上看到類似于圖14的成功消息——這是每個(gè)工程師夢(mèng)寐以求的美好時(shí)刻:
“構(gòu)建成功完成?!?
深吸一口氣,喝一口遺忘已久的咖啡,向自己點(diǎn)一點(diǎn)頭——您剛剛像專業(yè)人士一樣為ADRV9009 + ZCU102構(gòu)建了一個(gè)自定義Linux映像。
6. 打包引導(dǎo)二進(jìn)制文件(Boot . bin)
一旦項(xiàng)目成功構(gòu)建,就該生成引導(dǎo)二進(jìn)制文件了- boot . bin .該文件結(jié)合了ZynqMP設(shè)備正確啟動(dòng)所需的基本引導(dǎo)組件。
在我的情況下,我是從SD卡引導(dǎo)ZCU102,所以BOOT.BIN必須至少包括:
?FSBL(第一階段引導(dǎo)加載程序)
?FPGA位流(.bit)
?U-Boot引導(dǎo)加載程序
所有這些文件都是在Petalinux項(xiàng)目的輸出目錄中自動(dòng)生成的:
現(xiàn)在把它們包裝在一起,使用:
這個(gè)命令在映像目錄中創(chuàng)建BOOT.BIN文件,準(zhǔn)備放到SD卡上進(jìn)行引導(dǎo)。
提示:如果您稍后重新構(gòu)建項(xiàng)目并需要重新生成引導(dǎo)映像,請(qǐng)使用——force標(biāo)志來(lái)覆蓋現(xiàn)有文件:
我的屏幕日志如圖12所示。
7:包裝SD卡鏡像
如果從SD卡引導(dǎo)(而不是直接引導(dǎo)到INITRD或INITRAMFS), PetaLinux提供了一個(gè)方便的內(nèi)置實(shí)用程序來(lái)創(chuàng)建完整的SD卡映像。此工具將所有內(nèi)容打包到。可以使用諸如balenaEtcher、Rufus或dd等實(shí)用程序?qū)D像文件閃入SD卡。
命令概述
PetaLinux使用PetaLinux -package命令和——wic標(biāo)志來(lái)創(chuàng)建這個(gè)映像。
在我的設(shè)置中(從SD卡啟動(dòng)ZCU102板),在SD卡的啟動(dòng)分區(qū)中需要以下文件:
?BOOT.BIN→引導(dǎo)程序二進(jìn)制文件(FSBL + bitstream + U-Boot)
?image.ub→合并Linux內(nèi)核和根文件系統(tǒng)映像
?system.dtb→設(shè)備樹(shù)Blob
?boot.scr→U-Boot啟動(dòng)腳本
根文件系統(tǒng)本身(rootfs.tar.gz)放在SD卡的根分區(qū)中。
完整命令示例
在PetaLinux項(xiàng)目目錄下運(yùn)行以下命令:
期待什么
?該過(guò)程可能需要幾分鐘才能完成,具體取決于系統(tǒng)的I/O速度。
?生成。鏡像通常在6 - 7gb左右,所以確保你至少有一個(gè)8gb的SD卡可用。
?一旦完成,。哪個(gè)映像將出現(xiàn)在項(xiàng)目的images/linux/目錄中。
閃爍SD卡
你現(xiàn)在可以閃光了。在我的案例中,我使用的是balena蝕刻器。
8. 啟動(dòng)板
現(xiàn)在是最有趣的部分了——讓您的新構(gòu)建的Linux系統(tǒng)煥發(fā)生機(jī)!
?插入SD卡:將SD卡(帶有PetaLinux映像)插入主板的SD插槽,如圖15所示。
?設(shè)置啟動(dòng)方式(ZCU102):對(duì)于ZCU102,將啟動(dòng)方式開(kāi)關(guān)(ZCU102為SW6)設(shè)置為從SD卡啟動(dòng):
On | off | off | off
(開(kāi)關(guān)位置見(jiàn)圖16)
?為串行控制臺(tái)連接UART:使用micro-USB電纜將ZCU102上的UART轉(zhuǎn)usb端口連接到主機(jī)PC(參見(jiàn)圖17)。該連接將允許您查看引導(dǎo)日志并與Linux控制臺(tái)進(jìn)行交互。
?安裝ADRV9009 FMC卡:將ADRV9009收發(fā)板固定在ZCU102上的HPC1 FMC連接器上,如圖18所示。
?打開(kāi)串行終端:?jiǎn)?dòng)您最喜歡的串行終端程序- PuTTY, TeraTerm或類似程序。選擇合適的端口(在我的例子中是/dev/ttyUSB0)。波特率設(shè)置為115200。
一旦所有東西都連接好并通電,您就可以正式啟動(dòng)到您的定制PetaLinux + ADI系統(tǒng)了。坐下來(lái),看著引導(dǎo)日志滾動(dòng),享受Linux終于迎接您的甜蜜時(shí)刻——祝賀您,您已經(jīng)從零開(kāi)始構(gòu)建了它!
結(jié)論
現(xiàn)在,您已經(jīng)成功地為ADRV9009 + ZCU102平臺(tái)構(gòu)建了自定義PetaLinux映像,集成了您自己的基于hdl的硬件設(shè)計(jì),并確保了設(shè)備樹(shù)的兼容性。這個(gè)過(guò)程演示了完整的流程——從準(zhǔn)備環(huán)境和合并元數(shù)據(jù)層,到解決構(gòu)建時(shí)問(wèn)題和在硬件上部署最終映像。
您的設(shè)置現(xiàn)在可以在Zynq UltraScale+ SoC上進(jìn)行更高級(jí)別的系統(tǒng)驗(yàn)證、驅(qū)動(dòng)程序集成和應(yīng)用程序開(kāi)發(fā)。無(wú)論您計(jì)劃擴(kuò)展功能,執(zhí)行性能測(cè)量,還是集成實(shí)時(shí)DSP工作負(fù)載,這都是進(jìn)一步開(kāi)發(fā)的堅(jiān)實(shí)基礎(chǔ)。
本文編譯自hackster.io





