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..."
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]))
345 def ARMreadMem(self, adr, wrdcount):
347 r0 = self.ARMget_register(5); # store R0 and R1
348 r1 = self.ARMget_register(9);
349 #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR())
350 for word in range(adr, adr+(wrdcount*4), 4):
351 #sys.stdin.readline()
352 self.ARMset_register(5, word); # write address into R0
353 self.ARMset_register(9, 0xdeadbeef)
356 self.ARMdebuginstr(0xe4959004L, 0); # push LDR R1, [R0], #4 into instruction pipeline (autoincrements for consecutive reads)
361 self.ARMdebuginstr(0x47146,0)
362 self.ARMdebuginstr(0x47147,0)
363 print hex(self.ARMget_register(9))
364 # FIXME: this may end up changing te current debug-state. should we compare to current_dbgstate?
365 #print repr(self.data[4])
366 if (len(self.data)>4 and self.data[4] == '\x00'):
367 print >>sys.stderr,("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
368 raise Exception("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
371 retval.append( self.ARMget_register(9) ) # read memory value from R1 register
372 #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1)))
373 self.ARMset_register(9, r1); # restore R0 and R1
374 self.ARMset_register(5, r0);
378 case 0xD0: // loopback test
379 cmddatalong[0] = 0x12345678;
380 case 0xD1: // Set Scan Chain
381 cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
383 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
385 cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
387 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
389 cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
391 cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
393 cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
395 cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
399 if(sys.argv[1]=="test"):
401 if(sys.argv[1]=="deadtest"):
402 for i in range(1,10):
403 print "IDENT as %s" % client.CCidentstr();
404 if(sys.argv[1]=="dumpcode"):
409 start=int(sys.argv[3],16);
411 stop=int(sys.argv[4],16);
413 print "Dumping code from %04x to %04x as %s." % (start,stop,f);
417 h[i]=client.CCpeekcodebyte(i);
419 print "Dumped %04x."%i;
422 if(sys.argv[1]=="dumpdata"):
427 start=int(sys.argv[3],16);
429 stop=int(sys.argv[4],16);
431 print "Dumping data from %04x to %04x as %s." % (start,stop,f);
435 h[i]=client.CCpeekdatabyte(i);
437 print "Dumped %04x."%i;
440 if(sys.argv[1]=="status"):
441 print "Status: %s" %client.CCstatusstr();
442 if(sys.argv[1]=="erase"):
443 print "Status: %s" % client.CCstatusstr();
444 client.CCchiperase();
445 print "Status: %s" %client.CCstatusstr();
447 if(sys.argv[1]=="peekinfo"):
448 print "Select info flash."
449 client.CCwr_config(1);
450 print "Config is %02x" % client.CCrd_config();
454 start=int(sys.argv[2],16);
457 stop=int(sys.argv[3],16);
458 print "Peeking from %04x to %04x." % (start,stop);
460 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
462 if(sys.argv[1]=="poke"):
463 client.CCpokeirambyte(int(sys.argv[2],16),
464 int(sys.argv[3],16));
465 if(sys.argv[1]=="randtest"):
467 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
468 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
469 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
470 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
473 for foo in range(1,10):
474 print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
475 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
476 client.CCreleasecpu();
478 print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
479 if(sys.argv[1]=="adctest"):
480 # ADCTest 0xDF3A 0xDF3B
481 print "ADC TEST %02x%02x" % (
482 client.CCpeekdatabyte(0xDF3A),
483 client.CCpeekdatabyte(0xDF3B));
484 if(sys.argv[1]=="config"):
485 print "Config is %02x" % client.CCrd_config();
487 if(sys.argv[1]=="flash"):
492 start=int(sys.argv[3],16);
494 stop=int(sys.argv[4],16);
498 pagelen = 2048; #2kB pages in 32-bit words
501 print "Wiping Flash."
503 #client.CCchiperase();
504 #Wipe the RAM buffer for the next flash page.
505 #client.CCeraseflashbuffer();
506 for i in h._buf.keys():
507 while(i>page+pagelen):
509 client.CCflashpage(page);
510 #client.CCeraseflashbuffer();
512 print "Flashed page at %06x" % page
515 #Place byte into buffer.
516 client.CCpokedatabyte(0xF000+i-page,
520 print "Buffering %04x toward %06x" % (i,page);
522 client.CCflashpage(page);
523 print "Flashed final page at %06x" % page;
525 if(sys.argv[1]=="lock"):
526 print "Status: %s" %client.CCstatusstr();
528 print "Status: %s" %client.CCstatusstr();
529 if(sys.argv[1]=="flashpage"):
532 target=int(sys.argv[2],16);
533 print "Writing a page of flash from 0xF000 in XDATA"
534 client.CCflashpage(target);
535 if(sys.argv[1]=="erasebuffer"):
536 print "Erasing flash buffer.";
537 client.CCeraseflashbuffer();
539 if(sys.argv[1]=="writedata"):
544 start=int(sys.argv[3],16);
546 stop=int(sys.argv[4],16);
550 for i in h._buf.keys():
551 if(i>=start and i<=stop):
552 client.CCpokedatabyte(i,h[i]);
555 #if(sys.argv[1]=="flashtest"):
556 # client.CCflashtest();
557 if(sys.argv[1]=="peekdata"):
560 start=int(sys.argv[2],16);
563 stop=int(sys.argv[3],16);
564 print "Peeking from %04x to %04x." % (start,stop);
566 print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
568 if(sys.argv[1]=="peek"):
571 start=int(sys.argv[2],16);
574 stop=int(sys.argv[3],16);
575 print "Peeking from %04x to %04x." % (start,stop);
577 print "%04x: %02x" % (start,client.CCpeekirambyte(start));
580 if(sys.argv[1]=="peekcode"):
583 start=int(sys.argv[2],16);
586 stop=int(sys.argv[3],16);
587 print "Peeking from %04x to %04x." % (start,stop);
589 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
591 if(sys.argv[1]=="pokedata"):
595 start=int(sys.argv[2],16);
597 val=int(sys.argv[3],16);
598 print "Poking %04x to become %02x." % (start,val);
599 client.CCpokedatabyte(start,val);