客制化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里面有三个文件夹。
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的以太网地址的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 浅谈HSRP(热备份路由选择协议)
- 下一篇: 1.2安装配置VMwaer虚拟机