import serial import sys import time import binascii import random import pprint import collections import struct import elffile class Error(Exception): pass RETURN_CODE = { 0: 'CMD_SUCCESS', 1: 'INVALID_COMMAND', 2: 'SRC_ADDR_ERROR', 3: 'DST_ADDR_ERROR', 4: 'SRC_ADDR_NOT_MAPPED', 5: 'DST_ADDR_NOT_MAPPED', 6: 'COUNT_ERROR', 7: 'INVALID_SECTOR', 8: 'SECTOR_NOT_BLANK', 9: 'SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION', 10: 'COMPARE_ERROR', 11: 'BUSY', 12: 'PARAM_ERROR', 13: 'ADDR_ERROR', 14: 'ADDR_NOT_MAPPED', 15: 'CMD_LOCKED', 16: 'INVALID_CODE', 17: 'INVALID_BAUD_RATE', 18: 'INVALID_STOP_BIT', 19: 'CODE_READ_PROTECTION_ENABLED ', } Section = collections.namedtuple('Section', 'name address content') def fix_vectors(data): """Patch the vector table so the bootloader recognises the code as valid. Sum of the first eight is zero. """ first = data[:4*7] remainder = data[4*8:] vectors = struct.unpack(' %r' % v) self.port.write(v) def send(self, v): v += '\r\n' self.write(v) got = self.read(len(v)) if got != v: raise Error('Echo error. Sent %r, got %r' % (v, got)) def read(self, limit, partial=False): got = self.port.read(limit) if partial: self.log('%r' % got, eol=False) else: self.log('< %r' % got) return got def main(): loader = Loader() loader.sync() loader.unlock() loader.erase(0) for arg in sys.argv[1:]: data = ELFReader(arg) for section in data.sections: loader.program(section.address, section.content) loader.sync() loader.run() # loader.unlock() # loader.go(data.entry) if __name__ == '__main__': main()