from GoodFET import GoodFET;
from intelhex import IntelHex;
+import xml.dom.minidom;
+
class GoodFETCC(GoodFET):
"""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);
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",
#last page
self.CCflashpage(page);
print "Flashed final page at %06x" % page;
-
+
client.serInit();
client.setup();
client.start();
+ def prompt(self):
+ sys.stdout.write("gf% ");
+ sys.stdout.flush();
def run(self):
+ self.prompt();
+ #for cmd in sys.stdin:
while 1:
- sys.stdout.write("gf% ");
- sys.stdout.flush();
cmd=sys.stdin.readline();
- self.handle(cmd);
-
+ if not cmd: break;
+ if(cmd.strip()!=""):
+ self.handle(cmd);
+ self.prompt();
def handle(self, str):
"""Handle a command string. First word is command."""
#Lines beginning with # are comments.
def CMDflash(self,args):
file=args[1];
self.client.flash(self.expandfilename(file));
+ def CMDchip(self,args):
+ cmd="self.client.CMD%s()" % args[1];
+ print cmd;
+ try:
+ eval(cmd);
+ except:
+ print sys.exc_info()[0];
+ print "Chip-specific command failed.";
def expandfilename(self,filename):
if(filename[0]=='~'):
return "%s%s" % (os.environ.get("HOME"),filename.lstrip('~'));
print "%s test" % sys.argv[0];
print "%s term" % sys.argv[0];
print "%s info" % sys.argv[0];
+ print "%s radioinfo" % sys.argv[0];
print "%s dumpcode $foo.hex [0x$start 0x$stop]" % sys.argv[0];
print "%s dumpdata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
print "%s erase" % sys.argv[0];
print "Status: %s" %client.status();
if(sys.argv[1]=="info"):
print "%s" % client.CCidentstr();
+if(sys.argv[1]=="radioinfo"):
+ client.CMDrs();
if(sys.argv[1]=="erase"):
print "Status: %s" % client.status();
client.CCchiperase();