X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;ds=sidebyside;f=client%2FGoodFETCC.py;h=6f85a0e6733ce709aec057bb98e414186933ea7c;hb=4e19996ffadaba56b6cca3cae9d732e6fba5c45e;hp=6001a5945195d275521e4af160325e0e7c800d90;hpb=139279cae9d6f011896550e265d4d676e460f47d;p=goodfet diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index 6001a59..6f85a0e 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,89 @@ 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=0; + try: + freq2=self.peekbysym("FREQ2"); + freq1=self.peekbysym("FREQ1"); + freq0=self.peekbysym("FREQ0"); + freq=(freq2<<16)+(freq1<<8)+freq0; + except: + freq=0; + + hz=freq*396.728515625; + + return hz; + + def RF_carrier(self): + """Hold a carrier wave on the present frequency.""" + print "ERROR, this ain't working yet." + + def RF_getrssi(self): + """Returns the received signal strenght, with a weird offset.""" + try: + rssireg=self.symbols.get("RSSI"); + return self.CCpeekdatabyte(rssireg); + except: + if self.verbose>0: print "RSSI reg doesn't exist."; + try: + #RSSI doesn't exist on 2.4GHz devices. Maybe RSSIL and RSSIH? + rssilreg=self.symbols.get("RSSIL"); + rssil=self.CCpeekdatabyte(rssilreg); + rssihreg=self.symbols.get("RSSIL"); + rssih=self.CCpeekdatabyte(rssihreg); + return (rssih<<8)|rssil; + except: + if self.verbose>0: print "RSSIL/RSSIH regs don't exist."; + + return 0; + + + 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 +229,7 @@ class GoodFETCC(GoodFET): CCversions={0x0100:"cc1110", + 0x1100:"cc1111", 0x8500:"cc2430", 0x8900:"cc2431", 0x8100:"cc2510", @@ -141,6 +238,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 +251,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,7 +269,7 @@ 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; @@ -187,6 +289,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); @@ -235,6 +343,7 @@ class GoodFETCC(GoodFET): def erase(self): """Erase all of the target's memory.""" self.CCchiperase(); + self.start(); def CCstatus(self): """Check the status.""" @@ -276,7 +385,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.""" @@ -295,6 +405,27 @@ 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);