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





