mac设置流程
背景:设备不同的mac地址,防止多设备同mac地址影响网络通信。
一.uboot的mac设置
系统启动的必要两个文件:cis.bin,boot.bin来用于配置设备信息和启动系统。 烧录cis.bin,boot.bin也叫烧录空片。
boot.bin引导加载时,对ethaddr的值进行判断,第一次ethaddr的为空,使用数组MY_MAC的mac地址,且将mac地址存入变量ethaddr
s = getenv ("ethaddr");
if (s)
{
for (i = 0; i < 6; ++i)
{
ThisBCE.sa1[i] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
{
s = (*e) ? e + 1 : e;
}
}
}
else
{
ThisBCE.sa1[0] = MY_MAC[0];
ThisBCE.sa1[1] = MY_MAC[1];
ThisBCE.sa1[2] = MY_MAC[2];
ThisBCE.sa1[3] = MY_MAC[3];
ThisBCE.sa1[4] = MY_MAC[4];
ThisBCE.sa1[5] = MY_MAC[5];
}
烧录image,boot在初始化emac时,会先获取环境变量参数 ethaddr的值,根据值是否有效来判断使用数组的mac地址还是环境变量的mac地址。
按照代码逻辑第二次加载uboot,从而使用ethaddr的地址。
二.kernel的mac设置
- boot下向kernel传递mac地址
bootloader后会将mac地址写入emac的寄存器,通过获取emac特定寄存器的值,来获取boot下设置的mac地址。
// Check if bootloader set address in Specific-Address 1 //
HiAddr = MHal_EMAC_get_SA1H_addr(hemac->hal);
LoAddr = MHal_EMAC_get_SA1L_addr(hemac->hal);
addr[0] = (LoAddr & 0xffUL);
addr[1] = (LoAddr & 0xff00UL) >> 8;
addr[2] = (LoAddr & 0xff0000UL) >> 16;
addr[3] = (LoAddr & 0xff000000UL) >> 24;
addr[4] = (HiAddr & 0xffUL);
addr[5] = (HiAddr & 0xff00UL) >> 8;
memcpy (dev->dev_addr, &addr, 6);