将 MAC 地址转换为 Motorola S-Records

作者:Mitch Frazier

如果您从事嵌入式编程,您可能熟悉 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;

Mitch Frazier 是 Emerson Electric Co. 的一名嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是Linux Journal 的贡献者和朋友。

加载 Disqus 评论