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
是找不到写保护信息