Minor additions to dsPIC33F/PIC24H programmer:
[goodfet] / client / GoodFETCC.py
index 7468834..79fbe5e 100644 (file)
@@ -17,10 +17,14 @@ class GoodFETCC(GoodFET):
     """A GoodFET variant for use with Chipcon 8051 Zigbee SoC."""
     APP=0x30;
     smartrfpath="/opt/smartrf7";
+    def loadsymbols(self):
+        try: self.SRF_loadsymbols();
+        except: print "SmartRF load failed.";
     def SRF_chipdom(self,chip="cc1110", doc="register_definition.xml"):
         fn="%s/config/xml/%s/%s" % (self.smartrfpath,chip,doc);
         print "Opening %s" % fn;
         return xml.dom.minidom.parse(fn)
+        
     def CMDrs(self,args=[]):
         """Chip command to grab the radio state."""
         self.SRF_radiostate();
@@ -35,7 +39,7 @@ class GoodFETCC(GoodFET):
             if e.localName=="Name" and e.childNodes: name= e.childNodes[0].nodeValue;
             elif e.localName=="Start": start=e.childNodes[0].nodeValue;
             elif e.localName=="Stop": stop=e.childNodes[0].nodeValue;
-        return "[%s:%s] %15s " % (start,stop,name);
+        return "   [%s:%s] %30s " % (start,stop,name);
     def SRF_radiostate(self):
         ident=self.CCident();
         chip=self.CCversions.get(ident&0xFF00);
@@ -58,14 +62,42 @@ class GoodFETCC(GoodFET):
                             if g.childNodes:
                                 description=g.childNodes[0].nodeValue;
                         elif g.localName=="Bitfield":
-                            bitfields+="%17s/* %10s */\n" % ("",self.SRF_bitfieldstr(g));
+                            bitfields+="%17s/* %-50s */\n" % ("",self.SRF_bitfieldstr(g));
                     #print "SFRX(%10s, %s); /* %50s */" % (name,address, description);
                     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();
     def CChaltcpu(self):
         """Halt the CPU."""
         self.writecmd(self.APP,0x86,0,self.data);
+    def resume(self):
+        self.CCreleasecpu();
     def CCreleasecpu(self):
         """Resume the CPU."""
         self.writecmd(self.APP,0x87,0,self.data);
@@ -166,6 +198,8 @@ class GoodFETCC(GoodFET):
             sys.exit(1);
             #return 2048;
         return size;
+    def getpc(self):
+        return self.CCgetPC();
     def CCgetPC(self):
         """Get a chipcon's PC."""
         self.writecmd(self.APP,0x83,0,None);
@@ -288,6 +322,18 @@ class GoodFETCC(GoodFET):
               (adr>>24)&0xFF];
         print "Flashing buffer to 0x%06x" % adr;
         self.writecmd(self.APP,0x95,4,data);
+    def dump(self,file,start=0,stop=0xffff):
+        """Dump an intel hex file from code memory."""
+        print "Dumping code from %04x to %04x as %s." % (start,stop,file);
+        h = IntelHex(None);
+        i=start;
+        while i<=stop:
+            h[i]=self.CCpeekcodebyte(i);
+            if(i%0x100==0):
+                print "Dumped %04x."%i;
+                h.write_hex_file(file); #buffer to disk.
+            i+=1;
+        h.write_hex_file(file);
 
     def flash(self,file):
         """Flash an intel hex file to code memory."""