AI手机网,短视频直播 硬改改机 一键新机 群控软件 刷机定制

 找回密码
 立即注册
搜索
查看: 1363|回复: 0

客制化NVRAM的以太网地址

[复制链接]
发表于 2020-5-11 09:05:50 | 显示全部楼层 |阅读模式

在使用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_LID1、添加一个头文件CFG_Ethernet_File.h,指定数据结构、记录大小、记录数目

路径: mediatek/proprietary/custom/[Project]/cgen/cfgfileinc/CFG_Ethernet_File.h



  • #ifndef _CFG_ETHERNET_FILE_H



  • #define _CFG_ETHERNET_FILE_H







  • typedef 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_H







  • File_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; //以太网的LID



  •     int 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, &ethernet_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);




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

技术交流售后群

QQ|小黑屋|手机版|站点找错-建议|AI手机网 |Sitemap



GMT+8, 2024-5-20 09:46 , Processed in 0.142504 second(s), 26 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表