2.2.3. 配置项管理

配置项管理模块, 负责为用户访问不同特性的系统配置项, 提供统一接口,系统配置项管理区域列举如下:

都不可以在中断中进行使用

2.2.3.1. VOTP区域

  • 特性:FLASH 虚拟OTP,可读可写, 一个配置只能写一次,不可再写

  • 空间大小定义:通过INI文件添加“OTP_CFG_SIZE”关键字来分配大小,若“OTP_CFG_SIZE =0”或没有这个关键字,则不支持VOTP区域;若FLASH 配置了写保护后,该区域就会变成不可擦写状态。

2.2.3.2. OTP区域

  • 特性:FLASH 提供的物理OTP区域,可读,不可擦写

  • 空间大小定义:不同芯片容量不同

2.2.3.3. VM区域

  • 特性:可读可写, 同一个配置可多次写入, 读出以最后写入的数据为有效值

  • 空间大小定义:在app_config.h文件中配置TCFG_VM_SIZE以控制VM大小。

模块每个配置项分配唯一的 ID 号, ID 号定义在 SDK syscfg_id.h文件中:

配置项 ID 号定义情况如下:

#define   CFG_GROUP_VOTP        (0x01<< 24)     //FLASH 虚拟OTP,通过INI文件分配大小,flash 配置了写保护后,才会变成不可擦写
#define   CFG_GROUP_OTP         (0x02<< 24)     //FLASH 提供的物理OTP区域,不同芯片容量不同
#define   CFG_GROUP_VM              (0x03<< 24)     //FLASH 提供的VM区域

//存储在虚拟OTP区域,只能写一次
enum votp_id {
    CFG_ID_VOTP_FLASH_INFO = CFG_GROUP_VOTP,
    CFG_ID_VOTP_CALIBRATION,

    //user votp id
};

//存储在VM区域,可以重复读写
enum vm_id {
    VM_VIR_RTC_TIME = CFG_GROUP_VM,
    VM_VIR_RTC_ALM,
    VM_VIR_RTC_CNT,
    VM_PMU_VOLTAGE,

    //user vm id
};

2.2.3.4. syscfg_read

  • 函数原型:

    int syscfg_read(u32 item_id, void *buf, u16 len)
    
  • 功能说明:读取一个配置项数据

  • 参数说明:

    参数

    说明

    item_id

    配置项 ID 号,包括上述三个区域,根据ID定义不同区不同分区读取信息

    buf

    用于读取数据的 buf

    len

    用于读取数据的 buf的长度

  • 返回值:

    > 0

    读取成功

    <= 0

    读取出错

  • 示例:

     1//读取 VOTP:
     2int ret = 0;
     3WEIGHT_SCALE_CALIBRATE_PARAM calibrate_param;
     4ret = syscfg_read(CFG_ID_VOTP_CALIBRATION, (u8 *)&calibrate_param, sizeof(calibrate_param));
     5if (ret == 6) {
     6    printf(“read votp config succ”);
     7} else {
     8    printf(“read votp config fail, ret = %d”, ret);
     9}
    10
    11//读取OTP:
    12int ret = 0;
    13u8 read_otp_buf[16] = {0};
    14ret = syscfg_read(CFG_ID_OTP_FLASH_INFO, read_otp_buf, sizeof(read_otp_buf));
    15if (ret == 16) {
    16    printf(“read otp config succ”);
    17} else {
    18    printf(“read otp config fail, ret = %d”, ret);
    19}
    

2.2.3.5. syscfg_write

  • 函数原型:

    int syscfg_write(u32 item_id, void *buf, u16 len)
    
  • 功能说明:写入一个配置项数据

  • 参数说明:

    参数

    说明

    item_id

    配置项 ID 号,包括上述三个区域,根据ID定义不同区不同分区读取信息

    buf

    用于写入数据的 buf

    len

    用于写入数据的 buf的长度

  • 返回值:

    > 0

    写入成功

    <= 0

    写入出错

  • 示例:

    1int ret = 0;
    2WEIGHT_SCALE_CALIBRATE_PARAM calibrate_param;
    3ret = syscfg_write(CFG_ID_VOTP_CALIBRATION, (u8 *)&calibrate_param, sizeof(calibrate_param));
    4if (ret == sizeof(calibrate_param)) {
    5    printf(“write config succ”);
    6} else {
    7    printf(“write config fail, ret = %d”, ret);
    8}
    

2.2.3.6. syscfg_get_ptr

  • 函数原型:

    int syscfg_get_ptr(u32 item_id, const void **p, u16 len);
    
  • 功能说明:获取 VOTP 或 OTP 区域的指针

  • 参数说明:

    参数

    说明

    item_id

    配置项 ID 号,存储在VOTP区域

    p

    用于 获取 VOPT 区域的指针

    len

    用于写入数据的 buf的长度

  • 返回值:

    > 0

    写入成功

    <= 0

    写入出错

  • 示例:

    1const void *flash_p;
    2int r = syscfg_get_ptr(CFG_ID_VOTP_FLASH_INFO, &flash_p, sizeof(struct flash_config_info));
    3if (r != sizeof(struct flash_config_info)) {
    4    printf("flash info not found!\n");
    5}
    

2.2.3.7. norflash_otp_lock

  • 函数原型:

    u32 norflash_otp_lock()
    
  • 功能说明:FLASH OTP区域加锁,设置后是只读状态

  • 返回值:

    = 0

    加锁成功

    != 0

    加锁失败

  • 示例:

    1int ret = 0;
    2ret = norflash_otp_lock();
    3if(ret == 0){
    4    printf("FLASH OTP ADD LOCK SUCCS!\n");
    5}else{
    6    printf("FLASH OTP ADD LOCK FAIL!\n");
    7}
    

2.2.3.8. FLASH OTP 应用场景

Flash OTP 在许多领域中发挥着关键作用,特别是在需要保护数据安全性、防止篡改和确保设备身份验证的场景中,例如应用在多算法授权开发中: https://doc.zh-jieli.com/Tools/zh-cn/mass_prod_tools/multi_auth/index.html

2.2.3.9. norflash_set_write_protect

  • 函数原型:

    int norflash_set_write_protect(u32 enable, u32 wp_addr)
    
  • 功能说明:FLASH 加写保护

  • 参数说明:

    参数

    说明

    enable

    写保护使能,1加写保护,0解除写保护

    wp_addr

    加写保护后需要保护的地址

  • 返回值:

    >= 0

    加写保护的地址

    < 0

    是找不到写保护信息