diff options
author | Marti Bolivar <mbolivar@leaflabs.com> | 2014-04-29 19:56:39 -0700 |
---|---|---|
committer | Marti Bolivar <mbolivar@leaflabs.com> | 2014-04-29 19:56:39 -0700 |
commit | 746d6fecf86572c9fe95dbbffdf541a8d3875dd0 (patch) | |
tree | 8dc7170e295756116dcdc9e973dee028b9cb2454 /support/scripts/robotis-loader.py | |
parent | 139e4b1a1ae547540d32aa66d47c4e69b1b57bbf (diff) | |
parent | 731e2ab24755b3706daf7d64eaa53f2ec0512277 (diff) | |
download | librambutan-746d6fecf86572c9fe95dbbffdf541a8d3875dd0.tar.gz librambutan-746d6fecf86572c9fe95dbbffdf541a8d3875dd0.zip |
Merge pull request #89 from Gregwar/bootloader-option
Adding BOOTLOADER option to support Robotis bootloader different ROM
Diffstat (limited to 'support/scripts/robotis-loader.py')
-rwxr-xr-x | support/scripts/robotis-loader.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/support/scripts/robotis-loader.py b/support/scripts/robotis-loader.py new file mode 100755 index 0000000..95d4e71 --- /dev/null +++ b/support/scripts/robotis-loader.py @@ -0,0 +1,94 @@ +#!/usr/bin/python + +# This script sends a program on a robotis board (OpenCM9.04 or CM900) +# using the robotis bootloader (used in OpenCM IDE) +# +# Usage: +# python robotis-loader.py <serial port> <binary> +# +# Example: +# python robotis-loader.py /dev/ttyACM0 firmware.bin +# +# https://github.com/Gregwar/robotis-loader + +import serial, sys, os, time + +print('~~ Robotis loader ~~') +print('') + +# Reading command line +if len(sys.argv) != 3: + exit('! Usage: robotis-loader.py <serial-port> <binary>') +pgm, port, binary = sys.argv + +# Helper to prints a progress bar +def progressBar(percent, precision=65): + threshold=precision*percent/100.0 + sys.stdout.write('[ ') + for x in xrange(0, precision): + if x < threshold: sys.stdout.write('#') + else: sys.stdout.write(' ') + sys.stdout.write(' ] ') + sys.stdout.flush() + +# Opening the firmware file +try: + stat = os.stat(binary) + size = stat.st_size + firmware = file(binary, 'rb') + print('* Opening %s, size=%d' % (binary, size)) +except: + exit('! Unable to open file %s' % binary) + +# Opening serial port +try: + s = serial.Serial(port, baudrate=115200) +except: + exit('! Unable to open serial port %s' % port) + +print('* Resetting the board') +s.setRTS(True) +s.setDTR(False) +time.sleep(0.1) +s.setRTS(False) +s.write('CM9X') +s.close() +time.sleep(1.0); + +print('* Connecting...') +s = serial.Serial(port, baudrate=115200) +s.write('AT&LD') +print('* Download signal transmitted, waiting...') + +# Entering bootloader sequence +while True: + line = s.readline().strip() + if line.endswith('Ready..'): + print('* Board ready, sending data') + cs = 0 + pos = 0 + while True: + c = firmware.read(2048) + if len(c): + pos += len(c) + sys.stdout.write("\r") + progressBar(100*float(pos)/float(size)) + s.write(c) + for k in range(0,len(c)): + cs = (cs+ord(c[k]))%256 + else: + break + print('') + s.setDTR(True) + print('* Checksum: %d' % (cs)) + s.write(chr(cs)) + print('* Firmware was sent') + else: + if line == 'Success..': + print('* Success, running the code') + print('') + s.write('AT&RST') + s.close() + exit() + else: + print('Board -> '+line) |