paul@10 | 1 | #!/usr/bin/env python |
paul@10 | 2 | |
paul@10 | 3 | from serial import Serial |
paul@10 | 4 | import sys |
paul@10 | 5 | |
paul@10 | 6 | def console(initial=None): |
paul@10 | 7 | if initial: |
paul@10 | 8 | s.write(initial) |
paul@10 | 9 | |
paul@10 | 10 | try: |
paul@10 | 11 | while 1: |
paul@10 | 12 | s.write(raw_input(s.readline()) + "\n") |
paul@10 | 13 | except EOFError: |
paul@10 | 14 | print "Session closed." |
paul@10 | 15 | |
paul@10 | 16 | def upload(filename, sector): |
paul@10 | 17 | data = open(filename, "rb").read() |
paul@10 | 18 | |
paul@10 | 19 | if len(data) != 0x4000: |
paul@10 | 20 | print >>sys.stderr, "File", filename, "is not", 0x4000, "bytes long." |
paul@10 | 21 | return False |
paul@10 | 22 | |
paul@10 | 23 | print >>sys.stderr, "Erasing sector", sector, "..." |
paul@10 | 24 | |
paul@10 | 25 | s.write("S%x\n" % sector) |
paul@10 | 26 | resp = s.readline().rstrip("\r\n") |
paul@10 | 27 | if resp != "S": |
paul@10 | 28 | print >>sys.stderr, "Sector %d erase failed: %s" % (sector, resp) |
paul@10 | 29 | return False |
paul@10 | 30 | |
paul@10 | 31 | print >>sys.stderr, "Uploading", filename, "to sector", sector, "..." |
paul@10 | 32 | |
paul@10 | 33 | i = 0 |
paul@10 | 34 | while i < 0x4000: |
paul@10 | 35 | value = ord(data[i]) |
paul@10 | 36 | addr = (sector << 14) | i |
paul@10 | 37 | s.write("P%04x%02x\n" % (addr, value)) |
paul@10 | 38 | print >>sys.stderr, "P%04x%02x" % (addr, value) |
paul@10 | 39 | resp = s.readline().rstrip("\r\n") |
paul@10 | 40 | if resp != "P": |
paul@10 | 41 | print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp) |
paul@10 | 42 | return False |
paul@10 | 43 | #s.write("R%04x\n" % addr) |
paul@10 | 44 | #print >>sys.stderr, "R%04x" % addr |
paul@10 | 45 | #readvalue = s.readline().rstrip("\r\n") |
paul@10 | 46 | #if readvalue != ("%X" % value): |
paul@10 | 47 | # print >>sys.stderr, "Program of location %04x failed: %s read for %s written." % (addr, readvalue, "%X" % value) |
paul@10 | 48 | # return False |
paul@10 | 49 | i += 1 |
paul@10 | 50 | |
paul@10 | 51 | return True |
paul@10 | 52 | |
paul@10 | 53 | if __name__ == "__main__": |
paul@10 | 54 | port = "/dev/ttyUSB0" |
paul@10 | 55 | rate = 115200 |
paul@10 | 56 | |
paul@10 | 57 | s = Serial(port, rate) |
paul@10 | 58 | |
paul@10 | 59 | if "-i" in sys.argv: |
paul@10 | 60 | console() |
paul@10 | 61 | elif len(sys.argv) > 1: |
paul@10 | 62 | s.readline() |
paul@10 | 63 | for sector, filename in enumerate(sys.argv[1:]): |
paul@10 | 64 | upload(filename, sector) |
paul@10 | 65 | else: |
paul@10 | 66 | print >>sys.stderr, sys.argv[0], "-i | <filename>..." |
paul@10 | 67 | sys.exit(1) |
paul@10 | 68 | |
paul@10 | 69 | # vim: tabstop=4 expandtab shiftwidth=4 |