import sys, time, string, cStringIO, struct, glob, serial, os;
import sqlite3;
+fmt = ("B", "<H", None, "<L")
+
def getClient(name="GoodFET"):
import GoodFET, GoodFETCC, GoodFETAVR, GoodFETSPI, GoodFETMSP430;
if(name=="GoodFET" or name=="monitor"): return GoodFET.GoodFET();
return self.symbols.get(name);
def timeout(self):
print "timeout\n";
- def serInit(self, port=None, timeout=None):
+ def serInit(self, port=None, timeout=2):
"""Open the serial port"""
+ # Make timeout None to wait forever, 0 for non-blocking mode.
if port is None and os.environ.get("GOODFET")!=None:
glob_list = glob.glob(os.environ.get("GOODFET"));
if len(glob_list) > 0:
port = glob_list[0];
+ else:
+ port = os.environ.get("GOODFET");
if port is None:
glob_list = glob.glob("/dev/tty.usbserial*");
if len(glob_list) > 0:
if len(glob_list) > 0:
port = glob_list[0];
+
self.serialport = serial.Serial(
port,
#9600,
timeout=timeout
)
- #Explicitly set RTS and DTR to halt board.
- self.serialport.setRTS(1);
- self.serialport.setDTR(1);
- #Drop DTR, which is !RST, low to begin the app.
- self.serialport.setDTR(0);
- self.serialport.flushInput()
- self.serialport.flushOutput()
+ self.verb=0;
+ attempts=0;
+ while self.verb!=0x7F:
+ self.serialport.flushInput()
+ self.serialport.flushOutput()
+ #Explicitly set RTS and DTR to halt board.
+ self.serialport.setRTS(1);
+ self.serialport.setDTR(1);
+ #Drop DTR, which is !RST, low to begin the app.
+ self.serialport.setDTR(0);
+ self.serialport.flushInput()
+ self.serialport.flushOutput()
+ #time.sleep(.1);
+ attempts=attempts+1;
+ self.readcmd(); #Read the first command.
+
+ #print "Connected after %02i attempts." % attempts;
+ self.mon_connected();
- #Read and handle the initial command.
- #time.sleep(1);
- self.readcmd(); #Read the first command.
- if(self.verb!=0x7F):
- print "Verb %02x is wrong. Incorrect firmware or bad Info guess?" % self.verb;
- print "http://goodfet.sf.net/faq/";
- #print "Connected."
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]);
print "Rx: ( 0x%02x, 0x%02x, 0x%04x )" % ( self.app, self.verb, self.count )
#Debugging string; print, but wait.
- if self.app==0xFF and self.verb==0xFF:
- print "# DEBUG %s" % self.serialport.read(self.count);
+ if self.app==0xFF:
+ if self.verb==0xFF:
+ 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]
sys.stdout.flush();
- return []
else:
self.data=self.serialport.read(self.count);
return self.data;
self.besilent=s;
print "besilent is %i" % self.besilent;
self.writecmd(0,0xB0,1,[s]);
-
+ def mon_connected(self):
+ """Announce to the monitor that the connection is good."""
+ self.writecmd(0,0xB1,0,[]);
def out(self,byte):
"""Write a byte to P5OUT."""
self.writecmd(0,0xA1,1,[byte]);
"""Self-test several functions through the monitor."""
print "Performing monitor self-test.";
- if self.peekword(0x0c00)!=0x0c04 and self.peekword(0x0c00)!=0x0c06:
- print "ERROR Fetched wrong value from 0x0c04.";
- self.pokebyte(0x0021,0); #Drop LED
- if self.peekbyte(0x0021)!=0:
- print "ERROR, P1OUT not cleared.";
- self.pokebyte(0x0021,1); #Light LED
+ for f in range(0,30):
+ if self.peekword(0x0c00)!=0x0c04 and self.peekword(0x0c00)!=0x0c06:
+ print "ERROR Fetched wrong value from 0x0c04.";
+ self.pokebyte(0x0021,0); #Drop LED
+ if self.peekbyte(0x0021)!=0:
+ print "ERROR, P1OUT not cleared.";
+ self.pokebyte(0x0021,1); #Light LED
print "Self-test complete.";