详解汽车Bootloader设计
01
BootLoader的设计需求
图1 两级boot
3、更新速率需求
在当前主机厂都在追求整车OTA能力的情形下,主机厂开始在意软件的更新时间,尽量减少对用于的影响,也就是所谓的无感更新,提高用于体验,毕竟谁也不想出现几年前蔚来在长安街上等半天更新软件情形。
对此需要熟读芯片手册的Flash部分以及数据下载协议,多为UDS,目前通常采用的方法就是Flash执行多页写入,采取最大化的连续帧数量,也就是减少流控制的数量,亦或是提高总线速率等。
02
BootLoader程序流设计
从名字可以看出,该步骤主要是下载程序前的一些操作,包括唤醒ECU、读写特定的DID、通信管理等,详细的操作如图3所示。
图3 预编程阶段
其中:
1、唤醒ECU,唤醒的方法和策略由主机厂制定,有些要求在KeyOn下刷写,有些要求在KeyOff下刷写。
2、为了运行85服务关闭DTC存储和28服务关闭相关的通信,首先需通过10服务切换至扩展会话,因为85和28服务都需要在扩展模式下才能工作。
3、进入扩展会话后,主机厂可以进一步进行特定数据链路的初始化,通常来说,国内主机厂不会有这种需求,不知道欧洲会不会有。
4、运行31服务对刷写条件进行检查,例如低压电是否在正常范围内,档位是否为P档,车速是否为零等;
5、检查通过后,为了防止刷写过程中其他ECU节点误触发DTC,通常为通信故障,则通过功能寻址请求85服务关闭局域网内所有ECU节点的DTC存储;
6、该步骤提供给主机厂一个接口,可以通过0x31服务启动或关闭ECU的故障安全响应(failsafe reaction),目前主机厂用得很少。
7、为了提高刷写速度,降低刷写程序时总线负载率,通过28服务关闭无关报文,比如应用报文和网络管理报文;
8、在关闭部分通信之后,通过22服务读取被刷ECU的状态(应用软件和数据)、软件指纹信息等;
9、为了减少刷写的时间,可以通过87服务提高CAN总线的波特率。
2、主编程阶段
该步骤用于将软件或者数据下载到被刷ECU中,主要包括进入特定的安全等级、写入指纹信息、下载软件和数据等,如图4所示。
图4 主编程阶段
其中:
1、10 02切换至编程会话模式,将软件刷新标志位置位,;
2、运行27服务进入特定的安全等级,下载前,通过安全访问过程是强制的,确保只有合法的诊断仪能对ECU进行下载操作。
3、运行2E服务将指纹信息写入ECU;
4、运行34、36、37服务将永久存储区写入默认值;
5、运行31服务检查步骤4是否成功,另外一种方法是通过37的响应确定是否成功;
6、运行31服务对特定的Flash进行擦除;
7、分别运行34、36、37服务将Flash driver下载至内存中;
8、运行31服务检查Flash driver下载是否成功;
9、分别运行34、36、37服务将软件包或者标定数据下载至Buffer中,Boot通过周期调用Flash Driver将数据写入Flash中;
10、运行31服务检查步骤9是否下载成功;
11、运行31服务验证程序是否能正常运行,例如checksum、标志位等;
12、在下载完软件和数据后,汽车制造产商需要一些特定的操作,比如写入VIN码等。
3、后编程阶段
该步骤主要通过11服务对ECU进行复位或者通过10服务将会话切换至默认会话,如图5所示,如果在预编程阶段中调整了波特率,须通过特定的操作将波特率调整至正常值。通常操作是运行11服务使ECU复位,重启ECU。
图5 后编程阶段