meta-sysmocom-bsp/recipes-sysmobts/sysmobts2100-devtools/files/uartboot

200 lines
5.1 KiB
Bash
Executable File

#!/bin/bash
# This script allows litecell uart serial boot with specified MLO+u-boot files
# Requirements: printf, wc, stty, sx, dd, microcom (tested on ubuntu 12.04LTS)
MYVERSION=1.0.0
TMPHEADER=""
myDEV="/dev/ttyUSB0"
CHECKMODE=0
TERMMODE=0
# maximum size in flash sectors allowed for MLO and u-boot components
MAXMLOSIZE=131072
MAXUBOOTSIZE=524288
int2header() {
local i=4026728450
local f
printf -v f '\\x%02x\\x%02x\\x%02x\\x%02x' $((i&255)) $((i >> 8 & 255)) $((i >> 16 & 255)) $((i >> 24 & 255))
if test $? -ne 0 ; then my_exit 21; fi;
printf "$f" > $2
if test $? -ne 0 ; then my_exit 22; fi;
i=$1
printf -v f '\\x%02x\\x%02x\\x%02x\\x%02x' $((i&255)) $((i >> 8 & 255)) $((i >> 16 & 255)) $((i >> 24 & 255))
if test $? -ne 0 ; then my_exit 23; fi;
printf "$f" >> $2
if test $? -ne 0 ; then my_exit 24; fi;
}
function log_write()
{
echo "$*"
}
function log_write_nr()
{
echo -n "$*"
}
function __sig_int {
log_write "WARNING: SIGINT caught"
my_exit 110
}
function __sig_quit {
log_write "WARNING: SIGQUIT caught"
my_exit 111
}
function __sig_term {
log_write "WARNING: SIGTERM caught"
my_exit 112
}
function __sig_hup {
log_write "WARNING: SIGHUP caught"
my_exit 113
}
function my_exit()
{
trap - SIGINT
trap - SIGQUIT
trap - SIGTERM
trap - SIGHUP
sync
if [ ! "$TMPHEADER" == "" ] ; then
rm -f "$TMPHEADER"
fi
if [ $* -eq 0 ] ; then
log_write "Success"
else
log_write "Exit error code: $*"
fi
exit $*
}
function show_help {
log_write "uartboot $MYVERSION help information:"
log_write "uartboot [ [ -c | -t ] | -p dev | --help ] [ mlofile ubootfile ]"
log_write "where mlofile # mlo serial binary file location (u-boot-spl.bin)"
log_write " ubootfile # u-boot image file location (u-boot.img)"
log_write " options: --help # displays update help"
log_write " -p dev # serial device Port to use (default: $myDEV)"
log_write " -c # Checks for rom download 'VA' string"
log_write " -t # restarts Terminal (once booted)"
}
function start_term {
microcom -p $myDEV -s 115200
my_exit $?
}
function setup_term {
if [ "$*" == "1" ] ; then
stty -F $myDEV raw -echo -echoe -echok parenb -parodd -cstopb cs8 -ixon -ixoff -crtscts 115200
else
stty -F $myDEV raw -echo -echoe -echok -parenb -parodd -cstopb cs8 -ixon -ixoff -crtscts 115200
fi
if test $? -ne 0 ; then my_exit 30; fi;
}
# Set TRAPs to cleanup if forced to exit
trap __sig_int SIGINT
trap __sig_quit SIGQUIT
trap __sig_term SIGTERM
trap __sig_hup SIGHUP
# default runmode is remote and no reboot at the end
TOTALARG=$#
while getopts :cp:t- FLAG; do
case $FLAG in
c)
CHECKMODE=1
;;
t)
TERMMODE=1
;;
p)
myDEV=$OPTARG
if ! test -c "$myDEV" ; then
log_write "Device $myDEV cannot be accessed!"
my_exit 14
fi;;
'-')
show_help
my_exit 0;;
\?)
log_write "Invalid option: -$OPTARG" && my_exit 1;;
\:)
log_write "Required argument not found for option: -$OPTARG" && my_exit 2;;
esac
done
# removes processed option(s) from the cmd line args
shift $((OPTIND-1))
# test if we entered any arguments (default get help)
if [ $TOTALARG -eq 0 ] ; then
show_help
my_exit 0
elif ( [ "$CHECKMODE" -eq "1" ] || [ "$TERMMODE" -eq "1" ] ) ; then
setup_term "$CHECKMODE"
start_term
elif [ $# -eq 2 ] ; then
myMLO="$1"
myUBOOT="$2"
if ! test -f "$myMLO" ; then
log_write "MLO file $myMLO cannot be accessed!"
my_exit 4
fi
if ! test -f "$myUBOOT" ; then
log_write "U-boot file $myUBOOT cannot be accessed!"
my_exit 5
fi
else
log_write "Missing or invalid combination of arguments!"
my_exit 3
fi
TMPHEADER=$(mktemp)
if [ $? -ne 0 ]; then
log_write "mktemp fail!"
my_exit 6
fi
log_write "tmp file created: $TMPHEADER"
mlofile_size=`wc -c < "$myMLO"`
if [ $mlofile_size -gt $MAXMLOSIZE ] ; then
log_write "MLO file size bigger than expected: $mlofile_size max: $MAXMLOSIZE"
my_exit 7
fi
ubfile_size=`wc -c < "$myUBOOT"`
if [ $ubfile_size -gt $MAXUBOOTSIZE ] ; then
log_write "U-boot file size bigger than expected: $ubfile_size max: $MAXUBOOTSIZE"
my_exit 8
fi
int2header $mlofile_size "$TMPHEADER"
log_write "MLO: $myMLO, size: $mlofile_size"
log_write "Setting port $myDEV for MLO download..."
setup_term "1"
if test $? -ne 0 ; then my_exit 9; fi;
log_write "Sending header..."
dd if="$TMPHEADER" of=$myDEV bs=1 count=8 obs=1 ibs=1
if test $? -ne 0 ; then my_exit 10; fi;
log_write "Sending MLO..."
dd if="$myMLO" of=$myDEV bs=1 count=$mlofile_size obs=1 ibs=1
if test $? -ne 0 ; then my_exit 11; fi;
log_write "U-boot: $myUBOOT, size: $ubfile_size"
log_write "Setting port $myDEV for u-boot download..."
setup_term
if test $? -ne 0 ; then my_exit 12; fi;
log_write "Sending u-boot..."
sx "$myUBOOT" > $myDEV < $myDEV
if test $? -ne 0 ; then my_exit 13; fi;
log_write "Starting microcom terminal..."
start_term