Minor additions to dsPIC33F/PIC24H programmer:
[goodfet] / client / GoodFET.py
index d024638..518cf47 100755 (executable)
@@ -8,13 +8,15 @@
 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();
     elif name=="cc" or name=="chipcon": return GoodFETCC.GoodFETCC();
     elif name=="avr": return GoodFETAVR.GoodFETAVR();
     elif name=="spi": return GoodFETSPI.GoodFETSPI();
-    elif name=="msp430": return GoodFETSPI.GoodFETMSP430();
+    elif name=="msp430": return GoodFETMSP430.GoodFETMSP430();
     
     print "Unsupported target: %s" % name;
     sys.exit(0);
@@ -47,6 +49,13 @@ class SymbolTable:
 
 class GoodFET:
     """GoodFET Client Library"""
+
+    besilent=0;
+    app=0;
+    verb=0;
+    count=0;
+    data="";
+    verbose=False
     
     GLITCHAPP=0x71;
     symbols=SymbolTable();
@@ -60,7 +69,7 @@ class GoodFET:
         return self.symbols.get(name);
     def timeout(self):
         print "timeout\n";
-    def serInit(self, port=None):
+    def serInit(self, port=None, timeout=None):
         """Open the serial port"""
         
         if port is None and os.environ.get("GOODFET")!=None:
@@ -80,12 +89,10 @@ class GoodFET:
             port,
             #9600,
             115200,
-            parity = serial.PARITY_NONE
+            parity = serial.PARITY_NONE,
+            timeout=timeout
             )
         
-        #This might cause problems, but it makes failure graceful.
-        #self.serialport._timeout = 5;
-        
         #Explicitly set RTS and DTR to halt board.
         self.serialport.setRTS(1);
         self.serialport.setDTR(1);
@@ -98,7 +105,8 @@ class GoodFET:
         #time.sleep(1);
         self.readcmd(); #Read the first command.
         if(self.verb!=0x7F):
-            print "Verb %02x is wrong.  Incorrect firmware?" % self.verb;
+            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]);
@@ -116,6 +124,9 @@ class GoodFET:
         #little endian 16-bit length
         self.serialport.write(chr(count&0xFF));
         self.serialport.write(chr(count>>8));
+
+        if self.verbose:
+            print "Tx: ( 0x%02x, 0x%02x, 0x%04x )" % ( app, verb, count )
         
         #print "count=%02x, len(data)=%04x" % (count,len(data));
         
@@ -128,34 +139,41 @@ class GoodFET:
             outstr=''.join(data);
             self.serialport.write(outstr);
         if not self.besilent:
-            self.readcmd();
-        
-    besilent=0;
-    app=0;
-    verb=0;
-    count=0;
-    data="";
+            return self.readcmd()
+        else:
+            return []
 
     def readcmd(self):
         """Read a reply from the GoodFET."""
-        while 1:
-            #print "Reading...";
-            self.app=ord(self.serialport.read(1));
-            #print "APP=%2x" % self.app;
-            self.verb=ord(self.serialport.read(1));
-            #print "VERB=%02x" % self.verb;
-            self.count=(
-                ord(self.serialport.read(1))
-                +(ord(self.serialport.read(1))<<8)
-                );
+        while 1:#self.serialport.inWaiting(): # Loop while input data is available
+            try:
+                #print "Reading...";
+                self.app=ord(self.serialport.read(1));
+                #print "APP=%2x" % self.app;
+                self.verb=ord(self.serialport.read(1));
+                #print "VERB=%02x" % self.verb;
+                self.count=(
+                    ord(self.serialport.read(1))
+                    +(ord(self.serialport.read(1))<<8)
+                    );
+
+                if self.verbose:
+                    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);
-                sys.stdout.flush();
-            else:
-                self.data=self.serialport.read(self.count);
-                return self.data;
+                #Debugging string; print, but wait.
+                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();
+                else:
+                    self.data=self.serialport.read(self.count);
+                    return self.data;
+            except TypeError:
+                print "Error: waiting for serial read timed out (most likely)."
+                sys.exit(-1)
+
     #Glitching stuff.
     def glitchApp(self,app):
         """Glitch into a device by its application."""