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