0 寫在前面
? ? ? ?這是一個系列博客,詳細介紹如何在 ZYNQ 與 ZYNQ MP 平臺上如何移植 Linux 系統。目前網絡上的大部分教程都是全程基于 Petalinux 的開發,雖然這樣簡化了開發流程,但對于初學者深入理解掌握 Linux 是不利的,所以,有了這個系列的博客,從幾乎為 0 開始教大家怎么移植 Linux 系統。
? ? ? ?本人的軟件與環境版本:
? ? ? ?Windows 的 Vivado 與 Vitis 版本:2020.2(前期學習 ZYNQ7020 跟隨正點原子安裝);
? ? ? ?Ubuntu版本:18.04.2;
? ? ? ?虛擬機上的 Vivado、Vitis 與 Petalinux 版本:2020.1(前期學習 ZYNQ MP 跟隨 Alinx 安裝)。
1 ZYNQ 與設備樹
? ? ? ?ZYNQ 本身是 FPGA + ARM 的異構處理器,設備樹扮演著關鍵角色。它通過硬件描述與內核分離的機制,動態定義 CPU、內存、外設及 PL側中的 IP 核資源,使同一內核鏡像能夠適配不同硬件配置,大幅提升系統移植的靈活性。設備樹由 u-boot 傳遞給 Linux 內核,驅動據此自動匹配并初始化硬件,如 UART、GPIO 或自定義的 AXI IP 核,避免了傳統嵌入式開發中的硬編碼問題。此外,設備樹支持運行時疊加,適應 FPGA 動態重配置場景,是實現 ZYNQ 硬件可擴展性與 Linux 驅動高效管理的重要橋梁。
2 獲取設備樹
? ? ? ?從零編寫設備樹,是 Xilinx 等器件廠商該做的事情,那我們怎么獲取設備樹呢?簡單來說,就是使用 Xilinx 的模版。具體而言,有兩種獲取的方法,一是通過 Vitis 獲得,二是通過 Petalinux 獲得。但在此之前還是需要先從 Vivado 中導出硬件描述性文件(.xsa
)。
2.1 Vivado導出 .xsa
? ? ? ?只要使用 ZYNQ 的 PS 側,就需要在 Block Design 中對 ZYNQ 核的相關功能進行配置:
? ? ? ?添加 ZYNQ 核:
這里需要注意的是 ZYNQ-7000 系列與 ZYNQ-MPSoC 系列的 IP 核是不一樣的,不過一般也不會選錯,因為在創建 Vivado 工程時需要選定器件型號,選好后,這里就只能搜索到對應的 IP 核了。
? ? ? ?而 ZYNQ核的配置部分根據自己的情況進行配置,自己設計的硬件需要參考硬件原理圖與手冊,如果是開發板可以參考對應的例程。
? ? ? ?之后就按照 FPGA 的開發流程,在 Block Design 中根據需要(是否有邏輯側)選擇添加其它 IP 或在外面直接加 verilog/VHDL 等代碼,生成輸出文件,然后經過綜合、實現、生成比特流。
? ? ? ?而接下的步驟就比較關鍵了,我們需要從 Vivado 中輸出 .xsa
(硬件描述性文件)。
? ? ? ?依次選擇 File --> Export --> Export Hardware…
?? ? ? ?點擊 Next 至以下界面,這里需要注意默認是 Pre-synthesis
,我們需要把它修改至 Include bitstream
。
?? ? ? ?后面可以一直選擇 Next ,默認輸出路徑不需要修改,如果曾經生成過,會提示是否要覆蓋,選擇是即可。默認是導出到 Vivado 工程目錄下。
? ? ? ?這個 .xsa 文件,我們后續要用到,可以先備份到一個地方。
2.2 Vitis 獲取設備樹
? ? ? ?使用 Vitis 獲取設備樹,需要先獲取官方的設備樹模板,這部分在這個系列上一部分介紹過了,有需要的可以去看看。
? ? ? ?先正常加載一個 Vitis 工程工作空間,指定路徑(不著急創建工程!!!):
? ? ? ?先把我們前面下載的設備樹模板進行配置:
? ? ? ?點擊右側的 New..
:
? ? ? ?定位到解壓出的模版文件所在位置:
? ? ? ?依次點擊下面的 Apply
與 Apply and Close
:
? ? ? ?接著創建一個平臺工程(Platform Project):
?? ? ? ?后續按 Vitis 正常創建工程的步驟進行,定一個工程名,我這里定為 linux_base,之后在選擇 .xsa
的時候選擇我們前面從 Vivado 中導出的 .xsa
(我的習慣是會把這個xsa拷貝到Vitis的工程目錄下)。然后在操作系統部分改為設備樹,其它的默認即可,然后 Finish
。
? ? ? ?在生成的工程右鍵進行編譯(build):
?? ? ? ?Viits 編譯生成的設備樹所在位置如下:
vitis工程目錄/工程名/生成的處理器/device_tree_domain\bsp
?? ? ? ?其中 zynqmp.dts 和 zynqmp-clk-ccf.dtsi 是 ZYNQ 通用的設備樹文件,后續在 Linux 內核源碼等相關路徑也會出現,不需要進行替換,只需要單獨把其它4個設備樹文件先備份出來。
? ? ? ?如果后續的系統移植完全不使用 Petalinux,還需要備份一下以下的輸出文件:
?? ? ? ?它們所在位置如下:
fsbl.elf: vitis工程目錄/工程名/export\工程名\sw\工程名\boot
pmufw.elf: vitis工程目錄/工程名/export\工程名\sw\工程名\boot
xxx.bit: vitis工程目錄/工程名/hw
2.3 Petalinux 獲取設備樹
? ? ? ?使用 Petalinux 的話,設備樹包含兩部分,一是從 .xsa 獲取的設備樹(其實就是和Vitis獲取的一樣),另一部分是用戶自定義的追加設備樹。
2.3.1 從 .xsa 獲取的設備樹
? ? ? ?在創建好 Petalinu 工程后,需要先獲取設備描述文件(.xsa):
petalinux-config --get-hw-description xsa路徑
? ? ? ?執行完命名后,進入以下圖形化配置界面,此時需要先進行一些配置,與設備樹相關的就是指定官方的設備樹模板包路徑。
? ? ? ?按以下路徑進入:
-->Auto Config Settings --> Device tree autoconfig
? ? ? ?勾選上設備樹的自動配置。
? ? ? ?在完成 Petalinux 的基本配置后(如包含離線編譯,鏡像,內核源碼與 u-boot 包的路徑指定等),編譯工程:
petalinux-build
? ? ? ?編譯完成后就能在以下路徑找到從 .xsa
獲取的設備樹:
petalinux工程目錄/components/plnx_workspace/device-tree/device-tree
? ? ? ?感興趣的話可以進去查看以下,與 Vitis 生成的內容基本一致。
2.3.2 用戶自定義的追加設備樹
? ? ? ?如果是使用 Petalinux 進行 linux 開發,一般會對以下目錄的設備樹進行修改:
petalinux/project-spec/meta-user/recipes-bsp/device-tree/files
? ? ? ?如果是不使用 Petalinux 來移植 Linux 系統,同樣也需要把這個 system-user.dtsi
進行備份,放到內核對象位置。
3 獲取文件總結
? ? ? ?通過本篇內容,我們獲取了后續 u-boot、Linux內核源碼等需要使用的設備樹。它們一般包含以下 4 個文件(除去 ZYNQ 通用的 2 個設備樹 zynqmp.dts 和 zynqmp-clk-ccf.dtsi)
1,pcw.dtsi:PS 部分的配置,如 UART、I2C、SPI;
2,pl.dtsi:PL 部分的配置,如AXI GPIO、AXI DMA;
3,system.dts:完整設備樹主干文件;
4,system-top.dts:頂層設備樹文件
? ? ? ?其中關于 PL 和 PS 側配置的設備樹文件都不建議自行修改,需要修改也要謹慎起見。
? ? ? ?如果是使用 Petalinux,還可能涉及到用戶設備樹:
5,system-user.dtsi
6,pl-custom.dtsi
? ? ? ?如果后續的系統移植完全不使用 Petalinux,還可以從 Vitis 獲取:
1,fsbl.elf : ZYNQ啟動(全稱叫First Stage Boot Loader)所需要的文件;
2,pmufw.elf :ZYNQ用來進行包括系統初始化,電源管理和錯誤處理等功能的小型處理器執行代碼;
3,xxx.bit :就是 FPGA 開發中常用到的比特文件。