Explicity setDTR. Matt Carpenter says this should be neighborly.
[goodfet] / client / GoodFET.py
index 9fcbbab..70e383e 100755 (executable)
@@ -10,6 +10,9 @@ import sys, time, string, cStringIO, struct, glob, serial, os;
 
 class GoodFET:
     """GoodFET Client Library"""
+    
+    GLITCHAPP=0x71;
+    
     def __init__(self, *args, **kargs):
         self.data=[0];
     def timeout(self):
@@ -36,6 +39,13 @@ class GoodFET:
             115200,
             parity = serial.PARITY_NONE
             )
+        
+        #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);
         #Drop DTR, which is !RST, low to begin the app.
         self.serialport.setDTR(0);
         self.serialport.flushInput()
@@ -55,6 +65,8 @@ class GoodFET:
         self.serialport.write(chr(app));
         self.serialport.write(chr(verb));
         
+        #if data!=None:
+        #    count=len(data); #Initial count ignored.
         
         #print "TX %02x %02x" % (app,verb);
         
@@ -69,6 +81,7 @@ class GoodFET:
                 #print "Converting %02x at %i" % (data[i],i)
                 data[i]=chr(data[i]);
             outstr=''.join(data);
+            #outstr=data;
             self.serialport.write(outstr);
         if not self.besilent:
             self.readcmd();
@@ -94,10 +107,34 @@ class GoodFET:
             
             #Debugging string; print, but wait.
             if self.app==0xFF and self.verb==0xFF:
-                print "DEBUG %s" % self.serialport.read(self.count);
+                print "DEBUG %s" % self.serialport.read(self.count);
             else:
                 self.data=self.serialport.read(self.count);
                 return self.data;
+    #Glitching stuff.
+    def glitchAPP(self,app):
+        """Glitch into a device by its application."""
+        self.data=[app&0xff];
+        self.writecmd(self.GLITCHAPP,0x80,1,self.data);
+        #return ord(self.data[0]);
+    def glitchVERB(self,app,verb, data):
+        """Glitch during a transaction.."""
+        self.data=[app&0xff, verb&0xFF]+data;
+        self.writecmd(self.GLITCHAPP,0x81,len(self.data),self.data);
+        #return ord(self.data[0]);
+    def glitchVoltages(self,low=0x0880, high=0x0fff):
+        """Set glitching voltages. (0x0fff is max.)"""
+        self.data=[low&0xff, (low>>8)&0xff,
+                   high&0xff, (high>>8)&0xff];
+        self.writecmd(self.GLITCHAPP,0x90,4,self.data);
+        #return ord(self.data[0]);
+    def glitchRate(self,count=0x0800):
+        """Set glitching count period."""
+        self.data=[count&0xff, (count>>8)&0xff];
+        self.writecmd(self.GLITCHAPP,0x91,2,
+                      self.data);
+        #return ord(self.data[0]);
+    
     
     #Monitor stuff
     def silent(self,s=0):