zephyr笔记 5.3.1 Zephyr 版本 MCUboot 的编译和使用

1 前言

这一节是翻译自 MCUboot 网站上 MCUboot with Zephyr

MCUboot 最初是 Mynewt 的引导程序。此后,它也成为了 Zephyr 的引导程序。Zephyr 的应用程序在编译方式存在较大大的差异,这里将会记录这些不同之处。

有关 bootloader 的设计和操作文档,请参阅设计文档。这个功能在所有支持的 RTOS 上都是一样的。

我正在学习 Zephyr,一个很可能会用到很多物联网设备上的操作系统,如果你也感兴趣,可点此查看帖子zephyr学习笔记汇总

2 概述

第一步是确保您的主板在其设备树中具有如下定义的闪存分区。这些分区是:

  • boot_partition:用于MCUboot本身
  • slot0_partition:主镜像插槽
  • slot1_partition:辅助镜像插槽
  • scratch_partition:临时插槽

目前,这两个镜像插槽必须是连续的。如果您正使用 MCUboot 作为阶段1引导加载程序,则必须对 boot_partition 进行配置,以便您的SoC在复位状态能运行它。

闪存分区通常在Zephyr boards文件夹中定义,文件是 boards///.dts。例如 frdm_k64f 的.dts文件是 boards/arm/ frdm_k64f/frdm_k64f.dts。要确保 board 目录下的.dts文件的标签与实际使用的硬件相匹配。

3 编译 bootloader 本身

bootloader 是一个普通的 Zephyr 应用程序,至少从 Zephyr 的角度来看是这样。在编译它之前需要做一些配置,其中大部分可以按照 boot/ zephyr 中的 CMakeLists.txt 文件中的说明完成,其中有部分注释是操作指导。最重要的是选择一个签名算法,并决定是否在每次启动时验证 slot0。

要编译 MCUboot,请在 boot/zephyr中创建一个编译目录,并像往常一样编译它:

  cd boot/zephyr
  mkdir build && cd build
  cmake -GNinja -DBOARD=<board> ..
  ninja

除了在 DTS 中定义的分区之外,还需要一些关于闪存布局的附加信息来编译 MCUboot。所有需要的配置都在 boot/zephyr/include/ target.h中收集。根据电路板的不同,这些信息可能来自电路板特定的头文件,设备树,或者由每个SoC系列的 MCUboot 配置。

在编译了 bootloader 之后,二进制文件应在 build/zephyr/zephyr 中。{bin,hex,elf},其中 build 是运行cmake时选择的构建目录。 通常通过从 build 目录运行 make flash(或者ninja flash等)来烧写这些二进制文件。 根据所使用的目标和闪存工具,这可能会在编程引导加载程序映像本身之前擦除整个闪存(整体擦除)或仅擦除引导加载程序所在的扇区。

4 编译适合 bootloader 的应用程序

除了DTS中的闪存分区之外,还需要一些额外的配置来编译 MCUboot 的应用程序。

这由 Zephyr 配置系统在内部处理,并包装在 CONFIG_BOOTLOADER_MCUBOOT Kconfig 变量中,该变量必须在应用程序的 prj.conf 文件中启用。

MCUboot 树中的 samples/zephyr/hello-world 目录包含一个简单的应用程序,包含您需要的所有内容。 你可以在你的主板上尝试它,然后制作一个副本,开始使用自己的应用程序; 有关教程,请参阅 samples/zephyr/README.md。

Zephyr CONFIG_BOOTLOADER_MCUBOOT 配置选项 文档 提供了有关它对映像放置和生成所做更改的其他详细信息,以便应用程序可由 MCUboot 启动。

有了这个,就可以像平常一样编译应用程序。

4.1 应用程序签名

为了升级到镜像(或者甚至启动它,如果启用了MCUBOOT_VALIDATE_SLOT0),必须对镜像进行签名。为了使开发更容易,MCUboot 通过一些示例密钥进行分发。重要的是要强调下永远不要把这些密钥用到生产,因为私钥在这个仓库中是公开的。 请参阅下面关于如何制作自己的签名。

镜像可以使用 scripts/imgtool.py 脚本进行签名。最好查看 samples/zephyr/Makefile 的示例,以了解如何使用。

4.2 烧写应用程序

应用程序本身可以使用常规的闪存工具进行闪存,但是需要对该特定目标的插槽0的偏移量进行编程。 根据平台和闪存工具的不同,您可能需要手动指定对应于插槽0起始地址的闪存偏移量。这通常与使用 Intel Hex映像(.hex)而不是原始二进制映像(.bin)的闪存工具无关,因为前者包含目标地址信息。 此外,您需要确保闪存工具不会执行批量擦除(擦除整个闪存),否则您将删除 MCU Boot。 这些映像也可以标记为升级,并加载到插槽1中,此时引导加载程序应执行升级。在下一次重新引导之前,将slot-0标记为“image ok”是由映像决定的,否则 bootloader 将恢复应用程序。

5 管理签名密钥

5.1 产生新的密钥对

5.2 解压出公钥


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值