3. 配置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,若未生效,确认没有其他配置文件覆盖该选项。