NvRam增加记录恢复出厂设置次数(上)

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

3. 添加新的nvram数据的定义
Z:\MT8735AN0\vendor\mediatek\proprietary\custom\rlk8783_f6_rc\cgen\inc\Custom_NvRam_LID.h

//添加LID定义. 在CUSTOM_CFG_FILE_LID定义的enum中,AP_CFG_CUSTOM_FILE_MAX_LID之前添加

    AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID, //new add
    AP_CFG_CUSTOM_FILE_MAX_LID,
CUSTOM_CFG_FILE_LID;
 
//添加LID版本信息。需要和 CUSTOM_CFG_FILE_LID 中的位置对应
#define AP_CFG_RDEB_FILE_MASTERCLEAR_CUSTOM_LID_VERNO "000"

4.添加 include path,在第一步中添加的.h文件

\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;   
}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值