Fixes flash page sizing on CC1110, for flashing above 0x400.
[goodfet] / client / goodfet.cc
1 #!/usr/bin/env python
2 # GoodFET Chipcon Example
3
4 # (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 import sys;
9 import binascii;
10
11 from GoodFETCC import GoodFETCC;
12 from intelhex import IntelHex;
13
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s test" % sys.argv[0];
18     print "%s info" % sys.argv[0];
19     print "%s dumpcode $foo.hex [0x$start 0x$stop]" % sys.argv[0];
20     print "%s dumpdata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
21     print "%s erase" % sys.argv[0];
22     print "%s writedata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
23     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
24     print "%s peekdata 0x$start [0x$stop]" % sys.argv[0];
25     print "%s pokedata 0x$adr 0x$val" % sys.argv[0];
26     print "%s peek 0x$iram" % sys.argv[0];
27     print "%s poke 0x$iram 0x$val" % sys.argv[0];
28     print "%s peekcode 0x$start [0x$stop]" % sys.argv[0];
29     sys.exit();
30
31 #Initailize FET and set baud rate
32 client=GoodFETCC();
33 client.serInit()
34
35 #Connect to target
36 client.setup();
37 client.start();
38
39 if(sys.argv[1]=="explore"):
40     print "Exploring undefined commands."
41     print "Status: %s" %client.CCstatusstr();
42     
43     cmd=0x04; #read status
44     for foo in range(0,0x5):
45         client.CCcmd([(0x0F<<3)|(0x00)|0x03,0x09<<3]);
46         print "Status %02x: %s" % (foo,client.CCstatusstr());
47     for foo in range(0,3):
48         print "PC: %04x" % client.CCgetPC();
49         
50 if(sys.argv[1]=="test"):
51     client.CCtest();
52 if(sys.argv[1]=="deadtest"):
53     for i in range(1,10):
54         print "IDENT as %s" % client.CCidentstr();
55 if(sys.argv[1]=="dumpcode"):
56     f = sys.argv[2];
57     start=0x0000;
58     stop=0xFFFF;
59     if(len(sys.argv)>3):
60         start=int(sys.argv[3],16);
61     if(len(sys.argv)>4):
62         stop=int(sys.argv[4],16);
63     
64     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
65     h = IntelHex(None);
66     i=start;
67     while i<=stop:
68         h[i]=client.CCpeekcodebyte(i);
69         if(i%0x100==0):
70             print "Dumped %04x."%i;
71         i+=1;
72     h.write_hex_file(f);
73 if(sys.argv[1]=="dumpdata"):
74     f = sys.argv[2];
75     start=0xE000;
76     stop=0xFFFF;
77     if(len(sys.argv)>3):
78         start=int(sys.argv[3],16);
79     if(len(sys.argv)>4):
80         stop=int(sys.argv[4],16);
81     
82     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
83     h = IntelHex(None);
84     i=start;
85     while i<=stop:
86         h[i]=client.CCpeekdatabyte(i);
87         if(i%0x100==0):
88             print "Dumped %04x."%i;
89         i+=1;
90     h.write_hex_file(f);
91 if(sys.argv[1]=="status"):
92     print "Status: %s" %client.CCstatusstr();
93 if(sys.argv[1]=="erase"):
94     print "Status: %s" % client.CCstatusstr();
95     client.CCchiperase();
96     print "Status: %s" %client.CCstatusstr();
97
98 if(sys.argv[1]=="peekinfo"):
99     print "Select info flash."
100     client.CCwr_config(1);
101     print "Config is %02x" % client.CCrd_config();
102     
103     start=0x0000;
104     if(len(sys.argv)>2):
105         start=int(sys.argv[2],16);
106     stop=start;
107     if(len(sys.argv)>3):
108         stop=int(sys.argv[3],16);
109     print "Peeking from %04x to %04x." % (start,stop);
110     while start<=stop:
111         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
112         start=start+1;
113 if(sys.argv[1]=="poke"):
114     client.CCpokeirambyte(int(sys.argv[2],16),
115                           int(sys.argv[3],16));
116 if(sys.argv[1]=="randtest"):
117     #Seed RNG
118     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
119     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
120     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
121     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
122     
123     #Dump values
124     for foo in range(1,10):
125         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
126         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
127         client.CCreleasecpu();
128         client.CChaltcpu();
129     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
130 if(sys.argv[1]=="adctest"):
131     # ADCTest 0xDF3A 0xDF3B
132     print "ADC TEST %02x%02x" % (
133         client.CCpeekdatabyte(0xDF3A),
134         client.CCpeekdatabyte(0xDF3B));
135 if(sys.argv[1]=="config"):
136     print "Config is %02x" % client.CCrd_config();
137
138 if(sys.argv[1]=="flash"):
139      f=sys.argv[2];
140      start=0;
141      stop=0xFFFF;
142      if(len(sys.argv)>3):
143          start=int(sys.argv[3],16);
144      if(len(sys.argv)>4):
145          stop=int(sys.argv[4],16);
146    
147      h = IntelHex(f);
148      page = 0x0000;
149      pagelen = client.CCpagesize(); #2048; #2kB pages in 32-bit words
150      
151      bcount = 0;
152      
153      print "Wiping Flash."
154      #Wipe all of flash.
155      #client.CCchiperase();
156      #Wipe the RAM buffer for the next flash page.
157      client.CCeraseflashbuffer();
158      for i in h._buf.keys():
159          while(i>page+pagelen):
160              if bcount>0:
161                  client.CCflashpage(page);
162                  #client.CCeraseflashbuffer();
163                  bcount=0;
164                  print "Flashed page at %06x" % page
165              page+=pagelen;
166              
167          #Place byte into buffer.
168          client.CCpokedatabyte(0xF000+i-page,
169                                h[i]);
170          bcount+=1;
171          if(i%0x100==0):
172                 print "Buffering %04x toward %06x" % (i,page);
173      #last page
174      client.CCflashpage(page);
175      print "Flashed final page at %06x" % page;
176      
177 if(sys.argv[1]=="lock"):
178     print "Status: %s" %client.CCstatusstr();
179     client.CClockchip();
180     print "Status: %s" %client.CCstatusstr();
181 if(sys.argv[1]=="flashpage"):
182     target=0;
183     if(len(sys.argv)>2):
184         target=int(sys.argv[2],16);
185     print "Writing a page of flash from 0xF000 in XDATA"
186     client.CCflashpage(target);
187 if(sys.argv[1]=="erasebuffer"):
188     print "Erasing flash buffer.";
189     client.CCeraseflashbuffer();
190
191 if(sys.argv[1]=="writedata"):
192     f=sys.argv[2];
193     start=0;
194     stop=0xFFFF;
195     if(len(sys.argv)>3):
196         start=int(sys.argv[3],16);
197     if(len(sys.argv)>4):
198         stop=int(sys.argv[4],16);
199     
200     h = IntelHex(f);
201     
202     for i in h._buf.keys():
203         if(i>=start and i<=stop):
204             client.CCpokedatabyte(i,h[i]);
205             if(i%0x100==0):
206                 print "%04x" % i;
207 #if(sys.argv[1]=="flashtest"):
208 #    client.CCflashtest();
209 if(sys.argv[1]=="peekdata"):
210     start=0x0000;
211     if(len(sys.argv)>2):
212         start=int(sys.argv[2],16);
213     stop=start;
214     if(len(sys.argv)>3):
215         stop=int(sys.argv[3],16);
216     print "Peeking from %04x to %04x." % (start,stop);
217     while start<=stop:
218         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
219         start=start+1;
220 if(sys.argv[1]=="peek"):
221     start=0x0000;
222     if(len(sys.argv)>2):
223         start=int(sys.argv[2],16);
224     stop=start;
225     if(len(sys.argv)>3):
226         stop=int(sys.argv[3],16);
227     print "Peeking from %04x to %04x." % (start,stop);
228     while start<=stop:
229         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
230         start=start+1;
231 if(sys.argv[1]=="verify"):
232     f=sys.argv[2];
233     start=0;
234     stop=0xFFFF;
235     if(len(sys.argv)>3):
236         start=int(sys.argv[3],16);
237     if(len(sys.argv)>4):
238         stop=int(sys.argv[4],16);
239     
240     h = IntelHex(f);
241     for i in h._buf.keys():
242         if(i>=start and i<stop):
243             peek=client.CCpeekcodebyte(i)
244             if(h[i]!=peek):
245                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
246             if(i%0x100==0):
247                 print "%04x" % i;
248 if(sys.argv[1]=="peekcode"):
249     start=0x0000;
250     if(len(sys.argv)>2):
251         start=int(sys.argv[2],16);
252     stop=start;
253     if(len(sys.argv)>3):
254         stop=int(sys.argv[3],16);
255     print "Peeking from %04x to %04x." % (start,stop);
256     while start<=stop:
257         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
258         start=start+1;
259 if(sys.argv[1]=="pokedata"):
260     start=0x0000;
261     val=0x00;
262     if(len(sys.argv)>2):
263         start=int(sys.argv[2],16);
264     if(len(sys.argv)>3):
265         val=int(sys.argv[3],16);
266     print "Poking %04x to become %02x." % (start,val);
267     client.CCpokedatabyte(start,val);
268
269 client.stop();