from GoodFET import GoodFET;
from intelhex import IntelHex;
+import xml.dom.minidom;
+
class GoodFETCC(GoodFET):
- """A GoodFET variant for use with Chipcon 8051 Zigbeema SoC."""
+ """A GoodFET variant for use with Chipcon 8051 Zigbee SoC."""
+ APP=0x30;
+ smartrfpath="/opt/smartrf7";
+ 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();
+ def SRF_radiostate(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=="DeviceName":
+ print "// %s RadioState" % (f.childNodes[0].nodeValue);
+ elif f.localName=="Register":
+ name="unknownreg";
+ address="0xdead";
+ description="";
+ 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":
+ description=g.childNodes[0].nodeValue;
+ #print "SFRX(%10s, %s); /* %50s */" % (name,address, description);
+ print "%10s=0x%02x; /* %50s */" % (
+ name,self.CCpeekdatabyte(eval(address)), description);
def CChaltcpu(self):
"""Halt the CPU."""
self.writecmd(0x30,0x86,0,self.data);
def CCreleasecpu(self):
"""Resume the CPU."""
self.writecmd(0x30,0x87,0,self.data);
- def CCtest(self):
+ def test(self):
self.CCreleasecpu();
self.CChaltcpu();
#print "Status: %s" % self.CCstatusstr();
def CClockchip(self):
"""Set the flash lock bit in info mem."""
self.writecmd(0x30, 0x9A, 0, None);
+ def lock(self):
+ """Set the flash lock bit in info mem."""
+ self.CClockchip();
- CCversions={0x0100:"CC1110",
- 0x8500:"CC2430",
- 0x8900:"CC2431",
- 0x8100:"CC2510",
- 0x9100:"CC2511",
- 0xA500:"CC2530", #page 52 of SWRU191
- 0xB500:"CC2531",
+ CCversions={0x0100:"cc1110",
+ 0x8500:"cc2430",
+ 0x8900:"cc2431",
+ 0x8100:"cc2510",
+ 0x9100:"cc2511",
+ 0xA500:"cc2530", #page 52 of SWRU191
+ 0xB500:"cc2531",
0xFF00:"CCmissing"};
CCpagesizes={0x01: 1024, #"CC1110",
0x85: 2048, #"CC2430",
0xA5: 2048, #"CC2530", #page 52 of SWRU191
0xB5: 2048, #"CC2531",
0xFF: 0 } #"CCmissing"};
-
+ def infostring(self):
+ return self.CCidentstr();
def CCidentstr(self):
ident=self.CCident();
chip=self.CCversions.get(ident&0xFF00);
def CCdebuginstr(self,instr):
self.writecmd(0x30,0x88,len(instr),instr);
return ord(self.data[0]);
+ def peek8(self,address, memory="code"):
+ if(memory=="code" or memory=="flash" or memory=="vn"):
+ return self.CCpeekcodebyte(address);
+ elif(memory=="data" or memory=="xdata" or memory=="ram"):
+ return self.CCpeekdatabyte(address);
+ elif(memory=="idata" or memory=="iram"):
+ return self.CCpeekirambyte(address);
+ print "%s is an unknown memory." % memory;
+ return 0xdead;
def CCpeekcodebyte(self,adr):
"""Read the contents of code memory at an address."""
self.data=[adr&0xff, (adr&0xff00)>>8];
def CCchiperase(self):
"""Erase all of the target's memory."""
self.writecmd(0x30,0x80,0,None);
+ def erase(self):
+ """Erase all of the target's memory."""
+ self.CCchiperase();
+
def CCstatus(self):
"""Check the status."""
self.writecmd(0x30,0x84,0,None);
0x01 : "sel_flash_info_page" #stricken from CC2530
};
- def CCstatusstr(self):
+ def status(self):
"""Check the status as a string."""
status=self.CCstatus();
str="";
"""Start debugging."""
self.writecmd(0x30,0x20,0,self.data);
ident=self.CCidentstr();
- print "Target identifies as %s." % ident;
- #print "Status: %s." % self.CCstatusstr();
+ #print "Target identifies as %s." % ident;
+ #print "Status: %s." % self.status();
self.CCreleasecpu();
self.CChaltcpu();
- #print "Status: %s." % self.CCstatusstr();
+ #print "Status: %s." % self.status();
def stop(self):
"""Stop debugging."""
(adr>>24)&0xFF];
print "Flashing buffer to 0x%06x" % adr;
self.writecmd(0x30,0x95,4,data);
+
+ def flash(self,file):
+ """Flash an intel hex file to code memory."""
+ print "Flashing %s" % file;
+
+ h = IntelHex(file);
+ page = 0x0000;
+ pagelen = self.CCpagesize(); #Varies by chip.
+
+ #print "page=%04x, pagelen=%04x" % (page,pagelen);
+
+ bcount = 0;
+
+ #Wipe the RAM buffer for the next flash page.
+ self.CCeraseflashbuffer();
+ for i in h._buf.keys():
+ while(i>=page+pagelen):
+ if bcount>0:
+ self.CCflashpage(page);
+ #client.CCeraseflashbuffer();
+ bcount=0;
+ print "Flashed page at %06x" % page
+ page+=pagelen;
+
+ #Place byte into buffer.
+ self.CCpokedatabyte(0xF000+i-page,
+ h[i]);
+ bcount+=1;
+ if(i%0x100==0):
+ print "Buffering %04x toward %06x" % (i,page);
+ #last page
+ self.CCflashpage(page);
+ print "Flashed final page at %06x" % page;
+