Files
99_7018_lmx/apps/earphone/remote_control/nvs.c
2025-12-01 10:01:10 +08:00

113 lines
3.2 KiB
C

#include "system/includes.h"
#include "system/syscfg_id.h"
#include "nvs.h"
// 2. 定义一个唯一的配置项ID (必须在1-49之间)
#define CFG_FACTORY_INFO_ID 10
/**
* @brief 将出厂信息写入Flash
*
* @param info 指向要写入的出厂信息结构体的指针
* @return 实际写入的长度, <0: 失败
*/
int nvs_write_factory_info(const factory_info_t *info)
{
if (!info) {
return -1;
}
printf("--> Writing factory info to flash...\n");
int ret = syscfg_write(CFG_FACTORY_INFO_ID, (void*)info, sizeof(factory_info_t));
if (ret != sizeof(factory_info_t)) {
printf("!!! syscfg_write factory info failed, ret = %d\n", ret);
} else {
printf("--> syscfg_write factory info success.\n");
}
return ret;
}
/**
* @brief 从Flash读取出厂信息
*
* @param info 指向用于存储读取数据的出厂信息结构体的指针
* @return 实际读取的长度, <0: 失败 (例如尚未写入过)
*/
int nvs_read_factory_info(factory_info_t *info)
{
if (!info) {
return -1;
}
printf("--> Reading factory info from flash...\n");
int ret = syscfg_read(CFG_FACTORY_INFO_ID, (void*)info, sizeof(factory_info_t));
if (ret != sizeof(factory_info_t)) {
printf("!!! syscfg_read factory info failed, ret = %d. Maybe not set yet.\n", ret);
// 如果读取失败,清空结构体以避免使用脏数据
memset(info, 0, sizeof(factory_info_t));
} else {
printf("--> syscfg_read factory info success.\n");
// 可以在这里打印读取到的信息以供调试
printf(" Product ID: %s\n", info->product_id);
printf(" Serial No: %s\n", info->serial_number);
printf(" HW Version: 0x%x\n", info->hw_version);
}
return ret;
}
/**
* @brief 清空Flash中的出厂信息
*
* @return 0: 成功, <0: 失败
*/
int nvs_clear_factory_info(void)
{
printf("--> Clearing factory info from flash...\n");
// 写入长度为0的数据即可实现删除效果
int ret = syscfg_write(CFG_FACTORY_INFO_ID, NULL, 0);
if (ret != 0) {
printf("!!! syscfg_write clear factory info failed, ret = %d\n", ret);
} else {
printf("--> syscfg_write clear factory info success.\n");
}
return ret;
}
// 可以在这里添加一个测试函数
void nvs_test_factory_info(void)
{
factory_info_t write_info = {
.product_id = "RC_V2",
.serial_number = "SN202511260002",
.hw_version = 0x0102, // v1.1
.cal_data = 1234,
.manufacture_date = 1764080400, // 2025-11-26
};
factory_info_t read_info;
printf("\n\n--- NVS WRITE TEST ---\n");
nvs_write_factory_info(&write_info);
os_time_dly(10);
printf("\n--- NVS READ TEST ---\n");
nvs_read_factory_info(&read_info);
// ASSERT(memcmp(&write_info, &read_info, sizeof(factory_info_t)) == 0, "NVS Read/Write Check Failed!");
// printf("\n--- NVS CLEAR TEST ---\n");
// nvs_clear_factory_info();
os_time_dly(10);
printf("\n--- NVS READ AFTER CLEAR TEST ---\n");
int ret = nvs_read_factory_info(&read_info);
if(ret < 0){
printf("--- nvs read error ---\n");
}
printf("\n\n--- NVS TEST COMPLETE ---\n\n");
}