MCUBoot在HPM_SDK上的应用

在 HPMicro 芯片上应用 MCUboot 安全引导加载程序

MCUboot 是一个开源的安全引导加载程序,广泛应用于物联网和嵌入式系统领域。它能够为 32 位 MCU 提供固件安全升级、验证和回滚等功能,确保设备在启动时只运行经过签名和验证的固件。本文将以 HPMicro 芯片为例,介绍如何集成和使用 MCUboot。

一、MCUBoot 简介

MCUboot 由 MCU Tools 社区维护,支持多种主流操作系统(如 Zephyr、Apache Mynewt),具备跨平台特性。它通过分区管理、固件签名和加密等机制,提升了嵌入式设备的安全性和可靠性。

二、HPMicro 芯片上的 MCUBoot 应用架构

先楫半导体在baremetal上支持了MCUBoot,目前基于hpm_sdk的版本为V1.10.0, MCUBoot的版本为V1.10.0。
下面介绍一下swap-using-scratch模式下的使用。

swap-using-scratch模式

对于一个镜像来说,有两个插槽,一个主插槽(slot0)和一个辅助插槽(slot1)。在swap-using-scratch模式中,镜像运行在主插槽中,升级镜像应当被写入到辅助插槽中。除了主插槽和辅助插槽外,还需要一个交换插槽(scratch slot)辅助镜像的升级过程。
升级过程可以简单描述如下:

  1. 通过程序或者工具将新版本的程序下载到辅助插槽中
  2. bootloader在运行时检查辅助插槽和主插槽内的镜像,在通过合法检查等等检查后,进行升级
  3. 将辅助插槽中的部分内容复制到交换插槽
  4. 将主插槽中的部分内容移动到辅助插槽
  5. 将交换插槽中的内容复制到主插槽
  6. 重复3-5的过程直到主插槽和辅助插槽内容交换完毕
  7. bootloader跳转到主插槽中运行
    特别说明:以上内容是简化描述的版本,仅仅表述了升级过程中最主要的过程,细节部分可以参考MCUBoot的官方文档MCUBoot文档

示例程序

先楫半导体提供了三个示例程序用来演示上述的固件升级过程。

  • Bootloader 应用:MCUboot 作为主引导加载程序,负责固件镜像的认证和升级。当检测到有效镜像时,加载并跳转到应用程序。
  • hello_world 应用:一个简单的用户应用,演示 LED 灯闪烁和串口消息输出。该应用可通过两种方式构建:
    • BOOT 模式:镜像烧录到主分区,设备启动后直接运行。
    • UPGRADE 模式:镜像烧录到次分区,bootloader检测到新版本固件后,会将新镜像复制到主分区并运行。

三、硬件与软件环境准备

1. 硬件配置

使用开发板默认配置即可,若有特殊需求可根据实际板卡调整。分区映射等信息可参考 boot/hpmicro/port/boards 目录下的配置文件。

2. 配置说明

地址范围

起始地址 区域
0x00 bootloader
MCUBOOT_IMAGE0_PRIMARY_START_ADDRESS 主插槽
MCUBOOT_IMAGE0_SECONDARY_START_ADDRESS 辅助插槽
MCUBOOT_SCRATCH_OFFSET 交换插槽

以hpm6750evk2为例

地址范围 区域
0x80000000 - 0x80043000 bootloader
0x80043000 - 0x801c3000 主插槽
0x801c3000 - 0x80343000 交换插槽

除了起始地址偏移的定义以外,还需要对flash的扇区大小和数量进行定义,在定义中扇区的大小和flash的sector定义不是同一个概念,但是mcuboot扇区的大小需要是flash sector大小的整数倍。并且扇区的数量不能超过config.h中的CONFIG_BOOT_MAX_IMG_SECTORS
例如以下定义

