OpenBLT介绍及基本应用

OpenBLT

介绍

       OpenBLT 是一个开源嵌入式MCU引导加载程序,可以在任何微控制器上运行,并使用任何类型的通信接口进行软件更新,而无需专用调试硬件。OpenBLT 是开源的,并根据 GNU GPLv3进行许可。根据这一许可,OpenBLT 是免费的,可以在其条款下自由使用和分发。根据GNU GPLv3的要求,您可能不希望开源自己的产品代码,OpenBLT 可以以商业许可证的形式提供。在商业许可证下,OpenBLT 不包含对 GNU GPL 的任何引用。您可以访问OpenBLT官方网站了解更多详情。



技术支持

微信Contact

邮箱

   y_cube@163.com

应用场景

1. 现场重新编程

       在您的客户开始使用产品后,总是有可能需要进行软件更新。例如,为了启用新功能或解决现有问题。借助 OpenBLT,您可以轻松地在客户现场重新刷写软件。

2. 装配线终端

       通过 OpenBLT,您可以在装配线的末端对产品的软件进行刷写,这样可以确保最新版本的软件随产品一起发货。

3. 开发阶段

       在软件开发阶段,您会频繁地重新刷写软件。OpenBLT 使您能够在不需要特殊调试硬件的情况下完成此操作。

4. 校准(标定)阶段

       在进行软件的参数调优时,OpenBLT 可用于快速重新刷写优化后的校准参数。

5. 评估套件

       通过在微控制器评估套件上预置引导加载程序,最终用户无需购买昂贵的调试刷写设备。也不必在评估套件板上内置片上调试器。这降低了评估套件的成本,使其对最终用户更具吸引力。



OpenBLT详细介绍

       OpenBLT 的设计旨在灵活性和可移植性。其理念是OpenBLT可以在任何类型的微控制器上运行,并且可以通过任何类型的数据传输接口进行实际的固件更新。这一章节将会解释OpenBLT的内部结构。

架构设计

OpenBLT的功能和代码分为四个类别:

1. 应用特定功能

       此部分的代码用于在OpenBLT中实现项目的特定需求。它包含 main() 函数、OpenBLT的配置文件以及钩子函数,允许您调整OpenBLT的行为,而无需修改OpenBLT的内部实现。例如,在这里您可以实现控制后门的打开和关闭,以及监视狗的处理(如果适用)。

2. MCU无关功能

       这部分是驱动OpenBLT的核心。在软件更新过程中,它负责处理从烧录文件到MCU存储器的数据传输及写入。它构成了您的应用与硬件之间的链接。您无需对OpenBLT的这一部分进行任何更改。主机 PC 与嵌入式OpenBLT之间的通信遵循 XCP 版本 1.0 协议。其官方名称为 ASAM MCD-1 XCP V1.0.0,这是一种通用的测量和校准协议,定义了一种总线无关的主从通信协议,用于连接 ECU 与校准系统。有关更多信息,请访问 http://www.asam.net/

3. MCU依赖功能

       将OpenBLT移植到新的微控制器时,仅需修改此部分。它包含访问通信、定时器和内存外设的底层驱动程序。

4. 编译器特定功能

       这实际上是目标依赖类别的一个子类别。它包含一些代码,如 C 启动例程和中断向量表,通常需要一些编译器特性来链接到正确的内存位置。OpenBLT本身一次性刷写到微控制器的只读存储器中,通常是内部闪存 EEPROM,并控制主中断向量表。在每次复位重启后,OpenBLT将变为激活状态。它会检查在应用程序更新成功时计算的和写入的校验和,以确定是否存在有效的用户程序。如果是这样,它将跳转到用户应用程序。后门程序可以用于强制MCU保持在OpenBLT状态。这在刷写过程出错时特别有用。
Arch


模块构成

       请参考以下插图,以详细了解OpenBLT的四个类别中的模块。理解这些模块可以帮助OpenBLT的源代码理解。
Moudules



程序状态机

典型的应用场景可以用以下状态机来描述:
StateMachine

从正在运行的用户程序进行固件更新

       OpenBLT 示例程序都可以从正在运行的用户程序(状态为用户程序激活)启动程序更新。当用户程序接收到来自主机 PC 的 XCP CONNECT 命令时,它会通过执行软件复位来激活OpenBLT。在复位后,OpenBLT将保持后门在预配置的时间内打开(BOOT_BACKDOOR_ENTRY_TIMEOUT_MS)。主机 PC 将持续发送 XCP CONNECT 命令,直到收到响应。如果在后门打开期间OpenBLT接收到 XCP CONNECT 命令,它将发送一个正响应,并保持OpenBLT处于激活状态,以便进行程序更新,从而抑制(旧)用户程序的启动。

一旦固件更新完成,系统将执行一次软件复位,首先进入Entry状态。在后门时间窗口结束后,将切换到用户程序验证状态。在此状态下,将重新计算用户程序的校验和,并与固件更新结束时写入的值进行比较。如果校验和正确,OpenBLT将认为用户程序有效并跳转到用户程序。

如果在固件更新过程中发生错误或校验和验证失败,OpenBLT将默认返回Entry状态。在此状态下,它将等待并监听新的固件更新请求。

