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

转载于:https://www.cnblogs.com/sierllen/archive/2012/05/07/2486836.html

(转载) MTK之NVRAM研究[三]相关推荐

  1. MTK之NVRAM研究[三]

    一,下面来具体看看两个不同的NV项的实现过程,具体的步骤还是和上面的一样的: 这里面实现两中NV项: NV项一:LZQ_TEST :他的数据结构比较简单,只是一个数组: NV项二:HL_WEB_PHO ...

  2. MTK之NVRAM研究

    MTK之NVRAM研究[一] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元 ...

  3. MTK之NVRAM研究[一]

    [size=large] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元(T ...

  4. mtk NVRAM研究系列

    MTK之NVRAM研究[一] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元 ...

  5. C#多线程学习(三) 生产者和消费者 (转载系列)——继续搜索引擎研究

    前面说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问题就是几个线程同时执行一个函数,导致数据的混乱,产生不可预料的结果,因此我们必须避免这种情况的发生. ...

  6. C#多线程学习(四) 多线程的自动管理(线程池) (转载系列)——继续搜索引擎研究...

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  7. C#多线程学习(五) 多线程的自动管理(定时器) (转载系列)——继续搜索引擎研究...

    Timer类:设置一个定时器,定时执行用户指定的函数.               定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer ...

  8. 图像信噪比计算公式_CT 科研设计之图像质量对比研究三步曲

    CT科研是CT技术的窗口,帮助医务工作者开展CT科研也是我们的责任和义务! 问 如何科学地比较不同重建技术的图像质量? 答 首先要排除其他影响图像质量的因素, 然后进行客观指标的比较, 最后进行主观指 ...

  9. 【转载】VMware vSphere中三种磁盘规格的解释说明

    在VMware vSphere中,不管是以前的5.1版本,或者是现在的6.5版本,创建虚拟机时,在创建磁盘时,都会让选择磁盘的置备类型,如下图所示,分为: 厚置备延迟置零 厚置备置零 Thin Pro ...

  10. java写三次函数导数,用导数研究三次函数

    <用导数研究三次函数>由会员分享,可在线阅读,更多相关<用导数研究三次函数(14页珍藏版)>请在人人文库网上搜索. 1.用导数研究三次函数1. 知识点解析1.定义:定义1.形如 ...

最新文章

  1. 中国软件正版化的理想模型
  2. 高性能MySQL——查询性能优化
  3. 上传文件显示进度条_文件上传带进度条进阶-断点续传
  4. wps for linux alpha 15 语言包,WPS Office for Linux Alpah 7发布
  5. 【Java】JDBC连接MySQL驱动
  6. TiDB 源码阅读系列文章(十八)tikv-client(上) 1
  7. 人工智能是计算机科学的一个分支下定义,阅读中有一篇叫人工智能什么,是说明文...
  8. Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics) 1 2. 第六章 堆排序(Heapsort)
  9. ajax调用网易云APi遇到跨域问题
  10. 程序设计语言与语言程序处理程序基础(软件设计师备考笔记)
  11. python实现分词和词云制作
  12. 如何评价近几年顶会的超分,去噪,去模糊等图像复原文章?
  13. 【苹果相册推】Xcode项目,我们将其命名为mypushchat,以及调试的iOS设备
  14. html5 figure和figcaption
  15. Windows API一日一练(29)SelectObject和DeleteObject函数
  16. 网盘搜索引擎以及网盘分享社区地址
  17. PAT乙级1034题解
  18. jionlp:一款解析地址信息的神奇 Python 库
  19. 计算机网络(17)——虚电路网络与数据报网络
  20. Android 12.0修改系统默认设备类型的平板电脑类型为设备类型

热门文章

  1. jquery富文本编译器_jQuery 移动端artEditor富文本编辑器
  2. 搭建mqtt服务器apollo
  3. 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_03.入门程序之需求分析
  4. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_5_Stream流中的常用方法_map...
  5. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第4节 模拟BS服务器案例_2_模拟BS服务器代码实现...
  6. 案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变...
  7. CF125E MST Company
  8. 前端学习01-07图像标签
  9. 利用SusuCMS快速创建网站(一)
  10. JS 使用RSA加密解密