partition
分区管理模块提供对Flash分区表的读取与解析能力,支持按分区ID获取分区的存储类型及对应地址或文件路径信息,为系统各模块提供统一的分区查询接口。
头文件清单
#include <middleware/utils/partition.h>
#include <middleware/chips/3322/include/shared/partition_resource_id.h>
接口清单
| 接口名称 | 功能简述 |
|---|---|
| uapi_partition_init | 分区管理模块初始化 |
| uapi_partition_get_info | 获取指定分区ID的分区信息 |
Functions
uapi_partition_init
函数声明
头文件清单
功能说明
- 初始化分区管理模块,从Flash中读取分区表并解析到内存中
- 读取Flash分区表头部的image_id字段,校验其与预期值是否匹配,不匹配则返回初始化失败
- 解析分区表项的数量和每项的地址、大小、ID信息,存入全局分区信息结构中
- 若分区表项数量超过最大支持数量,则仅解析前PARTITION_MAX_CNT项
前置条件
- Flash分区表已正确烧录,分区表头部image_id与PARTITION_IMAGE_ID一致
- Flash分区表数据结构完整,无损坏
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x0) | 执行成功 | 分区表image_id校验通过,分区信息解析成功 |
| ERRCODE_PARTITION_INIT_ERR(0x80003000) | 分区初始化失败 | 分区表头部image_id与预期值不匹配 |
uapi_partition_get_info
函数声明
头文件清单
功能说明
- 根据指定的分区ID获取该分区的信息,包括分区存储位置类型和对应的地址/路径信息
- 当分区存储在内存地址上时,返回分区类型为PARTITION_BY_ADDRESS,并填充addr_info中的起始地址和字节长度
- 当分区存储在文件系统上时,返回分区类型为PARTITION_BY_PATH,并填充file_path路径信息
- 优先按地址方式查找分区,未找到时再按路径方式查找
前置条件
- 分区管理模块已通过uapi_partition_init()初始化完成
- 入参info不为NULL,且指向的内存空间已申请成功
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| partition_id | partition_ids_t | 指定的分区ID | - PARTITION_SSB_IMAGE - PARTITION_SSB_BACKUP - PARTITION_RECOVERY_IMAGE - PARTITION_SELITEOS_IMAGE - PARTITION_ACPU_IMAGE - PARTITION_BT_IMAGE - PARTITION_DSP_MAIN_IMAGE - PARTITION_DSP_OVERLAY_IMAGE - PARTITION_NV_DATA - PARTITION_FOTA_DATA - PARTITION_SSB_UPG_IMAGE - PARTITION_SELITEOS_UPG_IMAGE - PARTITION_DFX_DATA - PARTITION_LOG_FILE - PARTITION_DUMP_INFO - PARTITION_FILE_SYSTEM |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| info | partition_information_t * | 分区信息,包含分区类型type及对应的地址信息或文件路径 |
返回值
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| ERRCODE_SUCC(0x0) | 执行成功 | 成功获取分区信息 |
| ERRCODE_PARTITION_INVALID_PARAM(0x80003002) | 参数无效 | info为NULL |
| ERRCODE_PARTITION_CONFIG_NOT_FOUND(0x80003003) | 分区配置未找到 | 指定分区ID在分区表中不存在 |
参考案例
src/application/3322/3322_app_standard/service_init.csrc/bootloader/flashboot_3322/main.csrc/middleware/utils/update/storage/upg_storage.c
Enumerations
partition_type_t
typedef enum partition_type {
PARTITION_BY_ADDRESS, /*!< Partition stored on an memory address. */
PARTITION_BY_PATH, /*!< Partition stored on filesystem. */
PARTITION_TYPE_COUNT /*!< type count, not a valid type. */
} partition_type_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| PARTITION_BY_ADDRESS | 0 | 分区存储在内存地址上 |
| PARTITION_BY_PATH | 1 | 分区存储在文件系统上 |
| PARTITION_TYPE_COUNT | 2 | 类型数量,不作为有效类型使用 |
partition_ids_t
typedef enum {
PARTITION_SSB_IMAGE = 0x0,
PARTITION_SSB_BACKUP = 0x1,
PARTITION_RECOVERY_IMAGE = 0x20,
PARTITION_SELITEOS_IMAGE = 0x21,
PARTITION_ACPU_IMAGE = 0x22,
PARTITION_BT_IMAGE = 0x23,
PARTITION_DSP_MAIN_IMAGE = 0x24,
PARTITION_DSP0_IMAGE = PARTITION_DSP_MAIN_IMAGE,
PARTITION_DSP_OVERLAY_IMAGE = 0x25,
PARTITION_DSP1_IMAGE = PARTITION_DSP_OVERLAY_IMAGE,
PARTITION_NV_DATA = 0x30,
PARTITION_FOTA_DATA = 0x31,
PARTITION_SSB_UPG_IMAGE = 0x32,
PARTITION_SELITEOS_UPG_IMAGE = 0x33,
PARTITION_DFX_DATA = 0x34,
PARTITION_LOG_FILE = 0x35,
PARTITION_DUMP_INFO = 0x36,
PARTITION_FILE_SYSTEM = 0x37,
PARTITION_MAX_CNT = 15
} partition_ids_t;
| 枚举成员 | 取值 | 描述 |
|---|---|---|
| PARTITION_SSB_IMAGE | 0x0 | SSB镜像分区 |
| PARTITION_SSB_BACKUP | 0x1 | SSB备份分区 |
| PARTITION_RECOVERY_IMAGE | 0x20 | 恢复镜像分区 |
| PARTITION_SELITEOS_IMAGE | 0x21 | SEliteOS镜像分区 |
| PARTITION_ACPU_IMAGE | 0x22 | ACPU镜像分区 |
| PARTITION_BT_IMAGE | 0x23 | BT镜像分区 |
| PARTITION_DSP_MAIN_IMAGE | 0x24 | DSP主镜像分区 |
| PARTITION_DSP0_IMAGE | 0x24 | DSP0镜像分区(别名,同PARTITION_DSP_MAIN_IMAGE) |
| PARTITION_DSP_OVERLAY_IMAGE | 0x25 | DSP Overlay镜像分区 |
| PARTITION_DSP1_IMAGE | 0x25 | DSP1镜像分区(别名,同PARTITION_DSP_OVERLAY_IMAGE) |
| PARTITION_NV_DATA | 0x30 | NV数据分区 |
| PARTITION_FOTA_DATA | 0x31 | FOTA数据分区 |
| PARTITION_SSB_UPG_IMAGE | 0x32 | SSB升级镜像分区 |
| PARTITION_SELITEOS_UPG_IMAGE | 0x33 | SEliteOS升级镜像分区 |
| PARTITION_DFX_DATA | 0x34 | DFX数据分区 |
| PARTITION_LOG_FILE | 0x35 | 日志文件分区 |
| PARTITION_DUMP_INFO | 0x36 | Dump信息分区 |
| PARTITION_FILE_SYSTEM | 0x37 | 文件系统分区 |
| PARTITION_MAX_CNT | 15(0xF) | 分区最大数量,不作为分区ID有效性的判断 |
Associations
partition_information_t.part_info
union {
struct {
uint32_t addr; /*!< Address of partition if partition stored on an memory address. */
uint32_t size; /*!< Byte length of partition if partition stored on flash or ram. */
} addr_info; /*!< The address info of the partition. */
char *file_path; /*!< File path if image partition on filesystem. */
} part_info; /*!< the union of partition information(address or file path). */
| 成员名称 | 类型 | 描述 |
|---|---|---|
| addr_info | struct | 分区的地址信息,包含起始地址和字节长度 |
| file_path | char * | 分区所在文件系统路径 |
Structures
partition_information_t
typedef struct partition_information {
partition_type_t type; /*!< Partition storage location type. */
union {
struct {
uint32_t addr; /*!< Address of partition if partition stored on an memory address. */
uint32_t size; /*!< Byte length of partition if partition stored on flash or ram. */
} addr_info; /*!< The address info of the partition. */
char *file_path; /*!< File path if image partition on filesystem. */
} part_info; /*!< the union of partition information(address or file path). */
} partition_information_t;
成员说明
| 成员名称 | 数据类型 | 描述 |
|---|---|---|
| type | partition_type_t | 分区存储位置类型,标识分区存储在内存地址或文件系统上 |
| part_info | union { struct { uint32_t addr; uint32_t size; } addr_info; char *file_path; } | 分区信息联合体,根据type选择地址信息或文件路径 |