swapforth
1import sys2import time3import struct4import array5
6sys.path.append("../shell")7import swapforth8
9class FT900Bootloader:10def __init__(self, ser):11self.ser = ser12# self.verbose = True13self.cumcrc = 014
15cellsize = 416
17def rd1(self):18""" Return the last incoming character, if any """19n = self.ser.inWaiting()20if n:21r = self.ser.read(n)22return r[-1]23else:24return None25
26def waitprompt(self):27# Might already be at the bootloader prompt28if self.rd1() == '>':29return30
31# Might be at prompt already, or halted. Send ' '32self.ser.write(' ')33self.ser.flush()34time.sleep(0.001)35if self.rd1() == '>':36return37
38# Is somewhere else, request manual reset39print "Please press RESET on target board"40while True:41s = self.ser.read(1)42print repr(s)43if s == ">":44break45print "OK, device reset"46
47def confirm(self):48self.ser.write("C")49return struct.unpack("I", self.ser.read(4))[0]50
51def version(self):52self.ser.write("V")53return struct.unpack("I", self.ser.read(4))[0]54
55def pmcrc32(self, a, sz):56t0 = time.time()57self.ser.write("Q" + struct.pack("II", a, sz))58(r, ) = struct.unpack("I", self.ser.read(4))59if self.verbose:60t = time.time() - t061self.cumcrc += t62print 'crc', sz, t, self.cumcrc63return r64
65def flashcrc32(self, a, sz):66t0 = time.time()67self.ser.write("G" + struct.pack("II", a, sz))68(r, ) = struct.unpack("I", self.ser.read(4))69if self.verbose:70t = time.time() - t071self.cumcrc += t72print 'crc', sz, t, self.cumcrc73return r74
75def ex(self, ):76self.ser.write("R")77self.ser.flush()78
79def setspeed(self, s):80if hasattr(self.ser, 'setBaudrate'):81self.ser.write("S" + struct.pack("I", s))82self.ser.flush()83time.sleep(.001)84self.ser.setBaudrate(s)85self.ser.flushInput()86self.ser.flushOutput()87
88def loadprogram(self, program):89pstr = program.tostring()90self.ser.write("P" + struct.pack("II", 0, len(pstr)))91self.ser.write(pstr)92
93def flash(self, addr, s):94self.ser.write('F' + struct.pack("II", addr, len(s)) + s)95(answer, ) = struct.unpack("I", self.ser.read(4))96assert answer == 0xf1a54ed97
98def hardboot(self, ):99self.ser.write("H")100self.ser.flush()101
102class TetheredFT900(swapforth.TetheredTarget):103
104def boot(self, bootfile = None):105ser = self.ser106speed = 921600107bl = FT900Bootloader(ser)108ser.setDTR(1)109ser.setRTS(1)110ser.setDTR(0)111ser.setRTS(0)112bl.waitprompt()113
114time.sleep(.001)115ser.flushInput()116
117if bl.confirm() != 0xf70a0d13:118print 'CONFIRM command failed'119sys.exit(1)120bl.setspeed(speed)121
122if bl.confirm() != 0xf70a0d13:123print 'High-speed CONFIRM command failed'124sys.exit(1)125if bootfile is not None:126program = array.array('I', open(bootfile).read())127bl.loadprogram(program)128bl.ex()129
130time.sleep(.05)131while True:132n = ser.inWaiting()133if not n:134break135ser.read(n)136
137ser.write("true tethered !\r\n")138while ser.read(1) != chr(30):139pass140
141def interrupt(self):142self.ser.write(chr(3))143self.ser.flush()144while self.ser.read(1) != chr(30):145pass146
147if __name__ == '__main__':148swapforth.main(TetheredFT900)149