Firmware OTA

OTA分类

前台OTA

OTA功能以独立的程序映像烧录在芯片Flash特定地址,独立于应用程序映像。在实施OTA升级前,需要跳出应用,重启执行OTA功能。在OTA过程中,不能完成原有应用功能,只有OTA状态呈现,因此称作 前台OTA

后台OTA

OTA功能与应用编译在同一程序映像中。实施OTA升级时,原有应用功能依然可以运行,因此称作 后台OTA

双区OTA

可用于应用程序存储的Flash空间一分为二。一部分存储当前运行的应用固件,另一部分存新固件。当新固件全部收到之后,重启,将老固件擦除,新固件搬移到老固件所在的位置。这种方式固件存储区一份为二,因此称作 双区OTA 。这种方式的好处在于,若新固件接收过程中出现异常,老固件可以重新运行。

单区OTA

当应用程序固件较大,可用于应用程序存储的Flash空间无法容纳两份应用程序固件的时候。固件升级只能通过 单区OTA 的方式进行。在固件升级前,先进入OTA模式,擦除原有固件,接收新固件,若接收失败,则继续维持OTA状态,必须重新接收新固件。

综合上述4个概念,可行的OTA方式有:前台单区OTA前台双区OTA后台双区OTA。这三种方式我们均支持。

关键概念

Flash可用空间

Flash会存放信息页,Bootloader,协议栈,持久数据和OTA功能映像等内容,在这些区域之外,Flash剩下的大片连续区域称作 Flash可用空间

固件大小最大值

开发者需要对应用程序当前版本和后续一切新版本的程序映像大小最大值有一个估计。双区OTA的条件是 Flash可用空间大小 > 2 * 固件大小最大值

应用程序映像地址、新固件下载地址

在单区OTA中:新固件下载地址 == 应用程序映像地址

在双区OTA中:新固件下载地址 > 应用程序映像地址 + 应用程序大小 并且 新固件不能超出Flash可用空间范围

OTA功能程序映像地址(仅针对前台OTA)

前台OTA的OTA功能程序存放地址和执行地址均不同于用户应用程序。OTA功能程序既不能覆盖Flash其他区域信息,又要确保尽可能留出更大的Flash可用空间,因此在编写和链接的时候,要特别注意程序大小及链接地址。

固件签名

对用于升级的固件有安全性要求的场景下,可以使用固件签名。启用固件签名功能后,SBL会检查签名是否合法,如果不合法,则拒绝升级,以此保障新固件的来源可靠。

固件签名采用ECDSA算法。

  1. 利用 tools/signing/key_gen.py 生成一对密钥,包含公钥、私钥。

  2. SBL中,定义宏 FW_ECC_VERIFY 为1,并公钥拷贝到 sbl/pub_key.c 文件中,编译生成带有验证签名功能的SBL。

  3. 新固件生成后,利用 tools/signing/signing.py 生成固件签名文件。手机OTA升级时,除了选择固件文件之外,还要选择此签名文件。