Convert a MAC Address to Motorola S-Records
June 2nd, 2008 by Mitch Frazier in
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;
Mitch Frazier is an Associate Editor for Linux Journal and the Web Editor for linuxjournal.com.
Special Magazine Offer -- Free Gift with Subscription
Receive a free digital copy of Linux Journal's System Administration Special Edition as well as instant online access to current and past issues. CLICK HERE for offer
Linux Journal: delivering readers the advice and inspiration they need to get the most out of their Linux systems since 1994.
Subscribe now!
The Latest
Newsletter
Tech Tip Videos
- Nov-19-09
- Nov-04-09
Recently Popular
From the Magazine
December 2009, #188
If last month's Infrastrucuture issue was too "big" for you then try on this month's Embedded issue. Find out how to use Player for programming mobile robots, build a humidity controller for your root cellar, find out how to reduce the boot time of your embedded system, and if you're new to embedded systems find out the basics that go into one. You can also read about the Beagle Board, the Mesh Potato and a spate of other interestingly named items. And along with our regular columns don't miss our new monthly column: Economy Size Geek.
Delicious
Digg
StumbleUpon
Reddit
Facebook








Post new comment