2017-08-11 51 views
0

根據的U-Boot的README.enetaddr「用法」部分:U-Boot的以太網硬件MAC地址

如果該MAC地址存儲在一些特殊的地方在硬件設計任務(如EEP​​ROM等等),那麼板特定的初始化代碼(例如板特定的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卡相連。

+0

這看起來確實不是編程相關的...你可能想要[澄清]。 – Will

回答

0

答案是這成爲一個政策問題。非默認環境(所以,當您使用saveenv時,將什麼保存到某處)旨在用於實例特定。這就是爲什麼一般來說,電路板代碼將會看到是否設置了ethaddr,如果是這樣,則不要嘗試導出一個。

當您從一個板子移動到另一個板子時,您可以使用env default -f -a將運行環境恢復到內置的默認值。

如果你想在多個電路板之間共享相同的SD卡,那麼你需要制定一個策略來管理這種情況。

相關問題