Normal mode下保存nvram数据不丢失
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
很多客户有在normal mode下保存数据的需求,而且此数据在恢复出厂设置之后,不会丢失。如客户要随时校准sensor并保存,随机生成wifi MAC地址,并以后一直不变等。
MT6589之后有product info feature,可以满足此需求。可以参考 FAQ03920 [NvRAM] NvRAM product info的客制化以及注意事项,建立一项独立的nvram项。
但是如果只是需要保存很少的数据量,则可以利用现有的 pro_info 中的reserved区域来保存。
[SOLUTION]
1. 确认打开 mtk_PRODUCT_INFO_SUPPORT修改alps/mediatek/config/$project/ProjectConfig.mk:
MTK_PRODUCT_INFO_SUPPORT=yes
MTK_PRODUCT_INFO_SUPPORT 也必须存在于 AUTO_ADD_GLOBAL_DEFINE_BY_NAME 中。
2. 定义需要保存的参数:
CFG_PRODUCT_INFO_File.h(mediatek\custom\[$project]\cgen\cfgfileinc\CFG_PRO
DUCT_INFO_File.h)
以下以定义wifi mac和ps data为例。
typedef struct
{
unsigned char macaddr[6];
unsigned char reserved[2];
} nvram_wifi_mac_struct;
typedef struct
{
unsigned int psdata[3];
} nvram_ps_struct;
注意:每一项的数据,最好都是4byte对齐的大小。
将新定义的数据加入到 PRODUCT_INFO 中:
typedef struct
{
unsigned char barcode[64];
nvram_ef_IMEI_imeisv_struct IMEI[4];
nvram_wifi_mac_struct wifimac;
nvram_ps_struct ps;
unsigned char reserved[1024-40-64-8-12]; //保持 PRODUCT_INFO size不变和对齐,这里需要减去对应的新增变量的size
} PRODUCT_INFO;
3. 在客制化的需要保存数据的code中,就可以操作这些数据:
F_ID pro_info_fd;
int rec_size = 0;
int rec_num = 0;
PRODUCT_INFO pi;
pro_info_fd = NVM_GetFileDesc(iFilePRODUCT_INFOLID, &rec_size, &rec_num,
true);
read(pro_info_fd.iFileDesc, &pi, (rec_size*rec_num));
NVM_CloseFileDesc(pro_info_fd);
//这里修改保存对应的参数
meMCPy(pi.wifimac.macaddr, "123456", sizeof(pi.wifimac.macaddr));
mEMSet(&(pi.ps), 0x01, sizeof(pi.ps));
pro_info_fd = NVM_GetFileDesc(iFilePRODUCT_INFOLID, &rec_size, &rec_num,
false);
write(pro_info_fd.iFileDesc, &pi, (rec_size*rec_num));
NVM_CloseFileDesc(pro_info_fd);
注意:操作pro_info数据的thread,需要system或者root权限。
很多客户有在normal mode下保存数据的需求,而且此数据在恢复出厂设置之后,不会丢失。如客户要随时校准sensor并保存,随机生成wifi MAC地址,并以后一直不变等。
MT6589之后有product info feature,可以满足此需求。可以参考 FAQ03920 [NvRAM] NvRAM product info的客制化以及注意事项,建立一项独立的nvram项。
但是如果只是需要保存很少的数据量,则可以利用现有的 pro_info 中的reserved区域来保存。
[SOLUTION]
1. 确认打开 mtk_PRODUCT_INFO_SUPPORT修改alps/mediatek/config/$project/ProjectConfig.mk:
MTK_PRODUCT_INFO_SUPPORT=yes
MTK_PRODUCT_INFO_SUPPORT 也必须存在于 AUTO_ADD_GLOBAL_DEFINE_BY_NAME 中。
2. 定义需要保存的参数:
CFG_PRODUCT_INFO_File.h(mediatek\custom\[$project]\cgen\cfgfileinc\CFG_PRO
DUCT_INFO_File.h)
以下以定义wifi mac和ps data为例。
typedef struct
{
unsigned char macaddr[6];
unsigned char reserved[2];
} nvram_wifi_mac_struct;
typedef struct
{
unsigned int psdata[3];
} nvram_ps_struct;
注意:每一项的数据,最好都是4byte对齐的大小。
将新定义的数据加入到 PRODUCT_INFO 中:
typedef struct
{
unsigned char barcode[64];
nvram_ef_IMEI_imeisv_struct IMEI[4];
nvram_wifi_mac_struct wifimac;
nvram_ps_struct ps;
unsigned char reserved[1024-40-64-8-12]; //保持 PRODUCT_INFO size不变和对齐,这里需要减去对应的新增变量的size
} PRODUCT_INFO;
3. 在客制化的需要保存数据的code中,就可以操作这些数据:
F_ID pro_info_fd;
int rec_size = 0;
int rec_num = 0;
PRODUCT_INFO pi;
pro_info_fd = NVM_GetFileDesc(iFilePRODUCT_INFOLID, &rec_size, &rec_num,
true);
read(pro_info_fd.iFileDesc, &pi, (rec_size*rec_num));
NVM_CloseFileDesc(pro_info_fd);
//这里修改保存对应的参数
meMCPy(pi.wifimac.macaddr, "123456", sizeof(pi.wifimac.macaddr));
mEMSet(&(pi.ps), 0x01, sizeof(pi.ps));
pro_info_fd = NVM_GetFileDesc(iFilePRODUCT_INFOLID, &rec_size, &rec_num,
false);
write(pro_info_fd.iFileDesc, &pi, (rec_size*rec_num));
NVM_CloseFileDesc(pro_info_fd);
注意:操作pro_info数据的thread,需要system或者root权限。
:loveliness::loveliness:
学习了~~~~~~~~~~~~
学习了!