X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFET.py;h=10f2e6f01f499b17e25a0117b7d9cc67159fded0;hp=8244aaac6790d0def4b9d0f2b86f54eb773d353d;hb=052771a83e020314b718e82d0b1b2a645a7c3d4f;hpb=b16927a85ac4a4c6f925a41bfeef04224f8581f9 diff --git a/client/GoodFET.py b/client/GoodFET.py index 8244aaa..10f2e6f 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -93,10 +93,13 @@ class GoodFET: from scanwin32 import winScan; scan=winScan(); for order,comport,desc,hwid in sorted(scan.comports()): - if hwid.index('FTDI')==0: - port=comport; - #print "Using FTDI port %s" % port - + try: + if hwid.index('FTDI')==0: + port=comport; + #print "Using FTDI port %s" % port + except: + #Do nothing. + a=1; self.serialport = serial.Serial( port, @@ -119,6 +122,16 @@ class GoodFET: self.serialport.setDTR(1); #Drop DTR, which is !RST, low to begin the app. self.serialport.setDTR(0); + + #TelosB reset, prefer software to I2C SPST Switch. + if(os.environ.get("platform")=='telosb'): + self.telosBReset(); + #self.serialport.write(chr(0x80)); + #self.serialport.write(chr(0x80)); + #self.serialport.write(chr(0x80)); + #self.serialport.write(chr(0x80)); + + self.serialport.flushInput() self.serialport.flushOutput() #time.sleep(60); @@ -136,7 +149,75 @@ class GoodFET: break; if self.verbose: print "Connected after %02i attempts." % attempts; self.mon_connected(); - + def telosSetSCL(self, level): + self.serialport.setRTS(not level) + def telosSetSDA(self, level): + self.serialport.setDTR(not level) + + def telosI2CStart(self): + self.telosSetSDA(1) + self.telosSetSCL(1) + self.telosSetSDA(0) + + def telosI2CStop(self): + self.telosSetSDA(0) + self.telosSetSCL(1) + self.telosSetSDA(1) + + def telosI2CWriteBit(self, bit): + self.telosSetSCL(0) + self.telosSetSDA(bit) + time.sleep(2e-6) + self.telosSetSCL(1) + time.sleep(1e-6) + self.telosSetSCL(0) + + def telosI2CWriteByte(self, byte): + self.telosI2CWriteBit( byte & 0x80 ); + self.telosI2CWriteBit( byte & 0x40 ); + self.telosI2CWriteBit( byte & 0x20 ); + self.telosI2CWriteBit( byte & 0x10 ); + self.telosI2CWriteBit( byte & 0x08 ); + self.telosI2CWriteBit( byte & 0x04 ); + self.telosI2CWriteBit( byte & 0x02 ); + self.telosI2CWriteBit( byte & 0x01 ); + self.telosI2CWriteBit( 0 ); # "acknowledge" + + def telosI2CWriteCmd(self, addr, cmdbyte): + self.telosI2CStart() + self.telosI2CWriteByte( 0x90 | (addr << 1) ) + self.telosI2CWriteByte( cmdbyte ) + self.telosI2CStop() + + def telosBReset(self,invokeBSL=0): + # "BSL entry sequence at dedicated JTAG pins" + # rst !s0: 0 0 0 0 1 1 + # tck !s1: 1 0 1 0 0 1 + # s0|s1: 1 3 1 3 2 0 + + # "BSL entry sequence at shared JTAG pins" + # rst !s0: 0 0 0 0 1 1 + # tck !s1: 0 1 0 1 1 0 + # s0|s1: 3 1 3 1 0 2 + + if invokeBSL: + self.telosI2CWriteCmd(0,1) + self.telosI2CWriteCmd(0,3) + self.telosI2CWriteCmd(0,1) + self.telosI2CWriteCmd(0,3) + self.telosI2CWriteCmd(0,2) + self.telosI2CWriteCmd(0,0) + else: + self.telosI2CWriteCmd(0,3) + self.telosI2CWriteCmd(0,2) + + # This line was not defined inside the else: block, not sure where it + # should be however + self.telosI2CWriteCmd(0,0) + time.sleep(0.250) #give MSP430's oscillator time to stabilize + self.serialport.flushInput() #clear buffers + + def getbuffer(self,size=0x1c00): writecmd(0,0xC2,[size&0xFF,(size>>16)&0xFF]); print "Got %02x%02x buffer size." % (self.data[1],self.data[0]); @@ -195,6 +276,10 @@ class GoodFET: print "# DEBUG %s" % self.serialport.read(self.count) elif self.verb==0xFE: print "# DEBUG 0x%x" % struct.unpack(fmt[self.count-1], self.serialport.read(self.count))[0] + elif self.verb==0xFD: + #Do nothing, just wait so there's no timeout. + print "# NOP."; + sys.stdout.flush(); else: self.data=self.serialport.read(self.count); @@ -277,6 +362,9 @@ class GoodFET: def peekword(self,address): """Read a word of memory from the monitor.""" return self.peekbyte(address)+(self.peekbyte(address+1)<<8); + def peek(self,address): + """Read a word of memory from the monitor.""" + return self.peekbyte(address)+(self.peekbyte(address+1)<<8); def pokebyte(self,address,value): """Set a byte of memory by the monitor.""" self.data=[address&0xff,address>>8,value]; @@ -401,7 +489,6 @@ class GoodFET: def dump(self,file,start=0,stop=0xffff): """Dump an intel hex file from code memory.""" print "Dump not implemented."; - def peek32(self,address, memory="vn"): return (self.peek16(address,memory)+ (self.peek16(address+2,memory)<<16)); @@ -410,5 +497,8 @@ class GoodFET: (self.peek8(address+1,memory)<<8)); def peek8(self,address, memory="vn"): return self.peekbyte(address); #monitor + def peekword(self,address, memory="vn"): + return self.peek(address); #monitor + def loadsymbols(self): return;