zoukankan      html  css  js  c++  java
  • (转载) MTK之NVRAM研究[二]

     MTK之NVRAM研究[二]

    二,再来看“透明逻辑数据元”

    这样的数据项已经实现了的三个数据项:
         1,byte 数据项;
         2,short数据项;
         3,double数据项;

    这些数据项都已经实现了数据项LID的定义,数据项的定义和值的定义;如:
    LID: 在文件Nvram_user_defs.h中:

            NVRAM_EF_CACHE_BYTE _LID = NVRAM_LID_CUST_BEGIN,
            NVRAM_EF_CACHE_SHORT _LID,
            NVRAM_EF_CACHE_DOUBLE _LID,

    size:custom_mmi_default_value.h中:
    #define NVRAM_CACHE_SIZE                512         //很明显byte,short ,double的数据项都有512个记录,一个记录只有一个byte值 ;
    #define NVRAM_CACHE_TOTAL               1       

    新增数据项在文件:Nvram_user_config.h中
    ltable_entry_struct logical_data_item_table_cust[] =
    {
     {
      NVRAM_EF_CACHE_BYTE_LID,
      NVRAM_CACHE_SIZE,                          // 512
      NVRAM_CACHE_TOTAL,                    //1
      NVRAM_EF_ZERO_DEFAULT,
      NVRAM_ATTR_AVERAGE,
      NVRAM_CATEGORY_USER | NVRAM_CATEGORY_CUSTPACK | NVRAM_CATEGORY_SHADOW_MS,
      "CT00",
      VER(NVRAM_EF_CACHE_BYTE_LID),
      "1-byte Setting\0",
      NVRAM_RESERVED_VALUE
     } 
    ,{
      NVRAM_EF_CACHE_SHORT_LID,
      NVRAM_CACHE_SIZE,                             // 512
      NVRAM_CACHE_TOTAL,                     // 1
      NVRAM_EF_ZERO_DEFAULT,
      NVRAM_ATTR_AVERAGE,
      NVRAM_CATEGORY_USER | NVRAM_CATEGORY_CUSTPACK | NVRAM_CATEGORY_SHADOW_MS,
      "CT01",
      VER(NVRAM_EF_CACHE_SHORT_LID),
      "2-byte Setting\0",
      NVRAM_RESERVED_VALUE
     }
     ,{
      NVRAM_EF_CACHE_DOUBLE_LID,
      NVRAM_CACHE_SIZE,                            //512
      NVRAM_CACHE_TOTAL,                      //1
      NVRAM_EF_ZERO_DEFAULT,
      NVRAM_ATTR_AVERAGE,
      NVRAM_CATEGORY_USER | NVRAM_CATEGORY_CUSTPACK | NVRAM_CATEGORY_SHADOW_MS,
      "CT02",
      VER(NVRAM_EF_CACHE_DOUBLE_LID),
      "8-byte Setting\0",
      NVRAM_RESERVED_VALUE
     }
    ...

    默认值:
      kal_uint8 const NVRAM_EF_ZERO_DEFAULT[] = { 0x00 };
    我们先来看一个条目的数据结构:

    上图中显示,当total_records == 1时,说明这个LID为透明数据元,size就表示这个逻辑数据项的大小;比如byte,那么就是size=1*512;
    如果 total_records != 1 时,说明这个LID为线性固定数据元,total_records 就是记录的个数,size就是每个记录的大小;
    (    lzq注 :我们从这两种数据元的特征中可以得出这样的结论:

                       透明数据元相当于一维数组;已经实现了的数据项LID就相当于一个数组byte record[ Record_ID ]; 其中数组个数512; Recodr_ID为枚举ID;
                                                                                                                                                 short  record2[ Record_ID ];  //Record_ID由用户自己定义并初始化;
                                                                                                                                               double record3[ Recodr_ID ];

                      线性固定数据元相当于二维数组 :已经实现了的数据项LID就相当于My_type_struct    records[  total_records ][ size  ];


    由此分析,我们可以直接当做一个byte数据项的一个记录来直接添加到里面;即在数组record[]中的某个位置从新添加一个值;而不需要另外去实现一个新的byte的LID;大大的简化了操作;而且在byte,short,double的数据项里新添加一个数据很方便,具体只有两步骤:
    1,定义menu_ID
                
               typedef enum
               {
                   ......
                    #ifdef __HQ_CLAMSHELL_TONE__CONTROL__                //参考yj的一个滑盖声音模块的LID;
                     NVRAM_CLAMSHELL_TONE_CONTROL_SETTING,           //定义一个Record_ID;
                     #endif

                   ......
                  
                 NVRAM_LAST_BYTE_ELEMENT
               } BYTEDATA;
     

    2,将这个数组值设置一个默认值;
                    #ifdef __HQ_CLAMSHELL_TONE__CONTROL__
                     BYTE_ENTRY(    NVRAM_CLAMSHELL_TONE_CONTROL_SETTING   ,   0x01 ),  //默认值为0x01;
                   #endif

    Appendix:
    当数据都已经定义完后剩下的就是怎么使用这个数据了
    对透明数据(一维数组)的读写操作有:
                   WriteValue (NVRAM_CLAMSHELL_TONE_CONTROL_SETTING, &data, DS_BYTE, &error);
                    ReadValue (NVRAM_CLAMSHELL_TONE_CONTROL_SETTING, &data, DS_BYTE, &error);

    对线性固定数据元(二维数组)的读写操作有:
              ReadRecord (
                    NVRAM_EF_TIMING_SMS_LIST_LID,                            //参考宏:__HQ_TIMING_SMS__
                    (U16) (i + 1),
                    (void*)&(g_timingsms_cntx.TaskList[i]),
                    NVRAM_TIMING_SMS_LIST_RECORD_SIZE,
                    &error);
                WriteRecord (
                    NVRAM_EF_TIMING_SMS_LIST_LID,
                    (U16) (index + 1),
                    (void*)&(g_timingsms_cntx.TaskList[index]),
                    NVRAM_TIMING_SMS_LIST_RECORD_SIZE,
                    &error);

    二,现在来看下NVRAM的META工具中用到的‘位级别的注释’(bit_level description);  
       也就是在上面的步骤6和步骤7中的操作;
    先让我们来看个资料:NVRAM  LID脚本

       这个特殊的脚本能够用来描述NVRAM LID;在编译的过程中,这个脚本会解析并且将信息保存到有cgen.exe生成的数据库中;PC工具(如META工具)可以利用这个数据库去解析这个LID的原始数据;这个脚本可以被保存在一个头文件中并将在由cgen.exe解析之前进行预处理;程序员可以利用标准c语言(,//注释)去编程,并且可以用宏 “#define” 去控制;
    例如:
    typedef struct {


    kal_uint8 context_id;
    kal_uint8 nsapi;
    kal_uint8 pdp_addr_type;
    kal_uint8 pdp_addr_len;
    kal_uint8 addr_val[4];
    qos_struct req_qos;
    qos_struct min_qos;
    kal_uint8 apn_len;
    kal_uint8 apn[100];
    kal_uint8 pcomp_algo;
    kal_uint8 dcomp_algo;
    kal_uint8 context_type;
    kal_uint8 primary_context_id;
    kal_uint8 is_sib_defined;


    } nvram_ef_tcm_PDP_profile_record_struct;    //lzq:第六步:定义META工具使用的数据结构   ;

    typedef struct {


    kal_uint8 qos_length;
    kal_uint8 unused1;
    kal_uint8 delay_class;
    kal_uint8 reliability_class;
    kal_uint8 peak_throughput;
    kal_uint8 unused2;
    kal_uint8 precedence_class;
    kal_uint8 unused3;
    kal_uint8 mean_throughput;
    kal_uint8 traffic_class;
    kal_uint8 delivery_order;
    kal_uint8 delivery_of_err_sdu;
    kal_uint8 max_sdu_size;
    kal_uint8 max_bitrate_up_lnk;
    kal_uint8 max_bitrate_down_lnk;
    kal_uint8 residual_bit_err_rate;
    kal_uint8 sdu_err_ratio;
    kal_uint8 transfer_delay;
    kal_uint8 traffic_hndl_priority;
    kal_uint8 guarntd_bit_rate_up_lnk;
    kal_uint8 guarntd_bit_rate_down_lnk;


    } qos_struct;                                                       //lzq:在这个例子中,有嵌入式结构体定义;实现原理一样,不过要用到'" 、"来获得子成员变量 ;

    BEGIN_NVRAM_DATA
    LID_BIT VER_LID(NVRAM_EF_TCM_PDP_PROFILE_LID) nvram_ef_tcm_PDP_profile_record_struct*1
    {


    context_id: "" {}; //lzq:这个是上面定义的数据结构(第6步中实现的)nvram_ef_tcm_PDP_profile_record_struct中的成员变量 ;
    addr_val: "Statistic PDP address value, in MSB" {};//lzq:语法: 结构体成员变量名 :"描述语" {更多子项,可以为空 };
    addr_val[0]
    {
    addr_v1:4 " Address Value 1" {};
    addr_v2:4 " Address Value 2" {};
    };
    req_qos: "Requested QoS" {};
    req_qos.qos_length: "Length of QoS" {};
    req_qos.unused1: "Delay Class"
    {
    req_qos_identifier:3 " Request QoS Identifier"
    {
    0x0:"Req QoS Invaild";
    0x2:"Req QoS Vaild";
    0x4:"Req QoS Under Verifing";
    };
    req_qos_list:2
    {
    0x0:"Req QoS List 1";
    0x1:"Req QoS List 2";
    0x2:"Req QoS List 3";
    };
    };
    req_qos.delay_class: "Delay Class" {};
    req_qos.reliability_class: "Reliability Class"
    {
    reliablity_class:8
    {
    0x00: "Realiablity Class Zero";
    0x01: "Realiablity Class Low";
    0x02: "Realiablity Class Medium";
    }
    }
    req_qos.peak_throughput: "Peak Throughput" {};
    apn: "APN string" {} ;


    };
    END_NVRAM_DATA

    再来看第二个例子,透明数据员bity的描述实现:
    typedef struct
    {
        kal_uint8 CacheByte[NVRAM_CACHE_SIZE];
    } nvram_cache_byte_struct;

        LID_BIT VER_LID(NVRAM_EF_CACHE_BYTE_LID)
         nvram_cache_byte_struct *NVRAM_CACHE_TOTAL
         {
             CacheByte :"One-byte parameter setting";
             CacheByte [14]          //lzq:这里表示在结构体成员变量CacheByte[]数组的第14个数据项的描叙 ;
             {
               default_lang:8 "Default Language"   //default_lang: 8 ---表示直接显示这个串; "Default Language"---表示对这个数据项的补充说明;
                 {
                 };
             };

             CacheByte[24]          //lzq:这里表示在结构体成员变量CacheByte[]数组的第24个数据项的描叙 ;    
             {
               time_zone:8 "Time Zone (Current City)"
                 {
                 };
             };
             CacheByte[25]       //lzq:这里表示在结构体成员变量CacheByte[]数组的第25个数据项的描叙 ;
             {
               date_format:8 "Time Format"
                 {
                 };
             };

             CacheByte[26]     //lzq:这里表示在结构体成员变量CacheByte[]数组的第26个数据项的描叙 ;
             {
               date_format:8 "Date Format"
                 {
                 };
             };
        
    更多的实现功能可以参考原程序中的定义实现,再结合META工具去查看该数据项的显示效果;

    lzq自己添加的LID项,如下图;

    在实现的过程中,遇到一个问题:
        当我们完成所有的步骤(7步)后,当用META工具察看时却发现不了自己新添加的那个LID:NVRAM_EF_MY_NEW_DATA_LID;

    分析原因:
        没有看到LID说明两个问题:1,在实现的过程中有的地方出错;
                                                                       2,在用META工具查看时,选择了不对的datebase(数据库),导致手机database和META工具的database版本不对;

    操作:

                  在检查了所有的原代码后,确认没有出错,再从新new了一遍后,重新用META工具查看时,出现如下图的错误:

                    

     
     说明在选择database时选择了错误的版本,因此用META工具看到的还是原来的老的版本的数据,因此看不到我们新添加的LID;

    end  2009-7-17 下午 05:36:39

  • 相关阅读:
    CAN器件
    团队赋能
    电子模拟开关
    名言出处
    危机管理
    隔离技术
    让CSS布局更加直观:box-sizing
    浅谈跨域以WebService对跨域的支持
    给初学者的20个CSS实用建议
    JS中eval处理JSON数据 为什么要加括号
  • 原文地址:https://www.cnblogs.com/sierllen/p/2486834.html
Copyright © 2011-2022 走看看