Convert a MAC Address to Motorola S-Records
on June 2, 2008
If you do embedded programming you're probably familiar with Motorola S-Records. This following script takes a MAC Address and outputs S-Record data.
Given a MAC Address the script outputs S-Record data:
# sh macid.sh 00:11:22:33:44:55 S00D0000333737382D322E746D703B S1090000001122334455F7 S9030000FCOptionally, you can specify an address for re-basing the S-Record data and an output file name to write the S-Records to:
# sh macid.sh --address 0xffff0000 --output ma 00:11:22:33:44:55 # cat ma S00D0000333733302D322E746D7047 S30BFFFF0000001122334455F7 S705FFFF0000FCThe script follows:
#!/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;