From: travisutk Date: Sat, 17 Oct 2009 05:41:35 +0000 (+0000) Subject: Fixed critical bug in dumpcode of Chipcon client. X-Git-Url: http://git.rot13.org/?p=goodfet;a=commitdiff_plain;h=1c58df5f46dc4550684ed9227732e880d2023791 Fixed critical bug in dumpcode of Chipcon client. This would have been avoided if I had implemented support for writing flash. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@199 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py new file mode 100644 index 0000000..bb96d30 --- /dev/null +++ b/client/GoodFETCC.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python +# GoodFET Client Library +# +# (C) 2009 Travis Goodspeed +# +# This code is being rewritten and refactored. You've been warned! + +import sys; +import binascii; + +from GoodFET import GoodFET; +from intelhex import IntelHex; + + +class GoodFETCC(GoodFET): + """A GoodFET variant for use with Chipcon 8051 Zigbeema SoC.""" + 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): + self.CCreleasecpu(); + self.CChaltcpu(); + #print "Status: %s" % self.CCstatusstr(); + + #Grab ident three times, should be equal. + ident1=self.CCident(); + ident2=self.CCident(); + ident3=self.CCident(); + if(ident1!=ident2 or ident2!=ident3): + print "Error, repeated ident attempts unequal." + print "%04x, %04x, %04x" % (ident1, ident2, ident3); + + #Single step, printing PC. + print "Tracing execution at startup." + for i in range(1,15): + pc=self.CCgetPC(); + byte=self.CCpeekcodebyte(i); + #print "PC=%04x, %02x" % (pc, byte); + self.CCstep_instr(); + + print "Verifying that debugging a NOP doesn't affect the PC." + for i in range(1,15): + pc=self.CCgetPC(); + self.CCdebuginstr([0x00]); + if(pc!=self.CCgetPC()): + print "ERROR: PC changed during CCdebuginstr([NOP])!"; + + + #print "Status: %s." % self.CCstatusstr(); + #Exit debugger + self.CCstop(); + print "Done."; + + def CCsetup(self): + """Move the FET into the CC2430/CC2530 application.""" + #print "Initializing Chipcon."; + self.writecmd(0x30,0x10,0,self.data); + def CCrd_config(self): + """Read the config register of a Chipcon.""" + self.writecmd(0x30,0x82,0,self.data); + return ord(self.data[0]); + def CCwr_config(self,config): + """Write the config register of a Chipcon.""" + self.writecmd(0x30,0x81,1,[config&0xFF]); + + CCversions={0x0100:"CC1110", + 0x8500:"CC2430", + 0x8900:"CC2431", + 0x8100:"CC2510", + 0x9100:"CC2511", + 0xFF00:"CCmissing"}; + def CCidentstr(self): + ident=self.CCident(); + chip=self.CCversions.get(ident&0xFF00); + return "%s/r%02x" % (chip, ident&0xFF); + def CCident(self): + """Get a chipcon's ID.""" + self.writecmd(0x30,0x8B,0,None); + chip=ord(self.data[0]); + rev=ord(self.data[1]); + return (chip<<8)+rev; + 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 CCdebuginstr(self,instr): + self.writecmd(0x30,0x88,len(instr),instr); + return ord(self.data[0]); + def CCpeekcodebyte(self,adr): + """Read the contents of code memory at an address.""" + self.data=[adr&0xff, (adr&0xff00)>>8]; + self.writecmd(0x30,0x90,2,self.data); + return ord(self.data[0]); + def CCpeekdatabyte(self,adr): + """Read the contents of data memory at an address.""" + self.data=[adr&0xff, (adr&0xff00)>>8]; + self.writecmd(0x30,0x91, 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]; + self.writecmd(0x30, 0x92, 3, self.data); + return ord(self.data[0]); + def CCchiperase(self): + """Erase all of the target's memory.""" + self.writecmd(0x30,0x80,0,None); + def CCstatus(self): + """Check the status.""" + self.writecmd(0x30,0x84,0,None); + return ord(self.data[0]) + CCstatusbits={0x80 : "erased", + 0x40 : "pcon_idle", + 0x20 : "halted", + 0x10 : "pm0", + 0x08 : "halted", + 0x04 : "locked", + 0x02 : "oscstable", + 0x01 : "overflow"}; + def CCstatusstr(self): + """Check the status as a string.""" + status=self.CCstatus(); + str=""; + i=1; + while i<0x100: + if(status&i): + str="%s %s" %(self.CCstatusbits[i],str); + i*=2; + return str; + def CCstart(self): + """Start debugging.""" + self.writecmd(0x30,0x20,0,self.data); + ident=self.CCidentstr(); + print "Target identifies as %s." % ident; + #print "Status: %s." % self.CCstatusstr(); + self.CCreleasecpu(); + self.CChaltcpu(); + #print "Status: %s." % self.CCstatusstr(); + + def CCstop(self): + """Stop debugging.""" + self.writecmd(0x30,0x21,0,self.data); + def CCstep_instr(self): + """Step one instruction.""" + self.writecmd(0x30,0x89,0,self.data); + diff --git a/client/goodfet.cc b/client/goodfet.cc index 7a8fe49..eb5ffa6 100755 --- a/client/goodfet.cc +++ b/client/goodfet.cc @@ -1,9 +1,14 @@ #!/usr/bin/env python +# GoodFET Chipcon Example +# +# (C) 2009 Travis Goodspeed +# +# This code is being rewritten and refactored. You've been warned! import sys; import binascii; -from GoodFET import GoodFETCC; +from GoodFETCC import GoodFETCC; from intelhex import IntelHex; @@ -47,7 +52,7 @@ if(sys.argv[1]=="dumpcode"): h = IntelHex(None); i=start; while i<=stop: - h[i>>1]=client.CCpeekcodebyte(i); + h[i]=client.CCpeekcodebyte(i); if(i%0x100==0): print "Dumped %04x."%i; i+=1; diff --git a/client/goodfet.msp430 b/client/goodfet.msp430 index f616fba..d012728 100755 --- a/client/goodfet.msp430 +++ b/client/goodfet.msp430 @@ -39,6 +39,9 @@ if(sys.argv[1]=="info"): client.MSP430ident()); if(sys.argv[1]=="test"): client.MSP430test(); +if(sys.argv[1]=="glitch"): + for foo in range(0,100): + print "Identifies as %04x" % client.MSP430ident(); if(sys.argv[1]=="dump"): f = sys.argv[2]; start=0x0200;