首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

U-Boot 環境變量 ethaddr 提示 "Can't overwrite" 的原因與解決方法

     編輯:關於C語言

現象

在 U-Boot 命令行執行 setenv ethaddr XX:XX:XX:XX:XX:XX 時,提示 Can't overwrite "ethaddr",導致 MAC 地址無法二次修改。

根因分析

U-Boot 源碼 common/cmd_nvedit.c 中對 ethaddr、serial# 等關鍵環境變量實寫保護:

#ifndef CONFIG_ENV_OVERWRITE
if ( (strcmp(name, "serial#") == 0) ||
     (strcmp(name, "ethaddr") == 0)
#if defined(CONFIG_OVERWRITE_ETHADDR_ONCE) && defined(CONFIG_ETHADDR)
     && (strcmp(env_get_addr(oldval), MK_STR(CONFIG_ETHADDR)) != 0)
#endif
   ) {
    printf("Can't overwrite \"%s\"\n", name);
    return 1;
}
#endif

默認未定義 CONFIG_ENV_OVERWRITE,因此 ethaddr 僅允許寫入一次(或僅當當前值等於編譯時默認值 CONFIG_ETHADDR 時允許覆蓋一次)。

解決方案

  1. 修改板級配置頭文件(推薦):在 include/configs/<your_board>.h 中添加:
    #define CONFIG_ENV_OVERWRITE   // 允許覆蓋所有受保護環境變量
    重新編譯 U-Boot 並燒錄即可多次修改 ethaddr。
  2. 臨時繞過(僅限開發調試):若不願重編 U-Boot,可在 U-Boot 命令行手動擦除環境變量存儲區(如 NOR/NAND Flash 對應分區),再重新 saveenv,但風險較高,不建議量產設備使用。

驗證

重啟進入 U-Boot 後:

=> setenv ethaddr 00:11:22:33:44:55
=> saveenv
=> printenv ethaddr
ethaddr=00:11:22:33:44:55

不再報錯,說明配置生效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved