X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=05c20458d2552c4891a8141630faf362da9a7ac1;hp=d5e132f6c59956e1644132153725fc00396f5e52;hb=3ce193dd33e5e9e4c16989d85b8fb15715b139de;hpb=3b792eaee038953bb9d73f29a80aaebcf6399655 diff --git a/client/GoodFET.py b/client/GoodFET.py index d5e132f..05c2045 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): @@ -195,14 +195,23 @@ class GoodFET: if attemptlimit is not None and attempts >= attemptlimit: return elif attempts>2: - print "Resyncing."; - self.serialport.flushInput() - self.serialport.flushOutput() + print "Resyncing. See the GoodFET FAQ about missing info flash."; + #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("platform")=='telosb' or os.environ.get("board")=='telosb'): #print "TelosB Reset"; self.telosBReset(); + elif (os.environ.get("board")=='zolertiaz1' or os.environ.get("board")=='z1'): + self.bslResetZ1(invokeBSL=0); + elif (os.environ.get("board")=='apimote1'): + #Explicitly set RTS and DTR to halt board. + self.serialport.setRTS(1); + self.serialport.setDTR(1); + #RTS pin, not DTR is used for reset. + self.serialport.setRTS(0); + #print "Resetting Apimote not yet tested."; else: #Explicitly set RTS and DTR to halt board. self.serialport.setRTS(1); @@ -222,6 +231,10 @@ 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; @@ -278,6 +291,82 @@ class GoodFET: self.telosI2CWriteByte( 0x90 | (addr << 1) ) self.telosI2CWriteByte( cmdbyte ) self.telosI2CStop() + def bslResetZ1(self, invokeBSL=0): + ''' + Applies BSL entry sequence on RST/NMI and TEST/VPP pins + Parameters: + invokeBSL = 1: complete sequence + invokeBSL = 0: only RST/NMI pin accessed + + By now only BSL mode is accessed + ''' + + #if DEBUG > 1: sys.stderr.write("* bslReset(invokeBSL=%s)\n" % invokeBSL) + if invokeBSL: + #sys.stderr.write("in Z1 bsl reset...\n") + time.sleep(0.1) + self.writepicROM(0xFF, 0xFF) + time.sleep(0.1) + #sys.stderr.write("z1 bsl reset done...\n") + else: + #sys.stderr.write("in Z1 reset...\n") + time.sleep(0.1) + self.writepicROM(0xFF, 0xFE) + time.sleep(0.1) + #sys.stderr.write("z1 reset done...\n") + def writepicROM(self, address, data): + ''' Writes data to @address''' + for i in range(7,-1,-1): + self.picROMclock((address >> i) & 0x01) + self.picROMclock(0) + recbuf = 0 + for i in range(7,-1,-1): + s = ((data >> i) & 0x01) + #print s + if i < 1: + r = not self.picROMclock(s, True) + else: + r = not self.picROMclock(s) + recbuf = (recbuf << 1) + r + + self.picROMclock(0, True) + #k = 1 + #while not self.serial.getCTS(): + # pass + #time.sleep(0.1) + return recbuf + def readpicROM(self, address): + ''' reads a byte from @address''' + for i in range(7,-1,-1): + self.picROMclock((address >> i) & 0x01) + self.picROMclock(1) + recbuf = 0 + r = 0 + for i in range(7,-1,-1): + r = self.picROMclock(0) + recbuf = (recbuf << 1) + r + self.picROMclock(r) + #time.sleep(0.1) + return recbuf + + #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) + #time.sleep(0.02) + self.serialport.setDTR(0) + if slow: + time.sleep(0.02) + return self.serialport.getCTS() + + def picROMfastclock(self, masterout): + #print "setting masterout to "+str(masterout) + self.serialport.setRTS(masterout) + self.serialport.setDTR(1) + self.serialport.setDTR(0) + time.sleep(0.02) + return self.serialport.getCTS() def telosBReset(self,invokeBSL=0): # "BSL entry sequence at dedicated JTAG pins" @@ -586,6 +675,15 @@ class GoodFET: print "Clocked at %s" % self.monitorclocking(); return 1; + def testleds(self): + print "Flashing LEDs" + self.writecmd(self.MONITORAPP,0xD0,0,"") + try: + print "Flashed %d LED." % ord(self.data) + except: + print "Unable to process response:", self.data + return 1 + def monitor_list_apps(self, full=False): self.monitor_info() old_value = self.besilent