主板:i.MX 8M Plus LPDDR4 EVK (MIMX8ML8DVNLZAA), IMX8MPEVKHUG rev 0
HAB:熔断 OPEN(SRK 未烧毁,故意,仍在评估中)
我正在为基于 RAUC 的 A/B 更新系统实现启动加载程序更新冗余,并希望像许多 i.MX8M 设计那样使用 eMMC 的硬件 启动0/启动1 分区(BOOT_PARTITION_ENABLE)——将新的启动加载程序写入非活动启动分区,切换哪个分区处于活动状态,并依靠 ROM 在新激活的分区发生故障时回退到另一个分区。我特别想避免为此烧毁任何 BOOT_CFG/efuse。
我在 EVK 上使用基于 poky/oe-core mmc-utils 配方构建的 mmc-utils 时观察到以下情况:
- mmc extcsd 读取 /dev/mmcblk2 报告 PARTITION_CONFIG 中 BOOT_PARTITION_ENABLE 已设置为 boot0(值为 0x08)。
- boot0 (/dev/mmcblk2boot0) 包含一个看起来有效的映像(偏移量 0 处有正确的 IVT 标签),但它与我当前部署的引导加载程序不匹配。
- boot1 (/dev/mmcblk2boot1) 完全为空(全部为零)。
- 逐字节比较证实,该板实际上是从标准的 32 KiB 偏移处的原始 eMMC 用户区启动(内容与我当前部署的 imx-boot 完全匹配)——而不是从 boot0 启动,尽管 PARTITION_CONFIG 指示 boot0 已启用。
因此,在这个板上,EXT_CSD 的 BOOT_PARTITION_ENABLE 似乎对 ROM 的实际启动源没有影响。根据 IMX8MPEVKHUG 第 2.2 节,EVK 的 SW4 开关仅用于选择粗略的启动设备类别(eMMC vs SD vs QSPI vs NAND vs 熔丝 vs USB 串行下载)——没有用于 eMMC 启动分区子模式的开关位置。
问题:
1. 在LPDDR4 EVK上,是否有支持的方法可以选择“ROM从eMMC boot0/boot1硬件分区启动”,而无需设置BT_FUSE_SEL=1或烧录BOOT_CFG熔丝?例如,是否可以通过跳线、电阻或IMX8MPEVKHUG rev 0中未记录的SW4/SW1101组合来实现?或者,该板的PCB是否已硬性规定始终从eMMC用户区启动,而不管EXT_CSD状态如何?
2. 如果 BOOT_CFG 熔丝是启用 eMMC 启动分区模式的唯一方法:控制此模式的 BOOT_CFG 熔丝组是否独立于用于 HAB 的 SRK 哈希熔丝?我想了解通过熔丝启用 eMMC 启动分区冗余是否会迫使我同时关闭 HAB(SRK 烧录),或者这些是否是可分离的决定。
3. 对于使用 i.MX 8M Plus 和 eMMC 的定制板设计(非 EVK),推荐的方法是如何在首次启动时就使 eMMC boot0/boot1 冗余可用?也就是说,BOOT_CFG GPIO 跳线/PCB 设计中需要满足哪些条件,才能使其成为第一天就能使用的功能,而不是需要稍后进行熔丝位绑定?
如果能提供一些关于 eMMC 启动分区选择的 BOOT_CFG 位定义的具体参考手册章节的链接(除了 IMX8MPEVKHUG 中已经涵盖的 SW4 设备类位之外),我们将不胜感激。
谢谢!
供参考,请参阅 i.Mx8 UM 第 5.8.2.2.1 节“高级 eMMC 启动流程”。
SCU ROM 支持 4 种 eMMC 启动方案:
1.在这种情况下,“eMMC 快速启动”熔丝被烧断。小学和中学
镜像容器集均位于启动分区中,且 BOOT_PARTITION_ENABLE = 1 或 2。
2. 在这种情况下,“eMMC 快速启动”熔丝烧断了。小学和中学
镜像容器集均位于用户区域,且 BOOT_PARTITION_ENABLE =7。
3.在这种情况下,“eMMC 快速启动”熔丝没有熔断。启动模式为正常模式
启动、主镜像容器集和辅助镜像容器集都在用户区域。
4. 在这种情况下,“eMMC 快速启动”熔丝没有熔断。启动模式为正常模式
启动时,主镜像容器集和辅助镜像容器集都在启动过程中。
分区,并且 BOOT_PARTITION_ENABLE = 1 或 2。
谢谢你的指点——不过我认为第 5.8.2.2.1 章描述的是不同的芯片系列。“SCU ROM” eMMC 启动流程是 i.MX8QuadMax/QuadXPlus/DualXPlus 特有的,它们具有专用的系统控制器单元(独立的 Cortex-M4 启动子系统)。i.MX8M Plus 没有 SCU – 其启动 ROM 直接在 Cortex-A53 上运行 – 因此该章节中的 BOOT_PARTITION_ENABLE=1/2/7 场景不适用于这里。
对于 i.MX8M Plus,冗余似乎是通过 i.MX8M Plus 参考手册中的主/辅助映像机制来处理的(图 6-1):ROM 从 BT_FUSE_SEL/BOOT_CFG 选择的设备启动,如果失败,则回退到 IMG_CNTN_SET1_OFFSET 熔丝偏移处的辅助映像——在同一引导设备上,而不是单独的 boot0/boot1 分区。这与我在 LPDDR4 EVK 上看到的情况一致:EXT_CSD 中设置了 BOOT_PARTITION_ENABLE=1,但 ROM 忽略了它,仍然从原始用户区偏移量启动。
所以我的问题仍然是,仅限于 i.MX8M Plus:
1. 在 LPDDR4 EVK 上,是否有任何非熔丝方法(跳线、电阻或未记录的 SW1101/SW4 位置)来选择 eMMC boot0/boot1 作为启动源,还是这完全取决于 BOOT_CFG 跳线/BT_FUSE_SEL 的决定?
2. BOOT_CFG 熔丝组是否独立于 HAB 的 SRK 哈希熔丝,或者通过熔丝提交 BOOT_CFG 是否也会强制关闭 HAB?
3.对于定制板设计,在布局时需要进行哪些 BOOT_CFG 绑定才能在不进行后续熔丝分配的情况下保持硬件启动分区冗余?
如果我误解了第 5.8.2.2.1 章实际适用的部分,请指正。
启动 CFG 和 SRK Hash 之间的熔丝位是可分离的。如果 SRK 哈希值被烧录,则似乎需要额外的启动步骤,即比较启动映像和烧录的熔丝位的哈希值。
谢谢你提供的信息。
IMX8MMEVKBHUG i.MX 8M Mini LPDDR4 EVKB 板硬件用户指南是否提供了任何有用的信息,例如启动模式和引导设备配置章节?
您可以参考
i.MX8MP eMMC 辅助启动.zip
这些演示和文章涵盖了更高级的辅助启动场景,但也包括一些基础知识,例如如何将引导加载程序写入启动 1 或启动 2,以及如何启用启动 1 或启动 2。这些内容应该正是您所需要的。
i.MX8MP_emmc_boot_part_secondary_boot.uuu
FB:ucmd mmc partconf ${emmc_dev} ${emmc_ack} ${part} 0
启动 1
FB:ucmd mmc partconf ${emmc_dev} ${emmc_ack} 1 0
启动 2
FB:ucmd mmc partconf ${emmc_dev} ${emmc_ack} 2 0
i.MX8MP_emmc_boot_part_secondary_boot.uuu
uuu_version 1.2.39
SDPS: boot -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v6.6.3-1.0.0
SDPV: delay 1000
SDPV: write -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v6.6.3-1.0.0 -skipspl
SDPV: jump
#FB: ucmd setenv emmc_dev 1
FB: ucmd setenv part 1
FB: ucmd setenv boot_offset 0x0
FB: ucmd setenv fastboot_dev mmc
FB: ucmd setenv mmcdev ${emmc_dev}
FB: ucmd if test ${part} != 7; then mmc dev ${emmc_dev} ${part}; else mmc dev ${emmc_dev}; fi
FB: ucmd setenv fastboot_buffer ${loadaddr}
FB: download -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v5.15.71-2.2.0
#FB: download -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v6.6.3-1.0.0
FB: ucmd echo ${fastboot_bytes}
FB: ucmd setexpr blks ${fastboot_bytes} / 0x200; setexpr blks ${blks} + 1
FB: ucmd mmc write ${loadaddr} ${boot_offset} ${blks}
# Secondary boot
FB: ucmd setenv part 2
FB: ucmd if test ${part} != 7; then mmc dev ${emmc_dev} ${part}; else mmc dev ${emmc_dev}; fi
#FB: download -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v5.15.71-2.2.0
FB: download -f imx-boot-imx8mp-lpddr4-evk-sd.bin-flash_evk-LF_v6.6.3-1.0.0
FB: ucmd echo ${fastboot_bytes}
FB: ucmd setexpr blks ${fastboot_bytes} / 0x200; setexpr blks ${blks} + 1
FB: ucmd mmc write ${loadaddr} ${boot_offset} ${blks}
FB: ucmd setenv part 1
FB: ucmd if env exists emmc_ack; then ; else setenv emmc_ack 0; fi;
FB: ucmd mmc partconf ${emmc_dev} ${emmc_ack} ${part} 0
FB: done