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