热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MTK之NVRAM研究[二]

二,再来看“透明逻辑数据元”这样的数据项已经实现了的三个数据项:1,byte数据项;2,short数据项&#

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

这样的数据项已经实现了的三个数据项:
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, // 512NVRAM_CACHE_TOTAL, //1NVRAM_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, // 512NVRAM_CACHE_TOTAL, // 1NVRAM_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, //512NVRAM_CACHE_TOTAL, //1NVRAM_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 };

我们先来看一个条目的数据结构:


YojIl8.png

上图中显示,当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

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

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项,如下图;


YovccT.png

在实现的过程中,遇到一个问题:

当我们完成所有的步骤(7步)后,当用META工具察看时却发现不了自己新添加的那个LID:NVRAM_EF_MY_NEW_DATA_LID;

分析原因:没有看到LID说明两个问题:

1,在实现的过程中有的地方出错;

2,在用META工具查看时,选择了不对的datebase(数据库),导致手机database和META工具的database版本不对;

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


YovWB4.png

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


推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 类加载机制是Java虚拟机运行时的重要组成部分。本文深入解析了类加载过程的第二阶段,详细阐述了从类被加载到虚拟机内存开始,直至其从内存中卸载的整个生命周期。这一过程中,类经历了加载(Loading)、验证(Verification)等多个关键步骤。通过具体的实例和代码示例,本文探讨了每个阶段的具体操作和潜在问题,帮助读者全面理解类加载机制的内部运作。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 全局变量与常量在内存中的布局分析及应用
    本文详细探讨了全局变量与常量在内存中的存储布局及其应用。通过分析不同编译器和操作系统对全局变量与常量的处理方式,揭示了它们在内存中的具体分配机制。此外,文章还讨论了这些布局对程序性能和安全的影响,并提供了优化建议,帮助开发者更好地理解和利用全局变量与常量的内存管理。 ... [详细]
  • 线程能否先以安全方式获取对象,再进行非安全发布? ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
author-avatar
chenliuyan13
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有