X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=178ebd61d7addb450c323070b4b62ed10945f958;hp=23a147fc82e21f111db021007b33ee40e831b8af;hb=9efdb05e8177ee6925bda8ca39f0a113505bdf57;hpb=a9021e12779463f37bfebec8cacd9e8dd7643b69 diff --git a/client/GoodFET.py b/client/GoodFET.py index 23a147f..178ebd6 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -128,7 +128,7 @@ class GoodFET: if port==None: port=os.environ.get("GOODFET"); if port=="bluetooth" or (port is not None and re.match("..:..:..:..:..:..",port)): - self.btInit(port,timeout,attemptlimit); + self.btInit(port,2,attemptlimit); else: self.pyserInit(port,timeout,attemptlimit); def btInit(self, port, timeout, attemptlimit): @@ -140,6 +140,7 @@ class GoodFET: """Open the serial port""" # Make timeout None to wait forever, 0 for non-blocking mode. import serial; + fixserial=False; if os.name=='nt' and sys.version.find('64 bit')!=-1: print "WARNING: PySerial requires a 32-bit Python build in Windows."; @@ -194,18 +195,27 @@ class GoodFET: #print "'%s'!=\n'%s'" % (self.data,"http://goodfet.sf.net/"); if attemptlimit is not None and attempts >= attemptlimit: return - elif attempts>2: - print "Resyncing."; - self.serialport.flushInput() - self.serialport.flushOutput() + elif attempts==2 and os.environ.get("board")!='telosb': + print "See the GoodFET FAQ about missing info flash."; + self.serialport.setTimeout(0.2); + elif attempts == 100: + print "Tried 100 times to connect and failed." + sys.stdout.write("Continuing to try forever.") # No newline + sys.stdout.flush() + self.verbose=True # Something isn't going right, give the user more info + elif attempts > 100 and attempts % 10 == 0: + sys.stdout.write('.') + sys.stdout.flush() + #self.serialport.flushInput() + #self.serialport.flushOutput() #TelosB reset, prefer software to I2C SPST Switch. - if (os.environ.get("platform")=='telosb' or os.environ.get("board")=='telosb'): + if (os.environ.get("board")=='telosb'): #print "TelosB Reset"; self.telosBReset(); - elif (os.environ.get("board")=='zolertiaz1' or os.environ.get("board")=='z1'): - self.bslResetZ1(); - elif (os.environ.get("board")=='apimote1'): + elif (os.environ.get("board")=='z1'): + self.bslResetZ1(invokeBSL=0); + elif (os.environ.get("board")=='apimote1') or (os.environ.get("board")=='apimote'): #Explicitly set RTS and DTR to halt board. self.serialport.setRTS(1); self.serialport.setDTR(1); @@ -231,9 +241,15 @@ class GoodFET: attempts=attempts+1; self.readcmd(); #Read the first command. #print "Got %02x,%02x:'%s'" % (self.app,self.verb,self.data); + if self.verb!=0x7f: + #Retry again. This usually times out, but helps connect. + self.readcmd(); + #print "Retry got %02x,%02x:'%s'" % (self.app,self.verb,self.data); #Here we have a connection, but maybe not a good one. #print "We have a connection." connected=1; + if attempts >= 100: + print "" # Add a newline olds=self.infostring(); clocking=self.monitorclocking(); for foo in range(1,30): @@ -241,8 +257,8 @@ class GoodFET: if self.verbose: print "Comm error on %i try, resyncing out of %s." % (foo, clocking); - connected=0; - break; + connected=0; + break; if self.verbose: print "Connected after %02i attempts." % attempts; self.mon_connected(); self.serialport.setTimeout(12); @@ -345,7 +361,8 @@ class GoodFET: #time.sleep(0.1) return recbuf - def picROMclock(self, masterout, slow = False): + #This seems more reliable when slowed. + def picROMclock(self, masterout, slow = True): #print "setting masterout to "+str(masterout) self.serialport.setRTS(masterout) self.serialport.setDTR(1) @@ -568,6 +585,9 @@ class GoodFET: self.writecmd(0,0x03,3,self.data); return ord(self.data[0]); def poke16(self,address,value): + """Set a word of memory by the monitor.""" + self.MONpoke16(address,value); + def MONpoke16(self,address,value): """Set a word of memory by the monitor.""" self.pokebyte(address,value&0xFF); self.pokebyte(address,(value>>8)&0xFF); @@ -661,7 +681,8 @@ class GoodFET: data="The quick brown fox jumped over the lazy dog."; self.writecmd(self.MONITORAPP,0x81,len(data),data); if self.data!=data: - print "Comm error recognized by monitorecho(), got:\n%s" % self.data; + if self.verbose: + print "Comm error recognized by monitorecho(), got:\n%s" % self.data; return 0; return 1;