欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

客制化NVRAM的以太网地址

发布时间:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的这篇文章主要介绍了 客制化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, &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); 复制代码

    总结

    以上是生活随笔为你收集整理的客制化NVRAM的以太网地址的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。