客制化NVRAM的以太网地址
在使用SN Write写Ethernet MAC过程中出现了以下的错误:
ERROR!! Ethernet Mac:MetaResult = SPMETA_DLL::META_LID_INVALID。
复制代码
后来确认是AP_DB里面没找到AP_CFG_RDEB_FILE_ETHERNET_LID这个参数导致报错的,需在NVRAM中添加以太网的LID的参数。
本文就以AP_CFG_RDEB_FILE_ETHERNET_LID这只LID添加过程为例,简单说明客制化NVRAM的过程。
NVRAM介绍
Nvram: Non-volatile random access memory,是MTK平台的一种机制。
主要的目的是:用来描述RAM中的数据类型,关机也不会丢失;手机重要的参数在恢复出厂设置或者升级被删除后还能恢复。这些重要的数据包括两部分:AP端和Modem端,这里只介绍AP端部分。
AP端的主要有Wifi,Bt,Gps,sensor数据等。
Modem端的数据主要是打电话相关的参数,比如IMEI,RF等参数。
AP NVRAM Features:Backup
工厂Meta mode下做校准测试/写号等操作,工具结束disconnect 前触发backup动作, backup是从nvdata 分区(文件系统)备份到nvram 分区(raw data)。
AP NVRAM Features:Restore
使用下载工具做固件升级(firmware upgrade) 或者恢复出厂设置,会触发restore动作。 Restore是从nvram分区还原到nvdata分区,如果nvram 分区内容为空,则用nvram default值还原。
不同项目的需求,NVRAM模块需要提供客制化配置,包括默认值和LID的数据结构NVRAM的数据分两部分
1. Common 公共部分
MTK 平台使用,可以看到相关LID的数据结构,但是不要修改它。
2. 为不同的项目客制化部分
给客制化用的,可以看到相关LID的数据结构,并且可以修改它。
客制化相关的文件夹在以下的几个目录
mediatek\custom\ [project] \cgen里面有三个文件夹。
- cfgdefault 用来设置默认值的
- cfgfileinc 用来定义LID的数据结构的
- inc 用来支持NVRAM 模块功能的
NVRAM item的信息
每一项的格式是:
- 文件路径
- 文件版本
- 记录的大小
- 记录的总数
- 默认值的类型
- 默认值
- 数据转换函数
举例:
{"/data/nvram/APCFG/APRDEB/ETHERNET", //1.文件路径VER(AP_CFG_RDEB_FILE_ETHERNET_LID), //2.文件版本 CFG_FILE_ETHERNET_REC_SIZE, //3.记录的大小CFG_FILE_ETHERNET_REC_TOTAL, //4.记录的总数 SIGNLE_DEFUALT_REC, //5.默认值的类型(char *)&stEthernetDefault, //6.默认值DataReset , //7.数据转换函数 NULL}/*注意,LID的顺序,必须和某顺序保持对应*/
复制代码
添加AP_CFG_RDEB_FILE_ETHERNET_LID
1、添加一个头文件CFG_Ethernet_File.h,指定数据结构、记录大小、记录数目
路径: mediatek/proprietary/custom/[Project]/cgen/cfgfileinc/CFG_Ethernet_File.h
#ifndef _CFG_ETHERNET_FILE_H
#define _CFG_ETHERNET_FILE_Htypedef struct
{unsigned char addr[6];
} File_ETHERNET_Struct;#define CFG_FILE_ETHERNET_REC_SIZE sizeof(File_ETHERNET_Struct)
#define CFG_FILE_ETHERNET_REC_TOTAL 1#endif
复制代码
2、添加一个头文件CFG_Ethernet_Default.h,描述LID的默认值
路径:mediatek/proprietary/custom/[Project]/cgen/cfgdefault/CFG_Ethernet_Default.h
#ifndef _CFG_ETHERNET_D_H
#define _CFG_ETHERNET_D_HFile_ETHERNET_Struct stEthernetDefault =
{/*{*/ 0x12, 0x12, 0x12, 0x12, 0x12, 0x12 /*}*/ /* MAC ADDRESS */
};#endif
复制代码
3、添加Item项的文件版本
路径:mediatek/proprietary/custom/[Project]/cgen/inc/Custom_NvRam_LID.h
在typedef enum添加新的LID:
AP_CFG_RDEB_FILE_ETHERNET_LID,
复制代码
添加版本信息:
#define AP_CFG_CUSTOM_FILE_CUSTOM1_LID_VERNO “000”
复制代码
4、在g_akCFG_File_Custom新加item项
路径:mediatek/proprietary/custom/[Project]/cgen/inc/CFG_file_info_custom.h
在TCFG_FILE g_akCFG_File_Custom[]中添加:
{"/data/nvram/APCFG/APRDEB/ETHERNET", VER(AP_CFG_RDEB_FILE_ETHERNET_LID), CFG_FILE_ETHERNET_REC_SIZE,CFG_FILE_ETHERNET_REC_TOTAL, SIGNLE_DEFUALT_REC, (char *)&stEthernetDefault, DataReset , NULL},
复制代码
5、在Custom_NvRam_data_item.h中添加相应的信息
路径:mediatek/proprietary/custom/[Project]/cgen/inc/Custom_NvRam_data_item.h
LID_BIT VER_LID(AP_CFG_RDEB_FILE_ETHERNET_LID)
File_ETHERNET_Struct *CFG_FILE_ETHERNET_REC_TOTAL
{};
复制代码
6、如果LID需要备份,将它添加到aBackupToBinRegion[]
路径: mediatek/proprietary/external/nvram/libcustom_nvram/CFG_file_info.c
在aBackupToBinRegion[]中添加:
{"ETHERNET",AP_CFG_RDEB_FILE_ETHERNET_LID},
复制代码
通过以上六个步骤,我们已经成功的添加了AP_CFG_RDEB_FILE_ETHERNET_LID这只NVRAM LID,此时我们可以使用SN工具将以太网的MAC地址写入NVRAM并且通过AP Editor读取和设置NVRAM中的以太网地址。
设置以太网地址
我们想要实现的效果是:通过SN工具将以太网地址写入NVRAM中,并且在开机后可以查看到以太网地址为我们写入的数据。
从nvram的角度来看,只能提供保存ethernet mac地址的文件路径,以及文件结构,想要实现最终的效果需要请ethernet driver的owner去打开保存数据的文件,并读取mac地址。
1、从NVRAM中读取以太网的地址
char dp[15] = {0}; //大小设置为15个字节,如果太小,会出现错误int result;F_ID ethernet_nvram_id;int file_lid = AP_CFG_RDEB_FILE_ETHERNET_LID; //以太网的LIDint rec_size=0 , rec_num = 0;File_ETHERNET_Struct ethernet_struct;bool IsRead = true;ethernet_nvram_id = NVM_GetFileDesc(file_lid, &rec_size, &rec_num, IsRead);if(ethernet_nvram_id.iFileDesc < 0){printf("NVM_GetFileDesc failed\n");}result = read(ethernet_nvram_id.iFileDesc, ðernet_struct , rec_size * rec_num);if(result != rec_num*rec_size){printf("Get file failed\n");}sprintf(dp, "%02x%02x%02x%02x%02x%02x", ethernet_struct.addr[0],ethernet_struct.addr[1],ethernet_struct.addr[2],ethernet_struct.addr[3],ethernet_struct.addr[4],ethernet_struct.addr[5]);if(!NVM_CloseFileDesc(ethernet_nvram_id)){printf("NVM_CloseFileDesc failed\n");}复制代码
2、通过shell命令将mac地址写入节点
char cmd[1024]; snprintf(cmd, 1024, "rtunicpg /efuse /nodeid %s", dp);ALOGE("%s", cmd);system(cmd);
复制代码
客制化NVRAM的以太网地址相关推荐
- 客制化 GH60 XD60 像 Poker 一样的 60% 机械键盘 (2) 采购以及组装
客制化 GH60 XD60 像 Poker 一样的 60% 机械键盘 (2) 采购以及组装 在第一篇博文中 客制化键盘设计,我最终设计了如下图的键盘: 但是我们仅仅是设计出来有个P用,还得把键盘做出来 ...
- 【立创开源】 简易上手的入门级客制化键盘——Az40_百变怪_V2
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.内容展示 自制键盘的起因是源自一把求而不得的客制化键盘套件(我甚至忘记他到底叫什么了),20年刚入坑键圈时被群友安 ...
- Android 手机按键客制化详解
在Android 中会有以下5个按键(Back.Home.Menu.Power.Volume)与用户进行交互,Framework 层中实现按键功能,因此,从手机系统定制的角度,可以满足客户的客制化要求 ...
- Android实现客制化系统apk在线签名
目录 一.基线代码签名key 二.如何生成自定义的签名pk8 .x509.pem 签名文件 三.如何使用签名key对apk进行重新签名 四.大厂商为了安全,使用自定义签名方式,而不采用原生的签名方式 ...
- 客制化键盘键位修改_干电池 支持5设备无线连接 - 高斯ALT71机械键盘拆解评测...
近一段时间,本人就感觉小型紧凑机械键盘键盘很火,这点我很意外,一直以来都是87键和104键的天下,怎么突然就很火热呢?我真的是LOW.小型紧凑型机械键盘种类很多,有60.61.64.66.67.68. ...
- 客制化键盘编程_指尖运动会,谁是打字冠军,双十一机械键盘推荐
机械键盘就只能玩游戏吗?当然不是,其实机械键盘出现还远远早于薄膜键盘,早期类似IBM.AST.HP.康柏一类的品牌机都是标配机械键盘的.早期的机械键盘确实有点笨重,尤其是白轴的机械键盘,让你毕生难忘. ...
- 客制化键盘编程_客制化键盘劝退指南
客制化键盘劝退指南 最近总感觉mac book pro的键盘不太好用,所以把家里用的杜伽K320拿到公司用了.这把键盘,樱桃的银轴,红轴的压力克数,更小的键程,用起来还是不错的. 如此一来,家里的台式 ...
- 客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美
内置钢板是轴体固定需要也是机械键盘的标志,钢板除了可以带来极其稳定的固定效果也成就了机械键盘扎实的手感,同时是机械键盘分量感的主要来源,给人一种结实感,这是薄膜键帽所不具备的. ▲外置钢板在悬浮式结构 ...
- 客制化键盘编程_客制化键盘如何入坑?
首先,玩客制化键盘之前你得了解一些键盘相关的知识. 比如键盘的轴体大致分为:线性轴.段落轴.声音轴.线性轴主要是类红轴,静音轴两大类.段落轴主要是类茶轴,类hp轴两大类.声音轴就是类青轴和类box白轴 ...
最新文章
- matlab关于噪声课设,基于matlab的有噪声的语音信号处理的课程设计.doc
- MFC中简单绘图几种方式
- 载:看了你能懂几个?
- vs 无法解析变量$_C语言新手常见错误(Vs使用,语法...),绝对直击痛点
- java.lang.UnsupportedClassVersionError: Bad version number in .class file异常
- java自学报告_Vi,Java,Ant和Junit自学报告
- 【Json】JSONPath之fastJson与Snack3的使用介绍与区别
- 使用Log Parase 结合 Log Parase Studio 查询IIS日志
- 当ligerui的grid出现固定列与非固定列不在同一水平线上时,改怎么处理
- eclipse 安装包下载
- 用计算机遥感技术图片,遥感图像处理
- 【华为灰度管理法】之读书思维导图及感想分享
- hash和history路由的区别
- 用一段CSS代码找回属于童年的哆啦A梦欢度六一附源码在线展示
- DDR4、GDDR5、GDDR6内存的区别
- Week of 3.21
- 北大自考计算机及应用,北大自考计算机哪个专业好
- 你处在人生的哪个阶段
- 计算机毕业设计ssm高校体质测试管理系统dp69w系统+程序+源码+lw+远程部署
- 每天学习十分钟7之做最好的自己