1、简介
车载Fota是指ECU脱离诊断仪,使用网络结合BootLoader进行云端固件软件升级技术,此技术解决了以往用户升级固件必须预约且前往4s店的痛点。本文章不介绍FOTA升级包的制作方法,仅分享针对ECU单一节点的FOTA分区方案。
Note:本文中所讲BootLoader皆为Ecu层面所支持UDS的BootLoader,并非芯片自身所带启动BootLoader。
2.Fota实现流程
Fota的实现需要几个关键点,分别为能够解析Fota包的ECU(如:T-Box和网关等)、需要升级的ECU支持BootLoader、需升级的ECU支持APP备份和回滚。关系图如下:
从图中可以看到,当前升级ECU节点最重要的两个功能为BootLoader和备份回滚功能,BootLoder在以后的篇文章会做详细介绍,这边文章重点讲解实现回滚/备份功能,ECU的底层分区的几种方案。
3.软件存储在芯片内置Pflash,且芯片无flash Swap功能
3.1 采用最简单A/B分区方案,将Pflash划分为三个区域,分别存放boot、APP1、APP2,分别为两个APP设置有效标志位,采用交叉升级策略,见下图:
图中可以看出,此方法永远只升级无效区,不需要回滚与备份,相当于自动回滚备份。
3.2 和上图类似,仍将Pflash划分为boot、App1、App2三个区域,只是APP2成为了备份区,见下图:
此种分区方案升级成功后,可发送DUS指令进行新APP的备份,也可Boot自动备份。但升级失败的原因不同,Boot中必须做指令回滚流程,不建议使用此种分区方案,若整车EE架构要求必须做回滚/备份处理指令,可沟通多方在3.1的基础上做回滚备份假处理指令。
Note:在第3节中的情况,若考虑Boot刷写升级,可将Pflash分为5个区域,分别为 跳转Boot、升级Boot1、App1、升级Boot2、App2。3.1情况跳转Boot只需判断有效区,3.2中跳转Boot需添加回滚/备份指令,此方法会消耗Pflash的资源,若非强制要求,不建议使用。
4.芯片无内置Pflash,需外挂Pflash
此情况与第3节中方案一置,只多一步Boot中拷贝外置Pflash到运行区域,具体细节日后会在BootLoader详细设计中讲到。
5.内置Pflash,且芯片有Pflash Swap功能
目前我遇到过的 Pflash Swap功能有2种,分别为为两块Pflash整块交换映射(理解为交换地址指针)、将Pflash中的数据映射至虚拟内存中运行。
5.1两块Block整块交互映射时,目前遇到一款芯片拥有两种交换方式,第一种为操作寄存器进行交换,此种方式操作完寄存器后地址指针立刻发生变化(通过有效标志位来判断切换到那个Block),所以要交换的两个Block中分别需要有一段相同的Boot代码,避免在Boot中发生交换时因代码不同,代码跑飞,具体分布如下:
此方式类似3.1中的交叉升级方案,其实也是交叉升级,非交叉升级参考3.2内容,两者类似。
第二种Swap方式为硬件自动判断当前有效block(通过特定标识符完成),此种分区方式和上图相同,不同点为Boot无需操作寄存器完成Swap,也就是它跳到Boot时表示判断有效分区已经完成,此种方式较第一种方式的优点为两个Block的Boot可以不同,可以实现Boot的变更升级。
5.2将Pflash中的数据映射至虚拟内存中运行,与第4节中外挂Pflash类似,芯片厂会发布拷贝到虚拟内存的api。
总结:以上为目前遇到过的芯片情景,故只能总结这几种去方案。Fota的分区方案是由芯片架构决定的,选择合适的分区方案来满足顾客要求即可。不同的分区方案的BootLoader的设计细节不同,相关部分后期BootLoader的详细设计方案中会记录。