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)
32 print "\n\nTesting JTAG for ARM\n"
33 client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback: \t %s"%repr(client.data) # loopback
34 data.append(client.data)
35 client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data) # set scan chain
36 data.append(client.data)
37 client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data) # get dbg state
38 data.append(client.data)
39 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
40 data.append(client.data)
41 client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data) # execute instruction
42 data.append(client.data)
43 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
44 data.append(client.data)
45 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
46 data.append(client.data)
47 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
48 data.append(client.data)
49 client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data) # dr_shift32
50 data.append(client.data)
51 client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data) # set register
52 data.append(client.data)
53 client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data) # get register
54 data.append(client.data)
55 client.writecmd(0x33,0xd7,0,[]); print "chain1: \t %s"%repr(client.data) # chain1
56 data.append(client.data)
57 client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data) # read chain2
58 data.append(client.data)
59 client.writecmd(0x33,0xd9,0,[]); print "idcode: \t %s"%repr(client.data) # read idcode
60 data.append(client.data)
61 client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0: \t %s"%repr(client.data) # read idcode
62 data.append(client.data)
63 client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0): \t %s"%repr(client.data)
64 data.append(client.data)
65 client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2): \t %s"%repr(client.data)
66 data.append(client.data)
67 client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3): \t %s"%repr(client.data)
68 data.append(client.data)
69 client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4): \t %s"%repr(client.data)
70 data.append(client.data)
71 client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5): \t %s"%repr(client.data)
72 data.append(client.data)
73 client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7): \t %s"%repr(client.data)
74 data.append(client.data)
75 client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9): \t %s"%repr(client.data)
76 data.append(client.data)
77 client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c): \t %s"%repr(client.data)
78 data.append(client.data)
79 client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e): \t %s"%repr(client.data)
80 data.append(client.data)
81 client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f): \t %s"%repr(client.data)
82 data.append(client.data)
86 print "\n\nTesting JTAG for ARM\n"
87 print "IDCODE: %x"%client.ARMident()
88 print "Debug State: %x"%client.ARMget_dbgstate ()
89 print "Debug State: %x"%client.ARMget_dbgstate ()
90 print "Debug State: %x"%client.ARMget_dbgstate ()
91 print "Debug CTRL: %x"%client.ARMget_dbgctrl()
92 client.writecmd(0x33,0xda,0,[])
93 print "TEST CHAIN0: %s"%repr(client.data)
94 print "Debug State: %x"%client.ARMget_dbgstate ()
95 print "IDCODE: %x"%client.ARMident()
96 print "Debug State: %x"%client.ARMget_dbgstate ()
97 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
98 print "Loopback: \t %s"%repr(client.data) # loopback
99 print "Debug State: %x"%client.ARMget_dbgstate ()
100 print "IDCODE: %x"%client.ARMident()
101 print "GetPC: %x"%client.ARMgetPC()
102 print "IDCODE: %x"%client.ARMident()
103 print "Debug State: %x"%client.ARMget_dbgstate ()
104 print "IDCODE: %x"%client.ARMident()
105 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
106 print "IDCODE: %x"%client.ARMident()
107 print "Debug State: %x"%client.ARMget_dbgstate ()
108 print "IDCODE: %x"%client.ARMident()
109 print "get_register(3): %x"%client.ARMget_register(3)
110 print "IDCODE: %x"%client.ARMident()
111 print "Debug State: %x"%client.ARMget_dbgstate ()
112 print "IDCODE: %x"%client.ARMident()
115 print "IDCODE: %x"%client.ARMident()
116 print "Debug State: %x"%client.ARMget_dbgstate ()
117 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
118 print "Loopback: \t %s"%repr(client.data) # loopback
119 client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
120 print "test_set_reg: \t %s"%repr(client.data)
121 client.writecmd(0x33,0xd4,1,[0])
122 print "test_get_reg: \t %s"%repr(client.data)
123 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
124 print "get_register(3): %x"%client.ARMget_register(3)
125 client.writecmd(0x33,0xd4,1,[0])
126 print "test_get_reg: \t %s"%repr(client.data)
129 print "IDCODE: %x"%client.ARMident()
130 print "Debug State: %x"%client.ARMget_dbgstate ()
131 print "set_register(0,0x4141): %x"%client.ARMset_register(0,0x4141)
132 print "get_register(0): %x"%client.ARMget_register(0)
133 print "set_register(1,0x4141): %x"%client.ARMset_register(1,0x4142)
134 print "get_register(1): %x"%client.ARMget_register(1)
135 print "set_register(2,0x4141): %x"%client.ARMset_register(2,0x4143)
136 print "get_register(2): %x"%client.ARMget_register(2)
137 print "set_register(3,0x4141): %x"%client.ARMset_register(3,0x4144)
138 print "get_register(3): %x"%client.ARMget_register(3)
139 print "set_register(4,0x4141): %x"%client.ARMset_register(4,0x4145)
140 print "get_register(4): %x"%client.ARMget_register(4)
141 print "set_register(5,0x4141): %x"%client.ARMset_register(5,0x4146)
142 print "get_register(5): %x"%client.ARMget_register(5)
143 print "set_register(6,0x4141): %x"%client.ARMset_register(6,0x4147)
144 print "get_register(6): %x"%client.ARMget_register(6)
145 print "set_register(7,0x4141): %x"%client.ARMset_register(7,0x4148)
146 print "get_register(7): %x"%client.ARMget_register(7)
147 print "set_register(8,0x4141): %x"%client.ARMset_register(8,0x4149)
148 print "get_register(8): %x"%client.ARMget_register(8)
149 print "set_register(9,0x4141): %x"%client.ARMset_register(9,0x4140)
150 print "get_register(9): %x"%client.ARMget_register(9)
151 print "set_register(10,0x4141): %x"%client.ARMset_register(10,0x4151)
152 print "get_register(10): %x"%client.ARMget_register(10)
153 print "set_register(11,0x4141): %x"%client.ARMset_register(11,0x4152)
154 print "get_register(11): %x"%client.ARMget_register(11)
155 print "set_register(12,0x4141): %x"%client.ARMset_register(12,0x4153)
156 print "get_register(12): %x"%client.ARMget_register(12)
157 print "set_register(13,0x4141): %x"%client.ARMset_register(13,0x4154)
158 print "get_register(13): %x"%client.ARMget_register(13)
159 print "set_register(14,0x4141): %x"%client.ARMset_register(14,0x4155)
160 print "get_register(14): %x"%client.ARMget_register(14)
161 #print "set_register(15,0x4141): %x"%client.ARMset_register(15,0x41414156)
162 #print "get_register(15): %x"%client.ARMget_register(15)
166 def test5(start=0,end=15):
168 results = [[] for x in range(end)]
170 #print "IDCODE: %x"%client.ARMident()
171 #print "Debug State: %x"%client.ARMget_dbgstate ()
172 for x in range(start,end):
173 num = client.ARMset_register(x,seed)
174 print "set_register(%d,0x%x): %x"%(x,seed,num)
175 num = client.ARMget_register(x)
176 print "get_register(%d): %x"%(x,num)
177 results[x].append(num)
180 num = client.ARMset_register(x,seed)
181 print "set_register(%d,0x%x): %x"%(x,seed,num)
182 num = client.ARMget_register(x)
183 print "get_register(%d): %x"%(x,num)
184 results[x].append(num)
188 print "Debug State: %x"%client.ARMget_dbgstate ()
190 def test6(start=0,end=15):
192 results = [[] for x in range(end)]
194 #print "IDCODE: %x"%client.ARMident()
195 #print "Debug State: %x"%client.ARMget_dbgstate ()
196 for x in range(start,end):
197 num = client.ARMset_register(x,seed+x)
198 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
201 for x in range(start,end):
202 num = client.ARMget_register(x)
203 print "get_register(%d): %x"%(x,num)
204 results[x].append(num)
207 num = client.ARMset_register(x,seed+x)
208 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
209 num = client.ARMget_register(x)
210 print "get_register(%d): %x"%(x,num)
211 results[x].append(num)
214 print "Debug State: %x"%client.ARMget_dbgstate ()
217 def test7(start=0,end=14):
219 results = [[] for x in range(end)]
221 #print "IDCODE: %x"%client.ARMident()
222 #print "Debug State: %x"%client.ARMget_dbgstate ()
223 for x in range(end,start-1, -1):
224 num = client.ARMset_register(x,seed+x)
226 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
228 for x in range(start,endi+1):
229 num = client.ARMget_register(x)
231 print "get_register(%d): %x"%(x,num)
232 results[x].append(num)
235 def readtest(start=0,end=14):
237 results = [[] for x in range(end)]
239 #print "IDCODE: %x"%client.ARMident()
240 #print "Debug State: %x"%client.ARMget_dbgstate ()
241 for x in range(end,start, -1):
242 num = client.ARMget_register(x)
244 print "get_register(%d): %x"%(x,num)
246 for x in range(start,end,2):
247 num = client.ARMget_register(x)
249 print "get_register(%d): %x"%(x,num)
250 results[x].append(num)
254 print "Don't forget to 'client.stop()' if you want to exit cleanly"
258 for y in range(len(results)):
260 print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
263 case 0xD0: // loopback test
264 cmddatalong[0] = 0x12345678;
265 case 0xD1: // Set Scan Chain
266 cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
268 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
270 cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
272 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
274 cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
276 cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
278 cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
280 cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
284 if(sys.argv[1]=="test"):
286 if(sys.argv[1]=="deadtest"):
287 for i in range(1,10):
288 print "IDENT as %s" % client.CCidentstr();
289 if(sys.argv[1]=="dumpcode"):
294 start=int(sys.argv[3],16);
296 stop=int(sys.argv[4],16);
298 print "Dumping code from %04x to %04x as %s." % (start,stop,f);
302 h[i]=client.CCpeekcodebyte(i);
304 print "Dumped %04x."%i;
307 if(sys.argv[1]=="dumpdata"):
312 start=int(sys.argv[3],16);
314 stop=int(sys.argv[4],16);
316 print "Dumping data from %04x to %04x as %s." % (start,stop,f);
320 h[i]=client.CCpeekdatabyte(i);
322 print "Dumped %04x."%i;
325 if(sys.argv[1]=="status"):
326 print "Status: %s" %client.CCstatusstr();
327 if(sys.argv[1]=="erase"):
328 print "Status: %s" % client.CCstatusstr();
329 client.CCchiperase();
330 print "Status: %s" %client.CCstatusstr();
332 if(sys.argv[1]=="peekinfo"):
333 print "Select info flash."
334 client.CCwr_config(1);
335 print "Config is %02x" % client.CCrd_config();
339 start=int(sys.argv[2],16);
342 stop=int(sys.argv[3],16);
343 print "Peeking from %04x to %04x." % (start,stop);
345 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
347 if(sys.argv[1]=="poke"):
348 client.CCpokeirambyte(int(sys.argv[2],16),
349 int(sys.argv[3],16));
350 if(sys.argv[1]=="randtest"):
352 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
353 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
354 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
355 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
358 for foo in range(1,10):
359 print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
360 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
361 client.CCreleasecpu();
363 print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
364 if(sys.argv[1]=="adctest"):
365 # ADCTest 0xDF3A 0xDF3B
366 print "ADC TEST %02x%02x" % (
367 client.CCpeekdatabyte(0xDF3A),
368 client.CCpeekdatabyte(0xDF3B));
369 if(sys.argv[1]=="config"):
370 print "Config is %02x" % client.CCrd_config();
372 if(sys.argv[1]=="flash"):
377 start=int(sys.argv[3],16);
379 stop=int(sys.argv[4],16);
383 pagelen = 2048; #2kB pages in 32-bit words
386 print "Wiping Flash."
388 #client.CCchiperase();
389 #Wipe the RAM buffer for the next flash page.
390 #client.CCeraseflashbuffer();
391 for i in h._buf.keys():
392 while(i>page+pagelen):
394 client.CCflashpage(page);
395 #client.CCeraseflashbuffer();
397 print "Flashed page at %06x" % page
400 #Place byte into buffer.
401 client.CCpokedatabyte(0xF000+i-page,
405 print "Buffering %04x toward %06x" % (i,page);
407 client.CCflashpage(page);
408 print "Flashed final page at %06x" % page;
410 if(sys.argv[1]=="lock"):
411 print "Status: %s" %client.CCstatusstr();
413 print "Status: %s" %client.CCstatusstr();
414 if(sys.argv[1]=="flashpage"):
417 target=int(sys.argv[2],16);
418 print "Writing a page of flash from 0xF000 in XDATA"
419 client.CCflashpage(target);
420 if(sys.argv[1]=="erasebuffer"):
421 print "Erasing flash buffer.";
422 client.CCeraseflashbuffer();
424 if(sys.argv[1]=="writedata"):
429 start=int(sys.argv[3],16);
431 stop=int(sys.argv[4],16);
435 for i in h._buf.keys():
436 if(i>=start and i<=stop):
437 client.CCpokedatabyte(i,h[i]);
440 #if(sys.argv[1]=="flashtest"):
441 # client.CCflashtest();
442 if(sys.argv[1]=="peekdata"):
445 start=int(sys.argv[2],16);
448 stop=int(sys.argv[3],16);
449 print "Peeking from %04x to %04x." % (start,stop);
451 print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
453 if(sys.argv[1]=="peek"):
456 start=int(sys.argv[2],16);
459 stop=int(sys.argv[3],16);
460 print "Peeking from %04x to %04x." % (start,stop);
462 print "%04x: %02x" % (start,client.CCpeekirambyte(start));
465 if(sys.argv[1]=="peekcode"):
468 start=int(sys.argv[2],16);
471 stop=int(sys.argv[3],16);
472 print "Peeking from %04x to %04x." % (start,stop);
474 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
476 if(sys.argv[1]=="pokedata"):
480 start=int(sys.argv[2],16);
482 val=int(sys.argv[3],16);
483 print "Poking %04x to become %02x." % (start,val);
484 client.CCpokedatabyte(start,val);