2 # GoodFET Client Library
4 # (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
6 # This code is being rewritten and refactored. You've been warned!
11 from GoodFET import GoodFET;
12 from intelhex import IntelHex;
14 class GoodFETCC(GoodFET):
15 """A GoodFET variant for use with Chipcon 8051 Zigbeema SoC."""
18 self.writecmd(0x30,0x86,0,self.data);
19 def CCreleasecpu(self):
21 self.writecmd(0x30,0x87,0,self.data);
25 #print "Status: %s" % self.CCstatusstr();
27 #Grab ident three times, should be equal.
28 ident1=self.CCident();
29 ident2=self.CCident();
30 ident3=self.CCident();
31 if(ident1!=ident2 or ident2!=ident3):
32 print "Error, repeated ident attempts unequal."
33 print "%04x, %04x, %04x" % (ident1, ident2, ident3);
35 #Single step, printing PC.
36 print "Tracing execution at startup."
39 byte=self.CCpeekcodebyte(i);
40 #print "PC=%04x, %02x" % (pc, byte);
43 print "Verifying that debugging a NOP doesn't affect the PC."
46 self.CCdebuginstr([0x00]);
47 if(pc!=self.CCgetPC()):
48 print "ERROR: PC changed during CCdebuginstr([NOP])!";
50 print "Checking pokes to XRAM."
51 for i in range(0xf000,0xf020):
52 self.CCpokedatabyte(i,0xde);
53 if(self.CCpeekdatabyte(i)!=0xde):
54 print "Error in XDATA at 0x%04x" % i;
56 #print "Status: %s." % self.CCstatusstr();
62 """Move the FET into the CC2430/CC2530 application."""
63 #print "Initializing Chipcon.";
64 self.writecmd(0x30,0x10,0,self.data);
65 def CCrd_config(self):
66 """Read the config register of a Chipcon."""
67 self.writecmd(0x30,0x82,0,self.data);
68 return ord(self.data[0]);
69 def CCwr_config(self,config):
70 """Write the config register of a Chipcon."""
71 self.writecmd(0x30,0x81,1,[config&0xFF]);
73 """Set the flash lock bit in info mem."""
74 self.writecmd(0x30, 0x9A, 0, None);
77 CCversions={0x0100:"CC1110",
82 0xA500:"CC2530", #page 52 of SWRU191
87 chip=self.CCversions.get(ident&0xFF00);
88 return "%s/r%02x" % (chip, ident&0xFF);
90 """Get a chipcon's ID."""
91 self.writecmd(0x30,0x8B,0,None);
92 chip=ord(self.data[0]);
93 rev=ord(self.data[1]);
96 """Get a chipcon's PC."""
97 self.writecmd(0x30,0x83,0,None);
101 def CCcmd(self,phrase):
102 self.writecmd(0x30,0x00,len(phrase),phrase);
103 val=ord(self.data[0]);
104 print "Got %02x" % val;
106 def CCdebuginstr(self,instr):
107 self.writecmd(0x30,0x88,len(instr),instr);
108 return ord(self.data[0]);
109 def CCpeekcodebyte(self,adr):
110 """Read the contents of code memory at an address."""
111 self.data=[adr&0xff, (adr&0xff00)>>8];
112 self.writecmd(0x30,0x90,2,self.data);
113 return ord(self.data[0]);
114 def CCpeekdatabyte(self,adr):
115 """Read the contents of data memory at an address."""
116 self.data=[adr&0xff, (adr&0xff00)>>8];
117 self.writecmd(0x30,0x91, 2, self.data);
118 return ord(self.data[0]);
119 def CCpeekirambyte(self,adr):
120 """Read the contents of IRAM at an address."""
121 self.data=[adr&0xff];
122 self.writecmd(0x30,0x02, 1, self.data);
123 return ord(self.data[0]);
124 def CCpeekiramword(self,adr):
125 """Read the little-endian contents of IRAM at an address."""
126 return self.CCpeekirambyte(adr)+(
127 self.CCpeekirambyte(adr+1)<<8);
128 def CCpokeiramword(self,adr,val):
129 self.CCpokeirambyte(adr,val&0xff);
130 self.CCpokeirambyte(adr+1,(val>>8)&0xff);
131 def CCpokeirambyte(self,adr,val):
132 """Write the contents of IRAM at an address."""
133 self.data=[adr&0xff, val&0xff];
134 self.writecmd(0x30,0x02, 2, self.data);
135 return ord(self.data[0]);
137 def CCpokedatabyte(self,adr,val):
138 """Write a byte to data memory."""
139 self.data=[adr&0xff, (adr&0xff00)>>8, val];
140 self.writecmd(0x30, 0x92, 3, self.data);
141 return ord(self.data[0]);
142 def CCchiperase(self):
143 """Erase all of the target's memory."""
144 self.writecmd(0x30,0x80,0,None);
146 """Check the status."""
147 self.writecmd(0x30,0x84,0,None);
148 return ord(self.data[0])
150 CCstatusbits={0x80 : "erase_busy",
154 0x08 : "halt_status",
159 CCconfigbits={0x20 : "soft_power_mode", #new for CC2530
162 0x02 : "timer_suspend",
163 0x01 : "sel_flash_info_page" #stricken from CC2530
166 def CCstatusstr(self):
167 """Check the status as a string."""
168 status=self.CCstatus();
173 str="%s %s" %(self.CCstatusbits[i],str);
177 """Start debugging."""
178 self.writecmd(0x30,0x20,0,self.data);
179 ident=self.CCidentstr();
180 print "Target identifies as %s." % ident;
181 #print "Status: %s." % self.CCstatusstr();
184 #print "Status: %s." % self.CCstatusstr();
187 """Stop debugging."""
188 self.writecmd(0x30,0x21,0,self.data);
189 def CCstep_instr(self):
190 """Step one instruction."""
191 self.writecmd(0x30,0x89,0,self.data);
192 def CCeraseflashbuffer(self):
193 """Erase the 2kB flash buffer"""
194 self.writecmd(0x30,0x99);
195 def CCflashpage(self,adr):
196 """Flash 2kB a page of flash from 0xF000 in XDATA"""
201 print "Flashing buffer to 0x%06x" % adr;
202 self.writecmd(0x30,0x95,4,data);