1、概述
Image 模块主要用于管理和操作固件。系统启动过程中对固件的加载和检查,以及 OTA 升级过程中对固件的更新和验证,都用到 Image 模块提供的功能。此文档用以解释 Image 模块相关的概念并介绍接口的使用,帮助开发者了解如何使用 Image 模块管理和操作固件。
为更好理解 Image 模块的相关概念,建议先通过文档《
XR871 Memory
layout Developer Guide》了解固件打包和布局相关内容。此外,由于 OTA 功能在一定程度上依赖 Image 模块,因此本文档内容也有助于了解系统的 OTA 功能。
1.1 相关概念和定义
1.1.1 Image 区域
Image 区域是指在 Flash 上划分出来用于存放固件的区域。开发者如果通过 FDCM 模块或其他方式改写或擦除 Image 区域,可能导致固件损坏系统无法启动。
在不考虑 OTA 功能时,只需要在 Flash 上指定一个 Image 区域。工程目录下 prj_config.h 文件中可配置 Image区域的位置和大小。
#define PRJCONF_IMG_FLASH (0)
#define PRJCONF_IMG_ADDR (0x00000000)
#define PRJCONF_IMG_SIZE ((1 << 20) - (4 << 10))
宏 PRJCONF_IMG_FLASH 为 Flash 设备号(具体定义可参考 Flash 驱动),用来指定 Image 区域所在的具体 Flash设备,宏 PRJCONF_IMG_ADDR 表示 Image 区域的起始地址,宏 PRJCONF_IMG_SIZE 表示 Image 区域的大小。由以上三个宏就可以确定一个 Image 区域。
在考虑 OTA 功能时,需要在 Flash 上指定两个 Image 区域。其中第一个 Image 区域仍通过上述三个宏确定。第二个 Image 区域大小与第一个 Image 区域大小相同,同样是由宏 PRJCONF_IMG_SIZE 确定。第二个 Image区域的 Flash 设备号和起始地址通过文件 image.cfg 配置,配置示例如下:
"OTA" :{"flash": "1", "addr": "0x00100000"},
如果第二个 Image 区域与第一个 Image 区域在相同的 Flash 设备,则配置可简化为:
"OTA" :{ "addr": "0x00100000"},
1.1.2 Image sequence
支持 OTA 功能时,要求在 Flash 上有两个 Image 区域来存放固件。Image sequence 用于指定不同 Image 区域的固件。Image sequence 在代码中定义如下:
typedef enum image_sequence {
IMAGE_SEQ_1ST = 0,
IMAGE_SEQ_2ND = 1,
IMAGE_SEQ_NUM = 2,
} image_seq_t;
1.1.3 Section ID
从文档《XR871 Memory Layout Developer Guide》中可以看到,一个 IMAGE 由多个 Section 组成,一个 Section包含了头部和bin文件,也可能在尾部包含证书。Section ID是每个Section的唯一标识。Image模块根据SectionID 找到对应的 Section 以及 Section 内部的 bin。打包时固件中的 Section ID 来自固件配置文件 image.cfg,代码中的 Section ID 定义在文件 image.h 中(示例如下),应保证这两处定义的一致性。
#define IMAGE_BOOT_ID (0xA5FF5A00)
#define IMAGE_APP_ID (0xA5FE5A01)
#define IMAGE_APP_XIP_ID (0xA5FD5A02)
#define IMAGE_NET_ID (0xA5FC5A03)
#define IMAGE_NET_AP_ID (0xA5FB5A04)
#define IMAGE_
WLAN_BL_ID (0xA5FA5A05)
#define IMAGE_WLAN_FW_ID (0xA5F95A06)
#define IMAGE_WLAN_SDD_ID (0xA5F85A07)
1.1.4 Segment
打包生成的固件除了包含 bin 文件本身以外,在每个 bin 文件前还增加了一个长 64 个字节的头部,每个 bin文件的尾部也可以包含证书等信息。Segment 用来指定 Section 中的头部(HEADER)、bin 文件本身(BODY)或是尾部(TAILER)。Segment 在文件 image.h 中的定义如下:
typedef enum image_segment {
IMAGE_SEG_HEADER = 0,
IMAGE_SEG_BODY = 1,
IMAGE_SEG_TAILER = 2,
} image_seg_t;
1.1.5 Image validity
在 Section HEADER 中包含了 HEADER 部分的累加和,以及 BODY 加 TAILER 部分的累加和。固件累加和校验的结果用 Image validity 表示,在文件 image.h 中定义如下:
typedef enum image_validity {
IMAGE_INVALID = 0,
IMAGE_VALID = 1,
} image_val_t;
1.2 Image 与 OTA
OTA 功能的初始化参数(定义如下)可从 Image 模块提供的接口获得。参数主要包括两个 Image 区域的位置、大小以及 Bootloader 区域大小等信息。
typedef struct image_ota_param {
uint32_t flash[IMAGE_SEQ_NUM];
uint32_t addr[IMAGE_SEQ_NUM];
uint32_t image_size;
uint32_t boot_size;
} image_ota_param_t;
......
更多详细内容请下载附件查看