【发布时间】:2017-08-11 12:57:38
【问题描述】:
根据 U-Boot 的README.enetaddr“使用”部分:
如果硬件设计要求将 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 地址 EEPROM”,其中包含一个唯一的、普遍管理的 MAC 地址,以及该板用于保存 U-Boot 的唯一可用存储位置environment 是它启动的 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 卡从原始设备中取出并放入类似设备(在其 EEPROM 中具有不同的通用管理 MAC 地址),新设备是否会使用原始设备的 MAC 地址而不是自己的 MAC 地址,唯一的MAC地址?如果是这样,防止这种情况发生的最佳方法是什么?
EDIT2
我正在寻找的是某种自动设置 MAC 地址的方法,但不会“污染”使用此板特定 MAC 地址保存在 SD 卡上的任何环境副本。 IE。我希望 MAC 地址与开发板保持绑定,而不是与 SD 卡绑定。
【问题讨论】:
-
这似乎与编程无关……您可能想edit 澄清一下。
标签: mac-address u-boot