(转载) MTK之NVRAM研究[三]

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,"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是如何生效的需要另外深入研究;

posted @ 2012-05-07 08:20  sierllen  阅读(1821)  评论(0编辑  收藏  举报