X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=client%2FGoodFETCC.py;h=94fcafd2a78301db4cbf915f2cca58e03ea8ca70;hp=d5208bd2dccf01f0f90430465fad8589ee86f8b1;hb=6097d6dc581f9331d80c8f1a04d307dd68a2fd0d;hpb=f1803b3ed1a5bd2673fb14c1f023940355cb4254 diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index d5208bd..94fcafd 100644 --- a/client/GoodFETCC.py +++ b/client/GoodFETCC.py @@ -12,14 +12,16 @@ from GoodFET import GoodFET; from intelhex import IntelHex; 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; + 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(); @@ -47,13 +49,18 @@ class GoodFETCC(GoodFET): if(pc!=self.CCgetPC()): print "ERROR: PC changed during CCdebuginstr([NOP])!"; + print "Checking pokes to XRAM." + for i in range(0xf000,0xf020): + self.CCpokedatabyte(i,0xde); + if(self.CCpeekdatabyte(i)!=0xde): + print "Error in XDATA at 0x%04x" % i; #print "Status: %s." % self.CCstatusstr(); #Exit debugger - self.CCstop(); + self.stop(); print "Done."; - def CCsetup(self): + def setup(self): """Move the FET into the CC2430/CC2530 application.""" #print "Initializing Chipcon."; self.writecmd(0x30,0x10,0,self.data); @@ -67,6 +74,9 @@ class GoodFETCC(GoodFET): 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", @@ -77,6 +87,16 @@ class GoodFETCC(GoodFET): 0xA500:"CC2530", #page 52 of SWRU191 0xB500:"CC2531", 0xFF00:"CCmissing"}; + CCpagesizes={0x01: 1024, #"CC1110", + 0x85: 2048, #"CC2430", + 0x89: 2048, #"CC2431", + 0x81: 1024, #"CC2510", + 0x91: 1024, #"CC2511", + 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); @@ -87,15 +107,40 @@ class GoodFETCC(GoodFET): chip=ord(self.data[0]); rev=ord(self.data[1]); return (chip<<8)+rev; + def CCpagesize(self): + """Get a chipcon's ID.""" + self.writecmd(0x30,0x8B,0,None); + chip=ord(self.data[0]); + size=self.CCpagesizes.get(chip); + if(size<10): + print "ERROR: Pagesize undefined."; + print "chip=%02x" %chip; + sys.exit(1); + #return 2048; + return size; def CCgetPC(self): """Get a chipcon's PC.""" self.writecmd(0x30,0x83,0,None); hi=ord(self.data[0]); lo=ord(self.data[1]); return (hi<<8)+lo; + def CCcmd(self,phrase): + self.writecmd(0x30,0x00,len(phrase),phrase); + val=ord(self.data[0]); + print "Got %02x" % val; + return val; 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]; @@ -106,6 +151,24 @@ class GoodFETCC(GoodFET): self.data=[adr&0xff, (adr&0xff00)>>8]; self.writecmd(0x30,0x91, 2, self.data); return ord(self.data[0]); + def CCpeekirambyte(self,adr): + """Read the contents of IRAM at an address.""" + self.data=[adr&0xff]; + self.writecmd(0x30,0x02, 1, self.data); + return ord(self.data[0]); + def CCpeekiramword(self,adr): + """Read the little-endian contents of IRAM at an address.""" + return self.CCpeekirambyte(adr)+( + self.CCpeekirambyte(adr+1)<<8); + def CCpokeiramword(self,adr,val): + self.CCpokeirambyte(adr,val&0xff); + self.CCpokeirambyte(adr+1,(val>>8)&0xff); + def CCpokeirambyte(self,adr,val): + """Write the contents of IRAM at an address.""" + self.data=[adr&0xff, val&0xff]; + self.writecmd(0x30,0x02, 2, self.data); + return ord(self.data[0]); + def CCpokedatabyte(self,adr,val): """Write a byte to data memory.""" self.data=[adr&0xff, (adr&0xff00)>>8, val]; @@ -114,6 +177,10 @@ class GoodFETCC(GoodFET): 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); @@ -135,7 +202,7 @@ class GoodFETCC(GoodFET): 0x01 : "sel_flash_info_page" #stricken from CC2530 }; - def CCstatusstr(self): + def status(self): """Check the status as a string.""" status=self.CCstatus(); str=""; @@ -145,17 +212,17 @@ class GoodFETCC(GoodFET): str="%s %s" %(self.CCstatusbits[i],str); i*=2; return str; - def CCstart(self): + def start(self): """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 CCstop(self): + def stop(self): """Stop debugging.""" self.writecmd(0x30,0x21,0,self.data); def CCstep_instr(self): @@ -172,3 +239,37 @@ class GoodFETCC(GoodFET): (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; +