#!/usr/bin/kermit + # Disable input echo # (change this to 'on' for debug) set input echo off assign prog "\fbasename(\%0)" assign dev "/dev/ttyUSB0" assign brate "115200" assign flaaddr "0x9f000000" assign ramaddr "0x80800000" assign waitstr "Hit any key to stop booting" assign stopstr " \10" assign prompt "u-boot> " assign skipopt "(use '-' to skip and use default)" assign filesz 0 assign bckpsz 0 assign eraseszhex 0x0 # ============= # Custom macros # ============= def usage { echo "Usage:" echo " \m(prog) [dev] [brate] [waitstr] [stopstr] [prompt]" echo echo "Arguments:" echo " file image file to send (required)" echo " dev serial device (optional, default: '\m(dev)')" echo " brate baudrate (optional, default: '\m(brate)')" echo " waitstr string to wait for before sending 'stopstr' (optional, default: '\m(waitstr)')" echo " stopstr auto boot interrupt string (optional, default: '')" echo " for special characters, use \\x, where x is ASCII code (e.g. for use \\27)" echo " prompt command line prompt string in U-Boot (optional, default: '\m(prompt)')" echo echo "Skip optional argument with '-', example:" echo " \m(prog) u-boot.bin - - - 'tpl' 'ar7240>'" echo } def echo_err { if defined \%1 echo "[ERRO]: \%1!" exit 1 } def echo_info { if defined \%1 echo "[INFO]: \%1" } def echo_ok { if defined \%1 echo "[ OK ]: \%1" } def askuser { echo ask \%m ">>>>>> \%1 (type 'y' to continue)? " if not defined \%m exit 0 else if not equal \%m "y" exit 0 echo } def argsummary { echo_info "File to send: '\m(file)'" echo_info "Serial device: '\m(dev)'" echo_info "Baudrate: '\m(brate)'" echo_info "CLI prompt: '\m(prompt)'" echo_info "Wait string: '\m(waitstr)'" echo echo_info "File size: '\m(filesz)'" echo_info "Backup size: '\m(bckpsz)' (rounded up to 64K block)" echo_info "Erase size: '\m(eraseszhex)' (hex)" askuser "Do you want to continue" } def waitpromt { assign tout 3 if defined \%1 assign tout \%1 input \m(tout) "\m(prompt)" if fail echo_err "Timeout occurred waiting for prompt string" } def interrupt { input 15 "\m(waitstr)" if fail echo_err "Timeout occurred waiting for wait string" out "\m(stopstr)" waitpromt } def cmdtest { lineout "?" input 2 "\fpattern(\%1*-*\10)" if fail echo_err "Command '\%1' is not available" waitpromt } def checkretval { lineout "echo $?" input 3 "\fpattern(0*\10)" if fail echo_err "\%1" waitpromt } def sendcmd { echo_info "Sending command: '\%1'" lineout "\%1" } # ===================== # Execution begins here # ===================== # We need 7 args if < \v(argc) 7 { usage exit 1 } # File to send if not defined \%1 { usage echo_err "U-Boot image file not specified" } assign file \%1 if not exist \m(file) { usage echo_err "Specified file: '\m(file)' does not exist" } assign filesz \fsize(\m(file)) if fail { usage echo_err "Incorrect file specified: '\m(file)'" } assign i \Feval(\m(filesz) / 65536) assign bckpsz \Feval(\m(i) * 65536) if > \m(filesz) \m(bckpsz) { assign i \Feval((\m(filesz) / 65536) + 1) assign bckpsz \Feval(\m(i) * 65536) } assign eraseszhex "0x\fn2hex(\m(bckpsz))" if fail echo_err "Could not convert erase size to hex" # Serial device if not defined \%2 { usage echo_err "Serial device not specified \m(skipopt)" } else if not equal \%2 "-" assign dev \%2 set line \m(dev) if fail { usage echo_err "Incorrect serial device specified: '\m(dev)'" } # Baudrate if not defined \%3 { usage echo_err "Baudrate not specified \m(skipopt)" } else if not equal \%3 "-" assign brate \%3 set speed \m(brate) if fail { usage echo_err "Incorrect baudrate specified: '\m(brate)'" } # Wait for string if not defined \%4 { usage echo_err "Wait string not specified \m(skipopt)" } else if not equal \%4 "-" assign waitstr \%4 # Stop string if not defined \%5 { usage echo_err "Stop string not specified \m(skipopt)" } else if not equal \%5 "-" assign stopstr \%5 # CLI prompt if not defined \%6 { usage echo_err "U-Boot CLI prompt not specified \m(skipopt)" } else if not equal \%6 "-" assign prompt \%6 argsummary # Default configuration robust set serial 8n1 set file type bin set carrier-watch off set prefixing all set flow-control none set handshake none set modem none set window 10 set send packet-length 1000 echo_info "Power on device now..." interrupt # Check if we have 'echo' and 'loadb' commands cmdtest "echo" cmdtest "loadb" # Backup existing image in RAM (round up to 64K block) echo_info "Backuping data in RAM..." sendcmd "cp.b \m(flaaddr) \m(ramaddr) \m(eraseszhex)" waitpromt 5 checkretval "Could not backup data in RAM" # Start loadb sendcmd "loadb \m(ramaddr)" input 3 "\fpattern(Ready for binary*download*\10)" if fail echo_err "Timeout occurred waiting for binary download ready" # Send file to RAM echo_info "Sending selected file to RAM at \m(ramaddr) (this may take a while)..." send /quiet "\m(file)" if = \v(status) 1 echo_err "File send failed" waitpromt checkretval "File send failed" askuser "File sent successfully, do you want to write it to FLASH" # Erase flash and copy data from RAM to flash echo_info "Erasing FLASH, copying data from RAM to FLASH..." sendcmd "erase \m(flaaddr) +\m(eraseszhex) && cp.b \m(ramaddr) \m(flaaddr) \m(eraseszhex)" waitpromt 15 checkretval "Erase/copy commands failed, do not reset the board" echo_ok "Done!" echo ask \%m ">>>>>> Reset board now or switch to U-Boot CLI (type 'y' for reset)? " if not defined \%m { connect quit } else if not equal \%m "y" { connect quit } else { echo # Reset board and check if it's alive echo_info "Resetting the board..." sendcmd "reset" } interrupt echo_ok "U-Boot flashed successfully!" echo ask \%m ">>>>>> Exit now or switch to U-Boot CLI (type 'y' to exit)? " if not defined \%m connect else if not equal \%m "y" connect else quit quit