根据的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