AMD Versal自适应SoC中eMMC烧录/启动调试检查表(下)
本文作者:AMD 工程师 Sowmya Ramakrishnan
本文链接上一篇文章开发者分享 | AMD Versal 自适应 SoC:eMMC 烧录/启动调试检查表(上)
4.eMMC 器件烧录
有多种受支持的方式可用于烧录 eMMC 器件,包括使用 AMD Vivado IDE、使用 AMD Vitis GUI 或使用 U-Boot。
在通过 Vivado 或 Vitis 烧录 eMMC 之前不需要进行分区,分区由该工具在后台完成。
如果希望在烧录之前手动对器件进行分区,可以通过 Linux 来完成。下方提供了一个示例:
https://adaptivesupport.amd.com/s/article/000035921?language=zh_CN#format
Vivado 和 Vitis 使用相同实用工具 (program_flash) 来烧录 eMMC 器件。
a. Vivado IDE
烧录前,建议在 JTAG 模式下从零开始重新上电启动 (0000)。如果无法更改物理启动模式,则可运行《器件烧录/启动调试检查表》中所谈及的 versal_change_boot_mode.tcl 来通过软件强制执行 JTAG 启动模式。在其他启动模式下进行烧录可能导致意外失败,AMD 对此不予支持。
器件烧录/启动调试检查表:
https://adaptivesupport.amd.com/s/article/000033254?language=zh_CN#CheckDeviceStatus
如需了解在 Vivado 中烧录闪存器件的详细步骤,请参阅 UG908 中的“烧录配置存储器器件”部分。
UG908:
https://docs.amd.com/r/en-US/ug908-vivado-programming-debugging/Programming-Configuration-Memory-Devices
要观察烧录过程和详细日志,请从 Shell 或命令提示符打开 Vivado(在 Windows 中 -> CMD -> 导航到 Vivado 安装文件夹 -> 启动二进制文件)。Vivado 使用迷你 U-Boot 来烧录闪存器件,U-Boot 日志会显示在命令提示符窗口中。
Vivado 硬件管理器 GUI 用于添加和烧录闪存器件,以及检查启动后目标器件的状态。
打开 Vivado 硬件管理器并连接到 AMD Versal 自适应 SoC 器件。
添加 eMMC 是对其进行烧录的第一步。通过右键单击 Versal 器件并选择“Add Configuration Memory Device”(添加配置存储器器件)来完成此操作。

选中 eMMC 闪存,该配置存储器器件现已添加到硬件目标。要继续操作,Vivado 器件管理器会发出如下提示,询问您现在是否要对配置存储器器件进行烧录:“Do you want to program the configuration memory device now?”。单击“OK”(确定)以继续。
“Files to load”(要加载的文件):此处添加启动镜像。这些启动镜像可以使用 Vivado 或 Bootgen/Vitis(如果添加软件分区)来创建。
如果文件名不是推荐的“boot.bin”,Vivado 会发出警告。
要配置系统,就需要“Initialization PDI”(初始化 PDI),随后该工具才能访问并烧录闪存。它等同于 AMD Zynq 7000 和 MPSoC 流程中的 FSBL.elf。建议使用小尺寸的简单 PDI。用户可以使用来自 Vivado 的 PDI(无需 Vitis 添加的额外组件)作为初始化 PDI。
“Erase”(擦除):擦除配置存储器器件的内容。
“Blank Check”(空白检查):检查配置存储器器件,确保烧录前器件中不含数据。
“Program”(烧录):使用所选器件镜像对配置存储器器件进行烧录。
“Verify”(验证):验证配置存储器器件内容与所选器件镜像是否匹配。
单击“OK”即可在配置存储器器件上启动选择操作。
使用 Vivado 烧录闪存时如果遇到错误该怎么办?
发生错误时,有 3 种日志有助于调试。
(1)来自 Vivado Tcl 控制台的 log 日志
以下是由于在 RAW Boot 分区中加载大于 2MB 的文件而导致烧录失败的示例。

(2) U-Boot log 日志

