NvRam增加记录恢复出厂设置次数
1. 定义所需要保存的结构体。添加以下头文件
\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\cfgfileinc\CFG_Custom_MasterClear_File.h
#ifndef _CFG_MASTERCLEAR_CUSTOM_FILE_H
#define _CFG_MASTERCLEAR_CUSTOM_FILE_H
typedef struct
{
unsigned char masterClearTimes[512];
}FILE_MASTERCLEAR_CUSTOM_STRUCT;
#define CFG_FILE_MASTERCLEAR_CUSTOM_REC_SIZE sizeof(FILE_MASTERCLEAR_CUSTOM_STRUCT)
#define CFG_FILE_MASTERCLEAR_CUSTOM_REC_TOTAL 1
#endif
注意事项:
a) 如平台使用的是【eMMC】,新LID对应struct的size必须是512 byte的倍数;
b) 如平台使用的是【NAND】,新LID对应struct的size必须是page size对齐(即4K或2K)
2.定义以上结构体数据的default值。添加以下头文件
\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\cfgdefault\CFG_Custom_MasterClear_Default.h
#ifndef _CFG_MASTERCLEAR_CUSTOM_D_H
#define _CFG_MASTERCLEAR_CUSTOM_D_H
FILE_MASTERCLEAR_CUSTOM_STRUCT stCustomMasterClearDefault =
{
{0x00,0x00,0x00,0x00}
};
#endif
//添加LID定义. 在CUSTOM_CFG_FILE_LID定义的enum中,AP_CFG_CUSTOM_FILE_MAX_LID之前添加
\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\inc\custom_cfg_module_file.h
#include "../cfgfileinc/CFG_Custom1_File.h"
#include "../cfgfileinc/CFG_GPS_File.h"
#include "../cfgfileinc/CFG_PRODUCT_INFO_File.h"
#include "../cfgfileinc/CFG_Wifi_File.h"
#include "../cfgfileinc/CFG_Custom_MasterClear_File.h" //new add
5.添加 include path,在第二步中添加的.h文件
\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\inc\custom_cfg_module_default.h
#include "../cfgdefault/CFG_Custom1_Default.h"
#include "../cfgdefault/CFG_GPS_Default.h"
#include "../cfgdefault/CFG_PRODUCT_INFO_Default.h"
#include "../cfgdefault/CFG_WIFI_Default.h"
#include "../cfgdefault/CFG_Custom_MasterClear_Default.h" //new add
6.在g_akCFG_File_Custom[]添加NVRam file info
\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\inc\CFG_file_info_custom.h
//注意此添加的位置,需要和 CUSTOM_CFG_FILE_LID 中的位置对应
{ "/data/nvram/APCFG/APRDEB/MASTERCLEAR_TIMES", VER(AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID), CFG_FILE_MASTERCLEAR_CUSTOM_REC_SIZE,
CFG_FILE_MASTERCLEAR_CUSTOM_REC_TOTAL, SIGNLE_DEFUALT_REC , (char *)&stCustomMasterClearDefault, DataReset , NULL
},
7. \vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\inc\Custom_NvRam_data_item.h
//Meta tool需要读取的信息
LID_BIT VER_LID(AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID)
FILE_MASTERCLEAR_CUSTOM_STRUCT *CFG_FILE_MASTERCLEAR_CUSTOM_REC_TOTAL
{
};
8. \vendor\mediatek\proprietary\external\nvram\libcustom_nvram\CFG_file_info.c
在aBackupToBinRegion[]中添加:
{"MASTERCLEAR_TIMES",AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID},
在aNvRamConvertFuncTable[]中添加:
NULL,//AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID
如果恢复出厂设置需要保存值不变,还需要添加如下:
const TABLE_FOR_SPECIAL_LID g_new_nvram_lid[] =
{
#ifdef MTK_MLC_NAND_SUPPORT
{ AP_CFG_REEB_PRODUCT_INFO_LID, 0, 2 * 1024 * 1024 },
{ AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID, 2 * 1024 * 1024, 1024 * 1024 },
#else
{ AP_CFG_REEB_PRODUCT_INFO_LID, 0, 1024 * 1024 },
{ AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID, 1024 * 1024, 1024 * 1024 },
#endif
};
注意事项:
a) 如平台使用的是【eMMC】,g_new_nvram_lid[]里面新LID的size必须要128K对齐;
b) 如平台使用的是【NAND】, g_new_nvram_lid[]里面新LID的size必须要blocksize对齐(4K pagesize对应的是256K,2K pagesize对应的是128K)。
c) g_new_nvram_lid[]里各LID总size不能超过partition table里pro_info的size。默认情况下,【eMMC】平台pro_info大小为3M,【NAND】平台pro_info大小为1M。
d) 如不需要配置AP_CFG_REEB_PRODUCT_INFO_LID在g_new_nvram_lid[]里面,可以直接移除,新加LID的start_address需要改成0。
e) 如保留AP_CFG_REEB_PRODUCT_INFO_LID在g_new_nvram_lid[]里面,则需要注意CFG_file_info.c的aBackupToBinRegion[]里面去掉AP_CFG_REEB_PRODUCT_INFO_LID。
f) Default value配置问题
如普通nvram项的配置,欲写入product info下面新加区域的nvram也需要在进行配置在g_akCFG_File[](CFG_file_info.c),并在对应的xx_default.h和xx_file.h申明和定义default value。
但是,此处与普通nvram项不同的地方在于,当前的design中,写入product info下面新加区域的nvram项,自定义的default value是不生效的。
首次开机获取到的值,完全取决于当前这个raw分区里面的值:默认情况下,NAND的是0xff,eMMC的是0x00。
9.ProjectConfig.mk: MTK_PRODUCT_INFO_SUPPORT=yes
另加实现备份后还原的code
\vendor\mediatek\proprietary\external\nvram\libnvram_daemon_callback\libnvram_daemon_callback.c
int my_callback(void)
{
ALOGD("nvram daemon callback will run!!!");
my_nvram_daemon(); //add
return 0;
}
int my_nvram_daemon(void)
{
int err = 0, ret = 0;
F_ID fd;
int rec_size, rec_num;
HWMON_BACKUP_STRUCT hwmon_backup;
NVRAM_LOG("ready to read hwmon backup\n");
/* read the hwmon backup data */
fd = NVM_GetFileDesc(AP_CFG_RDCL_HWMON_BACKUP_LID, &rec_size, &rec_num, ISREAD);
if(fd.iFileDesc < 0)
{
NVRAM_LOG("null hwmon backup file handle pointer: %d!\n", fd.iFileDesc);
err = -EFAULT;
return err;
}
ret = read(fd.iFileDesc, &hwmon_backup, (rec_size * rec_num));
if(ret < 0)
{
NVRAM_LOG("read hwmon backup file error: %d!\n", ret);
err = -EFAULT;
}
NVM_CloseFileDesc(fd);
NVRAM_LOG("hwmon backup data, hwmon_acc:%d-%d-%d\n", hwmon_backup.hwmon_acc.offset[0], hwmon_backup.hwmon_acc.offset[1], hwmon_backup.hwmon_acc.offset[2]);
/* set the hwmon acc data */
fd = NVM_GetFileDesc(AP_CFG_RDCL_HWMON_ACC_LID, &rec_size, &rec_num, ISWRITE);
ret = write(fd.iFileDesc, &hwmon_backup.hwmon_acc, (rec_size * rec_num));
NVM_CloseFileDesc(fd);
NVRAM_LOG("hwmon backup data, hwmon_gyro:%d-%d-%d\n", hwmon_backup.hwmon_gyro.offset[0], hwmon_backup.hwmon_gyro.offset[1], hwmon_backup.hwmon_gyro.offset[2]);
/* set the hwmon gyro data */
fd = NVM_GetFileDesc(AP_CFG_RDCL_HWMON_GYRO_LID, &rec_size, &rec_num, ISWRITE);
ret = write(fd.iFileDesc, &hwmon_backup.hwmon_gyro, (rec_size * rec_num));
NVM_CloseFileDesc(fd);
NVRAM_LOG("hwmon backup data, hwmon_ps:%d-%d-%d\n", hwmon_backup.hwmon_ps.ps_cali[0], hwmon_backup.hwmon_ps.ps_cali[1], hwmon_backup.hwmon_ps.ps_cali[2]);
/* set the hwmon ps data */
fd = NVM_GetFileDesc(AP_CFG_RDCL_HWMON_PS_LID, &rec_size, &rec_num, ISWRITE);
ret = write(fd.iFileDesc, &hwmon_backup.hwmon_ps, (rec_size * rec_num));
NVM_CloseFileDesc(fd);
return err;
}