2 import sys, struct, binascii,time
3 from GoodFETARM7 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...\n\n"
20 print "STARTUP: %s\n"%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()
112 print "Testing readChunk/writeChunk"
113 mem=client.ARMreadChunk(0x200000,32)
114 client.ARMwriteChunk(0x200000,mem)
115 mem2=client.ARMreadChunk(0x200000,32)
117 print "Failed: \n%s\n%s"%(repr([hex(x) for x in mem]), repr([hex(x) for x in mem2]))
124 print "\n\nTesting JTAG for ARM\n"
125 client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback: \t %s"%repr(client.data) # loopback
126 data.append(client.data)
127 client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data) # set scan chain
128 data.append(client.data)
129 client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data) # get dbg state
130 data.append(client.data)
131 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
132 data.append(client.data)
133 client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data) # execute instruction
134 data.append(client.data)
135 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
136 data.append(client.data)
137 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
138 data.append(client.data)
139 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
140 data.append(client.data)
141 client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data) # dr_shift32
142 data.append(client.data)
143 client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data) # set register
144 data.append(client.data)
145 client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data) # get register
146 data.append(client.data)
147 client.writecmd(0x33,0xd7,0,[]); print "chain1: \t %s"%repr(client.data) # chain1
148 data.append(client.data)
149 client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data) # read chain2
150 data.append(client.data)
151 client.writecmd(0x33,0xd9,0,[]); print "idcode: \t %s"%repr(client.data) # read idcode
152 data.append(client.data)
153 client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0: \t %s"%repr(client.data) # read idcode
154 data.append(client.data)
155 client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0): \t %s"%repr(client.data)
156 data.append(client.data)
157 client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2): \t %s"%repr(client.data)
158 data.append(client.data)
159 client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3): \t %s"%repr(client.data)
160 data.append(client.data)
161 client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4): \t %s"%repr(client.data)
162 data.append(client.data)
163 client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5): \t %s"%repr(client.data)
164 data.append(client.data)
165 client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7): \t %s"%repr(client.data)
166 data.append(client.data)
167 client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9): \t %s"%repr(client.data)
168 data.append(client.data)
169 client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c): \t %s"%repr(client.data)
170 data.append(client.data)
171 client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e): \t %s"%repr(client.data)
172 data.append(client.data)
173 client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f): \t %s"%repr(client.data)
174 data.append(client.data)
178 print "\n\nTesting JTAG for ARM\n"
179 print "IDCODE: %x"%client.ARMident()
180 print "Debug State: %x"%client.ARMget_dbgstate ()
181 print "Debug State: %x"%client.ARMget_dbgstate ()
182 print "Debug State: %x"%client.ARMget_dbgstate ()
183 print "Debug CTRL: %x"%client.ARMget_dbgctrl()
184 client.writecmd(0x33,0xda,0,[])
185 print "TEST CHAIN0: %s"%repr(client.data)
186 print "Debug State: %x"%client.ARMget_dbgstate ()
187 print "IDCODE: %x"%client.ARMident()
188 print "Debug State: %x"%client.ARMget_dbgstate ()
189 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
190 print "Loopback: \t %s"%repr(client.data) # loopback
191 print "Debug State: %x"%client.ARMget_dbgstate ()
192 print "IDCODE: %x"%client.ARMident()
193 print "GetPC: %x"%client.ARMgetPC()
194 print "IDCODE: %x"%client.ARMident()
195 print "Debug State: %x"%client.ARMget_dbgstate ()
196 print "IDCODE: %x"%client.ARMident()
197 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
198 print "IDCODE: %x"%client.ARMident()
199 print "Debug State: %x"%client.ARMget_dbgstate ()
200 print "IDCODE: %x"%client.ARMident()
201 print "get_register(3): %x"%client.ARMget_register(3)
202 print "IDCODE: %x"%client.ARMident()
203 print "Debug State: %x"%client.ARMget_dbgstate ()
204 print "IDCODE: %x"%client.ARMident()
207 print "IDCODE: %x"%client.ARMident()
208 print "Debug State: %x"%client.ARMget_dbgstate ()
209 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
210 print "Loopback: \t %s"%repr(client.data) # loopback
211 client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
212 print "test_set_reg: \t %s"%repr(client.data)
213 client.writecmd(0x33,0xd4,1,[0])
214 print "test_get_reg: \t %s"%repr(client.data)
215 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
216 print "get_register(3): %x"%client.ARMget_register(3)
217 client.writecmd(0x33,0xd4,1,[0])
218 print "test_get_reg: \t %s"%repr(client.data)
221 print "IDCODE: %x"%client.ARMident()
222 print "Debug State: %x"%client.ARMget_dbgstate ()
223 print "set_register(0,0x4141): %x"%client.ARMset_register(0,0x4141)
224 print "get_register(0): %x"%client.ARMget_register(0)
225 print "set_register(1,0x4141): %x"%client.ARMset_register(1,0x4142)
226 print "get_register(1): %x"%client.ARMget_register(1)
227 print "set_register(2,0x4141): %x"%client.ARMset_register(2,0x4143)
228 print "get_register(2): %x"%client.ARMget_register(2)
229 print "set_register(3,0x4141): %x"%client.ARMset_register(3,0x4144)
230 print "get_register(3): %x"%client.ARMget_register(3)
231 print "set_register(4,0x4141): %x"%client.ARMset_register(4,0x4145)
232 print "get_register(4): %x"%client.ARMget_register(4)
233 print "set_register(5,0x4141): %x"%client.ARMset_register(5,0x4146)
234 print "get_register(5): %x"%client.ARMget_register(5)
235 print "set_register(6,0x4141): %x"%client.ARMset_register(6,0x4147)
236 print "get_register(6): %x"%client.ARMget_register(6)
237 print "set_register(7,0x4141): %x"%client.ARMset_register(7,0x4148)
238 print "get_register(7): %x"%client.ARMget_register(7)
239 print "set_register(8,0x4141): %x"%client.ARMset_register(8,0x4149)
240 print "get_register(8): %x"%client.ARMget_register(8)
241 print "set_register(9,0x4141): %x"%client.ARMset_register(9,0x4140)
242 print "get_register(9): %x"%client.ARMget_register(9)
243 print "set_register(10,0x4141): %x"%client.ARMset_register(10,0x4151)
244 print "get_register(10): %x"%client.ARMget_register(10)
245 print "set_register(11,0x4141): %x"%client.ARMset_register(11,0x4152)
246 print "get_register(11): %x"%client.ARMget_register(11)
247 print "set_register(12,0x4141): %x"%client.ARMset_register(12,0x4153)
248 print "get_register(12): %x"%client.ARMget_register(12)
249 print "set_register(13,0x4141): %x"%client.ARMset_register(13,0x4154)
250 print "get_register(13): %x"%client.ARMget_register(13)
251 print "set_register(14,0x4141): %x"%client.ARMset_register(14,0x4155)
252 print "get_register(14): %x"%client.ARMget_register(14)
253 #print "set_register(15,0x4141): %x"%client.ARMset_register(15,0x41414156)
254 #print "get_register(15): %x"%client.ARMget_register(15)
258 def test5(start=0,end=15):
260 results = [[] for x in range(end)]
262 #print "IDCODE: %x"%client.ARMident()
263 #print "Debug State: %x"%client.ARMget_dbgstate ()
264 for x in range(start,end):
265 num = client.ARMset_register(x,seed)
266 print "set_register(%d,0x%x): %x"%(x,seed,num)
267 num = client.ARMget_register(x)
268 print "get_register(%d): %x"%(x,num)
269 results[x].append(num)
272 num = client.ARMset_register(x,seed)
273 print "set_register(%d,0x%x): %x"%(x,seed,num)
274 num = client.ARMget_register(x)
275 print "get_register(%d): %x"%(x,num)
276 results[x].append(num)
280 print "Debug State: %x"%client.ARMget_dbgstate ()
282 def test6(start=0,end=15):
284 results = [[] for x in range(end)]
286 #print "IDCODE: %x"%client.ARMident()
287 #print "Debug State: %x"%client.ARMget_dbgstate ()
288 for x in range(start,end):
289 num = client.ARMset_register(x,seed+x)
290 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
293 for x in range(start,end):
294 num = client.ARMget_register(x)
295 print "get_register(%d): %x"%(x,num)
296 results[x].append(num)
299 num = client.ARMset_register(x,seed+x)
300 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
301 num = client.ARMget_register(x)
302 print "get_register(%d): %x"%(x,num)
303 results[x].append(num)
306 print "Debug State: %x"%client.ARMget_dbgstate ()
309 def test7(start=0,end=14):
311 results = [[] for x in range(end)]
313 #print "IDCODE: %x"%client.ARMident()
314 #print "Debug State: %x"%client.ARMget_dbgstate ()
315 for x in range(end,start-1, -1):
316 num = client.ARMset_register(x,seed+x)
318 print "set_register(%d,0x%x): %x"%(x,seed+x,num)
320 for x in range(start,endi+1):
321 num = client.ARMget_register(x)
323 print "get_register(%d): %x"%(x,num)
324 results[x].append(num)
327 def readtest(start=0,end=14):
329 results = [[] for x in range(end)]
331 #print "IDCODE: %x"%client.ARMident()
332 #print "Debug State: %x"%client.ARMget_dbgstate ()
333 for x in range(end,start, -1):
334 num = client.ARMget_register(x)
336 print "get_register(%d): %x"%(x,num)
338 for x in range(start,end,2):
339 num = client.ARMget_register(x)
341 print "get_register(%d): %x"%(x,num)
342 results[x].append(num)
349 for y in range(len(results)):
351 print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
353 def ARMreadMem(self, adr, wrdcount):
355 r0 = self.ARMget_register(5); # store R0 and R1
356 r1 = self.ARMget_register(9);
357 #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR())
358 for word in range(adr, adr+(wrdcount*4), 4):
359 #sys.stdin.readline()
360 self.ARMset_register(5, word); # write address into R0
361 self.ARMset_register(9, 0xdeadbeef)
364 self.ARMdebuginstr(0xe4959004L, 0); # push LDR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive reads)
369 self.ARMdebuginstr(0x47146,0)
370 self.ARMdebuginstr(0x47147,0)
371 print hex(self.ARMget_register(9))
372 # FIXME: this may end up changing te current debug-state. should we compare to current_dbgstate?
373 #print repr(self.data[4])
374 if (len(self.data)>4 and self.data[4] == '\x00'):
375 print >>sys.stderr,("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
376 raise Exception("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
379 retval.append( self.ARMget_register(9) ) # read memory value from R1 register
380 #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1)))
381 self.ARMset_register(9, r1); # restore R0 and R1
382 self.ARMset_register(5, r0);
386 case 0xD0: // loopback test
387 cmddatalong[0] = 0x12345678;
388 case 0xD1: // Set Scan Chain
389 cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
391 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
393 cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
395 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
397 cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
399 cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
401 cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
403 cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
407 if(sys.argv[1]=="test"):
409 if(sys.argv[1]=="deadtest"):
410 for i in range(1,10):
411 print "IDENT as %s" % client.CCidentstr();
412 if(sys.argv[1]=="dumpcode"):
417 start=int(sys.argv[3],16);
419 stop=int(sys.argv[4],16);
421 print "Dumping code from %04x to %04x as %s." % (start,stop,f);
425 h[i]=client.CCpeekcodebyte(i);
427 print "Dumped %04x."%i;
430 if(sys.argv[1]=="dumpdata"):
435 start=int(sys.argv[3],16);
437 stop=int(sys.argv[4],16);
439 print "Dumping data from %04x to %04x as %s." % (start,stop,f);
443 h[i]=client.CCpeekdatabyte(i);
445 print "Dumped %04x."%i;
448 if(sys.argv[1]=="status"):
449 print "Status: %s" %client.CCstatusstr();
450 if(sys.argv[1]=="erase"):
451 print "Status: %s" % client.CCstatusstr();
452 client.CCchiperase();
453 print "Status: %s" %client.CCstatusstr();
455 if(sys.argv[1]=="peekinfo"):
456 print "Select info flash."
457 client.CCwr_config(1);
458 print "Config is %02x" % client.CCrd_config();
462 start=int(sys.argv[2],16);
465 stop=int(sys.argv[3],16);
466 print "Peeking from %04x to %04x." % (start,stop);
468 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
470 if(sys.argv[1]=="poke"):
471 client.CCpokeirambyte(int(sys.argv[2],16),
472 int(sys.argv[3],16));
473 if(sys.argv[1]=="randtest"):
475 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
476 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
477 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
478 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
481 for foo in range(1,10):
482 print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
483 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
484 client.CCreleasecpu();
486 print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
487 if(sys.argv[1]=="adctest"):
488 # ADCTest 0xDF3A 0xDF3B
489 print "ADC TEST %02x%02x" % (
490 client.CCpeekdatabyte(0xDF3A),
491 client.CCpeekdatabyte(0xDF3B));
492 if(sys.argv[1]=="config"):
493 print "Config is %02x" % client.CCrd_config();
495 if(sys.argv[1]=="flash"):
500 start=int(sys.argv[3],16);
502 stop=int(sys.argv[4],16);
506 pagelen = 2048; #2kB pages in 32-bit words
509 print "Wiping Flash."
511 #client.CCchiperase();
512 #Wipe the RAM buffer for the next flash page.
513 #client.CCeraseflashbuffer();
514 for i in h._buf.keys():
515 while(i>page+pagelen):
517 client.CCflashpage(page);
518 #client.CCeraseflashbuffer();
520 print "Flashed page at %06x" % page
523 #Place byte into buffer.
524 client.CCpokedatabyte(0xF000+i-page,
528 print "Buffering %04x toward %06x" % (i,page);
530 client.CCflashpage(page);
531 print "Flashed final page at %06x" % page;
533 if(sys.argv[1]=="lock"):
534 print "Status: %s" %client.CCstatusstr();
536 print "Status: %s" %client.CCstatusstr();
537 if(sys.argv[1]=="flashpage"):
540 target=int(sys.argv[2],16);
541 print "Writing a page of flash from 0xF000 in XDATA"
542 client.CCflashpage(target);
543 if(sys.argv[1]=="erasebuffer"):
544 print "Erasing flash buffer.";
545 client.CCeraseflashbuffer();
547 if(sys.argv[1]=="writedata"):
552 start=int(sys.argv[3],16);
554 stop=int(sys.argv[4],16);
558 for i in h._buf.keys():
559 if(i>=start and i<=stop):
560 client.CCpokedatabyte(i,h[i]);
563 #if(sys.argv[1]=="flashtest"):
564 # client.CCflashtest();
565 if(sys.argv[1]=="peekdata"):
568 start=int(sys.argv[2],16);
571 stop=int(sys.argv[3],16);
572 print "Peeking from %04x to %04x." % (start,stop);
574 print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
576 if(sys.argv[1]=="peek"):
579 start=int(sys.argv[2],16);
582 stop=int(sys.argv[3],16);
583 print "Peeking from %04x to %04x." % (start,stop);
585 print "%04x: %02x" % (start,client.CCpeekirambyte(start));
588 if(sys.argv[1]=="peekcode"):
591 start=int(sys.argv[2],16);
594 stop=int(sys.argv[3],16);
595 print "Peeking from %04x to %04x." % (start,stop);
597 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
599 if(sys.argv[1]=="pokedata"):
603 start=int(sys.argv[2],16);
605 val=int(sys.argv[3],16);
606 print "Poking %04x to become %02x." % (start,val);
607 client.CCpokedatabyte(start,val);