根據的U-Boot的README.enetaddr「用法」部分:U-Boot的以太網硬件MAC地址
如果該MAC地址存儲在一些特殊的地方在硬件設計任務(如EEPROM等等),那麼板特定的初始化代碼(例如板特定的
misc_init_r()
函數)負責定位MAC地址並從中初始化相應的環境變量。請注意,只有在環境尚未包含這些環境變量的情況下才能完成此操作,即現有變量定義不能被覆蓋。在運行時,以太網層將使用環境變量將MAC地址同步到以太網結構。所有以太網驅動程序代碼應該只使用
eth_device
結構的enetaddr
成員。這是在每個網絡命令上完成的,因此以太網副本將保持同步。
讓我們假設一個裝置具有包含一個統一管理MAC地址的EEPROM和該設備的misc_init_r()
功能讀取該MAC地址,並將其寫入到環境變量(例如,「ethaddr」)當且僅當環境變量不存在。我們還假設U-Boot saveenv
命令稍後保存了環境,此外,整個系統正在運行一個可移動存儲設備,如SD卡,其中還保存了U-Boot環境。
編輯
在我的情況,我在其中具有從MICRONIX含有一種獨特的,統一管理的MAC地址「MAC地址EEPROM」一個新的定製電路板上面的情況,以及董事會的唯一可用保存的U-Boot環境的存儲位置是從其引導的SD卡。我對特定板misc_init_r()
函數以下代碼:
#include <common.h>
#ifndef CONFIG_SPL_BUILD
static int my_board_read_mac(uchar *mac)
{
int ret;
/* EEPROM is at bus 0. */
ret = i2c_set_bus_num(0);
if (ret) {
printf("Cannot select EEPROM I2C bus - err %d\n", ret);
return ret;
}
/* EEPROM is at address 0x50. MAC address is at offset 0xfa. */
ret = eeprom_read(0x50, 0xfa, mac, 6);
if (ret) {
printf("Cannot read I2C EEPROM - err %d\n", ret);
return ret;
}
return 0;
}
static int my_board_do_mac(void)
{
int ret;
uchar mac[6];
ret = my_board_read_mac(mac);
if (ret) {
printf("Failed to read MAC address - err %d\n", ret);
return ret;
}
if (!is_valid_ethaddr(mac)) {
printf("Read invalid MAC address %pM\n", mac);
return -EINVAL;
}
if (!getenv("ethaddr")) {
return eth_setenv_enetaddr("ethaddr", mac);
}
return 0;
}
int misc_init_r(void)
{
int ret;
ret = my_board_do_mac();
if (ret) {
printf("Failed to set MAC address - err %d\n", ret);
}
return 0;
}
#endif
我的問題是:如果SD卡被從原始設備取出,放入類似的設備(具有在一個不同的全局管理MAC地址的EEPROM),新設備將使用原始設備的MAC地址而不是它自己的唯一MAC地址?如果是這樣,防止這種情況發生的最好方法是什麼?
EDIT2
我正在尋找一些方法來設置MAC地址自動,而不是「污染」保存這塊主板特定MAC地址的SD卡對環境的任何副本。即我希望MAC地址保持與電路板相連,而不是與SD卡相連。
這看起來確實不是編程相關的...你可能想要[澄清]。 – Will