1、启动qboot线程
2、打印qboot版本信息
3、解压分区里面的固件 download
-
检查分区存在不存在
-
读取存放在分区里面的信息,封装了固件信息
if ( ! qbt_fw_info_read(fw_part_name, fw_info, false))//读取头部信息
- 查找分区
- 读取头部的分区数据 sizeof(头部结构体)
-
校验头部信息
if ( ! qbt_fw_info_check(fw_info))//检测头部信息 检测头部信息的crc
- 校验头部信息的crc
- typedef struct {
u8 type[4];//
u16 algo;
u16 algo2;
u32 time_stamp;
u8 part_name[16];//分区名?? 还是包名?
u8 fw_ver[24];//版本信息
u8 prod_code[24];
u32 pkg_crc;//包的crc
u32 raw_crc;
u32 raw_size;
u32 pkg_size;//包的大小
u32 hdr_crc;//包头的crc
}fw_info_t;
-
固件检测
if ( ! qbt_fw_crc_check(fw_part_name, sizeof(fw_info_t), fw_info->pkg_size, fw_info->pkg_crc))//固件的crc检测
去掉头部信息的大小,就是app的地址。包的大小。数据包的crc- 查找分区
- 每次读取4096个字节,就是一个扇区
- 读取出来加入到crc校验函数中去
- 返回结果
-
app的crc检测 (和固件检测的区别是啥,没细看)
-
如果需要升级,就会擦除app分区
-
如果跳转失败就会从download分区下载数据、或者factory分区
-
在失败会一直重启