原理:使用cpuid生成mac地址
1、修改u-boot/net/eth_common.c里的eth_env_set_enetaddr函数为:
int eth_env_set_enetaddr(const char *name, const uchar *enetaddr)
{
char buf[ARP_HLEN_ASCII + 1];
sprintf(buf, "%pM", enetaddr);
return env_set(name, buf);
}
2、修改u-boot/board/firefly/firefly-rk3288/firefly-rk3288.c里的setup_macaddr函数为:
void setup_macaddr(void)
{
#if CONFIG_IS_ENABLED(CMD_NET)
int ret;
const char *cpuid = env_get("cpuid#");
u8 hash[SHA256_SUM_LEN];
int size = sizeof(hash);
u8 mac_addr[6];
u8 mac1_addr[6];
/* Only generate a MAC address, if none is set in the environment */
//if (env_get("ethaddr"))
// return;
if (!cpuid) {
debug("%s: could not retrieve 'cpuid#'\n", __func__);
return;
}
ret = hash_block("sha256", (void *)cpuid, strlen(cpuid), hash, &size);
if (ret) {
debug("%s: failed to calculate SHA256\n", __func__);
return;
}
/* Copy 6 bytes of the hash to base the MAC address on */
memcpy(mac_addr, hash, 6);
/* Make this a valid MAC address and set it */
mac_addr[0] &= 0xfe; /* clear multicast bit */
mac_addr[0] |= 0x02; /* set local assignment bit (IEEE802) */
eth_env_set_enetaddr("ethaddr", mac_addr);
memcpy(mac1_addr, hash, 6);
mac1_addr[5]++;
eth_env_set_enetaddr("eth1addr", mac1_addr);
#endif
return;
}
4、在u-boot/include/common.h里添加如下函数定义(我加在45行):
void setup_macaddr(void);
5、在u-boot/common/autoboot.c的autoboot_command函数入口,调用setup_macaddr函数:
void autoboot_command(const char *s)
{
debug("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
setup_macaddr();
if (stored_bootdelay != -1 && s && !abortboot(stored_bootdelay)) {
#if defined(CONFIG_AUTOBOOT_KEYED) && !defined(CONFIG_AUTOBOOT_KEYED_CTRLC)
int prev = disable_ctrlc(1); /* disable Control C checking */
#endif
run_command_list(s, -1, 0);
autoboot_command_fail_handle();
#if defined(CONFIG_AUTOBOOT_KEYED) && !defined(CONFIG_AUTOBOOT_KEYED_CTRLC)
disable_ctrlc(prev); /* restore Control C checking */
#endif
}
#ifdef CONFIG_MENUKEY
if (menukey == CONFIG_MENUKEY) {
s = env_get("menucmd");
if (s)
run_command_list(s, -1, 0);
}
#endif /* CONFIG_MENUKEY */
}
结束。