2 import sys, struct, binascii
3 from GoodFETARM import *
4 from intelhex import IntelHex
11 #Initailize FET and set baud rate
17 print "STARTUP: "+repr(client.data)
22 print "\n\nTesting JTAG for ARM\n"
23 client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback: \t %s"%repr(client.data) # loopback
24 data.append(client.data)
25 client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data) # set scan chain
26 data.append(client.data)
27 client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data) # get dbg state
28 data.append(client.data)
29 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
30 data.append(client.data)
31 client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data) # execute instruction
32 data.append(client.data)
33 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
34 data.append(client.data)
35 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
36 data.append(client.data)
37 client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data) # execute instruction
38 data.append(client.data)
39 client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data) # dr_shift32
40 data.append(client.data)
41 client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data) # set register
42 data.append(client.data)
43 client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data) # get register
44 data.append(client.data)
45 client.writecmd(0x33,0xd7,0,[]); print "chain1: \t %s"%repr(client.data) # chain1
46 data.append(client.data)
47 client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data) # read chain2
48 data.append(client.data)
49 client.writecmd(0x33,0xd9,0,[]); print "idcode: \t %s"%repr(client.data) # read idcode
50 data.append(client.data)
51 client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0: \t %s"%repr(client.data) # read idcode
52 data.append(client.data)
53 client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0): \t %s"%repr(client.data)
54 data.append(client.data)
55 client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2): \t %s"%repr(client.data)
56 data.append(client.data)
57 client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3): \t %s"%repr(client.data)
58 data.append(client.data)
59 client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4): \t %s"%repr(client.data)
60 data.append(client.data)
61 client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5): \t %s"%repr(client.data)
62 data.append(client.data)
63 client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7): \t %s"%repr(client.data)
64 data.append(client.data)
65 client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9): \t %s"%repr(client.data)
66 data.append(client.data)
67 client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c): \t %s"%repr(client.data)
68 data.append(client.data)
69 client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e): \t %s"%repr(client.data)
70 data.append(client.data)
71 client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f): \t %s"%repr(client.data)
72 data.append(client.data)
76 print "\n\nTesting JTAG for ARM\n"
77 print "IDCODE: %x"%client.ARMident()
78 print "Debug State: %x"%client.ARMget_dbgstate ()
79 print "Debug State: %x"%client.ARMget_dbgstate ()
80 print "Debug State: %x"%client.ARMget_dbgstate ()
81 print "Debug CTRL: %x"%client.ARMget_dbgctrl()
82 #client.writecmd(0x33,0xda,0,[])
83 #print "TEST CHAIN0: %s"%repr(client.data)
84 print "Debug State: %x"%client.ARMget_dbgstate ()
85 print "IDCODE: %x"%client.ARMident()
86 #print "Debug State: %x"%client.ARMget_dbgstate ()
87 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
88 print "Loopback: \t %s"%repr(client.data) # loopback
89 print "Debug State: %x"%client.ARMget_dbgstate ()
90 print "IDCODE: %x"%client.ARMident()
91 print "GetPC: %x"%client.ARMgetPC()
92 print "IDCODE: %x"%client.ARMident()
93 print "Debug State: %x"%client.ARMget_dbgstate ()
94 print "IDCODE: %x"%client.ARMident()
95 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
96 print "IDCODE: %x"%client.ARMident()
97 print "Debug State: %x"%client.ARMget_dbgstate ()
98 print "IDCODE: %x"%client.ARMident()
99 print "get_register(3): %x"%client.ARMget_register(3)
100 print "IDCODE: %x"%client.ARMident()
101 print "Debug State: %x"%client.ARMget_dbgstate ()
102 print "IDCODE: %x"%client.ARMident()
105 print "IDCODE: %x"%client.ARMident()
106 print "Debug State: %x"%client.ARMget_dbgstate ()
107 client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
108 print "Loopback: \t %s"%repr(client.data) # loopback
109 client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
110 print "test_set_reg: \t %s"%repr(client.data)
111 client.writecmd(0x33,0xd4,1,[0])
112 print "test_get_reg: \t %s"%repr(client.data)
113 print "set_register(3,0x41414141): %x"%client.ARMset_register(3,0x41414141)
114 print "get_register(3): %x"%client.ARMget_register(3)
115 client.writecmd(0x33,0xd4,1,[0])
116 print "test_get_reg: \t %s"%repr(client.data)
119 print "Don't forget to 'client.stop()' if you want to exit cleanly"
124 case 0xD0: // loopback test
125 cmddatalong[0] = 0x12345678;
126 case 0xD1: // Set Scan Chain
127 cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
129 cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
131 cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
133 cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
135 cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
137 cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
139 cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
141 cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
145 if(sys.argv[1]=="test"):
147 if(sys.argv[1]=="deadtest"):
148 for i in range(1,10):
149 print "IDENT as %s" % client.CCidentstr();
150 if(sys.argv[1]=="dumpcode"):
155 start=int(sys.argv[3],16);
157 stop=int(sys.argv[4],16);
159 print "Dumping code from %04x to %04x as %s." % (start,stop,f);
163 h[i]=client.CCpeekcodebyte(i);
165 print "Dumped %04x."%i;
168 if(sys.argv[1]=="dumpdata"):
173 start=int(sys.argv[3],16);
175 stop=int(sys.argv[4],16);
177 print "Dumping data from %04x to %04x as %s." % (start,stop,f);
181 h[i]=client.CCpeekdatabyte(i);
183 print "Dumped %04x."%i;
186 if(sys.argv[1]=="status"):
187 print "Status: %s" %client.CCstatusstr();
188 if(sys.argv[1]=="erase"):
189 print "Status: %s" % client.CCstatusstr();
190 client.CCchiperase();
191 print "Status: %s" %client.CCstatusstr();
193 if(sys.argv[1]=="peekinfo"):
194 print "Select info flash."
195 client.CCwr_config(1);
196 print "Config is %02x" % client.CCrd_config();
200 start=int(sys.argv[2],16);
203 stop=int(sys.argv[3],16);
204 print "Peeking from %04x to %04x." % (start,stop);
206 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
208 if(sys.argv[1]=="poke"):
209 client.CCpokeirambyte(int(sys.argv[2],16),
210 int(sys.argv[3],16));
211 if(sys.argv[1]=="randtest"):
213 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
214 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
215 client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
216 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
219 for foo in range(1,10):
220 print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
221 client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
222 client.CCreleasecpu();
224 print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
225 if(sys.argv[1]=="adctest"):
226 # ADCTest 0xDF3A 0xDF3B
227 print "ADC TEST %02x%02x" % (
228 client.CCpeekdatabyte(0xDF3A),
229 client.CCpeekdatabyte(0xDF3B));
230 if(sys.argv[1]=="config"):
231 print "Config is %02x" % client.CCrd_config();
233 if(sys.argv[1]=="flash"):
238 start=int(sys.argv[3],16);
240 stop=int(sys.argv[4],16);
244 pagelen = 2048; #2kB pages in 32-bit words
247 print "Wiping Flash."
249 #client.CCchiperase();
250 #Wipe the RAM buffer for the next flash page.
251 #client.CCeraseflashbuffer();
252 for i in h._buf.keys():
253 while(i>page+pagelen):
255 client.CCflashpage(page);
256 #client.CCeraseflashbuffer();
258 print "Flashed page at %06x" % page
261 #Place byte into buffer.
262 client.CCpokedatabyte(0xF000+i-page,
266 print "Buffering %04x toward %06x" % (i,page);
268 client.CCflashpage(page);
269 print "Flashed final page at %06x" % page;
271 if(sys.argv[1]=="lock"):
272 print "Status: %s" %client.CCstatusstr();
274 print "Status: %s" %client.CCstatusstr();
275 if(sys.argv[1]=="flashpage"):
278 target=int(sys.argv[2],16);
279 print "Writing a page of flash from 0xF000 in XDATA"
280 client.CCflashpage(target);
281 if(sys.argv[1]=="erasebuffer"):
282 print "Erasing flash buffer.";
283 client.CCeraseflashbuffer();
285 if(sys.argv[1]=="writedata"):
290 start=int(sys.argv[3],16);
292 stop=int(sys.argv[4],16);
296 for i in h._buf.keys():
297 if(i>=start and i<=stop):
298 client.CCpokedatabyte(i,h[i]);
301 #if(sys.argv[1]=="flashtest"):
302 # client.CCflashtest();
303 if(sys.argv[1]=="peekdata"):
306 start=int(sys.argv[2],16);
309 stop=int(sys.argv[3],16);
310 print "Peeking from %04x to %04x." % (start,stop);
312 print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
314 if(sys.argv[1]=="peek"):
317 start=int(sys.argv[2],16);
320 stop=int(sys.argv[3],16);
321 print "Peeking from %04x to %04x." % (start,stop);
323 print "%04x: %02x" % (start,client.CCpeekirambyte(start));
326 if(sys.argv[1]=="peekcode"):
329 start=int(sys.argv[2],16);
332 stop=int(sys.argv[3],16);
333 print "Peeking from %04x to %04x." % (start,stop);
335 print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
337 if(sys.argv[1]=="pokedata"):
341 start=int(sys.argv[2],16);
343 val=int(sys.argv[3],16);
344 print "Poking %04x to become %02x." % (start,val);
345 client.CCpokedatabyte(start,val);