【启明智显技术分享】SSD202核心板Rootfs下如何烧录mac地址

提示:作为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.txt

burn_ok() {
	echo 14 > /sys/class/gpio/export
	echo out > /sys/class/gpio/gpio14/direction

	for i in 1 2 3 
	do
		echo 1 > /sys/class/gpio/gpio14/value
		sleep 0.5
		echo 0 > /sys/class/gpio/gpio14/value
		sleep 0.5
	done

	echo "------------------> burn_ok"
}

burn_fail() {
	echo 14 > /sys/class/gpio/export
	echo out > /sys/class/gpio/gpio14/direction
	echo 1 > /sys/class/gpio/gpio14/value
	sleep 5
	echo 0 > /sys/class/gpio/gpio14/value
	echo "------------------> burn fail"
}

have_burn() {
	echo 14 > /sys/class/gpio/export
	echo out > /sys/class/gpio/gpio14/direction

	for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
	do
		echo 1 > /sys/class/gpio/gpio14/value
		sleep 2
		echo 0 > /sys/class/gpio/gpio14/value
		sleep 2
	done

	echo "------------------> have burn"
}

burn_mac() {
	#mount /dev/mmcblk0p1 /sdcard -o iocharset=utf8	
	
	if [ ! -f $MAC_CURNNET ]; then
		bufn_fail
		umount /sdcard
		exit 0
	fi

	#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}" == "" ]; then
		burn_fail
		exit 1
	fi
	echo "mac_current=$mac_current"
	#burn
	mac_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 pcs
		burn_fail
		exit 1
	fi
	/etc/fw_setenv ethaddr ${mac_current_burn}
	#record
	echo "$mac_current_burn" >> $MAC_RECORD
  
	BYTE1=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=0x00
	let "VALUE=(BYTE1<<40)+(BYTE2<<32)+(BYTE3<<24)+(BYTE4<<16)+(BYTE5<<8)+(BYTE6<<0)"
	let "VALUE=VALUE+1"
	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"
	
	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 /sdcard
	sync
	burn_ok
}

mac_dev=`/etc/fw_printenv | grep ethaddr`
if [ "${mac_dev}" == "" -o "${mac_dev}" == "ethaddr=00:30:1b:ba:02:db" ]; then
	burn_mac
else
	echo "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地址。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值