客制化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虚拟机