2 import sys, struct, binascii,time
3 from GoodFETARM import *
4 from intelhex import IntelHex
11 #Initailize FET and set baud rate
12 print >>sys.stderr,"Connecting to goodfet..."
16 print >>sys.stderr,"Setting up JTAG ARM on goodfet..."
18 print >>sys.stderr,"Starting JTAG ARM on goodfet..."
20 print "STARTUP: "+repr(client.data)
23 def print_registers():
24 return [ hex(client.ARMget_register(x)) for x in range(15) ]
26 def regwratchet(num,hi=13,lo=0):
27 for x in xrange(lo,hi+1):
28 client.ARMset_register(x,num)
31 print "ARM JTAG Test Unit"
32 print " Chip ID", hex(client.ARMident())
33 print client.ARMidentstr()
34 print " Debug State: ",hex(client.ARMget_dbgstate())
35 print " Debug CTRL: ",hex(client.ARMget_dbgctrl())
37 print "Testing Register Read/Writes"
38 print " Storing old values"
39 originalregs = [client.ARMget_register(x) for x in xrange(16)]
42 test = [None for x in xrange(15)]
43 control = [x for x in xrange(15)]
45 client.ARMset_register(x,control[x])
46 test[x] = client.ARMget_register(x)
49 print "Control:",control
52 print "A little harder..."
53 test = [None for x in xrange(15)]
54 control = [4*x for x in xrange(15)]
56 client.ARMset_register(x,control[x])
57 test[x] = client.ARMget_register(x)
60 print "Control:",control
63 print "Complex testing 1"
64 for y in xrange(0,0xffffffff,0x10101010):
65 test = [None for x in xrange(15)]
66 control = [y for x in xrange(15)]
67 print " Test parms: ",control
69 client.ARMset_register(x,control[x])
70 test[x] = client.ARMget_register(x)
73 print "Control:",control
76 print "Complex testing 2"
77 for y in xrange(0,0xffffffff,101010101):
78 test = [None for x in xrange(15)]
79 control = [y for x in xrange(15)]
80 print " Test parms: ",control
82 client.ARMset_register(x,control[x])
83 test[x] = client.ARMget_register(x)
86 print "Control:",control
89 test = [None for x in xrange(15)]
90 control = [0x100*x for x in xrange(15)]
92 client.ARMset_register(x,control[x])
93 test[x] = client.ARMget_register(x)
96 print "Control:",control
99 print "Resetting original register values..."
101 client.ARMset_register(x,originalregs[x])
102 regs = [client.ARMget_register(x) for x in xrange(16)]
103 print "Original: \t",originalregs
104 print "Now (r15 may differ:\t",regs
106 print "Testing setting and movement of PC between instructions"
107 #client.ARMsetPC(0x0)
108 print "PC:",client.ARMgetPC()
109 print "PC:",client.ARMgetPC()
110 print "PC:",client.ARMgetPC()
111 print "PC:",client.ARMgetPC()
115 print "\n\nTesting JTAG for ARM\n"
116 client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback: \t %s"%repr(client.data) # loopback
117 data.append(client.data)
118 client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data) # set scan chain
119 data.append(client.data)
120 client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data) # get dbg state
121 data.append(client.data)
122 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
123 data.append(client.data)
124 client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data) # execute instruction
125 data.append(client.data)
126 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
127 data.append(client.data)
128 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
129 data.append(client.data)
130 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
131 data.append(client.data)
132 client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data) # dr_shift32
133 data.append(client.data)
134 client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data) # set register
135 data.append(client.data)
136 client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data) # get register
137 data.append(client.data)
138 client.writecmd(0x33,0xd7,0,[]); print "chain1: \t %s"%repr(client.data) # chain1
139 data.append(client.data)
140 client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data) # read chain2
141 data.append(client.data)
142 client.writecmd(0x33,0xd9,0,[]); print "idcode: \t %s"%repr(client.data) # read idcode
143 data.append(client.data)
144 client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0: \t %s"%repr(client.data) # read idcode
145 data.append(client.data)
146 client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0): \t %s"%repr(client.data)
147 data.append(client.data)
148 client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2): \t %s"%repr(client.data)
149 data.append(client.data)
150 client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3): \t %s"%repr(client.data)
151 data.append(client.data)
152 client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4): \t %s"%repr(client.data)
153 data.append(client.data)
154 client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5): \t %s"%repr(client.data)
155 data.append(client.data)
156 client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7): \t %s"%repr(client.data)
157 data.append(client.data)
158 client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9): \t %s"%repr(client.data)
159 data.append(client.data)
160 client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c): \t %s"%repr(client.data)
161 data.append(client.data)
162 client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e): \t %s"%repr(client.data)
163 data.append(client.data)
164 client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f): \t %s"%repr(client.data)
165 data.append(client.data)
169 print "\n\nTesting JTAG for ARM\n"
170 print "IDCODE: %x"%client.ARMident()
171 print "Debug State: %x"%client.ARMget_dbgstate ()
172 print "Debug State: %x"%client.ARMget_dbgstate ()
173 print "Debug State: %x"%client.ARMget_dbgstate ()
174 print "Debug CTRL: %x"%client.ARMget_dbgctrl()
175 client.writecmd(0x33,0xda,0,[])
176 print "TEST CHAIN0: %s"%repr(client.data)
177 print "Debug State: %x"%client.ARMget_dbgstate ()
178 print "IDCODE: %x"%client.ARMident()
179 print "Debug State: %x"%client.ARMget_dbgstate ()
180 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
181 print "Loopback: \t %s"%repr(client.data) # loopback
182 print "Debug State: %x"%client.ARMget_dbgstate ()
183 print "IDCODE: %x"%client.ARMident()
184 print "GetPC: %x"%client.ARMgetPC()
185 print "IDCODE: %x"%client.ARMident()
186 print "Debug State: %x"%client.ARMget_dbgstate ()
187 print "IDCODE: %x"%client.ARMident()
188 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
189 print "IDCODE: %x"%client.ARMident()
190 print "Debug State: %x"%client.ARMget_dbgstate ()
191 print "IDCODE: %x"%client.ARMident()
192 print "get_register(3): %x"%client.ARMget_register(3)
193 print "IDCODE: %x"%client.ARMident()
194 print "Debug State: %x"%client.ARMget_dbgstate ()
195 print "IDCODE: %x"%client.ARMident()
198 print "IDCODE: %x"%client.ARMident()
199 print "Debug State: %x"%client.ARMget_dbgstate ()
200 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
201 print "Loopback: \t %s"%repr(client.data) # loopback
202 client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
203 print "test_set_reg: \t %s"%repr(client.data)
204 client.writecmd(0x33,0xd4,1,[0])
205 print "test_get_reg: \t %s"%repr(client.data)
206 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
207 print "get_register(3): %x"%client.ARMget_register(3)
208 client.writecmd(0x33,0xd4,1,[0])
209 print "test_get_reg: \t %s"%repr(client.data)
212 print "IDCODE: %x"%client.ARMident()
213 print "Debug State: %x"%client.ARMget_dbgstate ()
214 print "set_register(0,0x4141): %x"%client.ARMset_register(0,0x4141)
215 print "get_register(0): %x"%client.ARMget_register(0)
216 print "set_register(1,0x4141): %x"%client.ARMset_register(1,0x4142)
217 print "get_register(1): %x"%client.ARMget_register(1)
218 print "set_register(2,0x4141): %x"%client.ARMset_register(2,0x4143)
219 print "get_register(2): %x"%client.ARMget_register(2)
220 print "set_register(3,0x4141): %x"%client.ARMset_register(3,0x4144)
221 print "get_register(3): %x"%client.ARMget_register(3)
222 print "set_register(4,0x4141): %x"%client.ARMset_register(4,0x4145)
223 print "get_register(4): %x"%client.ARMget_register(4)
224 print "set_register(5,0x4141): %x"%client.ARMset_register(5,0x4146)
225 print "get_register(5): %x"%client.ARMget_register(5)
226 print "set_register(6,0x4141): %x"%client.ARMset_register(6,0x4147)
227 print "get_register(6): %x"%client.ARMget_register(6)
228 print "set_register(7,0x4141): %x"%client.ARMset_register(7,0x4148)
229 print "get_register(7): %x"%client.ARMget_register(7)
230 print "set_register(8,0x4141): %x"%client.ARMset_register(8,0x4149)
231 print "get_register(8): %x"%client.ARMget_register(8)
232 print "set_register(9,0x4141): %x"%client.ARMset_register(9,0x4140)
233 print "get_register(9): %x"%client.ARMget_register(9)
234 print "set_register(10,0x4141): %x"%client.ARMset_register(10,0x4151)
235 print "get_register(10): %x"%client.ARMget_register(10)
236 print "set_register(11,0x4141): %x"%client.ARMset_register(11,0x4152)
237 print "get_register(11): %x"%client.ARMget_register(11)
238 print "set_register(12,0x4141): %x"%client.ARMset_register(12,0x4153)
239 print "get_register(12): %x"%client.ARMget_register(12)
240 print "set_register(13,0x4141): %x"%client.ARMset_register(13,0x4154)
241 print "get_register(13): %x"%client.ARMget_register(13)
242 print "set_register(14,0x4141): %x"%client.ARMset_register(14,0x4155)
243 print "get_register(14): %x"%client.ARMget_register(14)
244 #print "set_register(15,0x4141): %x"%client.ARMset_register(15,0x41414156)
245 #print "get_register(15): %x"%client.ARMget_register(15)
249 def test5(start=0,end=15):
251 results = [[] for x in range(end)]
253 #print "IDCODE: %x"%client.ARMident()
254 #print "Debug State: %x"%client.ARMget_dbgstate ()
255 for x in range(start,end):
256 num = client.ARMset_register(x,seed)
257 print "set_register(%d,0x%x): %x"%(x,seed,num)
258 num = client.ARMget_register(x)
259 print "get_register(%d): %x"%(x,num)
260 results[x].append(num)
263 num = client.ARMset_register(x,seed)
264 print "set_register(%d,0x%x): %x"%(x,seed,num)
265 num = client.ARMget_register(x)
266 print "get_register(%d): %x"%(x,num)
267 results[x].append(num)
271 print "Debug State: %x"%client.ARMget_dbgstate ()
273 def test6(start=0,end=15):
275 results = [[] for x in range(end)]
277 #print "IDCODE: %x"%client.ARMident()
278 #print "Debug State: %x"%client.ARMget_dbgstate ()
279 for x in range(start,end):
280 num = client.ARMset_register(x,seed+x)
281 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
284 for x in range(start,end):
285 num = client.ARMget_register(x)
286 print "get_register(%d): %x"%(x,num)
287 results[x].append(num)
290 num = client.ARMset_register(x,seed+x)
291 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
292 num = client.ARMget_register(x)
293 print "get_register(%d): %x"%(x,num)
294 results[x].append(num)
297 print "Debug State: %x"%client.ARMget_dbgstate ()
300 def test7(start=0,end=14):
302 results = [[] for x in range(end)]
304 #print "IDCODE: %x"%client.ARMident()
305 #print "Debug State: %x"%client.ARMget_dbgstate ()
306 for x in range(end,start-1, -1):
307 num = client.ARMset_register(x,seed+x)
309 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
311 for x in range(start,endi+1):
312 num = client.ARMget_register(x)
314 print "get_register(%d): %x"%(x,num)
315 results[x].append(num)
318 def readtest(start=0,end=14):
320 results = [[] for x in range(end)]
322 #print "IDCODE: %x"%client.ARMident()
323 #print "Debug State: %x"%client.ARMget_dbgstate ()
324 for x in range(end,start, -1):
325 num = client.ARMget_register(x)
327 print "get_register(%d): %x"%(x,num)
329 for x in range(start,end,2):
330 num = client.ARMget_register(x)
332 print "get_register(%d): %x"%(x,num)
333 results[x].append(num)
337 print "Don't forget to 'client.stop()' if you want to exit cleanly"
341 for y in range(len(results)):
343 print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
346 case 0xD0: // loopback test
347 cmddatalong[0] = 0x12345678;
348 case 0xD1: // Set Scan Chain
349 cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
351 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
353 cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
355 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
357 cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
359 cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
361 cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
363 cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
367 if(sys.argv[1]=="test"):
369 if(sys.argv[1]=="deadtest"):
370 for i in range(1,10):
371 print "IDENT as %s" % client.CCidentstr();
372 if(sys.argv[1]=="dumpcode"):
377 start=int(sys.argv[3],16);
379 stop=int(sys.argv[4],16);
381 print "Dumping code from %04x to %04x as %s." % (start,stop,f);
385 h[i]=client.CCpeekcodebyte(i);
387 print "Dumped %04x."%i;
390 if(sys.argv[1]=="dumpdata"):
395 start=int(sys.argv[3],16);
397 stop=int(sys.argv[4],16);
399 print "Dumping data from %04x to %04x as %s." % (start,stop,f);
403 h[i]=client.CCpeekdatabyte(i);
405 print "Dumped %04x."%i;
408 if(sys.argv[1]=="status"):
409 print "Status: %s" %client.CCstatusstr();
410 if(sys.argv[1]=="erase"):
411 print "Status: %s" % client.CCstatusstr();
412 client.CCchiperase();
413 print "Status: %s" %client.CCstatusstr();
415 if(sys.argv[1]=="peekinfo"):
416 print "Select info flash."
417 client.CCwr_config(1);
418 print "Config is %02x" % client.CCrd_config();
422 start=int(sys.argv[2],16);
425 stop=int(sys.argv[3],16);
426 print "Peeking from %04x to %04x." % (start,stop);
428 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
430 if(sys.argv[1]=="poke"):
431 client.CCpokeirambyte(int(sys.argv[2],16),
432 int(sys.argv[3],16));
433 if(sys.argv[1]=="randtest"):
435 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
436 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
437 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
438 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
441 for foo in range(1,10):
442 print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
443 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
444 client.CCreleasecpu();
446 print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
447 if(sys.argv[1]=="adctest"):
448 # ADCTest 0xDF3A 0xDF3B
449 print "ADC TEST %02x%02x" % (
450 client.CCpeekdatabyte(0xDF3A),
451 client.CCpeekdatabyte(0xDF3B));
452 if(sys.argv[1]=="config"):
453 print "Config is %02x" % client.CCrd_config();
455 if(sys.argv[1]=="flash"):
460 start=int(sys.argv[3],16);
462 stop=int(sys.argv[4],16);
466 pagelen = 2048; #2kB pages in 32-bit words
469 print "Wiping Flash."
471 #client.CCchiperase();
472 #Wipe the RAM buffer for the next flash page.
473 #client.CCeraseflashbuffer();
474 for i in h._buf.keys():
475 while(i>page+pagelen):
477 client.CCflashpage(page);
478 #client.CCeraseflashbuffer();
480 print "Flashed page at %06x" % page
483 #Place byte into buffer.
484 client.CCpokedatabyte(0xF000+i-page,
488 print "Buffering %04x toward %06x" % (i,page);
490 client.CCflashpage(page);
491 print "Flashed final page at %06x" % page;
493 if(sys.argv[1]=="lock"):
494 print "Status: %s" %client.CCstatusstr();
496 print "Status: %s" %client.CCstatusstr();
497 if(sys.argv[1]=="flashpage"):
500 target=int(sys.argv[2],16);
501 print "Writing a page of flash from 0xF000 in XDATA"
502 client.CCflashpage(target);
503 if(sys.argv[1]=="erasebuffer"):
504 print "Erasing flash buffer.";
505 client.CCeraseflashbuffer();
507 if(sys.argv[1]=="writedata"):
512 start=int(sys.argv[3],16);
514 stop=int(sys.argv[4],16);
518 for i in h._buf.keys():
519 if(i>=start and i<=stop):
520 client.CCpokedatabyte(i,h[i]);
523 #if(sys.argv[1]=="flashtest"):
524 # client.CCflashtest();
525 if(sys.argv[1]=="peekdata"):
528 start=int(sys.argv[2],16);
531 stop=int(sys.argv[3],16);
532 print "Peeking from %04x to %04x." % (start,stop);
534 print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
536 if(sys.argv[1]=="peek"):
539 start=int(sys.argv[2],16);
542 stop=int(sys.argv[3],16);
543 print "Peeking from %04x to %04x." % (start,stop);
545 print "%04x: %02x" % (start,client.CCpeekirambyte(start));
548 if(sys.argv[1]=="peekcode"):
551 start=int(sys.argv[2],16);
554 stop=int(sys.argv[3],16);
555 print "Peeking from %04x to %04x." % (start,stop);
557 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
559 if(sys.argv[1]=="pokedata"):
563 start=int(sys.argv[2],16);
565 val=int(sys.argv[3],16);
566 print "Poking %04x to become %02x." % (start,val);
567 client.CCpokedatabyte(start,val);