2025-12-01 10:01:10 +08:00
|
|
|
|
#include "system/includes.h"
|
|
|
|
|
|
#include "system/syscfg_id.h"
|
|
|
|
|
|
#include "nvs.h"
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
// 2. 定义唯一的配置项ID
|
2025-12-10 17:40:26 +08:00
|
|
|
|
|
|
|
|
|
|
#define CFG_RC_MAC_ADDR_ID 11 // 配置项id
|
2025-12-01 10:01:10 +08:00
|
|
|
|
|
|
|
|
|
|
/**
|
2025-12-02 16:25:20 +08:00
|
|
|
|
* @brief 将主板MAC地址写入Flash
|
2025-12-01 10:01:10 +08:00
|
|
|
|
*/
|
2025-12-02 16:25:20 +08:00
|
|
|
|
int nvs_write_main_board_mac(const u8 *mac_addr)
|
2025-12-01 10:01:10 +08:00
|
|
|
|
{
|
2025-12-02 16:25:20 +08:00
|
|
|
|
if (!mac_addr) {
|
2025-12-01 10:01:10 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
rc_nvs_data_t nvs_data;
|
|
|
|
|
|
memcpy(nvs_data.main_board_mac, mac_addr, MAIN_BOARD_MAC_ADDR_LENGTH);
|
|
|
|
|
|
|
|
|
|
|
|
printf("--> Writing main board MAC to flash...\n");
|
|
|
|
|
|
int ret = syscfg_write(CFG_RC_MAC_ADDR_ID, &nvs_data, sizeof(rc_nvs_data_t));
|
|
|
|
|
|
if (ret != sizeof(rc_nvs_data_t)) {
|
|
|
|
|
|
printf("!!! syscfg_write main board MAC failed, ret = %d\n", ret);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
} else {
|
2025-12-02 16:25:20 +08:00
|
|
|
|
printf("--> syscfg_write main board MAC success.\n");
|
2025-12-01 10:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2025-12-02 16:25:20 +08:00
|
|
|
|
* @brief 从Flash读取主板MAC地址
|
2025-12-01 10:01:10 +08:00
|
|
|
|
*/
|
2025-12-02 16:25:20 +08:00
|
|
|
|
int nvs_read_main_board_mac(u8 *mac_addr)
|
2025-12-01 10:01:10 +08:00
|
|
|
|
{
|
2025-12-02 16:25:20 +08:00
|
|
|
|
if (!mac_addr) {
|
2025-12-01 10:01:10 +08:00
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
rc_nvs_data_t nvs_data;
|
|
|
|
|
|
printf("--> Reading main board MAC from flash...\n");
|
|
|
|
|
|
int ret = syscfg_read(CFG_RC_MAC_ADDR_ID, &nvs_data, sizeof(rc_nvs_data_t));
|
|
|
|
|
|
|
|
|
|
|
|
if (ret != sizeof(rc_nvs_data_t)) {
|
|
|
|
|
|
printf("!!! syscfg_read main board MAC failed, ret = %d. Maybe not set yet.\n", ret);
|
|
|
|
|
|
memset(mac_addr, 0, MAIN_BOARD_MAC_ADDR_LENGTH);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
} else {
|
2025-12-02 16:25:20 +08:00
|
|
|
|
printf("--> syscfg_read main board MAC success.\n");
|
|
|
|
|
|
memcpy(mac_addr, nvs_data.main_board_mac, MAIN_BOARD_MAC_ADDR_LENGTH);
|
2025-12-01 10:01:10 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-10 17:40:26 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 清空Flash中的出厂信息
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return 0: 成功, <0: 失败
|
|
|
|
|
|
*/
|
|
|
|
|
|
int nvs_clear_info(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
rc_nvs_data_t nvs_data;
|
|
|
|
|
|
for(int i = 0 ; i < MAIN_BOARD_MAC_ADDR_LENGTH; i++){
|
|
|
|
|
|
nvs_data.main_board_mac[i] = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
printf("--> Clearing factory info from flash...\n");
|
|
|
|
|
|
// 写入长度为0的数据即可实现删除效果
|
|
|
|
|
|
int ret = syscfg_write(CFG_RC_MAC_ADDR_ID, &nvs_data, sizeof(rc_nvs_data_t));
|
|
|
|
|
|
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;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-02 16:25:20 +08:00
|
|
|
|
// =================================================================================
|
|
|
|
|
|
// 以下为旧的通用出厂信息API,已废弃
|
|
|
|
|
|
// =================================================================================
|
2025-12-10 17:40:26 +08:00
|
|
|
|
#define CFG_FACTORY_INFO_ID 10 // 旧的、通用的出厂信息ID (已废弃)
|
2025-12-02 16:25:20 +08:00
|
|
|
|
int nvs_write_factory_info(const factory_info_t *info)
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("WARNING: nvs_write_factory_info is deprecated.\n");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int nvs_read_factory_info(factory_info_t *info)
|
|
|
|
|
|
{
|
|
|
|
|
|
printf("WARNING: nvs_read_factory_info is deprecated.\n");
|
|
|
|
|
|
return -1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-12-01 10:01:10 +08:00
|
|
|
|
/**
|
|
|
|
|
|
* @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");
|
|
|
|
|
|
}
|