Beginning support for SQL symbol tables.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 28 Feb 2010 04:01:27 +0000 (04:01 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 28 Feb 2010 04:01:27 +0000 (04:01 +0000)
To be populated from header files and symbol files.

git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@370 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/GoodFETCC.py
client/GoodFETConsole.py
client/goodfet.cc

index 8b7f355..d024638 100755 (executable)
@@ -6,6 +6,7 @@
 # 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;
@@ -18,19 +19,45 @@ def getClient(name="GoodFET"):
     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):
@@ -315,3 +342,5 @@ class GoodFET:
                 (self.peek8(address+1,memory)<<8));
     def peek8(self,address, memory="vn"):
         return self.peekbyte(address); #monitor
+    def loadsymbols(self):
+        return;
index 6001a59..014b6d4 100644 (file)
@@ -17,6 +17,8 @@ class GoodFETCC(GoodFET):
     """A GoodFET variant for use with Chipcon 8051 Zigbee SoC."""
     APP=0x30;
     smartrfpath="/opt/smartrf7";
+    def loadsymbols(self):
+        self.SRF_loadsymbols();
     def SRF_chipdom(self,chip="cc1110", doc="register_definition.xml"):
         fn="%s/config/xml/%s/%s" % (self.smartrfpath,chip,doc);
         print "Opening %s" % fn;
@@ -63,6 +65,29 @@ class GoodFETCC(GoodFET):
                     print "%-10s=0x%02x; /* %-50s */" % (
                         name,self.CCpeekdatabyte(eval(address)), description);
                     if bitfields!="": print bitfields.rstrip();
+    def SRF_loadsymbols(self):
+        ident=self.CCident();
+        chip=self.CCversions.get(ident&0xFF00);
+        dom=self.SRF_chipdom(chip,"register_definition.xml");
+        for e in dom.getElementsByTagName("registerdefinition"):
+            for f in e.childNodes:
+                if f.localName=="Register":
+                    name="unknownreg";
+                    address="0xdead";
+                    description="";
+                    bitfields="";
+                    for g in f.childNodes:
+                        if g.localName=="Name":
+                            name=g.childNodes[0].nodeValue;
+                        elif g.localName=="Address":
+                            address=g.childNodes[0].nodeValue;
+                        elif g.localName=="Description":
+                            if g.childNodes:
+                                description=g.childNodes[0].nodeValue;
+                        elif g.localName=="Bitfield":
+                            bitfields+="%17s/* %-50s */\n" % ("",self.SRF_bitfieldstr(g));
+                    #print "SFRX(%10s, %s); /* %50s */" % (name,address, description);
+                    self.symbols.define(eval(address),name,description,"data");
     def halt(self):
         """Halt the CPU."""
         self.CChaltcpu();
index ca23bb9..fa40031 100644 (file)
@@ -19,6 +19,7 @@ class GoodFETConsole():
         client.serInit();
         client.setup();
         client.start();
+        client.loadsymbols();
     def prompt(self):
         sys.stdout.write("gf% ");
         sys.stdout.flush();
@@ -74,11 +75,15 @@ class GoodFETConsole():
     def CMDresume(self,args):
         print self.client.resume();
     def CMDpeek(self,args):
-        adr=eval(args[1]);
+        adr=args[1];
         memory="vn";
         if(len(args)>2):
             memory=args[2];
-        print "0x%08x:= 0x%04x" % (adr, self.client.peek16(adr,memory));
+        adr= self.client.name2adr(adr);
+        #print "%i" % adr;
+        print "0x%08x:= 0x%04x" % (
+            adr, self.client.peek16(adr,
+                                    memory));
     def CMDflash(self,args):
         file=args[1];
         self.client.flash(self.expandfilename(file));
index 7a07aac..b2e76bd 100755 (executable)
@@ -39,6 +39,8 @@ client.serInit()
 client.setup();
 client.start();
 
+#Get SmartRF Studio regs if they exist.
+#client.loadsymbols(); 
 
 if(sys.argv[1]=="explore"):
     print "Exploring undefined commands."