基于UDS的ECU在线升级系统设计

2023-12-28 10:11宋昊江王思山周海鹰司华超张贵海孙玉春
湖北汽车工业学院学报 2023年4期
关键词:固件上位报文

宋昊江,王思山,周海鹰,司华超,张贵海,孙玉春

(1.湖北汽车工业学院,湖北 十堰 442002;2.岚图汽车科技有限公司,湖北 武汉 430000)

随着整车电子电器架构的发展,智能网联汽车上集成了几百个电子控制单元,ECU 的应用程序更新变得复杂且繁琐。当前行业内通过Bootloader对控制器进行更新[1],将控制器连入CAN或LIN等汽车通信网络可实现对控制器进行升级[2]。在Bootloader 的更新技术上,朱少辉等[3]基于CCP 协议进行了控制器升级技术的设计。李娇娇等[4]使用Labview 软件设计了控制器刷写软件,采用S19文件进行控制器升级。汪春华等[5]针对车身控制器开发及生产中更新困难的问题,实现了基于UDS协议的Bootloader开发。马宏伟等[6]基于UDS协议完成了Bootloader 底层驱动开发,实现了控制器的在线升级系统设计。张成雨等[7]详细设计了Bootloader升级技术的Flash驱动与CAN驱动。杨朝阳等[8]通过外部触发方式,设计了基于CANFD 的在线升级系统。马建辉等[9]基于CAN节点MCU生成Flash 驱动程序的指令数据,在软件升级过程中实时下载到MCU的RAM空间,实现了避免程序数据被Flash 驱动误擦除隐患的Bootloader 设计。赵天义等[10]根据UDS 协议制定了控制器升级的流程标准,完成了基于UDS 的控制器在线升级设计。上述研究都是基于单个ECU 的在线升级系统,文中面向智能车底盘架构,根据多ECU更新需求,在数据链路层采用CAN 通信协议,在网络和应用层采用基于ISO14229 协议,设计并实现了基于UDS 协议的智能车底盘ECU在线升级系统。

1 UDS诊断服务在线升级流程

汽车工业中广泛应用的诊断协议是统一诊断服务,主要功能是对ECU 进行在线更新。采用UDS协议进行数据传输,通过定义的流程与握手功能,保证在线升级系统的稳定性和可靠性。

1.1 UDS指令

UDS 更新过程就是上位机使用UDS 协议规范地对数据进行交互。经过安全访问、数据擦除、数据传输和写入数据后实现对ECU 的Bootloader 更新。常用刷写指令见表1。

表1 常用的刷写指令

1.2 UDS刷写流程

UDS的ECU刷写流程分为3个阶段,分别是预编程阶段、编程阶段、后编程阶段。

1)预编程阶段 为ECU 进入编程模式做准备,上位机发送扩展会话指令,经过ECU响应过后进入扩展会话模式,检查ECU符合编程条件后,禁止DTC(诊断故障代码)和非诊断报文的收发,如图1 所示。Extend Session 指令诊断ID 为0x10,上位机发送子功能0x03,使ECU 进入扩展会话模式。Check Condition 指令诊断ID 为0x31。Control DTC指令用于设置是否启用DTC服务,诊断ID为0x85,子功能码0x02,禁止DTC 服务。Communication Control 指令用于控制ECU 的CAN 通信,诊断ID 为0x28。上位机发送子功能码0x03,表示禁止诊断报文外的其他报文的收发,为编程模式做好准备。

图1 预编程过程

2)编程阶段 对Flash进行擦除和写入,将更新的数据刷写到ECU,如图2所示。编程阶段发送的指令如下:Request Seed 指令用上位机向ECU 请求种子,诊断ID 为0x27,上位机发送子功能码0x01,从ECU 获取seed,与ECU 同时计算key,只有key 一 致 才 能 进 行 更 新;Erase Flash 诊 断ID 为0x31,子功能码为0x01,对指定的Flash地址进行擦除;Request Download 诊断ID 为0x34,请求上位机进行数据传输;Transfer Data诊断ID为0x36,包含1段内存区域,刷写时重复执行直到数据全部传输完成;Request Transfer Exit 诊断ID 为0x37,用于上位机向ECU通知数据传输结束。

图2 编程过程

3)后编程阶段 实现对ECU 的重启和DTC、CAN功能的恢复,后编程过程如图3所示。后编程阶段依次发送诊断指令:ECU Reset 指令用于ECU的复位,诊断ID为0x11,上位机在将全部数据传输完成后发送该指令,从而使ECU恢复到工作状态;Control DTC 指令用于ECU 的复位;Communication Control 指令用于控制ECU 的CAN 通信,诊断ID 为0x28。恢复DTC 子功能码为0x01,表示重启DTC。恢复CAN 通信子功能码设为0x00,表示恢复ECU的CAN正常通信。

图3 后编程过程

1.3 UDS报文传输模式

UDS网络层定义了4种帧格式,即单帧、首帧、流控帧和连续帧。对于数据容量满足单帧的数据将直接发送,对于数据容量超过单帧承载能力的数据将按照UDS 网络层协议进行分割重组,通过多帧进行传输。报文传输方式如图4所示。

图4 网络层报文帧传输方式

2 固件升级设计

2.1 基于嵌入式Linux代理设计

