blob: 3124088b63ea19e861602a1d13ecc93ef5a34991 [file] [log] [blame]
#!/bin/sh
usage()
{
echo "This is a script to get or set mtk factory's data"
echo "-Typically, get or set the eth lan/wan mac_address-"
echo "Usage1: $0 <op> <side> [mac_address] "
echo " <op>: -r or -w (Read or Write action)"
echo " [mac_address]: MAC[1] MAC[2] MAC[3] MAC[4] MAC[5] MAC[6] (only for write action)"
echo "Usage2: $0 <op> <length> <offset> [data] "
echo " <length>: length bytes of input"
echo " <offset>: Skip offset bytes from the beginning of the input"
echo "Usage3: $0 -o <length> <get_from> <overwrite_to>"
echo "Example:"
echo "$0 -w lan 00 0c 43 68 55 56"
echo "$0 -r lan"
echo "$0 -w 8 0x22 11 22 33 44 55 66 77 88"
echo "$0 -r 8 0x22"
echo "$0 -o 12 0x24 0x7fff4"
exit 1
}
factory_name="Factory"
factory_mtd=/dev/$(grep -i ''${factory_name}'' /proc/mtd | cut -c 1-4)
#default:7622
lan_mac_offset=0x2A
wan_mac_offset=0x24
case `cat /tmp/sysinfo/board_name` in
*7621*ax*)
# 256k - 12 byte
lan_mac_offset=0x3FFF4
wan_mac_offset=0x3FFFA
;;
*7621*)
lan_mac_offset=0xe000
wan_mac_offset=0xe006
;;
*7622*)
#512k -12 byte
lan_mac_offset=0x7FFF4
wan_mac_offset=0x7FFFA
;;
*7623*)
lan_mac_offset=0x1F800
wan_mac_offset=0x1F806
;;
*7988*)
#1024k - 18 byte
lan2_mac_offset=0xFFFEE
lan_mac_offset=0xFFFF4
wan_mac_offset=0xFFFFA
;;
*)
lan_mac_offset=0x2A
wan_mac_offset=0x24
;;
esac
#1.Read the offset's data from the Factory
#usage: Get_offset_data length offset
Get_offset_data()
{
local length=$1
local offset=$2
hexdump -v -n ${length} -s ${offset} -e ''`expr ${length} - 1`'/1 "%02x-" "%02x "' ${factory_mtd}
}
overwrite_data=
Get_offset_overwrite_data()
{
local length=$1
local offset=$2
overwrite_data=`hexdump -v -n ${length} -s ${offset} -e ''\`expr ${length} - 1\`'/1 "%02x " " %02x"' ${factory_mtd}`
}
#2.Write the offset's data from the Factory
#usage: Set_offset_data length offset data
Set_offset_data()
{
local length=$1
local offset=$2
local index=`expr $# - ${length} + 1`
local data=""
for j in $(seq ${index} `expr ${length} + ${index} - 1`)
do
temp=`eval echo '$'{"$j"}`
data=${data}"\x${temp}"
done
dd if=${factory_mtd} of=/tmp/Factory.backup
printf "${data}" | dd conv=notrunc of=/tmp/Factory.backup bs=1 seek=$((${offset}))
mtd write /tmp/Factory.backup ${factory_name}
rm -rf /tmp/Factory.backup
}
#3.Read Factory lan/wan mac address
GetMac()
{
if [ "$1" == "lan" ]; then
#read lan mac
Get_offset_data 6 ${lan_mac_offset}
elif [ "$1" == "lan2" ]; then
#read lan2 mac
Get_offset_data 6 ${lan2_mac_offset}
elif [ "$1" == "wan" ]; then
#read wan mac
Get_offset_data 6 ${wan_mac_offset}
else
usage
exit 1
fi
}
#4.write Factory lan/wan mac address
SetMac()
{
if [ "$#" != "9" ]; then
echo "Mac address must be 6 bytes!"
exit 1
fi
if [ "$1" == "lan" ]; then
#write lan mac
Set_offset_data 6 ${lan_mac_offset} $@
elif [ "$1" == "lan2" ]; then
#write lan2 mac
Set_offset_data 6 ${lan2_mac_offset} $@
elif [ "$1" == "wan" ]; then
#write wan mac
Set_offset_data 6 ${wan_mac_offset} $@
else
usage
exit 1
fi
}
#usage:
# 1. Set/Get the mac_address: mtk_factory -r/-w lan/wan /data
# 2. Set/Get the offset data: mtk_factory -r/-w length offset /data
# 3. Overwrite from offset1 to offset2 by length byte : mtk_factory -o length from to
if [ "$1" == "-r" ]; then
if [ "$2" == "lan" -o "$2" == "lan2" -o "$2" == "wan" ]; then
GetMac $2
elif [ "$2" -eq "$2" ]; then
Get_offset_data $2 $3
else
echo "Unknown command!"
usage
exit 1
fi
elif [ "$1" == "-w" ]; then
if [ "$2" == "lan" -o "$2" == "lan2" -o "$2" == "wan" ]; then
SetMac $2 $@
else
Set_offset_data $2 $3 $@
fi
elif [ "$1" == "-o" ]; then
Get_offset_overwrite_data $2 $3
Set_offset_data $2 $4 ${overwrite_data}
else
echo "Unknown command!"
usage
exit 1
fi