if(self.verb!=0x7F):
print "Verb %02x is wrong. Incorrect firmware?" % self.verb;
#print "Connected."
- def writecmd(self, app, verb, count=0, data=[], blocks=1):
+ 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]);
+ def writecmd(self, app, verb, count=0, data=[]):
"""Write a command and some data to the GoodFET."""
self.serialport.write(chr(app));
self.serialport.write(chr(verb));
- self.serialport.write(chr(count));
+
+
+ #print "TX %02x %02x" % (app,verb);
+
+ #little endian 16-bit length
+ self.serialport.write(chr(count&0xFF));
+ self.serialport.write(chr(count>>8));
+
#print "count=%02x, len(data)=%04x" % (count,len(data));
+
if count!=0:
- for d in data:
- self.serialport.write(chr(d));
+ for i in range(0,count):
+ #print "Converting %02x at %i" % (data[i],i)
+ data[i]=chr(data[i]);
+ outstr=''.join(data);
+ self.serialport.write(outstr);
+ if not self.besilent:
+ self.readcmd();
- self.readcmd(blocks); #Uncomment this later, to ensure a response.
- def readcmd(self,blocks=1):
+ besilent=0;
+ app=0;
+ verb=0;
+ count=0;
+ data="";
+
+ def readcmd(self):
"""Read a reply from the GoodFET."""
- self.app=ord(self.serialport.read(1));
- self.verb=ord(self.serialport.read(1));
- self.count=ord(self.serialport.read(1));
- self.data=self.serialport.read(self.count*blocks);
- #print "READ %02x %02x %02x " % (self.app, self.verb, self.count);
- return self.data;
-
+ 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)
+ );
+
+ #Debugging string; print, but wait.
+ if self.app==0xFF and self.verb==0xFF:
+ print "DEBUG %s" % self.serialport.read(self.count);
+ else:
+ self.data=self.serialport.read(self.count);
+ return self.data;
+
#Monitor stuff
+ def silent(self,s=0):
+ """Transmissions halted when 1."""
+ self.besilent=s;
+ print "besilent is %i" % self.besilent;
+ self.writecmd(0,0xB0,1,[s]);
+
def out(self,byte):
"""Write a byte to P5OUT."""
self.writecmd(0,0xA1,1,[byte]);