以嵌入式设备Xavier 作为底盘系统中各ECU的升级代理,使用NXP MPC5748G 为智能车底盘系统中待升级的ECU,采用CAN 总线的通信方式控制ECU 的整个升级流程。在线升级时序如图5所示。在Xavier终端输入刷写命令后,计算存储在Xavier的固件文件摘要值,与文件中记录的固件文件摘要值进行对比,若两者一致,则验证了固件文件的完整性和安全性。验证通过后以ECU ID为标识,检测目标ECU的版本号和状态,若满足升级条件,则通过UDS刷写流程对ECU进行刷写,刷写完毕后将升级结果反馈给Xavier。

图5 在线升级时序图

2.2 Flash的内存分布设计

基于MPC5748G 的Flash 结构特征,对Bootloader进行Flash分布设计,如图6所示。Bootloader将写入到Flash 的固定存储空间中,为避免与应用程序的Flash存储地址重叠,需分配好Bootloader代码在Flash 中的地址位置。其他代码存储在Bootloader 的Flash 区域外,可保证Bootloader 不被其他程序覆盖引起错误。0x01000000-0x0100FFFF 用于存储软件版本信息、编译日期、编译时间、固件摘要值等固件信息,便于在升级前进行检查版本。

图6 Flash分布设计

2.3 Bootloader下载模式

Bootloader 包括2 种操作模式:在线实时升级和外部触发升级。文中采用实时在线升级模式,主要流程如下:ECU 在正常启动后的运行过程中,Xavier收到命令行输入的更新命令后,检查ECU当前版本号和状态,若满足升级条件则置外部刷写指令有效并进行复位。重启后进入编程模式,使用安全访问服务进行安全认证,认证成功才允许文件进行下载,下载完毕后将清除外部刷写指令并重启ECU。Bootloader启动流程如图7所示。

图7 Bootloader启动流程图

2.4 在线升级安全机制

ECU 固件文件上传到Xavier、从Xavier 传输到目标ECU 的缓存以及安装过程中,固件文件都有被篡改的风险,因此采用SHA-256 算法作为验证固件文件安全的摘要算法,计算固件文件的摘要值,与文件中记录的固件摘要值对比,若相等则说明固件是完整安全、未经篡改的,反之,说明固件是非法的或者不完整的,将错误信息反馈到Xavier并停止升级。为了保证Xavier 对ECU 的安全访问以及下载验证,根据IS014229 协议中的安全访问服务来提供安全验证:1)Xavier 向ECU 发出信号request Seed 申请密钥种子Seed,ECU 随机返回种子;2)Xavier对ECU反馈的种子进行处理后得到有效密钥Key,发送到ECU 进行比对,结果一致后得到ECU的授权访问[11]。

3 软件设计

3.1 Bootloader软件设计

Bootloader 软件架构如图8 所示,MCU 驱动实现MCU 硬件驱动功能,包含系统时钟、定时器、看门狗、CRC、FLASH、CAN等驱动模块。ECU封装了这些驱动,供应用层调用。在此基础上利用S32G Design 编写CAN 通信模块以及UDS 协议栈(包括ISO15765-2网络层和应用层ISO14229-1),用于处理数据交互。UDS 协议规范了数据在网络层中的传输,包括数据的分包、组包、时间控制、应用层的诊断会话管理时序以及错误处理等。根据UDS协议命令编写对应功能的函数,部分源函数见表2。

图8 Bootloader软件层级架构

表2 UDS协议栈部分函数

3.2 Agent在线升级组件设计

为了使Xavier和ECU进行升级的数据交互,需要在Xavier添加在线升级组件,升级组件分为3个模块,结构如图9所示。Master 作为在线升级系统的主节点模块,在收到Xavier命令行输入的刷写指令后,先与Status Manager 模块进行交互,以ECU ID为标识,通过Update Agent模块与待升级的ECU进行通信,检查目标ECU的状态和版本号,若符合升级状态并且此次升级版本号大于ECU当前版本号,在预编程阶段通过诊断命令“28 01”静默CAN网络上其他ECU 报文的收发,以提高诊断报文的刷写速度和刷写成功率;然后对目标ECU 进行安全访问,验证通过后进入编程阶段,根据文中编程阶段的流程进行刷写升级。Update Agent 模块实时监控刷写流程是否规范,刷写完毕后执行后编程阶段,ECU 重启时需要对ECU 中的固件文件进行摘要值计算,通过比较其与ECU 中存储的固件文件摘要值,若相等则说明固件是未被篡改,重启成功后Update Agent 模块将升级成功后的结果反馈给Master。

图9 Agent在线升级组件设计

4 系统验证

采用NVIDIA Xaiver 作为升级系统的Agent,MPC5748G 为ECU。台架测试如图10 所示。功能测试中,通过第三方软件记录CAN总线的报文,验证在线升级系统的功能。截取的部分报文内容如图11所示。在线升级系统按照UDS刷写流程进行单帧、首帧、流控帧和连续帧的传输,实现了升级的整个流程,满足智能车底盘ECU的在线升级。

图10 台架测试图

图11 UDS部分刷写报文

5 结论

文中设计的系统成功实现了智能车底盘ECU MPC5748G应用程序的在线升级功能,克服了ECU需要频繁拆卸更新的难题,提高了开发效率;同时基于UDS 协议进行升级,提高了系统更新的可靠性,有利于Bootloader的开发和移植。

猜你喜欢
固件上位报文
基于J1939 协议多包报文的时序研究及应用
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
特斯拉 风云之老阿姨上位
“三扶”齐上位 决战必打赢
基于ZigBee和VC上位机的教室智能监测管理系统
基于固件的远程身份认证
ATS与列车通信报文分析
以新思路促推现代农业上位
提取ROM固件中的APP