(3)该日志来自于初始化 PDI 中的 PLM
闪存烧录期间,首先运行初始化 PDI。此 PDI 须正确执行。如需了解如何收集此日志,请参阅《器件烧录/启动调试检查表》中的描述。
器件烧录/启动调试检查表:
https://adaptivesupport.amd.com/s/article/000033254?language=zh_CN#LoadingPDI
b. Vitis GUI
使用 Vitis GUI 烧录 eMMC 闪存与上述 Vivado 方法十分相似。同样建议使用 JTAG 模式执行烧录。同样需要指定 2 个 PDI 文件,分别在“Image File”(图像文件)和“Init File”(初始化文件)中指定这些文件,如下所示。如需了解更多详细信息,请参阅 UG1400 的“闪存烧录”部分。
UG1400 :
https://docs.amd.com/r/en-US/ug1400-vitis-embedded/Programming-Flash
打开 Vitis 工作空间
导航到“Vitis -> Program Flash”(Vitis > 闪存烧录)

“Image File”(镜像文件):这是启动镜像。
“Partition Type”(分区类型):选择 fat32、raw-boot-1、raw-boot-2 或 raw-user。
“Init File”(初始化文件):提供初始化文件路径。
“Blank check after erase”(擦除后执行空白检查):该选项将通过执行空白检查来验证是否已正确完成擦除操作。它会读回内容并检查已擦除区域是否为空白。
“Verify after Flash”(烧录后验证):验证操作会与闪存烧录操作进行交叉检查。该选项会读回闪存内容,并与烧录后的数据进行交叉检查。
单击“Program”(烧录)并在“Output”(输出)部分中观察日志。
以下是烧录 eMMC 的 FAT32 分区的示例。

使用 Vitis 烧录闪存期间如果遇到错误该怎么办?
应收集以下信息:
迷你 U-Boot log 日志 - Vitis 将自动在控制台上显示 U-Boot 日志。
PLM log 日志。如需了解如何收集此日志,请参阅《器件烧录/启动调试检查表》中的描述。
重要:截至目前,2023.2 Vitis 仅支持将 eMMC 分区 0 烧录为 FAT32 或 RAW-User。无法使用 Vitis 烧录 RAW Boot 分区 1 和 2。(如果在 GUI 中选择了 Boot 分区 1 或 Boot 分区 2,工具会自动切换到 RAW-User)。此问题正在调查中,因此建议使用 Vivado 或 U-Boot 来烧录 eMMC RAW Boot 分区 1 和 2。
c. U-Boot
U-Boot 也可用于烧录 eMMC。启动进入 U-Boot 后,用户可以使用多条 U-Boot 命令来烧录器件。这些命令包括 mmc part、mmc erase、mmc write、fatwrite 等。下方提供了一些常见示例。
https://adaptivesupport.amd.com/s/article/000035921?language=zh_CN#commands
启动进入 U-Boot。如果采用 AMD 参考板,那么您可使用下方针对您的工具版本提供的预构建镜像。如果采用定制开发板,那么您需要构建镜像。建议使用 PetaLinux 工具来生成镜像。UG1144 包含有关如何生成此处使用的 BOOT.BIN 文件的详细步骤。
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842316/Linux+Prebuilt+Images
UG1144:
https://docs.amd.com/r/en-US/ug1144-petalinux-tools-reference-guide/Setting-Up-Your-Environment
请确保器件采用的是 JTAG 启动模式。如果无法更改物理启动模式,则可运行《器件烧录/启动调试检查表》中所谈及的 versal_change_boot_mode.tcl 来通过软件强制执行 JTAG 启动模式。
器件烧录/启动调试检查表:
https://adaptivesupport.amd.com/s/article/000033254?language=zh_CN#CheckDeviceStatus
连接到终端中的器件 PS COM 端口。在 XSCT 中,导航到正确的目录,并执行以下命令:
xsct% device program BOOT.BIN
您应可在 UART 控制台终端中看到器件启动进入 U-Boot。

下面显示了在 eMMC 器件的 RAW Boot 分区 1 中烧录启动镜像的示例。
在 XSCT 终端上,使用以下命令将启动镜像写入 DDR:
xsct% targets -set -nocase -filter {name =~ "Versal *"}xsct% dow -data -force BOOT.bin 0x70000000

在 U-Boot 提示符处,执行以下命令:
mmc info - 显示 eMMC 器件信息
part list mmc 0 - 列出 eMMC 器件 0 中的现有分区
mmc dev 0 0 - 选择要切换到并对其进行操作的 mmc 器件。在此例中,已选中 mmc 器件 0 和分区 0
mmc erase 0 0x4000 - 擦除 RAW user 分区中的扇区
mmc dev 0 1 - 已选中 mmc 器件 0 和分区 1
mmc erase 0 0x4000 - 擦除 RAW Boot 分区 1 中的扇区
mmc write 70000000 0 - 将指定扇区从 DRAM 写入 mmc
mmc dev 0 2 - 已选中 mmc 器件 0 和分区 2
mmc erase 0 0x4000 - 擦除 RAW Boot 分区 2 中的扇区

