固件在线升级流程

从事硬件开发,为了方便维护,免不了对模块进行固件升级,所以对于固件升级,简单整理了一下完整的在线升级的实现思路,该思路适用于所有带通讯总线的模块。

需要注意的是,需要额外的上位机配合。

下位机在线升级流程如下图:

原创图片,转发请标注出处。

APP升级步骤

(1)读软件版本、CPU型号、模块型号

(2)UDP包,每包长度1024字节,写入update区

(3)接收n包升级数据包,正常长度1024,将255整数长度的写入FLASH

(4)若接收到回读固件指令,则说明数据发送完成,将最后小于255长度的数据补全0xFF写入FLASH,且根据索引依次返回固件数据,进行校验比较

(5)比较通过后,写入APP升级标志,供重启后boot识别

(6)重启,boot判断升级标志,将升级区域数据复制到APP区,清除升级标志,跳入APP开始运行

BOOT升级步骤

(1)读软件版本、CPU型号、模块型号

(2)UDP包,每包长度1024字节,写入update区

(3)接收n包升级数据包,正常长度1024,将255整数长度的写入FLASH

(4)若接收到回读固件指令,则说明数据发送完毕,将小于255长度的数据补全0xFF写入FLASH,且根据索引依次返回固件标志,进行校验比较

(5)比较通过后,将update区域数据复制到boot区,注意最后未满足255长度的数据,需要补全后再写入。

(6)重启,正常运行。


在线升级笔记1:

(1)需要安装Agv_tool工具包,且本机电脑IP为192.168.0.xx网段

(2)打开AgvTool后,在车辆管理中新增车辆,输入参考。 编号:3;IP:192.168.0.3;端口号:4410

(3)配置管理界面:选中新增车辆,点击“连接”按钮进行连接;

(4)固件升级界面中,“选择目标文件”选中xml文件(需要xml文件和bin文件在同一路径下,xml文件是配置文件,bin是固件)。然后开始获取固件操作。

若固件获取失败,可以通过抓包,查看网口数据包,排查问题。


在线升级笔记2:

(1)由于UDP发送时未获取到目标IP地址,导致VCU无法获取到模块类型、软件版本、CPU类型;

(2)获取类型成功后,点击升级开始升级;

(3)升级逻辑:由于升级代码存放在0x40000,所以可以通过bin文件查看工具打开bin文件,并于写入FLASH中的0x40000中的数据进行对比,若完全一样,则说明写入成功;否则,写入失败,检查写入失败原因。


在线升级笔记3:调试在线升级遇到的问题:

(1)无法获得模块型号、软件版本号、CPU型号

原因:由于udp应答时,协议控制块中没有赋给目标IP地址和目标port,导致发送IP地址为0.0.0.0,MAC地址为FF FF FF FF FF FF ;VCU无法处理

(2)写FLASH错误,每次写0x400长度,前0x100写成功,之后写均失败,写FLASH逻辑问题。

原因:VCU一次写请求长度为0x400,即1KB,但是单次写FLASH最小长度为0x100,故要分开写4次,且最后不够0x100时,用0xFF凑够,再写入FLASH,修改逻辑后,写FLASH问题修复

(3)写完FLASH后,重启失败

原因:重启失败是因为写FLASH完成后,没发送重启响应给VCU,导致VCU以为响应超时,其实已经重启完成。在控制板重启前保证成功发送重启i响应给VCU,解决问题。

(4)存在概率性文件对比失败问题(通过抓包排查了问题)

原因:

(1)没有清除UDP接收标志,导致UpdataProcess()一直被执行,数据一致性出现问题,响应的索引值与请求索引值不一致,导致文件对比失败。

(2)UDP发送函数中,pbuf赋值采用pbuf_tack()函数;修改该项无影响。

(3)写完FLASH后,第一次读FLASH,会因为刚写完立马去做读操作,IAP会来不及处理,导致第一次读取FLASH都是00,做延时处理解决;

(4)将UpdataProcess()处理,放在UDP接收回调中处理,会解决数据一致性,以及第一次读FLASH错误问题。

原创文章 18 获赞 12 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28086285/article/details/88687234