MTK NVRAM 总结
NVRAM操作说明:
Nvram性质和文件一样,不过,对它进行读写数据,在手机格式化后还存在。
由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型;
1、透明数据元(Transparent EF):这个类型的数据项的记录的大小为一个byte;因此,这种数据项可以认为是一系列的bytes;
2、线性固定数据元(linear fixed EF):这个类型的数据项的记录的大小远大于一个byte;所有的数据按线性存储;
如下图所示:
一,先来看“线性固定数据元”
首先我们来新建一项NV;分析每个步骤的原理;
总的步骤必须遵循如下几步:
1,在文件:“nvram_user_defs.h”的枚举结构体“nvram_LID_cust_enum”中定义一个新的LID:“NVRAM_EF_[new logical data item name]_LID”;
注意:请将新LID项加在NVRAM_EF_LAST_LID_CORE.之前;
ex: NVRAM_EF_PORT_SETTING_LID;
lzq:这个LID项的主要作用是什么呢?为什么一定要添加一个LID?因为NVRAM中的数据是在fs文件系统的管理中操作的,而文件操作需要识别数据项和管理数据项,都是通过这个LID来操作的;
2,在文件:“nvram_user_defs.h”中定义两个常量:SIZE和TOTAL;
#define NVRAM_EF_PORT_SETTING_SIZE 16
#define NVRAM_EF_PORT_SETTING_TOTAL 1
既然是一块内存,很明显就必须要设置这块内存的大小;这样将结构体的数据保存和读取时都很容易的操作到了特定的内存中;
并且有效的控制的内存不足和溢出的问题;就像是初始话一个数组的大小;
如:
#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]; //本地区号;
} WEB_PHONE;
#define NVRAM_EF_ WEB_PHONE_DATA_SIZE sizeof( WEB_PHONE) // WEB_PHONE
#define NVRAM_EF_ WEB_PHONE_DATA_TOTAL 1 //1
#endif
3,在文件:“custom_nvram_editor_data_item.h”中定义版本号:“NVRAM_[new data item name]_LID_VERNO”。
#define NVRAM_EF_PORT_SETTING_LID_VERNO "000"
由于文件系统管理了这些NV数据;这些数据难免要进行各式的操作、比如修改、添加、删除的操作。那么文件系统是怎么知道它所管理的这些NV数据已经改变了呢?就是通过这个版本号来识别的,比如你修改了某个NV数据但没有更该它的版本号,文件系统是不会对原始数据更改的;只有在更改了NV值并且修改了版本号,这时文件系统才识别到已经更改,并进行相应的数据更新
例如 short类型NV的版本号是:NVRAM_EF_CACHE_SHORT_LID_VERNO ;
4,在文件:“nvram_user_config.c”中设置这个新nv项的默认值;
static kal_uint8 const NVRAM_EF_PORT_SETTING_DEFAULT[] = {
0x01, 0x00,
0x00, 0x00,
0x00, 0xC2, 0x01, 0x00,
0x00, 0xC2, 0x01, 0x00,
0x01, 0x00, 0x00, 0x00
};
在申请了一块内存后,需要进行初始化默认值;这样在手机的异常时,比如恢复出厂设置时,NV将只载入默认值;
5,在文件:“nvram_user_config.c”中的结构体数组logical_data_item_table_cust[]中新添加一个条目(Add a new entry);
注意:这个新的条目是设置这个LID项的属性的;以提供文件系统来对它操作;
{
NVRAM_EF_PORT_SETTING_LID,
NVRAM_EF_PORT_SETTING_SIZE,
NVRAM_EF_PORT_SETTING_TOTAL,
NVRAM_EF_PORT_SETTING_DEFAULT,
NVRAM_ATTR_AVERAGE,
NVRAM_CATEGORY_USER,
"MP1y", //注意:在这里如果上个是MP1y,那么这里应该为加一为:MP2y,表明有新的条目添加了;
VER(NVRAM_EF_PORT_SETTING_LID),
"Port Settings/0",
NVRAM_RESERVED_VALUE
},
6,在文件custom_nvram_editor_data_item.h 中添加结构体定义;这个结构体定义只为了在使用mata工具时,能看到的新添加的NV项的结构体数组中的各个值;如果不添加将在mata工具中看不到这个新添加的nv项 ;
这个是透明数据元byte在META工具中将要显示的byte的NV项中所有记录的字符串描述数组的结构体;
typedef struct
{
kal_uint8 CacheByte[NVRAM_CACHE_SIZE];
} nvram_cache_byte_struct ;
7,在文件:custom_nvram_editor_data_item.h中.添加 bit-level 说明;这个也是只为了在mata工具中的操作而实现的;在程序中并用不到 ;
这个是byte项的NV 的META工具中的字符串初始化默认值;
LID_BIT VER_LID(NVRAM_EF_CACHE_BYTE_LID) nvram_cache_byte_struct *NVRAM_CACHE_TOTAL
{
CacheByte:"One-byte parameter setting ";
CacheByte[14]
{
default_lang:8 "Default Language "
{
};
};
CacheByte[24]
{
time_zone:8 "Time Zone (Current City )"
{
};
};
CacheByte[25]
{
date_format:8 "Time Format "
{
};
};
CacheByte[26]
{
date_format:8 "Date Format "
{
};
};
};
整个过程如下图:
总结:NV数据实现了数据的读写保护,保证了数据在手机上正常而安全的使用;我们知道对于手机上的一些属性值,比如开机声音,待机画面等是由一些数据来控制的,这些数据是全局的,可以在随时随地的对它调用;如果是在一个游戏应用中,我们只要将它设置为一个全局的变量,在游戏开始时进行初始化就可以了;但在手机上我们必须保证这些数据不能丢失,并且在整个系统运行中当系统出现数据损坏并崩溃时,这些数据也是不会被丢失和更改;保证了手机系统的安全运行;也许我们可以说为什么不用一个文件来保存这些数据呢?我们知道如果用文件的话,虽然实现了数据的异地保存,但一旦这个文件丢失,将导致系统致命错误;另外,这些数据接受用户的个性修改,如果用文件保存的话,数据修改并不方便;而且在读写速度上明显不及直接NVRAM存储器的操作;因此,我们可以这样认为,NV让我们将一些数据从全局中取了出来,并放入了一个不能擦除的存储器中保护起来;
接下来让我们看看NVRAM的结构:
从上图中我们发现,在文件系统中Data Item Management System 管理着NVRAM;而这个管理系统(Data Item Management System)通过内部的一个查询表(lookup table)来获得每个数据项的具体细节;
而这个查询表(lookup table )包含以下4个部分:
1. MT reign, for project independent data items;
2. MP reign, for MTK /PMT common applications;
3. CT reign, for the customer usage.
4. CV reign, for the vendor of customer usage.
下图显示了NVRAM定制文件布局。我们经常操作的文件一般在CT部分;
NVRAM LID 的定义部分都在以下几个文件中进行:
- nvram_data_items.h : for MT use
- nvram_data_items.c : for MT use
- nvram_common_defs.h : for MP use
- nvram_common_config.c : for MP use
- nvram_user_defs.h : for CT use
- nvram_user_config.c : for CT use
- nvram_cust_pack.c: for CustPack use
- nvram_vendor_config.c: for CV use
- nvram_vendor_defs.h: for CV use
META tool 的说明介绍内容都在以下几个文件中实现;:
- nvram_editor_data_item.h: for MT use
- common_nvram_editor_data_item.h : for MP use
- custom_ nvram_editor_data_item.h : for CT use
- vendor_nvram_editor_data_item.h: for CV use
现在我们回头去看步骤5,添加新的条目的操作中,我们会问,为什么要添加新的条目,而且在这些变量中,各个项的涵义是什么呢? 如下:
{
NVRAM_EF_PORT_SETTING_LID,
NVRAM_EF_PORT_SETTING_SIZE,
NVRAM_EF_PORT_SETTING_TOTAL,
NVRAM_EF_PORT_SETTING_DEFAULT,
NVRAM_ATTR_AVERAGE,
NVRAM_CATEGORY_USER,
"MP1y",
VER(NVRAM_EF_PORT_SETTING_LID),
"Port Settings/0",
NVRAM_RESERVED_VALUE
},
我们刚才知道了,管理系统(Data Item Management System)通过内部的一个查询表(lookup table)来获得每个数据项的具体细节的,我们在这里实现的这个新的条目就是为了让管理系统通过查询表来找到它并对它进行操作;所以每个新的LID都要来这里添加新的条目;
那么每个新的条目的具体的数据结构是什么样的呢?如下是它的定义:
typedef struct
{
nvram_lid_enum LID;
kal_uint16 size;
kal_uint16 total_records;
kal_uint8 const *default_value;
nvram_attr_enum attr;
nvram_category_enum category;
kal_char fileprefix[FILE_PREFIX_LEN + 1];
kal_char fileverno[FILE_VERNO_LEN + 1];
kal_char *description;
kal_uint8 record_ID;
} ltable_entry_struct;
具体涵义如下:
接下来分别分析一些具体数据项的涵义:
1、属性attr ;
属性选项是个可选的,它由枚举:nvram_attr_enum定义:
NVRAM_ATTR_AVERAGE: 0x0000 //这是个默认的属性选项;
NVRAM_ATTR_IMPORTANT: 0x0001 //当一个IMPORTANT的数据项被更改时,会先将相关程序停止,并被要求进行备份和保存,只有在成功备份和保存后,才会将程序重新安全开启;
NVRAM_ATTR_WRITEPROTECT: 0x0002 //写保护,只读;
NVRAM_ATTR_MULTIPLE: 0x0004 //如果一个数据项的属性是multiple,那么NVRAM会自动将它做一个备份,并当在其中有一个数据被损坏时,NVRAM会从另个数据中将它还原;
NVRAM_ATTR_CONFIDENTIAL: 0x0008 //对数据采用对称算法进行加密或解密;所以:mulitiple+confidential能实现最好的数据保护;
NVRAM_ATTR_MULTIREC_READ: 0x0010 //适用于那些需要一次性对一数据进行多次读取操作的数据项;
NVRAM_ATTR_OTP: 0x0020 //This attribute is supported only if One Time Programming (OTP) function exists on the flash storage. NVRAM will maintain a small table to OTP region; the table consists of all OTP data items, by order in the lookup table.
NVRAM_ATTR_DIFFERENCE: 0x0080 //NVRAM保留。
我们再来看看LID文件的命名和LID的版本号规则:
File Name Format:
(0~3) File Name |
( 4) M. |
(5~7) Version |
这样的数据项已经实现了的三个数据项:
1、byte 数据项;
2、short数据项;
3、double数据项;
默认值:
kal_uint8 const NVRAM_EF_ZERO_DEFAULT[] = { 0x00 };
我们先来看一个条目的数据结构:
二,现在来看下NVRAM的META工具中用到的‘位级别的注释’(bit_level description),也就是在上面的步骤6和步骤7中的操作;
先让我们来看个资料:NVRAM LID脚本
在实现的过程中,遇到一个问题:
当我们完成所有的步骤(7步)后,当用META工具察看时却发现不了自己新添加的那个LID:NVRAM_EF_ NEW_DATA_LID;
1、在实现的过程中有的地方出错;
2、在用META工具查看时,选择了不对的datebase(数据库),导致手机database和META工具的database版本不对;
在检查了所有的原代码后,确认没有出错,再从新new了一遍后,重新用META工具查看时,出现如下图的错误:
说明在选择database时选择了错误的版本,因此用META工具看到的还是原来的老的版本的数据,因此看不到我们新添加的LID;
#ifdef __HL_WEB_PHONE__
NVRAM_EF_ WEB_PHONE_DATA_LID,
#endif
//说明:注意这里,新添加的NV项如果用到了数据结构,则一定要和它声明结构体大小的地方一起声明,不然编译时找不到结构体;
//在这里由于NV项二不用默认值,他只要使用平台的默认0值就可以了,所以在这里他不用声明和定义默认值;
VER(NVRAM_EF_ WEB_PHONE_DATA_LID),
"My new data2/0",
NVRAM_INVALID_VALUE
}
#endif
//------------在文件中设置NV的版本号:custom_nvram_editor_data_item.h
为新添加的NV项添加版本号;
#ifdef _LZQ_TEST_ //__HQ_ADD_BOOKMARK_DEFAULT__
#define NVRAM_EF_ NEW_DATA_LID_VERNO "002"
#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_ WEB_PHONE_DATA_LID) nvram_ef_ new_data2_struct* NVRAM_EF_ WEB_PHONE_DATA_TOTAL
{
//-------------------web phone-----------
nvram_ef_ new_data2_field:" 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
{
};
(注意:在模拟器下,修改了 nvram 最后是在 DOS 下用 new 命令全部重新编译一次)
在手机中隐藏了一个盘符:C盘;在modis上我们能看到这个盘符里的文件,都是临时文件和NV文件;这个盘符很重要因为在down软件时半擦不会将这个盘里的文件删除;而如果是全擦的话就会删除这里的全部文件;所以半擦时没有升级版本号的NV不会生效;
MTK NVRAM 总结相关推荐
- mtk NVRAM研究系列
MTK之NVRAM研究[一] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元 ...
- MTK NVRAM学习
MTK之NVRAM研究[一] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元 ...
- 个人收集的一些手机研发资料
FlashTool_v3.1.04 FlashTool v3[1][1].1.04 MTK平台板测校准原理 FlashTool v5.1140.00 MTK6223方案介绍 高薪诚聘软件J2ME开发工 ...
- android nvram读写,MTK Android平台Nvram与Gensor数据获取
微信公众号:morixinguan 关注可了解更多的教程.问题或建议,请公众号留言; 如果你觉得本文对你有帮助,欢迎赞赏 ▲长按图片保存可分享至朋友圈 在MTK的机器中,如果不用特定的工具烧写MAC地 ...
- MTK之NVRAM研究[一]
[size=large] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元(T ...
- MTK之NVRAM研究
MTK之NVRAM研究[一] 由NVRAM文件管理器管理的数据单元都是逻辑数据项,一个数据项可以被看作为一个固定大小的记录,所以我们根据他们的记录的大小将所有的逻辑数据项分为两种类型: 1,透明数据元 ...
- MTK Read/Write Ethernet Mac Addrees from Kernel NvRAM Patch
在Kernel Ethernet Driver中读nvram , 更新以太网Mac 地址. add Read and Write Ethernet Mac Addrees from NVRAMSign ...
- 手机modem开发(1)---MTK modem NVRAM
1.Modem NVRAM基础知识总结 1)Modem NVRAM四个分区 nvdata:手机运行过程中,使用(读写)的NVRAM(除了存在protect_f和protect_s中的少数NVRAM)都 ...
- MTK之NVRAM研究[三]
一,下面来具体看看两个不同的NV项的实现过程,具体的步骤还是和上面的一样的: 这里面实现两中NV项: NV项一:LZQ_TEST :他的数据结构比较简单,只是一个数组: NV项二:HL_WEB_PHO ...
最新文章
- 8086为什么不用c语言,现代汇编教材还是基于8086,对理解当今CPU(如i9)有帮助吗,还是教程太滞...
- 熟悉常用的HBase操作
- 娱乐社交,玩票大的!2021网易云信“融合通信开发者大赛”决赛名单公布!
- della计算机驱动检测,nexus6安装BPTOOLS中的diag驱动图文教程
- 新晋图灵奖得主Jeff Ullman受质疑,反对者:他享受了不该享受的荣誉
- oracle无法远程安装,docker部署Oracle,无法远程连接(已解决)
- Oracle中查看所有表和字段
- 直接调用高德地图_高德上线“充电地图”功能 覆盖全国96%充电桩信息
- [转载] Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数
- 基本概念---part3
- Hoo Smart Chain 万物生长计划火热报名中,可视化公链迸发勃勃生机
- barefoot公司和Tofino芯片
- 常用电子邮箱格式怎么写?哪个邮箱最安全最好用?
- java中字输入输出异常_Java:详解Java中的异常(Error与Exception)
- 产品经理小技术:图片素材随手找,原型设计快又好
- html调用手机陀螺仪,前端基于THREE.js的3D全景,支持鼠标控制和手机陀螺仪的切换...
- 6sigma is a good issue improved
- linux安装ie浏览器吗,Ubuntu 上安装IE浏览器的方法
- Java Resources是什么
- python毕业设计项目源码选题(17)校园二手书籍交易系统毕业设计毕设作品开题报告开题答辩PPT
热门文章
- 苹果系统新致命漏洞,黑客可以随意控制您的手机设备
- 强烈推荐!超牛B的PDF转换工具,这可能是你一直在找的
- python网页爬虫漫画案例_comic: scrapy漫画爬虫+django页面展示项目,网易163漫画、腾讯漫画、神漫画在线爬取...
- 实现Java后端数据校验
- python list map成员排序_python的map关于Python列表排序方法reverse、sort、sorted详细说明...
- 移动支付之智能IC卡与Android手机进行NFC通信
- 必要回报率(Required Rate Of Return)
- 命令方块和java_我的世界命令方块教程瞬间多次调用与执行模块概念
- 初中新课标来了,送上猿辅导资深教研老师梳理的全科学习建议
- 5.3.2 表单内数据的获取 -表单的使用- 常用语法【uni-app教程uniapp教程(黄菊华-跨平台开发系列教程)】