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])!";
51 #print "Status: %s." % self.CCstatusstr();
57 """Move the FET into the CC2430/CC2530 application."""
58 #print "Initializing Chipcon.";
59 self.writecmd(0x30,0x10,0,self.data);
60 def CCrd_config(self):
61 """Read the config register of a Chipcon."""
62 self.writecmd(0x30,0x82,0,self.data);
63 return ord(self.data[0]);
64 def CCwr_config(self,config):
65 """Write the config register of a Chipcon."""
66 self.writecmd(0x30,0x81,1,[config&0xFF]);
68 CCversions={0x0100:"CC1110",
76 chip=self.CCversions.get(ident&0xFF00);
77 return "%s/r%02x" % (chip, ident&0xFF);
79 """Get a chipcon's ID."""
80 self.writecmd(0x30,0x8B,0,None);
81 chip=ord(self.data[0]);
82 rev=ord(self.data[1]);
85 """Get a chipcon's PC."""
86 self.writecmd(0x30,0x83,0,None);
90 def CCdebuginstr(self,instr):
91 self.writecmd(0x30,0x88,len(instr),instr);
92 return ord(self.data[0]);
93 def CCpeekcodebyte(self,adr):
94 """Read the contents of code memory at an address."""
95 self.data=[adr&0xff, (adr&0xff00)>>8];
96 self.writecmd(0x30,0x90,2,self.data);
97 return ord(self.data[0]);
98 def CCpeekdatabyte(self,adr):
99 """Read the contents of data memory at an address."""
100 self.data=[adr&0xff, (adr&0xff00)>>8];
101 self.writecmd(0x30,0x91, 2, self.data);
102 return ord(self.data[0]);
103 def CCpokedatabyte(self,adr,val):
104 """Write a byte to data memory."""
105 self.data=[adr&0xff, (adr&0xff00)>>8, val];
106 self.writecmd(0x30, 0x92, 3, self.data);
107 return ord(self.data[0]);
108 def CCchiperase(self):
109 """Erase all of the target's memory."""
110 self.writecmd(0x30,0x80,0,None);
112 """Check the status."""
113 self.writecmd(0x30,0x84,0,None);
114 return ord(self.data[0])
115 CCstatusbits={0x80 : "erased",
119 0x08 : "halt_status",
123 def CCstatusstr(self):
124 """Check the status as a string."""
125 status=self.CCstatus();
130 str="%s %s" %(self.CCstatusbits[i],str);
134 """Start debugging."""
135 self.writecmd(0x30,0x20,0,self.data);
136 ident=self.CCidentstr();
137 print "Target identifies as %s." % ident;
138 #print "Status: %s." % self.CCstatusstr();
141 #print "Status: %s." % self.CCstatusstr();
144 """Stop debugging."""
145 self.writecmd(0x30,0x21,0,self.data);
146 def CCstep_instr(self):
147 """Step one instruction."""
148 self.writecmd(0x30,0x89,0,self.data);
149 def CCflashpage(self,adr):
150 """Flash a page of flash from 0xF000 in XDATA"""
151 data=[0x00,0x00,0x00,0x00];
152 self.writecmd(0x30,0x95,4,data);