2017-08-11 53 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卡,那么你需要制定一个策略来管理这种情况。

相关问题