日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

客制化NVRAM的以太网地址

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客制化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的以太网地址的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。