在 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 時允許覆蓋一次)。
include/configs/<your_board>.h 中添加:
#define CONFIG_ENV_OVERWRITE // 允許覆蓋所有受保護環境變量
重新編譯 U-Boot 並燒錄即可多次修改 ethaddr。saveenv,但風險較高,不建議量產設備使用。重啟進入 U-Boot 後:
=> setenv ethaddr 00:11:22:33:44:55
=> saveenv
=> printenv ethaddr
ethaddr=00:11:22:33:44:55
不再報錯,說明配置生效。