MTK之NVRAM研究[三]
Appendix2:
2009-12-16 下午 05:24:18
一,下面来具体看看两个不同的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,","","" }, { 1,0,8080,","","" },}
//-----------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是如何生效的需要另外深入研究;