X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETCC.py;h=688219d76dd89a2c85465f033a89384e470edd9c;hp=19e273165a24f7029b36184d32887c61f85b7a31;hb=144771f910594345d1efda0363a01735670ce2e5;hpb=8f024cc02ed60aaca66ecca2de8d56ca1dfd2c9e diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index 19e2731..688219d 100644 --- a/client/GoodFETCC.py +++ b/client/GoodFETCC.py @@ -16,14 +16,27 @@ import xml.dom.minidom; 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: + if self.verbose>0: print "SmartRF not found at %s." % self.smartrfpath; def SRF_chipdom(self,chip="cc1110", doc="register_definition.xml"): fn="%s/config/xml/%s/%s" % (self.smartrfpath,chip,doc); - print "Opening %s" % fn; + #print "Opening %s" % fn; return xml.dom.minidom.parse(fn) + def CMDrs(self,args=[]): """Chip command to grab the radio state.""" - self.SRF_radiostate(); + try: + self.SRF_radiostate(); + except: + print "Error printing radio state."; + print "SmartRF not found at %s." % self.smartrfpath; def SRF_bitfieldstr(self,bf): name="unused"; start=0; @@ -63,6 +76,65 @@ class GoodFETCC(GoodFET): print "%-10s=0x%02x; /* %-50s */" % ( name,self.CCpeekdatabyte(eval(address)), description); if bitfields!="": print bitfields.rstrip(); + def RF_setfreq(self,frequency): + """Set the frequency in Hz.""" + #FIXME CC1110 specific + + hz=frequency; + freq=hz/396.728515625; + freq0=freq&0xFF; + freq1=(freq&0xFF00)>>8; + freq1=(freq&0xFF0000)>>16; + self.CCpokedatabyte(0xdf09,freq2); + self.CCpokedatabyte(0xdf09,freq1); + self.CCpokedatabyte(0xdf09,freq0); + + def RF_getfreq(self): + """Get the frequency in Hz.""" + #FIXME CC1110 specific + + #return (2400+self.peek(0x05))*10**6 + #self.poke(0x05,chan); + freq2=self.CCpeekdatabyte(0xdf09); + freq1=self.CCpeekdatabyte(0xdf0a); + freq0=self.CCpeekdatabyte(0xdf0b); + freq=(freq2<<16)+(freq1<<8)+freq0; + hz=freq*396.728515625; + + return hz; + + def RF_carrier(self): + """Hold a carrier wave on the present frequency.""" + # Set CONT_WAVE, PLL_LOCK, and 0dBm in RF_SETUP + self.poke(0x06,8+10+4+2); + + def RF_getrssi(self): + """Returns the received signal strenght, from 0 to 1.""" + rssireg=self.symbols.get("RSSI"); + return self.CCpeekdatabyte(rssireg); + 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(); @@ -133,6 +205,7 @@ class GoodFETCC(GoodFET): CCversions={0x0100:"cc1110", + 0x1100:"cc1111", 0x8500:"cc2430", 0x8900:"cc2431", 0x8100:"cc2510", @@ -141,6 +214,7 @@ class GoodFETCC(GoodFET): 0xB500:"cc2531", 0xFF00:"CCmissing"}; CCpagesizes={0x01: 1024, #"CC1110", + 0x11: 1024, #"CC1111", 0x85: 2048, #"CC2430", 0x89: 2048, #"CC2431", 0x81: 1024, #"CC2510", @@ -153,7 +227,11 @@ class GoodFETCC(GoodFET): def CCidentstr(self): ident=self.CCident(); chip=self.CCversions.get(ident&0xFF00); - return "%s/r%02x" % (chip, ident&0xFF); + pagesize=self.CCpagesizes.get(ident>0xFF); + try: + return "%s/r%0.4x/ps0x%0.4x" % (chip, ident, pagesize); + except: + return "%04x" % ident; def CCident(self): """Get a chipcon's ID.""" self.writecmd(self.APP,0x8B,0,None); @@ -167,10 +245,12 @@ class GoodFETCC(GoodFET): size=self.CCpagesizes.get(chip); if(size<10): print "ERROR: Pagesize undefined."; - print "chip=%02x" %chip; + print "chip=%0.4x" %chip; 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); @@ -185,6 +265,12 @@ class GoodFETCC(GoodFET): def CCdebuginstr(self,instr): self.writecmd(self.APP,0x88,len(instr),instr); return ord(self.data[0]); + def peekblock(self,adr,length,memory="vn"): + """Return a block of data.""" + data=[adr&0xff, (adr&0xff00)>>8, + length&0xFF,(length&0xFF00)>>8]; + self.writecmd(self.APP,0x91,4,data); + return [ord(x) for x in self.data] def peek8(self,address, memory="code"): if(memory=="code" or memory=="flash" or memory=="vn"): return self.CCpeekcodebyte(address); @@ -233,6 +319,7 @@ class GoodFETCC(GoodFET): def erase(self): """Erase all of the target's memory.""" self.CCchiperase(); + self.start(); def CCstatus(self): """Check the status.""" @@ -274,7 +361,8 @@ class GoodFETCC(GoodFET): #print "Status: %s." % self.status(); self.CCreleasecpu(); self.CChaltcpu(); - #print "Status: %s." % self.status(); + #Get SmartRF Studio regs if they exist. + self.loadsymbols(); def stop(self): """Stop debugging.""" @@ -293,6 +381,39 @@ class GoodFETCC(GoodFET): (adr>>24)&0xFF]; print "Flashing buffer to 0x%06x" % adr; self.writecmd(self.APP,0x95,4,data); + + def setsecret(self,value): + """Set a secret word for later retreival. Used by glitcher.""" + page = 0x0000; + pagelen = self.CCpagesize(); #Varies by chip. + print "page=%04x, pagelen=%04x" % (page,pagelen); + + self.CCeraseflashbuffer(); + print "Setting secret to %x" % value; + self.CCpokedatabyte(0xF000,value); + self.CCpokedatabyte(0xF800,value); + print "Setting secret to %x==%x" % (value, + self.CCpeekdatabyte(0xf000)); + self.CCflashpage(0); + print "code[0]=%x" % self.CCpeekcodebyte(0); + def getsecret(self): + """Get a secret word. Used by glitcher.""" + secret=self.CCpeekcodebyte(0); + #print "Got secret %02x" % secret; + return secret; + + 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."""