如果linux嵌入式系统采用norflash引导加载uboot方式。uboot启动后,可进行uboot、设备树、内核及文件系统等升级和烧写工作及启动参数设置等操作。当uboot出厂前如果出现问题,可以通过其他方式修改重写,但是考虑到在用户现场情况下,如果出现uboot升级烧写过程中断电或其他不可抗拒原因,将可能导致uboot烧写失败或启动分区信息被破坏,那么系统将无法启动。为了解决以上问题,特采用双uboot系统保证系统升级及正常工作。
BootLoader引导加载uboot功能及应用程序升级uboot功能。
BootLoader中主要实现对双uboot的引导加载及错误处理。实现功能:系统启动后,根据启动标志位,校验优先启动uboot,校验通过启动,校验未通过加载次启动uboot。
应用层对上层提供接口命令完成升级功能。升级功能:升级脚本根据传入的文件名称,自动查询用户目录下是否有该升级文件,如有则升级,没有则退出。升级后重启引导加载最新uboot。注意:每次升级只升级次启动地址,当前启动不变。
根据需求要求,进行如下划分
系统层:
完成BootLoader引导双uboot工作。增加优先传启动标志位,可以对uboot启动进行管理,保证启动优先级。并且实现了优先启动分区出错跳转次启动地址的功能,保证设备工作状态。双uboot分别保存最新升级及上一版本uboot。每次启动优先启动最后一次升级版本。如果两个分区都启动失败,自动重启(或等待看门狗复位)。
应用层:
完成升级功能。根据后台发送的推送信息,自动查找指定升级文件并对设备进行升级。升级成功后,重置优先启动标志位为从当前升级分区,同时返回升级成功信息;如升级出错则返回没找到升级文件、校验失败或升级失败等错误信息。
flash分区如下:
BootLoader引导加载uboot功能框图:
BootLoader引导加载流程说明:
次启动分区标志值:由优先启动标志位决定,如果优先启动标志位为“first”,那么次启动分区标志值为“second”;如果优先启动标志位为“second”,那么次启动分区标志值为“first”;
升级uboot功能。
升级uboot程序框图
软件流程分析及关键点说明:
CRC32校验方式:读取偏移地址后的uboot进行CRC32校验,校验值同头信息读回的校验值进行对比。
获取当前启动系统标志位,通过对cocloud_cur_uboot判断,获取次启动地址进行升级。
升级时要注意,一定要等文件写入存储设备后在进行升级,否则由于文件系统写入延时问题,可能导致升级失败。