以下文章來源于OpenFPGA,作者碎碎思
在之前文章中,我們介紹了如何使用 XSCT 工具通過 JTAG 在 Zynq SoC 上啟動(dòng)嵌入式 Linux 鏡像(從 JTAG 啟動(dòng) Zynq-7000 嵌入式 Linux:使用 XSCT 全流程教程)。本文則進(jìn)一步講解如何在 Zynq UltraScale+ MPSoC 平臺(tái)上通過 JTAG 逐步啟動(dòng) Linux,并提供了完整的過程與關(guān)鍵命令。只要按步驟操作,即使是復(fù)雜的 Linux 鏡像也能成功通過 JTAG 啟動(dòng)。
所需條件與工具
要完成 JTAG 啟動(dòng),你需要準(zhǔn)備以下內(nèi)容:
支持 JTAG 調(diào)試的 Zynq UltraScale+ MPSoC 板
與目標(biāo)板連接的 JTAG 線纜(例如 SmartLynq / Platform Cable)
安裝了 Xilinx 工具(如 Vitis / SDK)的開發(fā)主機(jī)
可用的 Linux 鏡像、設(shè)備樹、ATF、U-Boot 等組件
操作概要(步驟不可改變)
整體流程分為 8 個(gè)步驟,每一步都對(duì)最終啟動(dòng)至關(guān)重要:
啟動(dòng) XSCT 命令行
配置 FPGA(下載 bitstream)
下載并運(yùn)行 PMU Firmware
配置處理系統(tǒng)
下載并執(zhí)行第一階段引導(dǎo)加載器(FSBL)
下載第二階段引導(dǎo)加載器(U-Boot)
下載并啟動(dòng) Linux 鏡像
1、如何啟動(dòng) XSCT
XSCT(Xilinx Software Commandline Tool)用于通過 JTAG 與設(shè)備通信:
/Xilinx/Vitis/2021.1/bin/xsct
或者開始菜單里尋找。
啟動(dòng)后,會(huì)進(jìn)入交互式命令行,等待你輸入各種引導(dǎo)命令。
1124 ~ > /opt/Xilinx/Vitis/2021.1/bin/xsct ****** Xilinx Software Commandline Tool (XSCT) v2021.1 **** SW Build 3246112 on 2021-06-09-1456 ** Copyright 1986-2021 Xilinx, Inc. All Rights Reserved. xsct%help Available Help Categories breakpoints - Target Breakpoints/Watchpoints. connections - Target Connection Management. device - Device Configuration System. download - Target Download FPGA/BINARY. hsi - HSI commands. ipi - IPI commands to Versal PMC. jtag - JTAG Access. memory - Target Memory. miscellaneous - Miscellaneous. petalinux - Petalinux commands. projects - Vitis Projects. registers - Target Registers. reset - Target Reset. running - Program Execution. streams - Jtag UART. svf - SVF Operations. tfile - Target File System. Type"help"followed by above"category"formore details or help" followed by the keyword "commands" to list all the commands xsct%
2、連接目標(biāo)設(shè)備
在 XSCT 中使用 connect 命令建立 JTAG 連接,例如:
connect -url tcp::3121
不同 JTAG 線纜的 IP 地址不同:
SmartLynq:通過板上顯示的 IP
SmartLynq(USB 直連):通常是 10.0.0.2
Platform Cable(國(guó)內(nèi)常用JTAG):通常是 127.0.0.1
默認(rèn)端口是 3121。
3、列出連到 JTAG 鏈的設(shè)備
連接成功后,可以查看 JTAG 鏈上所有目標(biāo):
xsct% targets
1 PS TAP
2 PMU
3 PL
4 PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Running)
10 Cortex-A53#1(Running)
11 Cortex-A53#2(Running)
12 Cortex-A53#3(Running)
執(zhí)行命令后看到的列表targets代表連接到 JTAG 鏈的每個(gè)設(shè)備。設(shè)備可以是單元、CPU 內(nèi)核、FPGA 等??梢詫?duì)每個(gè)設(shè)備進(jìn)行管理。有時(shí)可能無法在目標(biāo)設(shè)備和 JTAG 電纜之間建立可靠的連接。在這種情況下,應(yīng)該檢查錯(cuò)誤消息并根據(jù)消息采取相應(yīng)措施。例如,當(dāng)沒有 JTAG 連接或電路板斷電時(shí),將顯示如下所示的錯(cuò)誤提示。
xsct% targets 1 whole scan chain (board power off)
最常遇到的問題與使用的 JTAG 頻率有關(guān)。JTAG 鏈路的硬件結(jié)構(gòu)對(duì)其最佳頻率有顯著影響。某些物理特性,例如電纜長(zhǎng)度、目標(biāo)數(shù)量等,都可能影響合適的 JTAG 頻率。在這種情況下,XSCT 工具會(huì)生成一些錯(cuò)誤消息,指示與目標(biāo)的連接不穩(wěn)定。可以在下方看到一些示例。
xsct% targets 1 whole scan chain (Unknown device configuration) xsct% targets 1 whole scan chain (Unknown IR length) xsct% targets 1 whole scan chain (too many devices)
當(dāng)出現(xiàn)此類輸出時(shí),應(yīng)該重新調(diào)整 JTAG 頻率,以建立可靠穩(wěn)定的連接??梢酝ㄟ^調(diào)用jtag frequency -list以下方法查找 JTAG 電纜支持的頻率。然后,可以從列表中選擇合適的頻率。也可以選擇任意頻率,該實(shí)用程序會(huì)自動(dòng)處理舍入誤差。
xsct% jtag targets 1 xsct% jtag frequency -list 125000 250000 500000 1000000 2000000 3000000 4000000 6000000 7500000 10000000 12000000 13000000 15000000 20000000 30000000 40000000 50000000 60000000 70000000 80000000 90000000 100000000 xsct% jtag frequency 7500000 7500000 xsct% jtag frequency 7000000 7017543
4、中斷系統(tǒng)
在開始操作之前,CPU必須中斷并重置為初始狀態(tài)。沒有此步驟,將無法管理處理系統(tǒng)。Zynq SoC 中的此步驟有所不同。要重置系統(tǒng):
xsct% targets -set-nocase -filter {name =~"*PSU*"}
xsct% rst
xsct% Info: Cortex-A53#0(target 9) Stopped at 0xffff0000 (Reset Catch)
xsct% targets
1 PS TAP
2 PMU
3 PL
4* PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Reset Catch, EL3(S)/A64)
10 Cortex-A53#1(Reset)
11 Cortex-A53#2(Reset)
12 Cortex-A53#3(Reset)
5、配置FPGA
由于 Zynq UltraScale+ SoC 實(shí)際上是一款 FPGA 芯片,因此需要硬件鏡像才能訪問其底層組件,例如 DDR、以太網(wǎng)、串行接口等。通過 JTAG 下載完整的 FPGA 鏡像非常簡(jiǎn)單,只需使用fpga以下命令即可。
xsct% targets
1 PS TAP
2 PMU
3 PL
4* PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Reset Catch, EL3(S)/A64)
10 Cortex-A53#1(Reset)
11 Cortex-A53#2(Reset)
12 Cortex-A53#3(Reset)
xsct% targets -set-nocase -filter {name =~"*PS TAP*"}
xsct% fpga"system.bit"
100% 25MB 1.2MB/s 00:21
下載 FPGA 鏡像會(huì)清除現(xiàn)有的 PL 鏡像并將其替換為新鏡像。還可以通過向同一命令提供選項(xiàng)來管理可編程邏輯。按 Enter 鍵help fpga可查看更多信息。目前,將 FPGA 鏡像下載到硬件就足夠了,其余內(nèi)容超出了本教程的范圍。
6、PMU固件
Zynq UltraScale+ SoC 包含一個(gè)專用的 MicroBlaze 處理器,用于執(zhí)行平臺(tái)管理。PMU 代表平臺(tái)管理單元。其主要職責(zé)是在啟動(dòng)前初始化部分系統(tǒng)組件、管理分配給各個(gè)電源島的電源以及處理系統(tǒng)錯(cuò)誤。固件能夠與運(yùn)行在處理系統(tǒng)單元 (Processing System Unit) 上的用戶應(yīng)用程序通信。用戶可以創(chuàng)建請(qǐng)求來根據(jù)需要管理平臺(tái)。此外,還可以使用 Vitis IDE 修改 PMU 固件??梢詤⒖?Zynq UltraScale+ 的技術(shù)參考手冊(cè)(即 UG1085 )來進(jìn)一步了解 PMU 固件的詳細(xì)信息和使用場(chǎng)景。
如果不禁用處理系統(tǒng)單元 (PSU) 上的某些安全門,就無法訪問位于平臺(tái)管理單元 (PMU) 內(nèi)的 MicroBlaze 處理器。因此,我們的第一步是禁用這些安全門。然后,我們將 PMU 固件下載到目標(biāo)處理器并運(yùn)行它。為了確保安全,我們將重新啟用這些安全門。
xsct% targets -set-nocase -filter {name =~"*PSU*"}
xsct% targets
1 PS TAP
2 PMU
3 PL
4* PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Reset Catch, EL3(S)/A64)
10 Cortex-A53#1(Reset)
11 Cortex-A53#2(Reset)
12 Cortex-A53#3(Reset)
xsct% mask_write 0xFFCA0038 0x1C0 0x1C0
xsct% targets
1 PS TAP
2 PMU
13 MicroBlaze PMU (Sleeping. No clock)
3 PL
4* PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Reset Catch, EL3(S)/A64)
10 Cortex-A53#1(Reset)
11 Cortex-A53#2(Reset)
12 Cortex-A53#3(Reset)
禁用安全門后,MicroBlaze 內(nèi)核立即出現(xiàn)在 JTAG 目標(biāo)鏈上。通過獲取處理器的訪問權(quán)限,我們現(xiàn)在可以下載并運(yùn)行 PMU 固件。
xsct% targets -set-nocase -filter {name =~"*MicroBlaze PMU*"}
xsct% dow"pmufw.elf"
Downloading Program -- pmufw.elf
section, .vectors.reset: 0xffdc0000 - 0xffdc0007
section, .vectors.sw_exception: 0xffdc0008 - 0xffdc000f
section, .vectors.interrupt: 0xffdc0010 - 0xffdc0017
section, .vectors.hw_exception: 0xffdc0020 - 0xffdc0027
section, .text: 0xffdc0050 - 0xffdd1057
section, .rodata: 0xffdd1058 - 0xffdd2287
section, .data: 0xffdd2288 - 0xffdd639b
section, .sdata2: 0xffdd639c - 0xffdd639f
section, .sdata: 0xffdd63a0 - 0xffdd639f
section, .sbss: 0xffdd63a0 - 0xffdd639f
section, .bss: 0xffdd63a0 - 0xffdda0db
section, .srdata: 0xffdda0dc - 0xffdda9f7
section, .stack: 0xffdda9f8 - 0xffddb9f7
section, .xpbr_serv_ext_tbl: 0xffddf6e0 - 0xffddfadf
100% 0MB 0.2MB/s 00:00
Setting PC to Program Start Address 0xffdd0a04
Successfully downloaded pmufw.elf
xsct% Info: MicroBlaze PMU (target 13) Stopped at 0xffdc8534 (Stop)
xsct% con
Info: MicroBlaze PMU (target 13) Running
如果一切順利,我們可以重新啟用安全門,以防止訪問 MicroBlaze PMU,并繼續(xù)進(jìn)行 PSU 初始化。
xsct% targets -set-nocase -filter {name =~"*PSU*"}
xsct% mask_write 0xFFCA0038 0x1C0 0x0
xsct% targets
1 PS TAP
2 PMU
3 PL
4* PSU
5 RPU (Reset)
6 Cortex-R5#0(No Power)
7 Cortex-R5#1(No Power)
8 APU
9 Cortex-A53#0(Reset Catch, EL3(S)/A64)
10 Cortex-A53#1(Reset)
11 Cortex-A53#2(Reset)
12 Cortex-A53#3(Reset)
7、APU和PSU初始化
在將第一階段引導(dǎo)加載程序下載到應(yīng)用處理器單元 (APU) 之前,必須移除復(fù)位。此外,必須根據(jù)硬件映像(HDF/XSA 文件)初始化處理系統(tǒng)單元。從 Vivado 設(shè)計(jì)工具導(dǎo)出的硬件映像中包含一個(gè)名為“psu_init.tcl”的 TCL 腳本。以下是執(zhí)行這些步驟的命令。
xsct% targets -set-nocase -filter {name =~"*APU*"}
xsct% targets
1 PS TAP
2 PMU
3 PL
5 PSU
6 RPU (Reset)
7 Cortex-R5#0(No Power)
8 Cortex-R5#1(No Power)
9* APU
10 Cortex-A53#0(Reset Catch, EL3(S)/A64)
11 Cortex-A53#1(Reset)
12 Cortex-A53#2(Reset)
13 Cortex-A53#3(Reset)
xsct% mwr 0xffff0000 0x14000000
xsct% mask_write 0xFD1A0104 0x501 0x0
xsct%sourcepsu_init.tcl
xsct% psu_init
如果電源單元初始化成功,屏幕上將不會(huì)顯示任何輸出。完成此步驟后,我們便獲得了對(duì)電源單元資源的訪問權(quán)限。
8、第一階段引導(dǎo)加載程序(FSBL)
FSBL 是Zynq UltraScale+ 啟動(dòng)時(shí)在應(yīng)用處理器上運(yùn)行的第一個(gè)程序(實(shí)際上是第二個(gè),BootROM 首先運(yùn)行) 。它負(fù)責(zé)在調(diào)用 SSBL (第二階段引導(dǎo)加載程序)或所需的裸機(jī)應(yīng)用程序之前配置硬件并初始化一些組件??梢允褂米詣?dòng)生成的 FSBL,也可以編寫自己的 FSBL。要下載并運(yùn)行 FSBL,請(qǐng)調(diào)用以下命令。請(qǐng)注意,F(xiàn)SBL 必須在應(yīng)用處理單元的第一個(gè) Cortex-A53 內(nèi)核上運(yùn)行。因此,我們需要相應(yīng)地選擇目標(biāo)內(nèi)核。
xsct% targets -set-nocase -filter {name =~"*A53#0*"}
xsct% targets
1 PS TAP
2 PMU
3 PL
5 PSU
6 RPU (Reset)
7 Cortex-R5#0(No Power)
8 Cortex-R5#1(No Power)
9 APU
10* Cortex-A53#0(Reset Catch, EL3(S)/A64)
11 Cortex-A53#1(Reset)
12 Cortex-A53#2(Reset)
13 Cortex-A53#3(Reset)
xsct% dow"zynqmp_fsbl.elf"
Downloading Program -- zynqmp_fsbl.elf
section, .text: 0xfffc0000 - 0xfffcf88b
section, .note.gnu.build-id: 0xfffcf88c - 0xfffcf8af
section, .init: 0xfffcf8c0 - 0xfffcf8f3
section, .fini: 0xfffcf900 - 0xfffcf933
section, .rodata: 0xfffcf940 - 0xfffcfe6f
section, .sys_cfg_data: 0xfffcfe80 - 0xfffd0657
section, .mmu_tbl0: 0xfffd1000 - 0xfffd100f
section, .mmu_tbl1: 0xfffd2000 - 0xfffd3fff
section, .mmu_tbl2: 0xfffd4000 - 0xfffd7fff
section, .data: 0xfffd8000 - 0xfffd932f
section, .sbss: 0xfffd9330 - 0xfffd933f
section, .bss: 0xfffd9340 - 0xfffdb87f
section, .heap: 0xfffdb880 - 0xfffdbc7f
section, .stack: 0xfffdbc80 - 0xfffddc7f
section, .dup_data: 0xfffddc80 - 0xfffdefaf
section, .handoff_params: 0xfffe9e00 - 0xfffe9e87
section, .bitstream_buffer: 0xffff0040 - 0xfffffc3f
100% 0MB 0.3MB/s 00:00
Setting PC to Program Start Address 0xfffc0000
Successfully downloaded zynqmp_fsbl.elf
xsct% con
Info: Cortex-A53#0(target 10) Running
xsct% after 4000; stop
Info: Cortex-A53#0(target 10) Stopped at 0xfffce2f0 (External Debug Request)
啟動(dòng) FSBL 后,我們讓它運(yùn)行一段時(shí)間完成操作。然后,我們?cè)诮唤狱c(diǎn)手動(dòng)停止它。由于我使用的是定制板,其啟動(dòng)引腳被硬配置為 QSPI 啟動(dòng)模式,所以我修改了 FSBL 代碼,強(qiáng)制其使用 JTAG 啟動(dòng)模式。以下是我的 UART 輸出:
Xilinx Zynq MP First Stage Boot Loader (Modified) Release 2021.1 Jun 20 2022 - 1015 This FSBL has been modifiedinorder to boot from the JTAG only! Forcing the Boot Mode as JTAG! Check the xfsbl_initialization.c file.
9、第二階段引導(dǎo)加載程序(U-Boot)
與常規(guī)啟動(dòng)流程類似,SSBL 遵循 FSBL。由于我們使用的是 PetaLinux 構(gòu)建系統(tǒng)來生成鏡像,因此我們將使用常用的 U-Boot 作為 SSBL 程序。也可以使用不同的引導(dǎo)加載程序,但流程應(yīng)該類似。
U-Boot 需要一個(gè)設(shè)備樹二進(jìn)制文件,因此我們需要在啟動(dòng) U-Boot 之前將其加載到內(nèi)存中。該設(shè)備必須下載到內(nèi)存中預(yù)先設(shè)定的地址。在 PetaLinux 項(xiàng)目中,此配置位于名為CONFIG_SUBSYSTEM_UBOOT_DEVICETREE_OFFSET的參數(shù)下。可以在我之前的文章中找到一個(gè)簡(jiǎn)單的單行 Bash 命令,可以更快地找到所需的配置。在我的示例中,該地址為0x100000 。請(qǐng)注意,由于該二進(jìn)制文件不是可執(zhí)行文件,因此我們使用-data選項(xiàng)來下載它。
xsct% targets -set-nocase -filter {name =~"*A53#0*"}
xsct% dow -data"system.dtb"0x100000
100% 0MB 0.2MB/s 00:00
Successfully downloaded system.dtb
U-Boot 現(xiàn)在可以下載到內(nèi)存中了。
xsct% targets -set-nocase -filter {name =~"*A53#0*"}
xsct% dow "u-boot.elf"
Downloading Program -- u-boot.elf
section, .text: 0x08000000 - 0x080001af
section, .efi_runtime: 0x080001b0 - 0x080011bf
section, .text_rest: 0x08001800 - 0x080c8c23
section, .rodata: 0x080c8c28 - 0x080fa111
section, .hash: 0x080fa118 - 0x080fa12f
section, .data: 0x080fa130 - 0x0810863f
section, .got: 0x08108640 - 0x08108647
section, .got.plt: 0x08108648 - 0x0810865f
section, .u_boot_list: 0x08108660 - 0x0810d3f7
section, .efi_runtime_rel: 0x0810d3f8 - 0x0810d5a7
section, .rela.dyn: 0x0810d5a8 - 0x08125877
section, .bss_start: 0x08125878 - 0x08125877
section, .bss: 0x08125880 - 0x0813e3c7
section, .bss_end: 0x0813e3c8 - 0x0813e3c7
100% 1MB 0.3MB/s 00:04
Setting PC to Program Start Address 0x08000000
Successfully downloaded u-boot.elf
PS1:
注意到了嗎?這一步其實(shí)有點(diǎn)棘手,而且一旦出錯(cuò)就很難找出原因。與 FSBL 不同,我們并沒有在將 U-Boot 下載到內(nèi)存后立即啟動(dòng)它。這是因?yàn)?Zynq UltraScale+ 的架構(gòu)與 Zynq SoC 相比,情況要復(fù)雜一些。Zynq UltraScale+ 的應(yīng)用處理器基于 ARMv8 架構(gòu),而 Zynq 的應(yīng)用處理器則基于 ARMv7 架構(gòu)。
PS2:
為了符合 ARVv8 拓?fù)浣Y(jié)構(gòu),Linux 內(nèi)核啟動(dòng)時(shí)運(yùn)行在 ARM 異常級(jí)別 1/0。在該異常級(jí)別下,Linux 內(nèi)核對(duì)系統(tǒng)或安全關(guān)鍵寄存器的訪問受到硬件限制。Linux 與這些受限設(shè)備的所有交互都通過運(yùn)行在異常級(jí)別 3 的 ARM 可信固件 (ATF) 進(jìn)行路由。如果沒有 ATF, Linux 鏡像可能根本無法啟動(dòng)。
10、ARM 可信固件 (ATF)
如前所述,訪問特權(quán)區(qū)域需要 ARM 可信固件 (ATF)。ATF 作為代理,代表操作系統(tǒng)修改系統(tǒng)關(guān)鍵設(shè)置。為了使操作系統(tǒng)(在本例中為 Linux)能夠訪問這些資源,必須對(duì)其進(jìn)行修改,以支持 ATF 導(dǎo)出到操作系統(tǒng)自身的安全監(jiān)控調(diào)用。這些步驟超出了本教程的范圍。可以參考Zynq UltraScale+ 技術(shù)參考手冊(cè) UG1085 的第 16 章“16-System Protection Units”。接下來,我們將 ATF 下載到內(nèi)存中。
xsct% targets -set-nocase -filter {name =~"*A53#0*"}
xsct% targets
1 PS TAP
2 PMU
3 PL
5 PSU
6 RPU
7 Cortex-R5#0(No Power)
8 Cortex-R5#1(No Power)
9 APU
10* Cortex-A53#0(External Debug Request, EL3(S)/A64)
11 Cortex-A53#1(Reset)
12 Cortex-A53#2(Reset)
13 Cortex-A53#3(Reset)
xsct% dow "bl31.elf"
Downloading Program -- bl31.elf
section, .text: 0xfffea000 - 0xffff1fff
section, .rodata: 0xffff2000 - 0xffff2fff
section, .data: 0xffff3000 - 0xffff679d
section, stacks: 0xffff67c0 - 0xffff78bf
section, .bss: 0xffff78c0 - 0xffff863f
section, xlat_table: 0xffff9000 - 0xffffdfff
section, coherent_ram: 0xffffe000 - 0xffffefff
100% 0MB 0.3MB/s 00:00
Setting PC to Program Start Address 0xfffea000
Successfully downloaded bl31.elf
我們沒有重新啟動(dòng)處理器,因?yàn)檫€缺少一樣?xùn)|西,那就是 Linux 內(nèi)核本身。
11、完整的 Linux 鏡像
本教程的最后一步是將 Linux 內(nèi)核鏡像下載到 DDR 內(nèi)存中,并通過 U-Boot 啟動(dòng)它。用于下載鏡像的地址有限制。必須將鏡像放置在 DDR 內(nèi)存的空段中,并且不能損壞內(nèi)存中已有的任何其他鏡像。如果你已經(jīng)創(chuàng)建了一個(gè) PetaLinux 項(xiàng)目,可以在配置文件中通過帶有 CONFIG_SUBSYSTEM_UBOOT_FIT_IMAGE_OFFSET 標(biāo)記的配置項(xiàng)找到對(duì)應(yīng)的地址
請(qǐng)注意,Linux 內(nèi)核需要設(shè)備樹二進(jìn)制文件和可掛載的根文件系統(tǒng)才能完成啟動(dòng)過程。為了快速演示,我準(zhǔn)備了一個(gè) INITRAMFS 鏡像,并使用 PetaLinux 工具將內(nèi)核、根文件系統(tǒng)和設(shè)備樹二進(jìn)制文件打包到一個(gè)鏡像文件中。也可以根據(jù)需要選擇其他方法。
xsct% targets -set-nocase -filter {name =~"*A53#0*"}
xsct% dow -data "image.ub"0x10000000
100% 24MB 0.3MB/s 01:37
Successfully downloaded image.ub
下載 Linux 內(nèi)核需要一些時(shí)間,因?yàn)樗钦麄€(gè)過程中最大的鏡像文件。接下來,我們釋放 APU,然后通過檢查串口通道來觀察設(shè)備上的情況。
首先,運(yùn)行 ARM 可信固件。其輸出如下所示。
NOTICE: ATF running on XCZU9EG/silicon v4/RTL5.1 at 0xfffea000 NOTICE: BL31: v2.4(release):v1.1-7609-g851523ea2 NOTICE: BL31: Built : 0807, Apr 28 2021
當(dāng) ATF 完成將安全監(jiān)視器調(diào)用導(dǎo)出到操作系統(tǒng)后,就會(huì)發(fā)生 U-Boot 交接。
U-Boot 2021.01 (Jun 01 2021 - 1106 +0000) Board: Xilinx ZynqMP DRAM: 4 GiB PMUFW: v1.1 EL Level: EL2 Chip ID: zu9eg NAND: 0 MiB MMC: mmc@ff160000: 0, mmc@ff170000: 1 In: serial Out: serial Err: serial Bootmode: QSPI_MODE Reset reason: DEBUG Net: ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id eth0: ethernet@ff0b0000 Hit any key to stop autoboot: 0 ZynqMP>
當(dāng)終端出現(xiàn) U-Boot 提示符后,可以輸入bootm 0x10000000來啟動(dòng)下載的 Linux 內(nèi)核鏡像。由于該鏡像完整(包含內(nèi)核、根文件系統(tǒng)和設(shè)備樹),它將自動(dòng)啟動(dòng)。
## Loading kernel from FIT Image at 10000000 ... Using'conf-system-top.dtb'configuration Trying'kernel-1'kernel subimage Description: Linux kernel Created: 2021-06-04 1516 UTC Type: Kernel Image Compression: gzip compressed Data Start: 0x100000f8 Data Size: 9356113 Bytes = 8.9 MiB Architecture: AArch64 OS: Linux Load Address: 0x00200000 Entry Point: 0x00200000 Hash algo: sha256 Hash value: b4f7073afddc350f3c14f3e9ac1bf6ef8604c602951d13bbe58548bd0d415241 Verifying Hash Integrity ... sha256+ OK ## Loading ramdisk from FIT Image at 10000000 ... Using'conf-system-top.dtb'configuration Trying'ramdisk-1'ramdisk subimage Description: petalinux-image-minimal Created: 2021-06-04 1516 UTC Type: RAMDisk Image Compression: uncompressed Data Start: 0x108fa12c Data Size: 16778258 Bytes = 16 MiB Architecture: AArch64 OS: Linux Load Address: unavailable Entry Point: unavailable Hash algo: sha256 Hash value: 6fcf87930415873cac0aa2232786dace5b65379e68e42b0a6c30f77b870807bc Verifying Hash Integrity ... sha256+ OK ## Loading fdt from FIT Image at 10000000 ... Using'conf-system-top.dtb'configuration Trying'fdt-system-top.dtb'fdt subimage Description: Flattened Device Tree blob Created: 2021-06-04 1516 UTC Type: Flat Device Tree Compression: uncompressed Data Start: 0x108ec55c Data Size: 56061 Bytes = 54.7 KiB Architecture: AArch64 Hash algo: sha256 Hash value: 9bf95db6c5106f1f1945af67bbb43f2269539e514acadf88c4615f4ae7d6b595 Verifying Hash Integrity ... sha256+ OK Booting using the fdt blob at 0x108ec55c Uncompressing Kernel Image Loading Ramdisk to 7cd11000, end 7dd11412 ... OK Loading Device Tree to 000000007cd00000, end 000000007cd10afc ... OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034] [ 0.000000] Linux version 5.10.0-xilinx-v2021.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35.1)#1SMP Fri Jun 4 15:57 :16 UTC 2021 [ 0.000000] Machine model: xlnx,zynqmp .............................. PetaLinux 2021.1 ZynqUS_Linux ttyPS0 root@ZynqUS_Linux:~ > uname -r 5.10.0-xilinx-v2021.1
現(xiàn)在,硬件上已經(jīng)安裝了完整的 Linux 鏡像 :)
提示與經(jīng)驗(yàn)總結(jié)
流程順序不可隨意更改 — 每一步都有依賴
JTAG 啟動(dòng)非常強(qiáng)大 — 即使沒有 SD/USB/網(wǎng)絡(luò)也能引導(dǎo)系統(tǒng)
要注意 JTAG 鏈路穩(wěn)定性 — 線纜長(zhǎng)度、頻率設(shè)置會(huì)影響連接穩(wěn)定性
ATF 必須支持 UltraScale+ 安全模式 — 否則內(nèi)核可能不能正常訪問安全級(jí)別寄存器
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20442瀏覽量
333983 -
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219009 -
JTAG
+關(guān)注
關(guān)注
6文章
415瀏覽量
74962 -
UltraScale
+關(guān)注
關(guān)注
0文章
126瀏覽量
32361
原文標(biāo)題:從 JTAG 啟動(dòng) Zynq UltraScale+ 上的嵌入式 Linux 鏡像:詳細(xì)實(shí)戰(zhàn)教程
文章出處:【微信號(hào):HXSLH1010101010,微信公眾號(hào):FPGA技術(shù)江湖】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
通過JTAG啟動(dòng)Linux的方法和腳本
Zynq UltraScale + MPSoC USB 3.0 CDC器件類設(shè)計(jì)
如何利用ZYNQ MPSoC玩DOOM?
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
如何調(diào)試Zynq UltraScale+ MPSoC VCU DDR控制器
基于Zynq UltraScale+ MPSoC上運(yùn)行 Xen 管理程序
Zynq UltraScale+ MPSoC的發(fā)售消息
如何調(diào)試 Zynq UltraScale+ MPSoC VCU DDR 控制器?
米爾電子zynq ultrascale+ mpsoc底板外設(shè)資源清單分享
Zynq UltraScale+ MPSoC中的隔離方法
Zynq UltraScale+ MPSoC的隔離設(shè)計(jì)示例
Zynq UltraScale+MPSoC嵌入式設(shè)計(jì)教程
Zynq UltraScale+ MPSoC驗(yàn)證數(shù)據(jù)手冊(cè)
如何在Zynq UltraScale+ MPSoC平臺(tái)上通過JTAG啟動(dòng)嵌入式Linux鏡像
評(píng)論