#!/bin/sh # # (re)install ovms # # You can restore a backup after this completes using the serial console: # # config restore /sd/ZIPFILE PASS # prog="`basename $0`" L2="v3-30" L3="v3-35" baud=921600 debug=0 dryrun=0 erase=0 force=0 layout="${L2}" server="ovms.dexters-web.de" train="edge" verbose=0 version="v3.3" usage() { echo "usage: ${prog} [-denv] [-l LAYOUT] TTY" 2>&1 echo " -b serial aud rate (default: ${baud})" 2>&1 echo " -d enable debugging" 2>&1 echo " -e erase flash" 2>&1 echo " -f reinstall without confirmation prompt" 2>&1 echo " -n dryrun (no changes)" 2>&1 echo " -v verbose messages" 2>&1 echo " -l partition layout (default: ${layout})" 2>&1 echo " -s server (default: ${server})" 2>&1 echo " -t train (default: ${train})" 2>&1 exit 1 } run() { local _cmd _cmd="$@" if [ ${verbose} -ne 0 ]; then echo "+ ${_cmd}" fi if [ ${dryrun} -eq 0 ]; then sh -c "${_cmd}" return $? fi return 0 } # Return 1 when confirmed doconfirm() { while true; do echo -n \ "Warning: Are you sure you want to reinstall the module? " read confirm case "${confirm}" in yes) ;; ''|y|ye) echo "Please enter yes or no" continue ;; *) return 0 ;; esac break done return 1 } for fn in esptool.py wget; do which ${fn} >/dev/null 2>&1 if [ $? -ne 0 ]; then echo "${prog}: ${fn}: not found" 1>&2 exit 1 fi done while getopts defnvb:l:s:t: opt ; do case "$opt" in b) baud="${OPTARG}" ;; d) debug=$((${debug} + 1)) ;; e) erase=1 ;; f) force=1 ;; l) layout="${OPTARG}" ;; n) dryrun=1 verbose=1 ;; v) verbose=1 ;; s) server="${OPTARG}" ;; t) train="${OPTARG}" ;; ?) usage ;; esac done case "${layout}" in ${L2}) # Supported ;; ${L3}) echo "${prog}: ${layout} not implemented" 1>&2 exit 1 ;; *) echo "${prog}: Unknown partition layout" 1>&2 exit 1 ;; esac shift $((${OPTIND} - 1)) if [ $# -ne 1 ]; then usage fi tty=$1 shift if [ ! -e ${tty} ]; then echo "${prog}: ${tty}: not found" 1>&2 exit 1 fi if [ ! -w ${tty} ]; then echo "${prog}: ${tty}: not writable" 1>&2 exit 1 fi url="https://${server}/firmware/ota/${version}/${train}" echo ">> Using ${url}" 1>&2 if [ ${dryrun} -eq 0 ]; then bootloader="`mktemp /tmp/${prog}.bootloader.XXXXXX`" firmware="`mktemp /tmp/${prog}.firmware.XXXXXX`" partitions="`mktemp /tmp/${prog}.partitions.XXXXXX`" chmod +r ${bootloader} ${firmware} ${partitions} fi cleanup() { rm -f ${bootloader} ${firmware} ${partitions} ; exit 1 } die() { echo ">> Failed!" cleanup exit 1 } trap 'cleanup ; exit 1' 1 2 3 15 # Download echo ">> Downloading" wget="wget -q --show-progress --progress=bar:force:noscroll" run ${wget} -O ${bootloader} ${url}/bootloader.bin || die run ${wget} -O ${firmware} ${url}/ovms3.bin || die run ${wget} -O ${partitions} ${url}/partitions.bin || die if [ ${force} -eq 0 -a ${dryrun} -eq 0 ]; then doconfirm fi if [ ${erase} -ne 0 ]; then run esptool.py \ --chip esp32 --port ${tty} --baud ${baud} \ erase_region ${loaddr} ${hiaddr} 0xC10000 0x100000 || die fi run esptool.py \ --chip esp32 --port ${tty} --baud ${baud} \ --before "default_reset" --after "hard_reset" \ write_flash --compress --flash_mode "dio" \ --flash_freq "40m" --flash_size detect \ 0x1000 ${bootloader} 0x10000 ${firmware} 0x8000 ${partitions} || die echo ">> Success!" cleanup exit 1