HPM_PAGE_LAYOUT_IMAGE0_SLOT0_START_OFFSET 0x43000
HPM_PAGE_LAYOUT_IMAGE0_SLOT0_SIZE 0x180000
HPM_PAGE_LAYOUT_IMAGE0_SLOT0_END_OFFSET 0x1C3000
HPM_PAGE_LAYOUT_IMAGE0_SLOT0_PAGES_SIZE 262144
HPM_PAGE_LAYOUT_IMAGE0_SLOT0_PAGES_COUNT 6

MCUBoot在操作扇区时,以一个PAGE为最小单位,按照上述的配置,在操作主插槽时,最小操作256k

3. 软件环境

  • 按照 hpm_sdkREADME 文档完成开发环境搭建。
  • 按照 MCUboot 的 README 文档进行相关配置。

四、构建与烧录流程

1. 构建 Bootloader

cd boot\hpmicro\samples\bootloader
md build & cd build
cmake -GNinja -DBOARD=hpm6750evk2 -DHPM_BUILD_TYPE=flash_xip ..
ninja

烧录 bootloader 后,设备重启会提示未找到有效镜像。

2. 构建 hello_world 应用(BOOT 模式)

cd boot\hpmicro\samples\mcuboot_hello
md build & cd build
cmake -GNinja -DBOARD=hpm6750evk2 -DHPM_BUILD_TYPE=flash_xi ..
ninja

烧录到主分区(ADDRESS=0x80043000),重启后运行 hello_world 应用,LED 闪烁并输出 hpmicro hello world app for mcuboot(BOOT MODE)

3. 构建 hello_world 应用(UPGRADE 模式)

cd boot\hpmicro\samples\mcuboot_hello_upgrade
md build & cd build
cmake -GNinja -DBOARD=hpm6750evk2 -DHPM_BUILD_TYPE=flash_xip ..
ninja

烧录到次分区(ADDRESS=0x801C3000),重启后 bootloader 会自动升级并运行新镜像,LED 闪烁并输出 hpmicro hello world app for mcuboot(UPGRADE MODE)

4. 固件签名

固件在编译成功后,需要进行签名才可以正常使用,签名使用mcuboot的python脚本进行。
在使用gcc/zcc进行命令行编译时,会自动生成签名bin文件,名称为demo_signed.bin。
命令如下:
主插槽签名:

python ${path to imgtool.py} sign --header-size 0x200 --align 8 --version 1.0 --slot-size 0x180000 ${path to orign bin file} ${path to output file}

辅助插槽签名:

python ${path to imgtool.py} sign --header-size 0x200 --align 8 --version 1.1 --slot-size 0x180000 --pad ${path to orign bin file} ${path to output file}

两条命令差异为 - - pad 选项。

5. 固件烧写

对于bootloader应用,和其他hpm_sdk应用一样进行烧写即可。
对于mcuboot app应用,需要对bin文件进行签名后,再烧写到指定的位置。分区信息可参考 boot/hpmicro/port/boards 目录下的相关文件。
HPMicro 支持多种烧录方式,如 openocd、jlink。
这里推荐大家使用sdk_env下的start_gui或者官方的量产工具mfg tool进行烧写bin文件。
以start_gui工具为例:
选中使用的调试器和芯片型号后,勾选烧写地址选项,填写烧写的起始地址,便会自动完成flash的擦除和文件烧写操作。

以下是手动利用命令行进行烧写的示例:

  1. 启动 openocd,加载 SoC、板卡和调试器配置文件:
    openocd -f  -f  -f 
  2. 启动命令行或 telnet 连接到 openocd:
    telnet localhost 4444
  3. 依次执行以下命令:
    reset halt
    flash erase_address 
    flash write_bank 0

具体参数可参考开发板和应用的实际分区地址。例如:

flash erase_address 0x80043000 0x180000
flash write_bank 0 <signed-hello1-hpm.bin> 0x43000

五、总结

通过集成 MCUboot,HPMicro 芯片可实现安全启动和固件升级,提升设备安全性。开发者可根据实际需求选择合适的分区和烧录方式,灵活应用于各类嵌入式场景。更多详细信息请参考 MCUboot 官方文档 及 HPMicro SDK 文档。


1
1

订阅

发表回复 0

Your email address will not be published. Required fields are marked *