|
MTK之NVRAM研究[三]
一,下面来具体看看两个不同的NV项的实现过程,具体的步骤还是和上面的一样的;
这里面实现两中NV项:
NV项一:_LZQ_TEST_ :他的数据结构比较简单,只是一个数组;
NV项二:__HL_WEB_PHONE__ :他的数据结构是个结构体,和NV项一相比有些地方实现不一样;
具体实现如下:
//--------------------在文件中定义NV项的LID:nvram_user_defs.h----------
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
NVRAM_EF_MY_NEW_DATA_LID,
#endif
#ifdef __HL_WEB_PHONE__
NVRAM_EF_MY_WEB_PHONE_DATA_LID,
#endif
//--------------------在文件中定义NV项的大小和个数:nvram_user_defs.h----------
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
#define NVRAM_EF_MY_NEW_DATA_SIZE 10 // 10 byte each record
#define NVRAM_EF_MY_NEW_DATA_TOTAL 9 //9 records
#endif
#ifdef __HL_WEB_PHONE__
typedef struct
{
kal_uint8 status; //open or close;
kal_uint32 phone_number[11]; //本机号码;
kal_uint8 number_exten[10];//号码前缀;
kal_uint8 number_zone[8]; //本地区号;
}MY_WEB_PHONE;
#define NVRAM_EF_MY_WEB_PHONE_DATA_SIZE sizeof(MY_WEB_PHONE) //MY_WEB_PHONE
#define NVRAM_EF_MY_WEB_PHONE_DATA_TOTAL 1 //1
#endif
//lzq说明:注意这里,新添加的NV项如果用到了数据结构,则一定要和它声明结构体大小的地方一起声明,不然编译时找不到结构体;
//---------------------------在文件中设置NV的默认值:nvram_user_config.c---------
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
static kal_uint8 const NVRAM_EF_MY_NEW_DATA_DEFAULT[90] ={
0x12,0x34,0x56,0x78,0x90,
0x12,0x34,0x56,0x78,0x90
};
#endif
//在这里由于NV项二不用默认值,他只要使用平台的默认0值就可以了,所以在这里他不用声明和定义默认值;
//---------------------------在文件中设置NV的属性:nvram_user_config.c---------
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
,{
NVRAM_EF_MY_NEW_DATA_LID,
NVRAM_EF_MY_NEW_DATA_SIZE,
NVRAM_EF_MY_NEW_DATA_TOTAL,
NVRAM_EF_MY_NEW_DATA_DEFAULT,//lzq:当不好设置默认值时就用默认的0代替;
NVRAM_ATTR_MULTIPLE,
NVRAM_CATEGORY_USER,
"CT52", //lzq:这是做什么的?
VER(NVRAM_EF_MY_NEW_DATA_LID), //lzq:这是做什么的?
"My new data\0", //lzq:这是做什么的?
NVRAM_INVALID_VALUE
}
#endif
#ifdef __HL_WEB_PHONE__ //__HQ_ADD_BOOKMARK_DEFAULT__
,{
NVRAM_EF_MY_WEB_PHONE_DATA_LID,
NVRAM_EF_MY_WEB_PHONE_DATA_SIZE,
NVRAM_EF_MY_WEB_PHONE_DATA_TOTAL,
NVRAM_EF_ZERO_DEFAULT,//NVRAM_EF_MY_NEW_DATA_DEFAULT,//lzq:当不好设置默认值时就用默认的0代替;
NVRAM_ATTR_MULTIPLE,
NVRAM_CATEGORY_USER,
"CT53", //lzq:这是做什么的?
VER(NVRAM_EF_MY_WEB_PHONE_DATA_LID), //lzq:这是做什么的?
"My new data2\0", //lzq:这是做什么的?
NVRAM_INVALID_VALUE
}
#endif
//-----------在文件中设置NV的版本号:custom_nvram_editor_data_item.h---------------
//lzq: 为新添加的NV项添加版本号;
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
#define NVRAM_EF_MY_NEW_DATA_LID_VERNO "002"
#endif
//lzq: 为新添加的NV项添加版本号;
#ifdef __HL_WEB_PHONE__ //__HQ_ADD_BOOKMARK_DEFAULT__
#define NVRAM_EF_MY_WEB_PHONE_DATA_LID_VERNO "000"
#endif
//-----------在文件中设置meta属性值:custom_nvram_editor_data_item.h---------------
--------------先添加meta说明的结构体-------------------------------
//lzq: 为新添加的NV项添加NV META工具中的说明结构体;
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
typedef struct
{
kal_uint8 nvram_ef_my_new_data_field[NVRAM_EF_MY_NEW_DATA_SIZE];
}nvram_ef_my_new_data_struct;
#endif
//lzq: 为新添加的NV项添加NV META工具中的说明结构体;
#ifdef __HL_WEB_PHONE__ //__HQ_ADD_BOOKMARK_DEFAULT__
typedef struct
{
MY_WEB_PHONE nvram_ef_my_new_data2_field;
}nvram_ef_my_new_data2_struct;
#endif
//lzq说明:在这里声明nvram_ef_my_new_data2_field时一定要用自己的数据结构来声明,不然在meta工具中看不到自己的数据;
----------------然后设置meta说明结构体:---------------------------
//lzq: 为新添加的NV项添加NV META工具中的说明字符串;
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
LID_BIT VER_LID(NVRAM_EF_MY_NEW_DATA_LID) nvram_ef_my_new_data_struct* NVRAM_EF_MY_NEW_DATA_TOTAL
{
nvram_ef_my_new_data_field:"my_new_data setting";
nvram_ef_my_new_data_field[2]
{
MynewData:6 "lzq"
{
};
};
};
#endif
//lzq: 为新添加的NV项添加NV META工具中的说明字符串;
#ifdef __HL_WEB_PHONE__ //__HQ_ADD_BOOKMARK_DEFAULT__
LID_BIT VER_LID(NVRAM_EF_MY_WEB_PHONE_DATA_LID) nvram_ef_my_new_data2_struct* NVRAM_EF_MY_WEB_PHONE_DATA_TOTAL
{
};
#endif
具体的结果看下图:
注意:在步骤六中出现了这样的问题:
Reading custom_data succeeded.
Start to parse the custom NVRAM DATA!
make: *** [.\tst\database_classb\BPLGUInfoCustomAppSrc] Error 1
因为在结构体中使用了说明字符串:
LID_BIT VER_LID(NVRAM_EF_MY_WEB_PHONE_DATA_LID) nvram_ef_my_new_data2_struct* NVRAM_EF_MY_WEB_PHONE_DATA_TOTAL
{
//-------------------web phone-----------
nvram_ef_my_new_data2_field:"my_web_phone setting"{};
status:"open or close switch"{};
phone_number:"the phone number"{};
number_exten:"the phone number pre extern"{};
number_zone:"the zone number"{};
};
此时只要将上面的这段红色的代码注释掉就可以了,本来按照文档的解释这样写是没问题的,但不知道为什么会出现问题;高手路过多指教;
另外附上平台的一个NV的流程,仅作参考:
//------1---------在文件中定义LID: nvram_common_defs.h ---------------------------------
NVRAM_EF_WAP_PROFILE_CONTENT_LID,
//-------2----------在文件中定义结构体common_nvram_editor_data_item.h---------------------------------------
typedef struct
{
kal_uint8 editable;
kal_uint8 empty;
kal_uint16 proxy_port;
kal_uint8 homepage_url[NVRAM_WAP_PROFILE_HOMEPAGE_URL_LEN];
kal_uint8 data_account;
kal_uint8 conn_type;
kal_uint8 proxy_ip[4];
kal_uint8 username[NVRAM_WAP_PROFILE_USERNAME_LEN];
kal_uint8 password[NVRAM_WAP_PROFILE_PASSWORD_LEN];
} nvram_wap_profile_content_struct;
//-------3--------------在文件中定义内存大小:Nvram_common_defs.h------------------------------------------
#define NVRAM_EF_WAP_PROFILE_CONTENT_SIZE sizeof(nvram_wap_profile_content_struct)
#define NVRAM_EF_WAP_PROFILE_CONTENT_TOTAL 10
//--------4-------------在文件中定义默认值:Nvram_common_config.c--------------------------------------------
nvram_wap_profile_content_struct const NVRAM_EF_WAP_PROFILE_CONTENT_DEFAULT[NVRAM_WAP_PROFILE_MAX]=
{
#ifdef CUSTOM_WAP_PROFILE_CONTENT_DEFAULT
CUSTOM_WAP_PROFILE_CONTENT_DEFAULT
#else
{
1,0,80,"http://mobile.fetnet.net",10,1,210,241,199,199,"",""
},
{
1,0,8080,"http://wap.emome.net",11,1,10,1,1,1,"",""
},
}
//-----------5----------------在文件中设置属性nvram_common_config.c--------------------------------------------
,{
NVRAM_EF_WAP_PROFILE_CONTENT_LID,
NVRAM_EF_WAP_PROFILE_CONTENT_SIZE,
NVRAM_EF_WAP_PROFILE_CONTENT_TOTAL,
(kal_uint8*)NVRAM_EF_WAP_PROFILE_CONTENT_DEFAULT,
NVRAM_ATTR_AVERAGE | NVRAM_ATTR_MULTIREC_READ,
NVRAM_CATEGORY_MULTI_DEFAULT,
"MP2U",
VER(NVRAM_EF_WAP_PROFILE_CONTENT_LID),
"wap profile\0",
NVRAM_RESERVED_VALUE
}
//该nv项的lid为:NVRAM_EF_WAP_PROFILE_CONTENT_LID,
//------------6-----------在文件中:common_nvram_editor_data_item.h中设置mata属性-----------------------;
typedef struct
{
nvram_wap_profile_content_struct wapProfile1;
nvram_wap_profile_content_struct wapProfile2;
nvram_wap_profile_content_struct wapProfile3;
nvram_wap_profile_content_struct wapProfile4;
nvram_wap_profile_content_struct wapProfile5;
nvram_wap_profile_content_struct wapProfile6;
nvram_wap_profile_content_struct wapProfile7;
nvram_wap_profile_content_struct wapProfile8;
nvram_wap_profile_content_struct wapProfile9;
nvram_wap_profile_content_struct wapProfile10;
} nvram_meta_wap_profile_content_struct;
LID_BIT VER_LID(NVRAM_EF_WAP_PROFILE_CONTENT_LID)
nvram_meta_wap_profile_content_struct *NVRAM_EF_WAP_PROFILE_CONTENT_TOTAL
{
};
【lzq2010-4-7 下午 04:28:22 补充】
1,在手机中隐藏了一个盘符:C盘;在modis上我们能看到这个盘符里的文件,都是临时文件和NV文件;这个盘符很重要因为在down软件时半擦不会将这个盘里的文件删除;而如果是全擦的话就会删除这里的全部文件;所以半擦时没有升级版本号的NV不会生效;
另外,升级了版本号的NV是如何生效的需要另外深入研究; |
|