paul@10 | 1 | #!/usr/bin/env python |
paul@10 | 2 | |
paul@10 | 3 | from serial import Serial |
paul@15 | 4 | from time import sleep |
paul@10 | 5 | import sys |
paul@10 | 6 | |
paul@15 | 7 | port = "/dev/ttyUSB0" |
paul@15 | 8 | rate = 115200 |
paul@15 | 9 | |
paul@15 | 10 | def openPort(): |
paul@15 | 11 | global s |
paul@15 | 12 | s = Serial(port, rate) |
paul@15 | 13 | s.setTimeout(5) |
paul@15 | 14 | s.readline() |
paul@15 | 15 | |
paul@15 | 16 | def closePort(): |
paul@15 | 17 | global s |
paul@15 | 18 | s.close() |
paul@15 | 19 | s = None |
paul@15 | 20 | |
paul@15 | 21 | def writeToPort(data): |
paul@15 | 22 | s.write(data) |
paul@15 | 23 | s.flush() |
paul@15 | 24 | print >>sys.stderr, data.rstrip() |
paul@15 | 25 | |
paul@15 | 26 | def readFromPort(): |
paul@15 | 27 | resp = s.readline().rstrip("\r\n") |
paul@15 | 28 | if resp == "?": |
paul@15 | 29 | resp = s.readline().rstrip("\r\n") |
paul@15 | 30 | return resp |
paul@15 | 31 | |
paul@11 | 32 | def console(): |
paul@10 | 33 | try: |
paul@10 | 34 | while 1: |
paul@15 | 35 | cmd = raw_input("> ") |
paul@15 | 36 | if cmd: |
paul@15 | 37 | s.write(cmd + "\n") |
paul@15 | 38 | s.flush() |
paul@11 | 39 | print s.readline().rstrip("\r\n") |
paul@10 | 40 | except EOFError: |
paul@10 | 41 | print "Session closed." |
paul@10 | 42 | |
paul@10 | 43 | def upload(filename, sector): |
paul@10 | 44 | data = open(filename, "rb").read() |
paul@10 | 45 | |
paul@10 | 46 | if len(data) != 0x4000: |
paul@10 | 47 | print >>sys.stderr, "File", filename, "is not", 0x4000, "bytes long." |
paul@10 | 48 | return False |
paul@10 | 49 | |
paul@10 | 50 | print >>sys.stderr, "Erasing sector", sector, "..." |
paul@10 | 51 | |
paul@15 | 52 | writeToPort("S%x\n" % sector) |
paul@15 | 53 | resp = readFromPort() |
paul@10 | 54 | if resp != "S": |
paul@10 | 55 | print >>sys.stderr, "Sector %d erase failed: %s" % (sector, resp) |
paul@10 | 56 | return False |
paul@10 | 57 | |
paul@10 | 58 | print >>sys.stderr, "Uploading", filename, "to sector", sector, "..." |
paul@10 | 59 | |
paul@10 | 60 | i = 0 |
paul@10 | 61 | while i < 0x4000: |
paul@10 | 62 | value = ord(data[i]) |
paul@10 | 63 | addr = (sector << 14) | i |
paul@15 | 64 | |
paul@16 | 65 | writeToPort("P%04x%02x\n" % (addr, value)) |
paul@16 | 66 | resp = readFromPort() |
paul@16 | 67 | if resp != "P": |
paul@16 | 68 | print >>sys.stderr, "Program of location %04x failed: %s" % (addr, resp) |
paul@16 | 69 | return False |
paul@15 | 70 | |
paul@10 | 71 | i += 1 |
paul@10 | 72 | |
paul@10 | 73 | return True |
paul@10 | 74 | |
paul@10 | 75 | if __name__ == "__main__": |
paul@15 | 76 | openPort() |
paul@10 | 77 | |
paul@18 | 78 | try: |
paul@18 | 79 | if "-i" in sys.argv: |
paul@18 | 80 | console() |
paul@18 | 81 | elif len(sys.argv) > 1: |
paul@18 | 82 | if len(sys.argv) > 3 and sys.argv[1] == "-s": |
paul@18 | 83 | base = int(sys.argv[2]) |
paul@18 | 84 | i = 3 |
paul@18 | 85 | else: |
paul@18 | 86 | base = 0 |
paul@18 | 87 | i = 1 |
paul@18 | 88 | for sector, filename in enumerate(sys.argv[i:]): |
paul@18 | 89 | upload(filename, sector + base) |
paul@18 | 90 | sleep(5) # give the device a rest |
paul@16 | 91 | else: |
paul@18 | 92 | print >>sys.stderr, sys.argv[0], "-i | <filename>..." |
paul@18 | 93 | sys.exit(1) |
paul@18 | 94 | finally: |
paul@18 | 95 | closePort() |
paul@10 | 96 | |
paul@10 | 97 | # vim: tabstop=4 expandtab shiftwidth=4 |