【问题标题】:U-Boot ethernet hardware MAC address in environment on SD cardSD卡环境中的U-Boot以太网硬件MAC地址
【发布时间】: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


【解决方案1】:

答案是这变成了一个政策问题。非默认环境(因此,当您使用 saveenv 时保存到 someplace 的内容)旨在特定于实例。这就是为什么一般来说板代码会查看是否设置了 ethaddr,如果设置了,则不要尝试导出一个。

当你从一个板移动到另一个板时,你可以使用 env default -f -a 将运行环境恢复为内置默认值。

如果您想在多个板之间共享同一张 SD 卡,那么您需要制定一个策略来管理这种情况。

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 2016-10-14
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多