FLASH分区表(PARTITION TABLE)¶
1、简介¶
CI14LP芯片的固件、模型、命令词、提示音、用户文件等资源以分区表的形式组织在FLASH中。分区表位于FLASH偏移 0x2000(FILECONFIG_FLASH_START_ADDR)处,由打包工具(PackTool)在固件制作时生成,SDK上电后通过 ci_flash_data_info_init 解析并缓存到RAM。
分区表(partition_table_t,1字节对齐)描述的信息包括:
| 字段组 | 内容 |
|---|---|
| 产品信息 | 厂商ID、产品ID(MAC地址)、硬件名称/版本、软件名称/版本、bootloader版本、芯片名、固件格式版本 |
| user_code1 | 应用程序镜像1:版本、偏移、大小、CRC、状态 |
| user_code2 | 应用程序镜像2(OTA双备份):版本、偏移、大小、CRC、状态 |
| asr_cmd_model | ASR命令词模型:版本、偏移、大小、CRC、状态 |
| dnn_model | DNN模型:版本、偏移、大小、CRC、状态 |
| voice | 提示音资源:版本、偏移、大小、CRC、状态 |
| user_file | 用户文件区:版本、偏移、大小、CRC、状态 |
| nv_data | NV数据区:偏移、大小 |
| 校验 | 分区表校验和(patitiontablechecksum) |
命令词模型内部按”模型组(group)—文件(file)”两级组织:每组包含命令词模型文件(COMMAND_INFO_FILE_ID=60000)与DNN模型文件(VOICE_PRINT_DNN_ID=60001),支持多语言/多套命令词切换。
2、API¶
| 函数名 | 描述 |
|---|---|
| ci_flash_data_info_init | 解析并初始化FLASH分区信息(传入默认模型组ID) |
| get_partition_table | 获取分区表指针 |
| get_current_model_addr | 获取当前使用的DNN模型与ASR模型地址/大小 |
| get_group_addr | 通过组ID获取模型组的地址 |
| get_file_addr | 通过文件ID获取文件地址和大小 |
| get_dnn_addr_by_id | 通过DNN文件ID获取DNN模型地址/大小 |
| get_asr_addr_by_id | 通过ASR ID获取ASR模型地址/大小 |
| get_voice_addr_by_id | 通过语音ID批量获取提示音地址 |
| get_file_table | 获取文件表(变长结构) |
| release_file_table | 释放文件表缓存 |
| get_userfile_addr | 通过文件ID获取用户文件地址/大小 |
| get_fw_version | 获取固件版本(硬件版本+软件版本) |
| cached_flash_reader_init | 初始化FLASH缓存读取器(起始地址) |
| cached_flash_reader_read | 基于缓存的FLASH读取(减少直接读FLASH次数) |
| cached_flash_reader_destroy | 销毁FLASH缓存读取器 |
3、关键类型¶
| 类型 | 说明 |
|---|---|
| partition_table_t | 分区表结构体(见第1节字段说明) |
| file_header_t | 文件表项:file_id、file_addr、file_size |
| file_table_t | 文件表:file_number + 变长file_header数组 |
| group_header_t | 模型组表项:group_id、group_addr |
| group_table_t | 模型组表:group_number + 变长group_header数组 |
| product_version_t | 固件版本:hard_ware_version、soft_ware_version |
| cached_flash_reader_info_t | FLASH缓存读取器信息:起始地址、缓存buffer、缓存偏移区间 |
4、示例¶
1) 以下代码在SDK初始化流程中解析分区表(SDK上电默认完成):
#include "ci_flash_data_info.h"
void partition_init_demo(void)
{
//解析分区表,默认使用模型组0
ci_flash_data_info_init(0);
}
2) 以下代码读取当前模型地址并打印分区信息:
#include "ci_flash_data_info.h"
void partition_info_demo(void)
{
uint32_t dnn_addr = 0, dnn_size = 0;
uint32_t asr_addr = 0, asr_size = 0;
partition_table_t *p_table = NULL;
//获取当前ASR/DNN模型地址
get_current_model_addr(&dnn_addr, &dnn_size, &asr_addr, &asr_size);
mprintf("asr model: 0x%x size %d\n", asr_addr, asr_size);
mprintf("dnn model: 0x%x size %d\n", dnn_addr, dnn_size);
//读取分区表
p_table = get_partition_table();
if (p_table != NULL)
{
mprintf("voice: 0x%x size %d\n",
p_table->voice_offset, p_table->voice_size);
mprintf("nv_data: 0x%x size %d\n",
p_table->nv_data_offset, p_table->nv_data_size);
}
}
3) 以下代码读取固件版本号:
#include "ci_flash_data_info.h"
void version_demo(void)
{
product_version_t version;
get_fw_version(&version);
mprintf("hw ver: 0x%x, sw ver: 0x%x\n",
version.hard_ware_version, version.soft_ware_version);
}
5、其它¶
- 分区表由打包工具在固件制作阶段生成,地址固定为FLASH偏移0x2000,boot区域(0x0 ~ 0x2000)为boot程序保留。
user_code1/user_code2双镜像配合OTA组件实现升级回滚;具体升级流程参见OTA相关文档。- 模型组(group)机制支持一套固件内置多套命令词(如中英文双语),运行时通过
cmd_info/asrtop_asr_switch_fst切换。 - NV数据区(
nv_data_offset/nv_data_size)由NVDATA组件使用,参见存储API-NVDATA管理。
6、API 参考¶
本模块接口声明于 components\flash_control\flash_control_inc\ci_flash_data_info.h,实现位于 components\flash_control\src\ci_flash_data_info.c。