尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ZYNQ Alternate Boot Mode 设置

ZYNQ Alternate Boot Mode 设置 ZCU106 Alternate Boot Mode、System Reset 与 POR 指南本文解释 Zynq UltraScale MPSoC 的 Alternate Boot Mode并给出 Vitis 2022.1/XSDB 可直接执行的命令。核心结论是写入 Alternate Boot Mode 只是在寄存器中准备下一次启动模式不会立即复位。随后执行rst -systemCSU BootROM 才会在一次 system reset 中使用 alternate 模式这不是 POR。1. 三种复位要分开操作是否重新运行 CSU BootROM是否重新选择 boot mode是否等同 POR写BOOT_MODE_USER否否只准备配置否rst -processor否否否rst -system是是使用USE_ALT或物理模式否断电重上电/POR 引脚是是重新采样物理拨码是rst -processor只复位当前 A53/R5 核。例如 R5 在VINITHI1时会回到0xFFFF0000它不会重新加载 SD/QSPI 镜像也不会再次执行 BootROM 的 XIP OCM 跳板。rst -system会重建处理器/DAP target并重新执行 CSU BootROM但不会产生真正的电源上电复位。已写入的BOOT_MODE_USER.USE_ALT/ALT_BOOT_MODE能在该流程中被 BootROM 使用。POR 会重新采样板上启动拨码。冷启动验证、改变拨码后的验证以及怀疑 warm-reset 残留状态时应断电重上电或使用明确的 POR 硬件信号。2.BOOT_MODE_USER位域寄存器CRL_APB_BOOT_MODE_USER 0xFF5E0200 CRL_APB_BOOT_MODE_POR 0xFF5E0204BOOT_MODE_USERbit[15:12] ALT_BOOT_MODE bit[8] USE_ALT bit[3:0] BOOT_MODE当前物理启动引脚值Alternate 写值计算value (ALT_BOOT_MODE 12) | (1 8)常用编码模式编码写入值JTAG0x00x00000100QSPI240x10x00001100QSPI320x20x00002100SD00x30x00003100SD10x50x00005100SD1 Low Speed0xE0x0000E100ZCU106 当前 SD 卡路径实测使用SD1_LS0xEQSPI 当前物理模式实测为QSPI240x1。写0xE100后如果物理拨码仍是 QSPI24读回可能是BOOT_MODE_USER 0x0000E101如果物理低四位是 SD1-LS则可能读回0x0000E10E。判断 alternate 模式要查看 bit[15:12] 和 bit[8]不能只看最低四位。3. Alternate Boot 的实际时序JTAG 写 BOOT_MODE_USER | | 此时 CPU 仍继续运行BootROM 没有重新执行 v 执行 rst -system | | system reset不是 POR v CSU BootROM 读取 USE_ALT | -- USE_ALT1使用 ALT_BOOT_MODE | -- USE_ALT0使用物理 boot pins v 从指定设备启动并释放 A53/R5Alternate Boot 适合在不改变拨码和不重新插拔 SD 卡的情况下对比同一次上电中的 SD/QSPI/JTAG BootROM 路径。它不能完全代替冷启动验证因为某些电源域、外设和寄存器只在 POR 后回到真正的初始状态。4. 一键脚本脚本build/zcu106_fsbl/boot_alt_mode.tcl强制 QSPI24 并 system resetcd F:\code\embeddedsw D:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.bat.\build\zcu106_fsbl\boot_alt_mode.tclqspi24强制 ZCU106 SD1-LSD:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.batF:\code\embeddedsw\build\zcu106_fsbl\boot_alt_mode.tclsd1_ls强制 JTAG bootD:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.batF:\code\embeddedsw\build\zcu106_fsbl\boot_alt_mode.tcljtag清除 alternate 并按物理拨码 system resetD:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.batF:\code\embeddedsw\build\zcu106_fsbl\boot_alt_mode.tclphysical脚本参数还支持qspi32、sd0和sd1。脚本会打印 reset 前后两个 boot mode 寄存器、RPU 配置和 target 状态。5. XSCT Console 手工操作在 Vitis 选择Xilinx - XSCT Console。QSPI24connect -url tcp:127.0.0.1:3121 targets -set -nocase -filter {name ~ PSU} mwr 0xFF5E0200 0x00001100 mrd 0xFF5E0200 2 rst -system after 3000 targetsSD1-LStargets -set -nocase -filter {name ~ PSU} mwr 0xFF5E0200 0x0000E100 rst -system after 3000 targets恢复物理拨码targets -set -nocase -filter {name ~ PSU} mwr 0xFF5E0200 0x00000000 rst -system after 3000只执行mwr ... 0而不 reset只会清除下一次启动的 alternate 选择当前已经运行的程序不会改变。6. Vitis IDE 操作Vitis 2022.1 没有单独的 Alternate Boot 对话框最稳定的 GUI 工作流是在 IDE 内使用 XSCT ConsoleVivado Hardware ManagerOpen Target - Auto Connect或启动本机hw_server。打开 Vitis workspace。Xilinx - XSCT Console。输入上一节命令或执行source F:/code/embeddedsw/build/zcu106_fsbl/boot_alt_mode.tcl脚本需要一个参数因此推荐从 PowerShell 调用在 XSCT Console 手工操作时直接使用mwr/rst命令更清楚。reset 后打开 Debug perspective刷新 TargetsAttach 到新出现的 A53/R5。不要让 Debug Configuration 再执行一次 system reset否则可能覆盖刚完成的启动现场。7. 实测对照现有脚本compare_r5_mpu_alt_sd_qspi.tcl在同一次上电中依次执行 alternate SD1-LS 和 QSPI24D:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.batF:\code\embeddedsw\build\zcu106_fsbl\compare_r5_mpu_alt_sd_qspi.tcl结果SD1-LS non-XIP: PC 0xFFFC00E8 SCTLR.M 0 QSPI24 XIP: PC 0xC00400E8 SCTLR.M 1 Region 1 base 0xC0000000, attr 0x30B, size 0x39该实验使用的是两次rst -system不是两次 POR。这一点正是 Alternate Boot 的价值不用移动拨码即可让 BootROM走不同启动分支并比较 OCM/CPU 上下文。8. 什么情况下必须 POR以下情况优先断电重上电刚改变物理拨码需要验证真实冷启动模式。QSPI/SD 控制器因失败实验处于未知状态。DAP sticky error 无法通过普通 reset 清除。电源域、PLL、DDR、OCM ECC 或安全状态可能保留 warm-reset 上下文。要证明产品上电行为而不是调试阶段的 BootROM 分支。通过 JTAG 控制 POR 引脚属于硬件级操作使用前应确认线缆支持并避免在 Flash 写入过程中触发。日常最可靠的 POR 方法仍是关闭板卡电源等待电源完全下降后重新上电。9. 常见误区误区正确理解写0x1100后立刻变成 QSPI 启动不会必须再执行 system resetrst -system等于 POR不等于它会重跑 BootROM但不是电源上电复位rst -processor会重跑 BootROM不会只复位选中的 CPU 核清除USE_ALT会立即切换当前程序不会只影响下一次 BootROM 启动alternate 结果可完全代表冷启动不能最终产品验证仍需 POR低四位就是 alternate 模式低四位是物理 boot pinsalternate 看 bit[15:12] 和 bit[8]10.实际运行效果PS F:\code\embeddedswD:\App_Software\vivado\install\Vitis\2022.1\bin\xsdb.bat .\build\zcu106_fsbl\boot_alt_mode.tcl qspi24 BOOT_MODE_USER before:FF5E0200:00000000BOOT_MODE_POR:FF5E0204:00000000Requested qspi24:ALT_BOOT_MODE0x1USE_ALT1write0x00001100BOOT_MODE_USER armed:FF5E0200:00001101Issuing systemreset(not POR)...BOOT_MODE_USER after:FF5E0200:00001101BOOT_MODE_POR after:FF5E0204:00000000RPU_0_CFG:FF9A0100:00000005Targets after boot:1PS TAP2PMU3PL4*PSU5RPU6Cortex-R5 #0(Running)7Cortex-R5 #1(Reset)8APU(L2 Cache Reset)9Cortex-A53 #0(APU Reset)10Cortex-A53 #1(APU Reset)11Cortex-A53 #2(APU Reset)12Cortex-A53 #3(APU Reset)11. 附录boot_alt_mode.tcl脚本的详细代码如下if{$argc!1}{putsUsage: xsdb boot_alt_mode.tcl qspi24|qspi32|sd0|sd1|sd1_ls|jtag|physicalexit2}set requested[string tolower[lindex $argv0]]array set boot_codes{jtag0x0qspi240x1qspi320x2sd00x3sd10x5sd1_ls0xE}connect-url tcp:127.0.0.1:3121after400targets-set-nocase-filter{name~PSU}putsBOOT_MODE_USER before: [mrd -force 0xFF5E0200 1]putsBOOT_MODE_POR: [mrd -force 0xFF5E0204 1]if{$requested eqphysical}{#USE_ALT0.The low BOOT_MODE bits remain the live physical pin value.mwr0xFF5E02000x00000000putsCleared USE_ALT; next system reset uses physical boot pins.}elseif{[info existsboot_codes($requested)]}{set code $boot_codes($requested)set value[expr{($code12)|(18)}]mwr0xFF5E0200$value puts[formatRequested %s: ALT_BOOT_MODE0x%X USE_ALT1 write0x%08X\ $requested $code $value]}else{putsUnknown mode: $requesteddisconnect exit2}putsBOOT_MODE_USER armed: [mrd -force 0xFF5E0200 1]putsIssuing system reset (not POR)...rst-system after3000targets-set-nocase-filter{name~PSU}putsBOOT_MODE_USER after: [mrd -force 0xFF5E0200 1]putsBOOT_MODE_POR after: [mrd -force 0xFF5E0204 1]putsRPU_0_CFG: [mrd -force 0xFF9A0100 1]putsTargets after boot:puts[targets]disconnect exit
返回列表