将启动模式切换至 eMMC 并通过给开发板掉电并重新上电或者发出 POR 来复位系统。以下提供了将启动模式更改为 eMMC 的脚本。它对 versal_change_boot_mode.tcl 作了些许修改。

5.以 eMMC 模式启动
此时,闪存烧录已经过调试,您可以相信闪存已烧录完成并且已准备好启动。
首先,将启动模式切换至 eMMC (0110)。建议更改物理 MODE 管脚。您也可以使用以下脚本来将启动模式强制更改为 eMMC。

随后,您可给系统上电,这样 Versal 器件将尝试从 eMMC 启动。
启动期间如果遇到错误该怎么办?
提交技术支持 case 时,请提供以下信息,这些信息至关重要:
错误状态日志。可在 Vivado 硬件管理器或 XSCT 中收集这些日志。
JTAG 状态日志。可在 Vivado 硬件管理器或 XSCT 中收集这些日志。
PLM 日志。此日志可从 UART 控制台或 XSCT 中收集,欲知详情,请参阅《器件烧录/启动调试检查表》中的描述。
请参阅《器件烧录/启动调试检查表》以获取错误状态日志和 JTAG 状态日志的两种收集方法的示例。
器件烧录/启动调试检查表:
https://adaptivesupport.amd.com/s/article/000033254?language=zh_CN#CheckDeviceStatus
如需了解有关 JTAG_STATUS 寄存器和 ERROR_STATUS 寄存器的详细信息,请参阅 AM011 的“测试和调试”章节。
AM011:
https://docs.amd.com/r/en-US/am011-versal-acap-trm/Test-and-Debug?tocId=S1ymOrXeGoLR023M1PAtYw
识别启动失败时所处的阶段非常重要。是 BootROM 执行失败?还是 PLM 执行失败?
请参阅“启动错误示例”部分,获取 BootROM/PLM 错误示例和解码策略。
https://adaptivesupport.amd.com/s/article/000035928?language=zh_CN#error
如果您当前使用的是 AMD 参考板,运行下方提供的预构建镜像可能会有所帮助。
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842316/Linux+Prebuilt+Images
如果怀疑启动镜像中的任意分区损坏,那么对可疑分区添加校验和可能会有所帮助。
下方提供了 eMMC 启动期间常见的 BootROM 和 PLM 错误的参考资料 。
https://adaptivesupport.amd.com/s/article/000035921?language=zh_CN#error
6.启动错误示例
BootROM 和 PLM 错误的示例及其解码方法:
BootROM 错误
请参阅 AM011 中的“BootROM 错误代码表”参考资料来进行错误解码。
AM011:
https://docs.amd.com/r/en-US/am011-versal-acap-trm/BootROM-Error-Code-Table
场景 1:未连接 eMMC 启动模块,以 eMMC 模式启动。
Vivado 硬件管理器寄存器列表:


在此 BootROM 故障示例中,BOOTROM FIRST ERROR 是十六进制 0x22b。
请参阅该表格,发生的错误如下。

BootROM 错误可能与硬件问题(如电源)有关。请务必遵循上述步骤中的所有要求以及PDM 工具中的建议来进行操作。
PDM 工具:
https://www.amd.com/zh-cn/products/software/adaptive-socs-and-fpgas/power-design-manager.html
场景 2:闪存烧录操作中途中止,从 eMMC 启动


PLM 错误
XXXX - 重大错误代码 - xplmi_status.h 中定义的 PLM/LOADER/XPLMI 错误代码。
场景 3:eMMC 闪存中未烧录任何镜像。
UART 控制台:

在以上 PLM 错误示例中,PLM MAJOR ERROR 是十六进制 0x31D。请参阅代码,发生的错误如下。

如果遇到 PLM 错误,通常表示硬件正常。如果您使用 PetaLinux 来开发嵌入式操作系统组件,并且错误发生在 ATF、U-Boot 或 Linux 中,那么最好调查一下 PetaLinux 组件,可能会有所帮助。如需了解更多信息,请参阅 UG1144。
7.结论
本篇博文中提供的指导信息演示了一种全面的方法用于理解、配置 Versal 中的 eMMC 烧录/启动流程并对其进行故障排除。
