class GoodFETCC(GoodFET):
"""A GoodFET variant for use with Chipcon 8051 Zigbeema 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();
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);
def CCwr_config(self,config):
"""Write the config register of a Chipcon."""
self.writecmd(0x30,0x81,1,[config&0xFF]);
+ 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",
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",
+ 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);
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="vn"):
+ return self.CCpeekcodebyte(address);
+
def CCpeekcodebyte(self,adr):
"""Read the contents of code memory at an address."""
self.data=[adr&0xff, (adr&0xff00)>>8];
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];
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);
return ord(self.data[0])
- CCstatusbits={0x80 : "erased",
+ #Same as CC2530
+ CCstatusbits={0x80 : "erase_busy",
0x40 : "pcon_idle",
0x20 : "cpu_halted",
0x10 : "pm0",
0x08 : "halt_status",
0x04 : "locked",
0x02 : "oscstable",
- 0x01 : "overflow"};
- def CCstatusstr(self):
+ 0x01 : "overflow"
+ };
+ CCconfigbits={0x20 : "soft_power_mode", #new for CC2530
+ 0x08 : "timers_off",
+ 0x04 : "dma_pause",
+ 0x02 : "timer_suspend",
+ 0x01 : "sel_flash_info_page" #stricken from CC2530
+ };
+
+ def status(self):
"""Check the status as a string."""
status=self.CCstatus();
str="";
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):
"""Step one instruction."""
self.writecmd(0x30,0x89,0,self.data);
+ def CCeraseflashbuffer(self):
+ """Erase the 2kB flash buffer"""
+ self.writecmd(0x30,0x99);
def CCflashpage(self,adr):
- """Flash a page of flash from 0xF000 in XDATA"""
+ """Flash 2kB a page of flash from 0xF000 in XDATA"""
+ data=[adr&0xFF,
+ (adr>>8)&0xFF,
+ (adr>>16)&0xFF,
+ (adr>>24)&0xFF];
+ print "Flashing buffer to 0x%06x" % adr;
self.writecmd(0x30,0x95,4,data);
-