在zephyr板子的设备树里定义如下的分区

  • boot_partition:用于MCUboot本身
  • image_0_primary_partition:存放运行程序的分区
  • image_0_secondary_partition:存放回滚程序的分区
  • scratch_partition:临时缓冲分区

两个程序插槽必须是连续的。如果将MCUboot用作第一阶段的引导程序,则boot_partition必须对其配置为SoC复位运行的地址

  1. &flash0 {
  2. /*
  3. * For more information, see:
  4. * https://docs.zephyrproject.org/latest/guides/dts/legacy-macros.html#legacy-flash-partitions
  5. */
  6. partitions {
  7. compatible = "fixed-partitions";
  8. #address-cells = <1>;
  9. #size-cells = <1>;
  10. boot_partition: partition@0 {
  11. label = "mcuboot";
  12. reg = <0x00000000 0x00010000>;
  13. read-only;
  14. };
  15. slot0_partition: partition@20000 {
  16. label = "image-0";
  17. reg = <0x00020000 0x00040000>;
  18. };
  19. slot1_partition: partition@60000{
  20. label = "image-1";
  21. reg = <0x00060000 0x00040000>;
  22. };
  23. scratch_partition: partition@a0000{
  24. label = "image-scratch";
  25. reg = <0x000a0000 0x00040000>;
  26. };
  27. };
  28. };

这里还有一个细节必须注意,我们还需要将在设备树的chosen节点下添加zephyr,code-partition = &slot0_partition;,否则应用程序无法启动。

  1. chosen {
  2. zephyr,console = &usart1;
  3. zephyr,shell-uart = &usart1;
  4. zephyr,sram = &sram0;
  5. zephyr,flash = &flash0;
  6. zephyr,dtcm = &dtcm;
  7. zephyr,code-partition = &slot0_partition;
  8. };

在zephyr中配置mcuboot

我们之前有讲解过Kconfig的配置,下面就是一个简单的mcuboot的配置。

  1. CONFIG_CONSOLE_HANDLER=y
  2. CONFIG_DEBUG=y
  3. CONFIG_SYSTEM_CLOCK_DISABLE=y
  4. CONFIG_SYS_POWER_MANAGEMENT=n
  5. CONFIG_MAIN_STACK_SIZE=10240
  6. CONFIG_MBEDTLS_CFG_FILE="mcuboot-mbedtls-cfg.h"
  7. CONFIG_BOOT_SWAP_SAVE_ENCTLV=n
  8. CONFIG_BOOT_ENCRYPT_RSA=n
  9. CONFIG_BOOT_ENCRYPT_EC256=n
  10. CONFIG_BOOT_ENCRYPT_X25519=n
  11. CONFIG_BOOT_VALIDATE_SLOT0=y
  12. CONFIG_BOOT_UPGRADE_ONLY=n
  13. CONFIG_BOOT_BOOTSTRAP=n
  14. ### Default to RSA
  15. CONFIG_BOOT_SIGNATURE_TYPE_NONE=n
  16. CONFIG_BOOT_SIGNATURE_TYPE_RSA=y
  17. CONFIG_BOOT_SIGNATURE_TYPE_RSA_LEN=2048
  18. CONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=n
  19. CONFIG_BOOT_SIGNATURE_TYPE_ED25519=n
  20. ### The bootloader generates its own signature verification based on a
  21. ### key file which needs to be provided and needs to match the selected signing
  22. ### algorithm (CONFIG_BOOT_SIGNATURE_TYPE_).
  23. ### The PEM files below are provided as examples.
  24. # 必须采用绝对路径,否则mcuboot找不到
  25. CONFIG_BOOT_SIGNATURE_KEY_FILE="/home/wangyan/work/stm32-demo/stm32f767-zephyr/keys/root-rsa-2048.pem"
  26. #CONFIG_BOOT_SIGNATURE_KEY_FILE="root-rsa-3072.pem"
  27. #CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ec-p256.pem"
  28. #CONFIG_BOOT_SIGNATURE_KEY_FILE="root-ed25519.pem"
  29. ### mbedTLS has its own heap
  30. # CONFIG_HEAP_MEM_POOL_SIZE is not set
  31. ### We never want Zephyr's copy of tinycrypt. If tinycrypt is needed,
  32. ### MCUboot has its own copy in tree.
  33. # CONFIG_TINYCRYPT is not set
  34. # CONFIG_TINYCRYPT_ECC_DSA is not set
  35. # CONFIG_TINYCRYPT_SHA256 is not set
  36. CONFIG_FLASH=y
  37. ### Various Zephyr boards enable features that we don't want.
  38. # CONFIG_BT is not set
  39. # CONFIG_BT_CTLR is not set
  40. # CONFIG_I2C is not set
  41. CONFIG_LOG=y
  42. ### Ensure Zephyr logging changes don't use more resources
  43. CONFIG_LOG_DEFAULT_LEVEL=0

编译mcuboot

上面的配置都设置好了之后我们就需要将mcuboot编译为可执行的二进制文件,然后将mcuboot的二进制文件和zephyr的应用程序二进制文件合并为一个整体的最终二进制文件烧录到板子上才可以完成启动。
编译mcuboot

  1. cd bootloader/mcuboot/boot/zephyr
  2. west build -p -b stm32f767 -- -DCONF_FILE=stm32f767-zephyr/mcuboot.conf

这里还需要注意我们在配置Mcuboot的启动了程序验签的配置,因此在编译应用程序的时候我们也需要签名文件对应用程序做签名,否则Mcuboot无法启动应用程序。这里就需要使用使用west sign指令对应用程序做签名。

  1. west sign -t imgtool -- --key keys/root-rsa-2048.pem

这里要注意,应用程序签名的文件和我们在mcuboot中配置的签名文件必须是同一个。

  1. CONFIG_BOOT_SIGNATURE_KEY_FILE="/home/wangyan/work/stm32-demo/stm32f767-zephyr/keys/root-rsa-2048.pem"

从上面的编译可以看出来,其实mcuboot也是zephyr的一个应用程序。这样生成了一个zephyr.bin的二进制文件。

打包最终的程序

当生成了mcuboot应用程序后需要将两个程序连接成一个烧录程序,这样就是空板的烧录程序了。
步骤如下:

  • 首先进入mcubootzephyr的应用程序目录下去编译,路径为bootloader\mcuboot\boot\zephyr,编译采用west指令来编译就好,最终生成了zephyr.bin的文件
  • 接下来需要生成应用程序的bin文件,在应用的目录下直接运行west指令,生成应用程序的zephyr.bin文件
  • 对应用程序的bin文件进行验签,这里需要采用west sign -t imgtool --的方式对应用程序进行验签。
  • 接下来就要将mcuboot的二进制文件和验签后的应用程序文件进行组合就OK了

验签的指令介绍

其实west sign就是west提供的验签工具,其中-t参数是需要我们选择到底是用什么工具对应用程序进行验签的,这里我们只介绍imgtoolimgtoolmcuboot官方提供的一个验签工具,地址
指令格式如下:

  1. west sign -t imgtool -- <参数>

这里的参数其实就是imgtool的参数了,如下是一些常用参数:

参数 描述
--key <验签文件> 验签的文件
--version <版本字符串> 提供版本号
--security-counter <计数器字符串> 计数器字符串号