启明云端分享|SSD20X_烧录mac地址文档参考

注:以下是针对单网口且MAC地址连续(一般批量MAC都是连续的)的情况,如果是双网口,请参考最后双网口的配置。
烧录原理
1、SSD20X平台的MAC地址保存于”ethaddr”这个环境变量中,我们可以通过在Uboot中设置该环境变量,从而设置MAC地址。
在这里插入图片描述

2、看起来,通过串口输入命令可以实现烧录MAC地址,但是操作比较繁琐(每次都要输入,还要MAC地址递增)。因此,我们可以使用文件来保存MAC地址,文件可以保存到SD卡或者U盘中。
3、大概的逻辑是:Uboot启动后,去读取SD卡/U盘中的特定文件(保存着这次要烧录的MAC地址信息),获得MAC地址信息后,调用setenv -f ethaddr命令来设置设备MAC地址,同时,将文件中的MAC地址信息更新(递增1,比如由88:A9:A7:00:00:01更新为88:A9:A7:00:00:02,这样下一个设备就烧录88:A9:A7:00:00:02,如此循环)。
4、使用fatread/fatwrite可以在Uboot下读写文件。
5、代码中的实现在common/cmd_mster.c中:

在这里插入图片描述
在这里插入图片描述

6、烧录的操作是在common/autoboot.c中调用的:
在这里插入图片描述

烧录办法
有2种烧录办法,一种是通过SD卡烧录,另一种是通过U盘烧录。要求SD卡和U盘都是FAT32格式:
在这里插入图片描述

打补丁
烧录MAC地址的操作是在uboot阶段完成的,补丁针对uboot:

cd u-boot-2015.01

patch -p1 < …/ssd20x_add_mac_burn.patch

打开MAC烧录功能:

ARCH=arm make menuconfig

Device Drivers —>
[] MStar drivers —>
[
] MSTAR SDMMC
[*] MSTAR MAC BRUN
这样uboot就添加了烧录MAC功能。
制作MAC数据
通过mac_split.sh来制作,mac_split.sh制作数据时,规定了前面4个字节时固定的,后面从开始数据递增。每次最多制作0xFFFF个MAC数据,这里假设我们要要烧录的mac地址为11:22:33:44:55:66(0x5566=21862)开始的1200个,则操作如下:

./mac_split.sh -h 11:22:33:44 -s 21862 -e 23061

这样就会产生MAC_INDEX和MAC_21862 - MAC_23061的一系列文件:
在这里插入图片描述

把上面这些文件拷贝到SD卡或U盘中。
烧录MAC
如果使用的是U盘烧录,则需要先设置MacReadDev这个环境变量(SD卡则不需要):

setenv MacReadDev usb

saveenv

在这里插入图片描述

按住回车键再上电,进入uboot命令行之前,mac地址会烧录完毕。
一些建议
通过设置环境变量MacReadDev 来设置是通过U盘还是SD卡读取MAC信息。这个环境变量可以在project/image/configs/i2m/script_nand.mk(nor flash 的话就是script_nor.mk)中设置:
在这里插入图片描述

如果不想按回车才执行烧录,而是直接开机即烧录,可以修改bootargs:
在这里插入图片描述

双网口的情况
由于平台的MAC地址只针对eth0,因此eth1需要在系统起来后使用ifconfig命令设置,例如:

ifconfig eth1 hw ether 00:70:27:00:00:03

一般情况下,eth0和eth1的MAC地址应该是连续的,所以我们可以在eth0的MAC地址上递增1,比如eth0的MAC地址是00:70:27:00:00:01,那eth1的MAC地址应该设置为00:70:27:00:00:02。
上面的逻辑,可以通过以下脚本set_eth1_mac.sh来实现:
#!/bin/sh
ETH0_ADDR=ifconfig eth0 | grep eth0 | awk '{print $5}' | sed 's/:/ /g'
echo $ETH0_ADDR
BYTE1=16#echo $ETH0_ADDR | awk '{print $1}'
BYTE2=16#echo $ETH0_ADDR | awk '{print $2}'
BYTE3=16#echo $ETH0_ADDR | awk '{print $3}'
BYTE4=16#echo $ETH0_ADDR | awk '{print $4}'
BYTE5=16#echo $ETH0_ADDR | awk '{print $5}'
BYTE6=16#echo $ETH0_ADDR | awk '{print $6}'
echo " $BYTE1 $BYTE2 $BYTE3 $BYTE4 $BYTE5 $BYTE6"
VALUE=0x00
let “VALUE=(BYTE1<<40)+(BYTE2<<32)+(BYTE3<<24)+(BYTE4<<16)+(BYTE5<<8)+(BYTE6<<0)”
printf “0X%X\n” $VALUE
let “VALUE=VALUE+1”
printf “0X%X\n” $VALUE
NEW_BYTE1=16#0x00
NEW_BYTE2=16#0x00
NEW_BYTE3=16#0x00
NEW_BYTE4=16#0x00
NEW_BYTE5=16#0x00
NEW_BYTE6=16#0x00
let “NEW_BYTE1=(VALUE>>40)&0xFF”
let “NEW_BYTE2=(VALUE>>32)&0xFF”
let “NEW_BYTE3=(VALUE>>24)&0xFF”
let “NEW_BYTE4=(VALUE>>16)&0xFF”
let “NEW_BYTE5=(VALUE>>8)&0xFF”
let “NEW_BYTE6=(VALUE>>0)&0xFF”
#printf “new value: %0.2X:%0.2X:%0.2X:%0.2X:%0.2X:%0.2X\n” $NEW_BYTE1 $NEW_BYTE2 $NEW_BYTE3 $NEW_BYTE4 $NEW_BYTE5 $NEW_BYTE6
ETH1_ADDR=printf "%0.2X:%0.2X:%0.2X:%0.2X:%0.2X:%0.2X" $NEW_BYTE1 $NEW_BYTE2 $NEW_BYTE3 $NEW_BYTE4 $NEW_BYTE5 $NEW_BYTE6
echo set eth1_addr:$ETH1_ADDR
ifconfig eth1 hw ether $ETH1_ADDR up
我们将set_eth1_mac.sh放到project/image/rootfs/rootfs.tar.gz的etc/init.d中。接着修改project/image/configs/i2m/rootfs.mk,把set_eth1_mac.sh的执行放到etc/profile中:
在这里插入图片描述

这样,每次系统启动后,就会自动地去设置eth1的MAC地址了。
当然,有了2个网口后,MAC地址的更新不再是递增1了,而是递增2,所以我们需要修改common/cmd_mster.c:
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值