1.SOTA功能描述
SOTA(Sofeware update over the air),指不连接烧写器的情况下,通过CAN、串口、以太网等通讯方式,实现应用程序的更新。汽车行业里通常有如下几种方案:
针对MCU控制器,需要分别开发汽车BootLoader程序(需裁剪UDS协议)和应用程序,MCU上电后首先运行BootLoader,然后正常进入应用程序;当需要更新应用程序时,可通过诊断仪下发指令给MCU,MCU的应用程序收到指令后将设置更新标志位,然后进行复位重新进入BootLoader,Bootloader根据标志位开始擦除旧APP,接收新的APP数据并直接写在APP运行的Flash地址空间。该方案的优点是不需要额外的Flash暂存数据,缺点是BootLoader代码更复杂,且如果数据传输发生中断,旧的APP将不能被恢复。该方案更适合Flash容量较小的MCU。
针对大容量Flash的MCU或者MCU+SOC异构控制器,由应用程序直接接收数据并且暂存于Flash,接收完毕后APP置位更新标志位重启MCU,BootLoader检查更新标志位,如有效,则擦除旧的APP,再将暂存于Flash的新APP数据写入APP运行地址处。该方案的优点是更新数据的接收由APP完成,BootLoader不需要通讯协议栈,代码量更小,且数据传输中断时,原有APP不损坏。缺点是需要额外的Flash空间暂存更新数据。
在Flash中划分出两块相同大小的区域,分为A区和B区,都用来存放APP,但同一时间下只有一个区的APP是有效的,分别设置一个标志位标识其有效性。初始状态下先将APP写入A区,更新的时候,将新的APP写入B区,再把A区的APP擦除,同时更新两个区的有效性标志位状态。BootLoader中判断哪个区的APP有效,就跳转到哪个区运行。这种方法不需要重复拷贝APP数据,但最大的一个缺陷是AB区的APP程序运行地址不同,需要分别编译,从而使得可应用性大大降低。
英飞凌SWAP功能:它的A\B Bank Flash物理地址支持两种不同物理地址映射到同一个逻辑地址方式(MCU自动从两种物理地址映射一个虚拟地址),从而使得APP编译时不需要区分AB区,使用相同的逻辑地址即可。
2.英飞凌TC3xx SWAP功能和内存映射机制
根据英飞凌TC3xx_UserManual中对SOTA的介绍。除开TC33x和TC33xED之外,所有的系列都可以将所有PFLASH划分为两个bank。当使能SOTA功能时,其中一个bank支持读取和执行,而另一组可以写入新代码。那么也意味着如果要使用SWAP功能,应用程序所能使用Flash容量至少会减半。举个例子,TC39xFlash总共16MB,那么应用程序不能超过8MB,因为要设计A/B互为备份。
由于SWAP是TC3xx支持两种不同的物理地址映射到同一个逻辑地址,因此当SWAP功能启用后,我们就要看它是如何实现这个地址映射的。
首先来看Standard address map,PF0--5按照顺序进行地址映射PF0/1/2/3/4/(5+reserved):
当使用SWAP功能后,虚拟地址实际对应的物理flash为 PF2/3/0/1/(5+reserved)/4:
从TC39x的备选地址映射来看,PF0/1和PF2/3可以SWAP替换,PF4和PF5+reserved可以swap替换?
如果不这样理解,那就是PF0/1/4为Active Bank,PF2/3/5为Inactive Bank。这样会出现地址不连续?
这里留个疑问,先继续往下看。
3.SOTA开发配置
3.1 SOTA相关配置参数
根据芯片手册,与SOTA相关的配置参数如下:
参数 | 描述 | 对应寄存器 | 相关模块 |
UCB_OTP.PROCONTP.SWAPEN | 该位使能后,在下次系统复位后进入SOTA模式。 下次系统复位后,为active bank配置的PROCONHSMCXx和PROCONHSMCOTP同样适用与inactive bank | DMU_HF_PROCONTP.SWAPEN | DMU |
UCB_SWAP_ORIG/COPY | 用户可编程活动地址映射是标准地址映射或备用地址映射。 进入SOTA模式后,根据上述配置选择标准还是备用地址映射 | SCU_SWAPCTRL | SCU |
UCB_OTP_PROCONTP.CPUxDDIS | 关闭CPU直接访问PFlash bank的接口 统一改为通过SRI总线访问PFlash | DMU_HF_PROCONTP.DDISx CPUx_FLASHCON4.DDIS | DMU,CPU |
从上图可以看到,SOTA功能的使能与UCB_SWAP/UCB_OTP_PROCONTP有密切关系。
3.1.1 UCB_OTP配置
注意,UCB_OTPx(x=0-7)_ORIG/COPY结构如下:
根据芯片手册DMU_HP_PROCONOTP/WOP寄存器描述和UCB,p表示可以看到UCB结构定义如下:
参数名字 | 描述 | UCB地址MAP |
PROCONOTP00 | 对应DMU_HP_PROCONOTP00,bit位置1表示PF0 sector0-31是OTP保护的sector | 0x AF40 4000 - 0x AF40 4003(4byte/32bit) |
PROCONOTP01 | 对应DMU_HP_PROCONOTP01,bit位置1表示PF0 sector32-63是OTP保护的sector | 0x AF40 4004 - 0x AF40 4007(4byte/32bit) |
... |
|
|
PROCONOTP05 | 对应DMU_HP_PROCONOTP05,bit位置1表示PF0 sector 160-191是OTP保护的sector | 0x AF40 4014 - 0x AF40 4017 |
... |
|
|
PROCONWOP55 | 对应DMU_HP_PROCONOTP55,bit位置1表示PF5 sector160 -191是OTP保护的sector | 0x AF40 41E4 - 0x AF40 41E7 |
PROCONTP | 对应DMU_HF_PROCONTP,Tuning Protection | 0x AF40 41E8 - 0x AF40 41EB |
CONFIRMATION | UCB_OTP0确认码 | 0x AF40 41F0 - 0x AF40 41FF |
因此在设计SWAP功能时关联UCB结构,使能SWAP需要配置PROCONTP,因此可以有如下两种方式
直接定义UCB_OTP0_ORIG的基地址+PROCONTP的偏移地址,根据DMU_HF_PROCONTP寄存器结构写入参数,如下:
将所有UCB全部定义出来如下:
根据上述对UCB32(SWAP_OTP0_ORIG)结构分析,我们可以设计一个uint32 UCB_OTP_ORIG[128](512byte/4);其中PROCONTP的位置位于UCB_OTP_ORIG[128-6](6 = (0x200-0x1e8)/4)。
这样设计思路可以统一管理所有UCB。
3.1.2 UCB_SWAP_ORIG配置
UCB_SWAP结构相对清晰,如下:
MARKETLx:用于选取是标准地址映射还是备用地址映射
MARKERHx:对应MARKERLx条目的地址作为确认或擦除
CONFIRMATIONLx:确认或擦除
CONFIRMATIONHx:对应CONFIRMATIONLx条目的地址作为确认或擦除
从上图可以看到,上述条目均有16个之多,这样的设计目的是什么呢?通过查阅datasheet,我们可以看到UCB擦除干扰限制为500cycle,也即可以通过16个SWAP配置来增加SWAP次数(16*500)次。
3.2 SOTA功能配置
其配置流程需要分出厂设备SOTA和运行时SOTA切换配置,如下:
3.2.1出厂设备激活SOTA功能
首先通过刷写工具在active bank里刷上可执行的程序,注意此时还是按照正常开发流程配置启动地址、模式等(BMHD)保证程序正常运行。
接下来激活SOTA功能,逻辑思路为:选择地址映射方式(SWAP)->确认SWAP条目->写入确认码(CONFIRMATION)->确认CONFIRMATION条目->(如有HSM,考虑将HSM代码放在PF0的sector0-39)->设置UCB_OTP/WOP保护->使能SWAP(SWAPEN)->重启系统
在下次系统复位后,自动进入SWAP模式。根据SSW的描述,上电初始化RAM和Flash后,SSW首先检查SOTA的配置
SSW会去检查UCB_SWAP_ORIG/COPY,如果找到有效的SOTA配置,SSW会将做出如下动作:
关闭CPU的直接访问(CPUx_FLASHCON4.DDIS = 1,DMU_HF_PROCONTP.CPUxDDIS = 1);
将UCB_SWAP数据加载至寄存器SCU_SWAPCTRL.ADDRCFG
这里会出现一个问题:当激活swap功能时inactive bank可能还没有程序,这时候在配置UCB_SWAP的时候要特别小心,因为对于用户来说,逻辑地址始终是固定的(例如0xA000 0000),如果在配置成了备选地址映射模式,那么很有可能实际的物理启动地址就变为了inactive bank(例如0xA006 0000),导致没有程序可跑。
3.2.2运行时SOTA切换配置
为了解决上个问题,最理想方式是在运行时确认inactive bank有可运行程序后再使用SWAP切换到新的程序。这就首先需要擦除一块不被使用的Flash区域(即inactive bank)。
那么对于inactive bank的地址我们应该怎么确定呢?
首先牢记SWAP这个功能,是两块不同的物理地址映射到相同逻辑地址,记住这一点,那么我们在开发的时候就只用明确想用的逻辑地址即可,
例如,现在我想用0xA0000000-0xA05FFFF这6M空间来满足应用,
标准地址映射模式下0xA000 0000 - 0xA05F FFFF对应PF0/1,0xA060 0000 - 0xA0BF FFFF对应PF2/3
备用地址映射模式下0xA000 0000 - 0xA05F FFFF对应PF2/3,0xA060 0000 - 0xA0BF FFFF对应PF0/1;
那么很明显,在标准地址映射模式程序在PF0/1上跑,在PF2/3上刷写新程序,然后切换到备用地址映射模式,此时程序仍然从0xA000 0000开始运行,但实际跑的PF2/3上面的程序。
所以我们擦除程序就应该擦除0xA060 0000--0xA0BF FFFF,
代码示例如下:
因此在多次SWAP之后,可能会出现用户并不知道到底擦的是PF2/3还是PF0/1的情况。
擦除完毕之后,接下来就是刷写这块inactive bank。数据从哪里来?很明显,可以通过CAN或者ETH接口接收并暂存数据(通常为4096bytes),并异步调用fls接口进行刷写。刷写程序这一套参考内置uds的bootloader程序。 刷写并校验完毕之后,正常情况就是要配置SWAP信息,例如地址映射模式为备选映射模式,这样就能保证PF2/3在下次启动后的逻辑映射地址为0xA000 0000。
以出厂后首次运行时配置SWAP为例
首先配置的是UCB_SWAP.MARKETL0= 0xAA(选取备用地址映射模式);然后将MARKETL0的地址写入MARKETH0予以确认;将0x57B5327F写入CONFIRMATIONL0,最后将CONFIRMATIONL0地址写入CONFIRMATIONH0予以确认。最后使能SWAP功能。
示例代码如下:
通过loadpage2x32接口可以实现一次性写入0xAA到MARKETL0,把MARKETL0地址(0xAF40 2E00)写入MARKETH0,CONFIRMATION同理。这样就完成了SWAP配置。至此就完成了运行时SOTA切换,最后系统复位就可以从逻辑地址0xA000 0000中运行PF2/3的代码。
3.2.3 多次SOTA升级引发的疑惑
假设上次SOTA升级成功,现在已经运行的PF2/3的代码;此时又有SOTA升级需求,这个时候如何来配置SWAP信息?TC3xx提供了多达16个UCB_SWAP配置entry。很明显此时配置新的SWAP就需要在MARKETL1写入0x55(标准地址映射模式),MARKETH0、CONFIRMATION同上述配置一样。
本次的SWAP信息配好了,上次存储的SWAP信息该如何作废掉?芯片手册提出了标准做法:
将MARKETL/H0、CONFIRMATIONL/H0 全部写入1(即0xFFFF FFFF)。
当swap entry使用超过16个后,此时就需要擦除所有的UCB_SWAP信息(DFlash 0 ->UCB area),然后又从0开始进行。当前使用的SWAP ENTRY可以通过寄存器SCU_STMEM1.SWAP_DW_INDEX进行读取,那么对这块的软件设计就相对简单。
上述整体流程图如下:
需要注意的是,多数UCB的尾巴上都有一个确认码,
其状态如下:
因此当我们需要擦除这块UCB的时候,要写入0x4321 1234解锁当前UCB状态,如下:
ucb_write(UCB_SWAP_ORIG + 0x1F00x432112340x00000000);
4.技术总结
英飞凌SWAP支持SOTA原理:提供了一种机制,该机制将两块不同的物理FLASH映射到相同的逻辑地址,保证客户只需要编译一份代码,且运行地址不变。如下图:PF0/1和PF2/3可以在不同情况下映射到同一逻辑地址。
通过配置UCB_SWAP和UCB_OTP来使能上述功能;配置详见SOTA开发配置。
当需要擦除UCB区域时,需检查当前UCB有没有CONFIRMATION位,如有需要解锁。
使能SWAP功能,Flash大小实际能用的最少减半,具体原因可以思考一下,很简单。
使能SWAP功能,CPU访问Flash只能通过Global总线从而稍微增加了访问时间。
功能安全方面:Active Bank 的safety_endinit保护依旧存在,但是Inactive Bank的safety_endinit保护无效。
信息安全方面:Active Bank 和Inactive Bank同样受信息安全相关寄存器的保护。
本文详细介绍了英飞凌TC3xx系列芯片的SOTA(Software Update Over The Air)功能,包括SOTA的工作原理、英飞凌的SWAP功能及其内存映射机制。内容涵盖SOTA功能配置、UCB_OTP和UCB_SWAP的配置参数,以及运行时SOTA切换的详细步骤。此外,还讨论了多次SOTA升级的疑惑和解决方法,强调了在配置过程中需注意的地址映射和安全性问题。

7204






