OTA-swap Bank AB

无聊逛51
发布于 2023-11-14 14:36
浏览
0收藏

“ 本文通过从芯片手册,寄存器到代码实现来梳理ota的bank AB升级方案, 举例芯片 aurix Tc397”

内存先行

首先要评估flash够不够,如果flash都不够,就无从SWAP机制可谈。

正常情况下,我们的芯片有6块flash可以用。如下图

OTA-swap Bank AB-鸿蒙开发者社区

在激活OTA配置的时候,内存映射发生了变化。如下图

OTA-swap Bank AB-鸿蒙开发者社区

从这两张图可以看出来,如果打开OTA配置的话,我们实际上可以用的flash 只有7M. 当然如果是别的芯片可用的flash会更少。这点是一开始就需要评估好的。否则芯片提供的机制无法满足需求。

配置初始化流程

这里先放一张图,芯片手册提供的标准流程,后面会对每一个步骤进行解析

OTA-swap Bank AB-鸿蒙开发者社区

运行时流程

这里也先放一张图,芯片手册提供的标准流程,后面会对每一个步骤进行解析

OTA-swap Bank AB-鸿蒙开发者社区

软件实现

从这里开始我们要对第二三两章的图进行一一实现。

一般来说是什么样的流程呢,简单的来说。下图

OTA-swap Bank AB-鸿蒙开发者社区

读取当前bank

当配置完SOTA之后,下一次上电,MCU会做什么呢。会首先读取UCB里面的SOTA配置信息。发现了SOTA被配置上了。则要做下面两件事

  • 因为地址重映射了,访问路径变了,什么意思呢?答:访问自己的pflash路径变了。直达的路线不给访问了,都需要走上面的总线。所以读写自己pflash速度可能会变慢。

OTA-swap Bank AB-鸿蒙开发者社区

通过下面寄存器自动写入。

OTA-swap Bank AB-鸿蒙开发者社区

/** \brief CPUx Flash Configuration Register 4 */
typedef struct _Ifx_CPU_FLASHCON4_Bits
{
    Ifx_Strict_32Bit DDIS:1;          /**< \brief [0:0] Disable direct LPB access (rw) */
    Ifx_Strict_32Bit reserved_1:31;    /**< \brief [31:1] \internal Reserved */
} Ifx_CPU_FLASHCON4_Bits;
  • 把当前的bank信息写入寄存器,没错就是下面的寄存器。所以我们可以通过这个寄存器来获取当前所在的bank.

OTA-swap Bank AB-鸿蒙开发者社区

SCU_SWAPCTRL.B.ADDRCFG

到这里第一步读取当前的bank已经清楚了,并且也清楚什么时候这个寄存器被赋值的。

下一步根据当前的bank来选择刷写的地址。我们配置mcal的flashload都知道这个函数。

根据当前bank来刷写固件

FlsLoader_ReturnType FlsLoader_Write(const FlsLoader_AddressType TargetAddress,
                                     const FlsLoader_LengthType Length,
                                     const uint8* const SourceAddressPtr)

这里面其中一个形参就是mcu的具体地址。

在使用SOTA时候,这个地址是需要注意的。也就是最上面我们给出的两张图。如果你下一次需要运行在BankB 那么这次刷写的地址需要有个offset. 好吧,把上面图复制下来仔细说一下。

OTA-swap Bank AB-鸿蒙开发者社区

就是这里当我们下一次需要运行在Bank B 我们的hex/s19文件本身的地址是不需要变化的。假设我们的hex地址开始是0x80001000 那么 这个就需要被刷写到0x80601000这个地址。当我们把地址明确了之后,就和普通的bootloader 刷写程序一样。等待刷写流程走完后。到了我们下一步,配置SOTA 和 写入 SOTA。这里为什么提了一下写入呢。因为这个写SOTA有点特殊,因为这个配置信息是存在UCB里面的UCB_SWAP_ORIG/COPY。这个位置是可能会把板子搞坏的位置。

配置SOTA

最开始的流程图在这里就用上了。我们这里先不考虑HSM的情况,这块容易死机。

OTA-swap Bank AB-鸿蒙开发者社区

首先根据这个图,直到第一步是要擦除掉现在已经有的UCB。除非是第一次。否则都需要先擦除一遍。

但是这里要先注意一下SOTA的状态,是否enable. 通过下面寄存器进行配置。具体可以看一下手册解释。

OTA-swap Bank AB-鸿蒙开发者社区

接上面,擦除方式呢?这里属于Dflash的位置,用Dflash最原始的办法就可以了。

擦除完之后就要根据当前的bank来选择写入的配置字。其实就是写入UCB里面。和上面擦除一样。这里属于dflash, 写的方式可以使用dmu.具体写的内容就是下面的两个位置。根据上面的参数即可。

OTA-swap Bank AB-鸿蒙开发者社区

具体数值呢?就是上面提到的0xAA 或者是0x55。下面的confirm呢?这里是固定的数据。

OTA-swap Bank AB-鸿蒙开发者社区

到了这里就到了流程的尾部。

OTA-swap Bank AB-鸿蒙开发者社区

系统reset, reset之后 启动过程 芯片会自动通过ucb的配置,来切换到另一个bank.


谢谢大家观看谢谢




文章转载自公众号:汽车与基础软件

分类
标签
已于2023-11-14 14:36:21修改
收藏
回复
举报
回复