最近恩智浦在Github发布了一套基于MCU的OTA工程,该工程支持i.MX RT系列,且支持security的相关功能,得到了用户的广泛关注。
SBL的主要功能是用于在芯片POR启动后,根据OTA flag data的信息,决定存储在Slot1或者Slot2的程序进行运行。除此之外,还支持程序的验签,回滚等功能。
OTA Flag Data区域主要是用于存储OTA升级过程中的一些标志位信息,根据相关的标志位信息SBL进行image升级,回滚和跳转到对应的slot运行程序。
Slot1和Slot2用于存储应用程序。
Customer Data用于存储客户的一些信息(可选项,非必须)。
本文将就上述几个区域的存储空间分配,及中间的一些需要注意的点予以介绍。
Function | Add_Start | Add_End |
SBL | 0x6000 0000 | 0x6000 6FFF |
OTA Flag data尽管只有32Bytes的数据,但是在升级过程中这些数据需要读写擦,但Flash的擦除过程需要按照Sector的大小进行,因此也至少需要留存4KB的空间,则此时OTA Flag data的地址及空间分配为:
接下来就是Slot1和Slot2,Slot1和Slot2要使用Remap的功能进行切换,Remap的地址需要4K对齐,则此时用于存储应用层程序的地址空间分配为:
Function | Add_Start | Add_End |
Slot1 | 0x6000 8000 | 0x6004 3FFF |
Slot2 | 0x6004 4000 | 0x6007 FFFF |
此时,细心的朋友们就会发现,完整的512K Flash空间已经被使用光了。没错,这次客户不需要用这个CustomerData区域,希望把更多的空间用于应用程序。
在完成了OTA存储结构按功能地址分配之后,我们进行一些细部探究。
首先看SBL,SBL区间主要包括用于Flash boot的相关信息,例如IVT, Flash Config Block等。这部分代码基本上不需要改动,可以直接使用。
在地址空间分配上,可以将SBL区域视为一个可以从Flash XIP boot的hello word工程。
接着看一下OTAFlag Data区间的地址分配,OTA Flag Data共计32个字节,用于指示OTA过程中的三种状态,升级,回滚以及正常工作(没有升级和回滚发生)。
该32字节通常存储在Slot1的首地址之前的32字节位置。
应用程序的首地址,即中断向量表的首地址并不是从Slot1的首地址开始的,原因有两点
第一在image的起始地址需要增加用于OTA的ImageHeader信息,该Image Header的大小为32字节。 其次,对于应用程序中中断向量表的起始地址,需要进行计算。其基本的计算原则是:中断向量的数量 * 4的结果,向上对齐到2的次幂整数倍。看RT1010的中断向量共计256个,但是真正可以使用的是96个。则此时的计算结果是:96 * 4 = 384。向上对齐到2次幂整数倍,则为512即0x200。
所以,应用程序的真正起始地址需要在Slot1的基础上,向后调整0x200。
Slot2的空间分配也需要满足这个条件。
最终完整的地址空间分配如下图所示:
当需要对OTAFlag Data以及Slot地址进行分配,可以在程序中搜索下图中的关键词进行更改,对下面的表格进行调整。
通常需要进行关注的关键地址为:BOOT_FLASH_ACT_APP和 BOOT_FLASH_CAND_APP。其余的地址信息,与这两个地址信息存在依赖关系,程序内部可根据这两个地址信息进行计算。
需要注意的是,本文中涉及到的OTA方法,是基于Remap功能实现的,因此仅仅适用于除RT1050,RT1020, RT1024, RT1015以外的RT系列。
最后,向在本次客户支持中提供大量协助的Tim, Gavin, Xiaoli表示感谢。
差点忘了,原工程的下载地址是:
https://github.com/NXPmicro/sbl
https://github.com/NXPmicro/sfw
暂无评论哦,快来评论一下吧!