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