MTK NVROM的使用
1. ROM(Read Only Memory):存储操作系统和内置程序,相当与Code Region。只读不能修改。
RAM(Read Access Memory):访问快,断电后自动删除。
NVROM(Non Volatile Random Access Memory):断电后保存。
2. 内存的划分: custom_MemoryDevice.h
#define NAND_BOOTING_FLASH_BASE_ADDRESS 0x04000000 ///code region 64M
#define NAND_BOOTING_ALLOCATED_FAT_SPACE 0x04000000 ///文件系统大小也是 64M
#define NAND_FAT_PARTITION_SECTORS (45000) /* 180000 */
3.剩下的的分区保存内容:
1.NVRAM的数据
2.wap,eMail,Java等对应的设置。
3.上网记录,播放器播放记录等一下日志文件。
4.其他一些我们使用过程中产生的文件。
4.配置NVRAM项目的区域
1.MT Region:系统相关的NVRAM使用
2.MP Region: 应用相关的NVRAM使用
3.CT Region:用户添加的NVRAM
5.添加的三个步骤
1.在下面文件中添加LID,size和total number
nvram_data_items.h for MT Region
nvram_common_defs.h for MP Region
nvram_user_defs.h for CT Region
【注】1.添加LID的目的:nvram中的数据是在fs文件系统的管理中操作的,而文件操作需要识别数据项和管理项,都是通过LID来操作的
2.一块内存,就必须设置其内存的大小,这样将结构体的数据保存和读取就容易,并有效的控制内存不足和溢出。
3.可以设置一个结构体变量。
2.在下面的文件中设置新定义的NVRAM项目的数据项和默认值
nvram_editor_item.c for MT Region
nvram_common_config.h for MP Region
nvram_user_config.h for CT Region
【注】1.申请的内存,需要进行初始化自己定义一个函数
2.可以使用默认的NVRAM_EF_ZERO_DEFAULT
3.在下面的文件中设置新定义的NVRAM项目的版本和结构
nvram_editor_data_item.h for MT Region
common_nvram_editor_data_item.h for MP Region
custom_nvram_editor_data_item.h for CT Region
【注】在此文件中添加一个版本号。如果数据修改了没有更改版本号,文件是不会对原始数据进行更新的。
可以通过设置,让其自动更新。
LID_BIT VER_LID(NVRAM_EF_CAIVS_CONFIG_LID)
CAIVS_PARAM *NVRAM_EF_CAIVS_CONFIG_TOTAL
{
};
版本号可以通过 VER(NVRAM_EF_MYAPP_DUMMY_LID)获得。
6.A.在nvram_user_defs.h定义一个新的LID:
typedef enum
{
/***************************/
#ifdef __MY_APP__
NVRAM_EF_MYAPP_DUMMY_LID,
#endif /*__MY_APP__*/
}nvram_lid_cust_enum;
B.在nvram_user_defs.h中定义size和total【此处的设置可以直接在nvram_user_config】
#ifdef __MY_APP__
#define NVRAM_EF_MYAPP_DUMMY_SIZE 512
#define NVRAM_EF_MYAPP_DUMMY_TOTAL 1
#endif /*__MY_APP__*/
C.在custom_nvram_editor_data_item.h中定义新的NVRAM的Version【此处的设置可以直接在nvram_user_config】
#ifdef __MY_APP__
#define NVRAM_EF_MYAPP_DUMMY_VERSION "000"
#endif
D.在nvram_user_config.h中设置NVRAM项目的默认值
#ifdef __MY_APP__
kal_uint8 const NVRAM_EF_MYAPP_DUMMY_DEFAULT[NVRAM_EF_MYAPP_DUMMY_SIZE] ={0x00};
#endif
E.在nvram_user_config.h中定义数据项。
在ltable_entry_struct logical_data_item_table_cust[] =
第一种形式:
#ifdef __MY_APP__
,{
NVRAM_EF_MYAPP_DUMMY_LID,
NVRAM_EF_MYAPP_DUMMY_SIZE/*512*/,
NVRAM_EF_MYAPP_DUMMY_TOTAL/*1*/,
NVRAM_EF_MYAPP_DUMMY_DEFAULT,
NVRAM_ATTR_AVERAGE,
NVRAM_CATEGORY_USER,
"MYAP",
NVRAM_EF_MYAPP_DUMMY_VERSION,
"MYAPP NVRAM/0",
NVRAM_RESERVED_VALUE
}
#endif
第二种形式:
#ifdef __MY_APP__
,{
NVRAM_EF_MYAPP_DUMMY_LID, /** LID **/
512, /** Size **/
1, /** Total **/
NVRAM_EF_MYAPP_DUMMY_DEFAULT, /** Default value **/
NVRAM_ATTR_AVERAGE, /** Attributes **/
NVRAM_CATEGORY_USER, /** Category **/
"MYAP", /** fileprefix 最多4字节 **/
"000", /** fileverno 最多3字节 **/
"CKING NVRAM/0", /** description **/
NVRAM_RESERVED_VALUE /** Record ID is calculated by NVRAM. DO NOT TOUCH. **/
}
#endif /*__MY_APP__*/
第三种形式:
typedef struct
{
WolfTel_TUint8 strMSP[8]; /*the china mobile sp number*/
WolfTel_TUint8 strUSP[8]; /*the unicom sp number*/
WolfTel_TUint8 strSjggZC[8];
WolfTel_TUint8 nCaivsFlag[4];
WolfTel_TUint8 nSendCondition[4]; /*send condition*/
WolfTel_TUint8 nInited; /*indicate the Param is inited*/
WolfTel_TUint8 nRev[16];
WolfTel_TUint8 strSjggOrder[16];
} CAIVS_PARAM;
LID_BIT VER_LID(NVRAM_EF_CAIVS_CONFIG_LID)
CAIVS_PARAM *NVRAM_EF_CAIVS_CONFIG_TOTAL
{
};
版本号可以通过 VER(NVRAM_EF_MYAPP_DUMMY_LID)获得。
Default value可以用 NVRAM_EF_ZERO_DEFAULT;
7.用下面的方法可以读写Nvram的值了。
void tese(void)
{
void *p_data;
U32 dw_len;
S16 error;
ReadRecord(NVRAM_EF_MYAPP_DUMMY_LID,1,p_data,dw_len,&error); //读取数据
WriteRecord(NVRAM_EF_MYAPP_DUMMY_LID,1,P_data,NVRAM_EF_MYAPP_DUMMY_SIZE,&error);
}
参数介绍如下:第一个就是自定义的id,第二个是从第几个开始读写(NVRAM_EF_MYAPP_DUMMY_TOTAL),第三个是要写入的值,第四个是写入几个字节数据,第五个error是个S16的值,注意变量类型。
8,也可以用以下方式读写格式化数据:
DS_BYTE = 1,//读取一个字节
DS_SHORT = 2,//读取short
DS_DOUBLE = 8//读取double
WriteValue(NVRAM_EF_MYAPP_DUMMY_LID,p_data,DS_SHORT,&fileerror);
ReadValue(NVRAM_EF_MYAPP_DUMMY_LID,p_data,DS_SHORT,&fileerror);
注意第三个参数为你想读写的类型,比如short。