从后门入口进行固件更新

       当用户程序不支持跳转到OpenBLT或刷写了一个不正确的用户程序(无法运行)时,可以通过后门始终激活OpenBLT。默认实现是在每次复位后保持后门打开约 500 毫秒(参见宏 BOOT_BACKDOOR_ENTRY_TIMEOUT_MS 的值)。这个后门功能可以通过钩子函数根据应用的需要进行更改。另一种常用的方式是在复位后基于引脚的状态始终保持后门打开。这使您能够简单地在复位期间切换开关或按下按钮,保持OpenBLT处于激活状态,而不是尝试启动用户程序。当在复位后检测到后门打开条件时,将转换到Idle状态。一旦进入空闲状态,OpenBLT将监听来自主机 PC 的 XCP CONNECT 命令,并在接收到后切换到编程状态以处理固件更新。



通信序列

Communication

       在固件更新过程中,主机 PC 通过配置的通信接口向微控制器目标发送 XCP 命令。下面的插图阐明了 XCP 命令的顺序。请注意,主机 PC 对每个 XCP 命令都需要MCU返回响应码,除了 PROGRAM_RESET 命令除外。有关更多详情,请下载 XCP 1.0 协议规范。



定制化

Customize

OpenBLT可以通过文件 blt_conf.h 中的宏进行配置和裁剪。在这个头文件中,您可以选择要使用的通信接口(UART、USB、CAN、SD 卡等),并且可以启用OpenBLT应调用哪些钩子函数。钩子函数使您能够进一步定制OpenBLT应用,而无需对OpenBLT核心进行任何修改。



安全性

       OpenBLT 程序是一个开源项目,允许所有人访问源代码。其一个缺点是,如果有人知道在您的产品中使用了OpenBLT,那么他们相对容易地就能弄清楚如何更新您产品中的固件。尽管这可能是您产品的一个特性,但在大多数情况下并不是您及客户所希望的。

       因此,OpenBLT包含一个种子/密钥安全模块。如果在OpenBLT的配置中启用了该安全模块,则只有拥有正确安全算法及共享库(*.dll, *.so)的用户才能进行更新。如果没有,固件更新将不被允许,引导加载程序会简单地拒绝建立连接,无论微控制器复位多少次。

自定义安全算法

       当安全功能配置并正常工作后,您可能会希望修改安全算法以实现独有的加密和解密过程。其工作原理是,上位机工具从OpenBLT获取一个种子,种子一般是一个字符串(长度可配置,一般是4个字节)。然后上位机工具将收到的种子根据您的安全算法计算得到解锁所需的密钥。密钥也是一个字符串(长度可配置,一般是4个字节)。接下来将密钥发送给OpenBLT,OpenBLT执行相同的安全算法来验证该密钥。如果验证通过,则允许对内存进行操作,否则将被拒绝。因此上位机软件及OpenBLT都需要实现相同的安全算法。

OpenBLT端

       OpenBLT在安全解锁过程中调用两个钩子函数:一个用于获取种子(XcpGetSeedHook()),另一个用于验证密钥(XcpVerifyKeyHook())。示例程序中的默认安全算法实现非常简单。种子始终仅为一个字节,其十六进制值为 55h。安全算法使得密钥的值为种子的值减 1。

blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed)
{
  /* set the seed */
  seed[0] = 0x55;

  /* return seed length */
  return 1;
}

blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len)
{
  /* the example key algorithm in "libopenblt.dll" works as follows:
   *  - programming resource will be unlocked if key = seed - 1
   */

  /* check key for unlocking ProGraMming resource */
  if (key[0] == (0x55-1))
  {
    /* correct key received for unlocking PGM resource */
    return 1;
  }

  /* still here so key incorrect */
  return 0;
}

       要进行算法的自定义,请更改这两个函数中的代码,并运用您的创造力来改变种子生成和密钥验证算法。最好是使用一个动态变化的种子以增强安全性。有条件的情况下可以使用随机数生成器外设(如果您的MCU提供的话)。

从源代码构建 XCP 种子和密钥共享库

       SeedNKey 依赖 CMake 自动检测您系统上的构建工具并生成相应的构建环境。以下说明假设您的系统上已安装 CMake 并且在路径中可用。

在 Windows 上使用 MinGW 构建

此方法假设您的计算机上已安装 MinGW 编译器工具链。安装它的便捷方式是下载将 Code::Blocks IDE 和 MinGW 一起打包的安装程序。在使用 OpenBLT 版本 1.14 或更高版本时,建议下载 64 位安装程序版本,因为所包含的 PC 二进制文件(MicroBoot、BootCommander 和 LibOpenBLT)也是 64 位的。否则,您可以下载 32 位安装程序版本。

确保将 MinGW 安装目录中的 .\bin 目录添加到 Windows 的路径中。要快速验证是否正确设置,请在 Windows 的命令提示符下运行以下命令,并确保能够找到该程序:

mingw32-make

在 Windows 的命令提示符中,将工作目录设置为 .\Host\Source\SeedNKey\build。接下来,输入以下两个命令以检测并生成基于 MinGW Makefiles 的构建环境,然后构建共享的 SeedNKey 库:

cmake -G "CodeBlocks - MinGW Makefiles" ..
mingw32-make

seedNkeywithmingw

编译成功后,将会在.\Host目录下生成libseednkey.dll。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值