3. 配置MCUboot基础

配置MCUboot基础 学习卡片

任务目标

在Zephyr环境中为nRF52840 DK开发板启用MCUboot引导程序,配置RSA-2048签名算法与分区大小,编译生成可烧录的bootloader十六进制镜像,并验证镜像头信息正确。

环境依赖

需要Zephyr SDK 0.16+、west工具链,以及MCUboot模块(通过west更新获取)。本案例基于nrf52840dk_nrf52840目标板,使用Zephyr内置的MCUboot配置。

实现步骤

MCUboot在Zephyr中作为独立镜像构建。核心工作分为两部分:一是通过menuconfig或配置文件设定签名算法与分区大小;二是编译生成镜像。以下为最小完整配置与构建流程。

1. 创建MCUboot构建目录并配置

# 进入Zephyr工程目录(假设已通过west init创建)
cd zephyrproject
west build -b nrf52840dk_nrf52840 -d build_mcuboot bootloader/mcuboot/boot/zephyr \
  -DCONFIG_BOOT_SIGNATURE_TYPE_RSA=y \
  -DCONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE="<你的工程路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_0="<你的工程路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_1="<你的工程路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_2="<你的工程路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_3="<你的工程路径>/root-rsa-2048.pem"

若尚未生成RSA密钥,先执行:openssl genrsa -out root-rsa-2048.pem 2048。MCUboot要求提供4个密钥槽位文件(可重复使用同一文件)。

2. 配置分区大小

分区大小在Zephyr的pm_static.yml或设备树中定义。对于nRF52840 DK,默认flash为1MB。在zephyrproject/bootloader/mcuboot/boot/zephyr/下创建pm_static.yml覆盖默认值:

# pm_static.yml
mcuboot_primary:
  size: 0x40000   # 256KB,用于存放应用镜像(含image header)
mcuboot_secondary:
  size: 0x40000   # 256KB,用于OTA临时存放
mcuboot_primary_app:
  size: 0x3F000   # 252KB,实际应用可用空间(预留1KB header)
mcuboot_secondary_app:
  size: 0x3F000

将该文件路径加入构建命令:-DPM_STATIC_YML_FILE="<路径>/pm_static.yml"。

3. 编译生成镜像

west build -b nrf52840dk_nrf52840 -d build_mcuboot bootloader/mcuboot/boot/zephyr \
  -DCONFIG_BOOT_SIGNATURE_TYPE_RSA=y \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE="<路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_0="<路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_1="<路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_2="<路径>/root-rsa-2048.pem" \
  -DCONFIG_BOOT_SIGNATURE_KEY_FILE_3="<路径>/root-rsa-2048.pem" \
  -DPM_STATIC_YML_FILE="<路径>/pm_static.yml"

构建产物位于build_mcuboot/zephyr/zephyr.hex。

验证方法

使用west sign工具检查镜像头信息(需先编译一个应用镜像作为输入):

# 编译一个测试应用(如hello_world)
west build -b nrf52840dk_nrf52840 -d build_app samples/hello_world \
  -DCONFIG_BOOTLOADER_MCUBOOT=y

# 使用MCUboot的imgtool签名并查看头
cd bootloader/mcuboot/scripts
./imgtool.py sign --key <路径>/root-rsa-2048.pem \
  --header-size 0x1000 --align 8 --version 1.0.0 \
  --slot-size 0x3F000 \
  ../../../build_app/zephyr/zephyr.bin signed_app.bin

./imgtool.py info signed_app.bin

通过条件:imgtool info输出中显示Signature algorithm: RSA-2048,且Image size不超过0x3F000字节。同时确认zephyr.hex文件大小非空(约100-200KB),且烧录后开发板LED无异常闪烁(若烧录未签名应用,MCUboot会进入恢复模式,LED呈特定闪烁节奏)。

常见问题

  • 密钥文件路径错误:构建报错File not found时,使用路径并确认pem文件权限可读。
  • 分区重叠:若pm_static.yml配置的mcuboot_primary与mcuboot_secondary之和超过flash容量,链接阶段会报错。nRF52840 flash为0x100000(1MB),上述配置共0x80000(512KB),剩余空间留给MCUboot自身(约0x20000)和静态分区。
  • 签名算法未生效:检查构建日志中是否包含CONFIG_BOOT_SIGNATURE_TYPE_RSA=y,若未生效,确认没有其他配置文件覆盖该选项。