# This code is being rewritten and refactored. You've been warned!
import sys, time, string, cStringIO, struct, glob, serial, os;
+import sqlite3;
+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();
+
+ print "Unsupported target: %s" % name;
+ sys.exit(0);
+
+class SymbolTable:
+ """GoodFET Symbol Table"""
+ db=sqlite3.connect(":memory:");
+
+ def __init__(self, *args, **kargs):
+ self.db.execute("create table if not exists symbols(adr,name,memory,size,comment);");
+ def get(self,name):
+ self.db.commit();
+ c=self.db.cursor();
+ try:
+ c.execute("select adr,memory from symbols where name=?",(name,));
+ for row in c:
+ #print "Found it.";
+ sys.stdout.flush();
+ return row[0];
+ #print "No dice.";
+ except:# sqlite3.OperationalError:
+ #print "SQL error.";
+ return eval(name);
+ return eval(name);
+ def define(self,adr,name,comment="",memory="vn",size=16):
+ self.db.execute("insert into symbols(adr,name,memory,size,comment)"
+ "values(?,?,?,?,?);", (
+ adr,name,memory,size,comment));
+ #print "Set %s=%s." % (name,adr);
class GoodFET:
"""GoodFET Client Library"""
GLITCHAPP=0x71;
+ symbols=SymbolTable();
def __init__(self, *args, **kargs):
self.data=[0];
+ def getConsole(self):
+ from GoodFETConsole import GoodFETConsole;
+ return GoodFETConsole(self);
+ def name2adr(self,name):
+ return self.symbols.get(name);
def timeout(self):
print "timeout\n";
def serInit(self, port=None):
#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;
print "Self-test complete.";
+ # The following functions ought to be implemented in
+ # every client.
- def I2Csetup(self):
- """Move the FET into the I2C application."""
- self.writecmd(0x02,0x10,0,self.data); #SPI/SETUP
- def I2Cstart(self):
- """Start an I2C transaction."""
- self.writecmd(0x02,0x20,0,self.data); #SPI/SETUP
- def I2Cstop(self):
- """Stop an I2C transaction."""
- self.writecmd(0x02,0x21,0,self.data); #SPI/SETUP
- def I2Cread(self,len=1):
- """Read len bytes by I2C."""
- self.writecmd(0x02,0x00,1,[len]); #SPI/SETUP
- return self.data;
- def I2Cwrite(self,bytes):
- """Write bytes by I2C."""
- self.writecmd(0x02,0x01,len(bytes),bytes); #SPI/SETUP
- return ord(self.data[0]);
+ def infostring(self):
+ a=self.peekbyte(0xff0);
+ b=self.peekbyte(0xff1);
+ return "%02x%02x" % (a,b);
+ def lock(self):
+ print "Locking Unsupported.";
+ def erase(self):
+ print "Erasure Unsupported.";
+ def setup(self):
+ return;
+ def start(self):
+ return;
+ def test(self):
+ print "Unimplemented.";
+ return;
+ def status(self):
+ print "Unimplemented.";
+ return;
+ def halt(self):
+ print "Unimplemented.";
+ return;
+ def resume(self):
+ print "Unimplemented.";
+ return;
+ def getpc(self):
+ print "Unimplemented.";
+ return 0xdead;
+ def flash(self,file):
+ """Flash an intel hex file to code memory."""
+ print "Flash not implemented.";
+ 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));
+ def peek16(self,address, memory="vn"):
+ return (self.peek8(address,memory)+
+ (self.peek8(address+1,memory)<<8));
+ def peek8(self,address, memory="vn"):
+ return self.peekbyte(address); #monitor
+ def loadsymbols(self):
+ return;