将 MAC 地址转换为 Motorola S-Records
发布于 2008 年 6 月 2 日
如果您从事嵌入式编程,您可能熟悉 Motorola S-Records。 以下脚本接受 MAC 地址并输出 S-Record 数据。
给定一个 MAC 地址,该脚本输出 S-Record 数据
# sh macid.sh 00:11:22:33:44:55 S00D0000333737382D322E746D703B S1090000001122334455F7 S9030000FC可以选择指定一个地址来重新设置 S-Record 数据的基址,以及一个输出文件名来写入 S-Records
# sh macid.sh --address 0xffff0000 --output ma 00:11:22:33:44:55 # cat ma S00D0000333733302D322E746D7047 S30BFFFF0000001122334455F7 S705FFFF0000FC脚本如下
#!/bin/bash
mac_addr_pattern='^[0-9a-fA-F]{2}[-:]'
mac_addr_pattern+='[0-9a-fA-F]{2}[-:]'
mac_addr_pattern+='[0-9a-fA-F]{2}[-:]'
mac_addr_pattern+='[0-9a-fA-F]{2}[-:]'
mac_addr_pattern+='[0-9a-fA-F]{2}[-:]'
mac_addr_pattern+='[0-9a-fA-F]{2}'
address_pattern='^(0x)?[0-9a-fA-F]{8}$'
######################################################################
function usage()
{
if [[ "$*" ]]; then echo $* >&2; fi
cat >&2 <<EOU
Usage: $0 OPTIONS MAC-ADDRESS
--address ADDRESS Address in FLASH of serial number or MAC Id.
--output FILE Output file.
EOU
exit 1
}
######################################################################
trap "rm -f $$-?.tmp" EXIT
output_file=
while [[ "$1" ]]
do
case "$1" in
--address)
shift
if [[ ! "$1" ]]; then usage "Missing address"; fi
address=$1
if ! grep --silent -P "$address_pattern" <<<$address; then
usage "Invalid address: $address"
fi
;;
--output)
shift
if [[ ! "$1" ]]; then usage "Missing output file name"; fi
output_file=$1
;;
*)
mac_addr=$1
shift
if [[ "$1" ]]; then usage "Unexpected argument: $1"; fi
if ! grep --silent -P "$mac_addr_pattern" <<<$mac_addr; then
usage "Invalid mac address: $mac_addr"
fi
;;
esac
shift
done
if [[ ! "$mac_addr" ]]; then usage "Missing mac address"; fi
mac_addr=${mac_addr/:/ }
mac_addr=${mac_addr/-/ }
echo "0000: $mac_addr" | xxd -r >$$-1.tmp
opt=
if [[ "$address" ]]; then opt="--change-addresses $address"; fi
objcopy $opt -I binary -O srec $$-1.tmp $$-2.tmp
if [[ "$output_file" ]]; then
mv $$-2.tmp $output_file
else
cat $$-2.tmp
fi
# vim: tabstop=4: shiftwidth=4: noexpandtab:
# kate: tab-width 4; indent-width 4; replace-tabs false;