注:以下是针对单网口且MAC地址连续(一般批量MAC都是连续的)的情况,如果是双网口,请参考最后双网口的配置。

烧录原理

1、SSD20X平台的MAC地址保存于”ethaddr”这个环境变量中,我们可以通过在Uboot中设置该环境变量,从而设置MAC地址。

android mac地址烧录工具 烧录网卡的mac地址_ssd201

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中:

android mac地址烧录工具 烧录网卡的mac地址_SSD20x_02


android mac地址烧录工具 烧录网卡的mac地址_ssd201_03

6、烧录的操作是在common/autoboot.c中调用的:

android mac地址烧录工具 烧录网卡的mac地址_SSD20x_04

烧录办法

有2种烧录办法,一种是通过SD卡烧录,另一种是通过U盘烧录。要求SD卡和U盘都是FAT32格式:

android mac地址烧录工具 烧录网卡的mac地址_ssd202_05

打补丁
烧录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的一系列文件:

android mac地址烧录工具 烧录网卡的mac地址_ssd202_06

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

setenv MacReadDev usb

saveenv

android mac地址烧录工具 烧录网卡的mac地址_android mac地址烧录工具_07

按住回车键再上电,进入uboot命令行之前,mac地址会烧录完毕。

一些建议

通过设置环境变量MacReadDev 来设置是通过U盘还是SD卡读取MAC信息。这个环境变量可以在project/image/configs/i2m/script_nand.mk(nor flash 的话就是script_nor.mk)中设置:

android mac地址烧录工具 烧录网卡的mac地址_SSD20x_08

如果不想按回车才执行烧录,而是直接开机即烧录,可以修改bootargs:

android mac地址烧录工具 烧录网卡的mac地址_ssd201_09

双网口的情况
由于平台的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中:

android mac地址烧录工具 烧录网卡的mac地址_ssd202_10

这样,每次系统启动后,就会自动地去设置eth1的MAC地址了。

当然,有了2个网口后,MAC地址的更新不再是递增1了,而是递增2,所以我们需要修改common/cmd_mster.c:

android mac地址烧录工具 烧录网卡的mac地址_android mac地址烧录工具_11