在zephyr板子的设备树里定义如下的分区
boot_partition
:用于MCUboot本身image_0_primary_partition
:存放运行程序的分区image_0_secondary_partition
:存放回滚程序的分区scratch_partition
:临时缓冲分区
两个程序插槽必须是连续的。如果将MCUboot用作第一阶段的引导程序,则boot_partition
必须对其配置为SoC复位运行的地址
。
&flash0 {
/*
* For more information, see:
* https://docs.zephyrproject.org/latest/guides/dts/legacy-macros.html#legacy-flash-partitions
*/
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x00000000 0x00010000>;
read-only;
};
slot0_partition: partition@20000 {
label = "image-0";
reg = <0x00020000 0x00040000>;
};
slot1_partition: partition@60000{
label = "image-1";
reg = <0x00060000 0x00040000>;
};
scratch_partition: partition@a0000{
label = "image-scratch";
reg = <0x000a0000 0x00040000>;
};
};
};
这里还有一个细节必须注意,我们还需要将在设备树的chosen
节点下添加zephyr,code-partition = &slot0_partition;
,否则应用程序无法启动。
chosen {
zephyr,console = &usart1;
zephyr,shell-uart = &usart1;
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,dtcm = &dtcm;
zephyr,code-partition = &slot0_partition;
};
在zephyr中配置mcuboot
我们之前有讲解过Kconfig的配置,下面就是一个简单的mcuboot
的配置。
CONFIG_CONSOLE_HANDLER=y
CONFIG_DEBUG=y
CONFIG_SYSTEM_CLOCK_DISABLE=y
CONFIG_SYS_POWER_MANAGEMENT=n
CONFIG_MAIN_STACK_SIZE=10240
CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
CONFIG_BOOT_SWAP_SAVE_ENCTLV=n
CONFIG_BOOT_ENCRYPT_RSA=n
CONFIG_BOOT_ENCRYPT_EC256=n
CONFIG_BOOT_ENCRYPT_X25519=n
CONFIG_BOOT_VALIDATE_SLOT0=y
CONFIG_BOOT_UPGRADE_ONLY=n
CONFIG_BOOT_BOOTSTRAP=n
### Default to RSA
CONFIG_BOOT_SIGNATURE_TYPE_NONE=n
CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN=2048
CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n
CONFIG_BOOT_SIGNATURE_TYPE_ED25519=n
### The bootloader generates its own signature verification based on a
### key file which needs to be provided and needs to match the selected signing
### algorithm (CONFIG_BOOT_SIGNATURE_TYPE_).
### The PEM files below are provided as examples.
# 必须采用绝对路径,否则mcuboot找不到
CONFIG_BOOT_SIGNATURE_KEY_FILE="/home/wangyan/work/stm32-demo/stm32f767-zephyr/keys/root-rsa-2048.pem"
#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-rsa-3072.pem"
#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ec-p256.pem"
#CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ed25519.pem"
### mbedTLS has its own heap
# CONFIG_HEAP_MEM_POOL_SIZE is not set
### We never want Zephyr's copy of tinycrypt. If tinycrypt is needed,
### MCUboot has its own copy in tree.
# CONFIG_TINYCRYPT is not set
# CONFIG_TINYCRYPT_ECC_DSA is not set
# CONFIG_TINYCRYPT_SHA256 is not set
CONFIG_FLASH=y
### Various Zephyr boards enable features that we don't want.
# CONFIG_BT is not set
# CONFIG_BT_CTLR is not set
# CONFIG_I2C is not set
CONFIG_LOG=y
### Ensure Zephyr logging changes don't use more resources
CONFIG_LOG_DEFAULT_LEVEL=0
编译mcuboot
上面的配置都设置好了之后我们就需要将mcuboot
编译为可执行的二进制文件,然后将mcuboot
的二进制文件和zephyr
的应用程序二进制文件合并为一个整体的最终二进制文件烧录到板子上才可以完成启动。
编译mcuboot
cd bootloader/mcuboot/boot/zephyr
west build -p -b stm32f767 -- -DCONF_FILE=stm32f767-zephyr/mcuboot.conf
这里还需要注意我们在配置Mcuboot的启动了程序验签的配置,因此在编译应用程序的时候我们也需要签名文件对应用程序做签名,否则Mcuboot无法启动应用程序。这里就需要使用使用west sign
指令对应用程序做签名。
west sign -t imgtool -- --key keys/root-rsa-2048.pem
这里要注意,应用程序
签名的文件和我们在mcuboot中配置
的签名文件必须是同一个。
CONFIG_BOOT_SIGNATURE_KEY_FILE="/home/wangyan/work/stm32-demo/stm32f767-zephyr/keys/root-rsa-2048.pem"
从上面的编译可以看出来,其实mcuboot也是zephyr的一个应用程序。这样生成了一个zephyr.bin
的二进制文件。
打包最终的程序
当生成了mcuboot
和应用程序
后需要将两个程序连接成一个烧录程序,这样就是空板的烧录程序了。
步骤如下:
- 首先进入
mcuboot
的zephyr
的应用程序目录下去编译,路径为bootloader\mcuboot\boot\zephyr
,编译采用west
指令来编译就好,最终生成了zephyr.bin
的文件 - 接下来需要生成应用程序的
bin
文件,在应用的目录下直接运行west
指令,生成应用程序的zephyr.bin
文件 - 对应用程序的
bin
文件进行验签,这里需要采用west sign -t imgtool --
的方式对应用程序进行验签。 - 接下来就要将
mcuboot
的二进制文件和验签后的应用程序文件进行组合就OK了
验签的指令介绍
其实west sign
就是west
提供的验签工具,其中-t
参数是需要我们选择到底是用什么工具对应用程序进行验签的,这里我们只介绍imgtool
,imgtool
是mcuboot
官方提供的一个验签工具,地址。
指令格式如下:
west sign -t imgtool -- <参数>
这里的参数其实就是imgtool
的参数了,如下是一些常用参数:
参数 | 描述 |
---|---|
--key <验签文件> |
验签的文件 |
--version <版本字符串> |
提供版本号 |
--security-counter <计数器字符串> |
计数器字符串号 |