字库处理存储方法
flag区
固定在后256k起始地址,即0x08040000
c
typedef __packed struct
{
uint32_t exist_flag;
uint32_t fontlib_addr;
uint32_t fontlib_len;
uint8_t md5[16];
} font_upgrade_flags_t;
__attribute__((at(FONT_LIB_FLAG_ADDR))) volatile const font_upgrade_flags_t font_flags = {
.exist_flag = FONT_LIB_EXIST_FLAGS,
.fontlib_addr = FONT_LIB_START_ADDR,
};
字库版本(与固件一致)
作为一个变量,存在于字库的开头,即 0x08040800
c
__attribute__((at(FONT_LIB_START_ADDR))) volatile const uint32_t font_lib_version =
(DEVICE_VERSION_A_PRJ_NUM << 24) |
(DEVICE_VERSION_B_PRJ_STAGE << 16) |
(DEVICE_VERSION_C_MAJOR << 8) |
(DEVICE_VERSION_D_MINOR << 0);
字库数据bitmap
存放于".fontconst"的section,通过attribute给所有需要的bitmap加上属性
存放于字库版本之后,即0x08040804后都是字库数据
c
#define LV_ATTRIBUTE_LARGE_CONST __attribute__((section(".fontconst")))
校验
开机判断:
升级过程最后会将flag区的字库存在标记置位,开机初始化阶段会进行判断,如果存在
标记位不在
标记区内的地址不合法
长度不合法
线程不运行,异常停止
合法校验:
升级过程最后会将整个字库的MD5计算值保存到标记区,开机会进行一次计算校验
开机初始化阶段不判断MD5校验是否通过(如果打开会影响keil下载调试效率,最后也可打开)
当大包升级中心或上位机查询字库版本时,如MD5校验不通过,则status=1
通过升级ID兼容方案 和升级协议进行