跳转至

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。