提示:作为Espressif(乐鑫科技)大中华区合作伙伴及sigmastar(厦门星宸)VAD合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考。同时也用心整理了乐鑫及星宸科技的新产品、新方案的主要特点及应用!希望你能第一时间了解并快速用上好的方案和产品!
SSD202核心板Rootfs下如何烧录mac地址:
一、uboot下默认mac地址
uboot下面默认mac地址的设定 MAC Address 00:30:1B:BA:02:DB boot\drivers\mstar\emac\mdrv_emac.c 中默认值 u8 MY_MAC[6] = { 0x00, 0x30, 0x1B, 0xBA, 0x02, 0xDB };
SSD202 Rootfs下烧录mac地址:
注意:本文主要介绍,在系统启动后通过SD卡或U盘的方式,批量烧录mac地址。
概述:上电进入系统后,自启SD卡中的脚本,通过脚本文件往boot下的环境变量写mac地址。每次写完往后加1。就可以实现批量烧录mac地址了。
只要在不重新烧录uboot的情况下,更新固件,mac地址是不会被覆盖的。
一、开机自动执行SD卡中的脚本
我们可以在/customer/demo.sh中添加相应的自启脚本。系统启动后就自动执行burn_mac.sh进行烧写mac地址。
二、mac烧写脚本
脚本工作原理
脚本执行后,读取/sdcard/mac_current中的mac的起始地址,通过/etc/fw_setenv向uboot中的环境变量,写入mac地址,并将写入的地址记录在/sdcard/mac_record.txt中。每次烧写完成后,向后加1,在烧写一下块核心板时,从新的mac地址开始。并且在烧录mac地址前,校验当前设备是否已经烧录过地址了(具体可自定义判断规则),防止重复烧录。
烧写脚本
烧写脚本如下:
!](https://img-blog.csdnimg.cn/direct/7604185b952941c0a3a57e0aefdf4931.png)
#!/bin/sh
MAC_CURNNET=/sdcard/mac_current
MAC_RECORD=/sdcard/mac_record.txtburn_ok() {echo 14 > /sys/class/gpio/exportecho out > /sys/class/gpio/gpio14/directionfor i in 1 2 3 doecho 1 > /sys/class/gpio/gpio14/valuesleep 0.5echo 0 > /sys/class/gpio/gpio14/valuesleep 0.5doneecho "------------------> burn_ok"
}burn_fail() {echo 14 > /sys/class/gpio/exportecho out > /sys/class/gpio/gpio14/directionecho 1 > /sys/class/gpio/gpio14/valuesleep 5echo 0 > /sys/class/gpio/gpio14/valueecho "------------------> burn fail"
}have_burn() {echo 14 > /sys/class/gpio/exportecho out > /sys/class/gpio/gpio14/directionfor i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20doecho 1 > /sys/class/gpio/gpio14/valuesleep 2echo 0 > /sys/class/gpio/gpio14/valuesleep 2doneecho "------------------> have burn"
}burn_mac() {#mount /dev/mmcblk0p1 /sdcard -o iocharset=utf8 if [ ! -f $MAC_CURNNET ]; thenbufn_failumount /sdcardexit 0fi#mac_current=88:A9:A7:00:77:40#mac_current=`echo 88:A9:A7:00:FF:FF | sed 's/:/ /g'`mac_current=`cat $MAC_CURNNET | sed 's/:/ /g'`if [ "${mac_current}" == "" ]; thenburn_failexit 1fiecho "mac_current=$mac_current"#burnmac_current_burn=`cat $MAC_CURNNET`//这里烧录到08:FC:52:AC:F9:00截止if [ "${mac_current_burn}" == "08:FC:52:AC:F9:00" ]; then# this card only burn 500 pcsburn_failexit 1fi/etc/fw_setenv ethaddr ${mac_current_burn}#recordecho "$mac_current_burn" >> $MAC_RECORDBYTE1=16#`echo $mac_current | awk '{print $1}'`BYTE2=16#`echo $mac_current | awk '{print $2}'`BYTE3=16#`echo $mac_current | awk '{print $3}'`BYTE4=16#`echo $mac_current | awk '{print $4}'`BYTE5=16#`echo $mac_current | awk '{print $5}'`BYTE6=16#`echo $mac_current | awk '{print $6}'`VALUE=0x00let "VALUE=(BYTE1<<40)+(BYTE2<<32)+(BYTE3<<24)+(BYTE4<<16)+(BYTE5<<8)+(BYTE6<<0)"let "VALUE=VALUE+1"NEW_BYTE1=16#0x00NEW_BYTE2=16#0x00NEW_BYTE3=16#0x00NEW_BYTE4=16#0x00NEW_BYTE5=16#0x00NEW_BYTE6=16#0x00let "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"mac_new=`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 "mac_new=$mac_new"echo -n "$mac_new" > $MAC_CURNNET#/etc/fw_setenv bootcmd 'dcache on; gpio out 45 0; gpio out 11 0; gpio out 38 1; ext4load mmc 0:2 0x22000000 /boot/uImage; gpio out 38 0; bootm 0x22000000; reset'sync#umount /sdcardsyncburn_ok
}mac_dev=`/etc/fw_printenv | grep ethaddr`
if [ "${mac_dev}" == "" -o "${mac_dev}" == "ethaddr=00:30:1b:ba:02:db" ]; thenburn_mac
elseecho "this device has been burn mac, skip..."have_burn
fi
将mac_record.txt、mac_current、burn_mac.sh拷贝到SD卡中。
mac_record.txt:新建一个空的txt,用于记录烧写的mac地址。
mac_current:存放起始地址文件,例如mac_current里写入88:A9:A7:00:77:40,则会从88:A9:A7:00:77:40开始写入mac地址。
上电后就自动读取SD卡中的脚本,进行烧录MAC地址。