updates to JTAGARM7 appid and some additional test play
[goodfet] / client / gplay-arm.py
1 #!/usr/bin/env ipython
2 import sys, struct, binascii,time
3 from GoodFETARM import *
4 from intelhex import IntelHex
5
6
7 data = []
8
9 client=GoodFETARM();
10 def init():
11     #Initailize FET and set baud rate
12     client.serInit()
13     #
14     #Connect to target
15     client.setup()
16     client.start()
17     print "STARTUP: "+repr(client.data)
18     #
19
20 def test1():
21     global 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)
73
74 def test2():
75     global 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()
103
104 def test3():
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)           
117
118 def test4():
119         print "IDCODE:      %x"%client.ARMident()
120         print "Debug State: %x"%client.ARMget_dbgstate ()
121         print "set_register(0,0x4141):  %x"%client.ARMset_register(0,0x4141)
122         print "get_register(0):             %x"%client.ARMget_register(0)
123         print "set_register(1,0x4141):  %x"%client.ARMset_register(1,0x4142)
124         print "get_register(1):             %x"%client.ARMget_register(1)
125         print "set_register(2,0x4141):  %x"%client.ARMset_register(2,0x4143)
126         print "get_register(2):             %x"%client.ARMget_register(2)
127         print "set_register(3,0x4141):  %x"%client.ARMset_register(3,0x4144)
128         print "get_register(3):             %x"%client.ARMget_register(3)
129         print "set_register(4,0x4141):  %x"%client.ARMset_register(4,0x4145)
130         print "get_register(4):             %x"%client.ARMget_register(4)
131         print "set_register(5,0x4141):  %x"%client.ARMset_register(5,0x4146)
132         print "get_register(5):             %x"%client.ARMget_register(5)
133         print "set_register(6,0x4141):  %x"%client.ARMset_register(6,0x4147)
134         print "get_register(6):             %x"%client.ARMget_register(6)
135         print "set_register(7,0x4141):  %x"%client.ARMset_register(7,0x4148)
136         print "get_register(7):             %x"%client.ARMget_register(7)
137         print "set_register(8,0x4141):  %x"%client.ARMset_register(8,0x4149)
138         print "get_register(8):             %x"%client.ARMget_register(8)
139         print "set_register(9,0x4141):  %x"%client.ARMset_register(9,0x4140)
140         print "get_register(9):             %x"%client.ARMget_register(9)
141         print "set_register(10,0x4141):  %x"%client.ARMset_register(10,0x4151)
142         print "get_register(10):             %x"%client.ARMget_register(10)
143         print "set_register(11,0x4141):  %x"%client.ARMset_register(11,0x4152)
144         print "get_register(11):             %x"%client.ARMget_register(11)
145         print "set_register(12,0x4141):  %x"%client.ARMset_register(12,0x4153)
146         print "get_register(12):             %x"%client.ARMget_register(12)
147         print "set_register(13,0x4141):  %x"%client.ARMset_register(13,0x4154)
148         print "get_register(13):             %x"%client.ARMget_register(13)
149         print "set_register(14,0x4141):  %x"%client.ARMset_register(14,0x4155)
150         print "get_register(14):             %x"%client.ARMget_register(14)
151         #print "set_register(15,0x4141):  %x"%client.ARMset_register(15,0x41414156)
152         #print "get_register(15):             %x"%client.ARMget_register(15)
153
154
155 seed = 0
156 def test5(start=0,end=15):
157     global results,seed
158     results = [[] for x in range(end)]
159     while True:
160         #print "IDCODE:      %x"%client.ARMident()
161         #print "Debug State: %x"%client.ARMget_dbgstate ()
162         for x in range(start,end):
163             num = client.ARMset_register(x,seed)
164             print "set_register(%d,0x%x):  %x"%(x,seed,num)
165             num = client.ARMget_register(x)
166             print "get_register(%d):             %x"%(x,num)
167             results[x].append(num)
168             if (num != seed):
169                 for y in range(13):
170                     num = client.ARMset_register(x,seed)
171                     print "set_register(%d,0x%x):  %x"%(x,seed,num)
172                     num = client.ARMget_register(x)
173                     print "get_register(%d):             %x"%(x,num)
174                     results[x].append(num)
175             seed += 1
176             client.ARMident()
177             client.ARMident()
178             print "Debug State: %x"%client.ARMget_dbgstate ()
179
180 def test6(start=0,end=15):
181     global results,seed
182     results = [[] for x in range(end)]
183     while True:
184         #print "IDCODE:      %x"%client.ARMident()
185         #print "Debug State: %x"%client.ARMget_dbgstate ()
186         for x in range(start,end):
187             num = client.ARMset_register(x,seed+x)
188             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
189             client.ARMident()
190             client.ARMident()
191         for x in range(start,end):
192             num = client.ARMget_register(x)
193             print "get_register(%d):             %x"%(x,num)
194             results[x].append(num)
195             if (num != seed+x):
196                 for y in range(13):
197                     num = client.ARMset_register(x,seed+x)
198                     print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
199                     num = client.ARMget_register(x)
200                     print "get_register(%d):             %x"%(x,num)
201                     results[x].append(num)
202             client.ARMident()
203             client.ARMident()
204             print "Debug State: %x"%client.ARMget_dbgstate ()
205         seed += 1
206
207 def test7(start=0,end=15):
208     global results,seed
209     results = [[] for x in range(end)]
210     while True:
211         #print "IDCODE:      %x"%client.ARMident()
212         #print "Debug State: %x"%client.ARMget_dbgstate ()
213         for x in range(end,start, -1):
214             num = client.ARMset_register(x,seed+x)
215             time.sleep(1)
216             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
217         for y in range(10):
218           for x in range(start,end,2):
219             num = client.ARMget_register(x)
220             time.sleep(1)
221             print "get_register(%d):             %x"%(x,num)
222             results[x].append(num)
223         seed += 1
224
225 init()
226 print "Don't forget to 'client.stop()' if you want to exit cleanly"
227
228
229 def printResults():
230     for y in range(len(results)):
231             x=results[y]
232             print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
233
234 """
235   case 0xD0: // loopback test
236     cmddatalong[0] = 0x12345678;
237   case 0xD1: // Set Scan Chain
238     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
239   case 0xD2: //
240     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
241   case 0xD3:
242     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
243   case 0xD4:
244     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
245   case 0xD5:
246     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
247   case 0xD6:
248     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
249   case 0xD7:
250     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
251   case 0xD8:
252     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
253 """
254
255 """
256 if(sys.argv[1]=="test"):
257     client.CCtest();
258 if(sys.argv[1]=="deadtest"):
259     for i in range(1,10):
260         print "IDENT as %s" % client.CCidentstr();
261 if(sys.argv[1]=="dumpcode"):
262     f = sys.argv[2];
263     start=0x0000;
264     stop=0xFFFF;
265     if(len(sys.argv)>3):
266         start=int(sys.argv[3],16);
267     if(len(sys.argv)>4):
268         stop=int(sys.argv[4],16);
269     
270     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
271     h = IntelHex(None);
272     i=start;
273     while i<=stop:
274         h[i]=client.CCpeekcodebyte(i);
275         if(i%0x100==0):
276             print "Dumped %04x."%i;
277         i+=1;
278     h.write_hex_file(f);
279 if(sys.argv[1]=="dumpdata"):
280     f = sys.argv[2];
281     start=0xE000;
282     stop=0xFFFF;
283     if(len(sys.argv)>3):
284         start=int(sys.argv[3],16);
285     if(len(sys.argv)>4):
286         stop=int(sys.argv[4],16);
287     
288     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
289     h = IntelHex(None);
290     i=start;
291     while i<=stop:
292         h[i]=client.CCpeekdatabyte(i);
293         if(i%0x100==0):
294             print "Dumped %04x."%i;
295         i+=1;
296     h.write_hex_file(f);
297 if(sys.argv[1]=="status"):
298     print "Status: %s" %client.CCstatusstr();
299 if(sys.argv[1]=="erase"):
300     print "Status: %s" % client.CCstatusstr();
301     client.CCchiperase();
302     print "Status: %s" %client.CCstatusstr();
303
304 if(sys.argv[1]=="peekinfo"):
305     print "Select info flash."
306     client.CCwr_config(1);
307     print "Config is %02x" % client.CCrd_config();
308     
309     start=0x0000;
310     if(len(sys.argv)>2):
311         start=int(sys.argv[2],16);
312     stop=start;
313     if(len(sys.argv)>3):
314         stop=int(sys.argv[3],16);
315     print "Peeking from %04x to %04x." % (start,stop);
316     while start<=stop:
317         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
318         start=start+1;
319 if(sys.argv[1]=="poke"):
320     client.CCpokeirambyte(int(sys.argv[2],16),
321                           int(sys.argv[3],16));
322 if(sys.argv[1]=="randtest"):
323     #Seed RNG
324     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
325     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
326     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
327     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
328     
329     #Dump values
330     for foo in range(1,10):
331         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
332         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
333         client.CCreleasecpu();
334         client.CChaltcpu();
335     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
336 if(sys.argv[1]=="adctest"):
337     # ADCTest 0xDF3A 0xDF3B
338     print "ADC TEST %02x%02x" % (
339         client.CCpeekdatabyte(0xDF3A),
340         client.CCpeekdatabyte(0xDF3B));
341 if(sys.argv[1]=="config"):
342     print "Config is %02x" % client.CCrd_config();
343
344 if(sys.argv[1]=="flash"):
345      f=sys.argv[2];
346      start=0;
347      stop=0xFFFF;
348      if(len(sys.argv)>3):
349          start=int(sys.argv[3],16);
350      if(len(sys.argv)>4):
351          stop=int(sys.argv[4],16);
352    
353      h = IntelHex(f);
354      page = 0x0000;
355      pagelen = 2048; #2kB pages in 32-bit words
356      bcount = 0;
357      
358      print "Wiping Flash."
359      #Wipe all of flash.
360      #client.CCchiperase();
361      #Wipe the RAM buffer for the next flash page.
362      #client.CCeraseflashbuffer();
363      for i in h._buf.keys():
364          while(i>page+pagelen):
365              if bcount>0:
366                  client.CCflashpage(page);
367                  #client.CCeraseflashbuffer();
368                  bcount=0;
369                  print "Flashed page at %06x" % page
370              page+=pagelen;
371              
372          #Place byte into buffer.
373          client.CCpokedatabyte(0xF000+i-page,
374                                h[i]);
375          bcount+=1;
376          if(i%0x100==0):
377                 print "Buffering %04x toward %06x" % (i,page);
378      #last page
379      client.CCflashpage(page);
380      print "Flashed final page at %06x" % page;
381      
382 if(sys.argv[1]=="lock"):
383     print "Status: %s" %client.CCstatusstr();
384     client.CClockchip();
385     print "Status: %s" %client.CCstatusstr();
386 if(sys.argv[1]=="flashpage"):
387     target=0;
388     if(len(sys.argv)>2):
389         target=int(sys.argv[2],16);
390     print "Writing a page of flash from 0xF000 in XDATA"
391     client.CCflashpage(target);
392 if(sys.argv[1]=="erasebuffer"):
393     print "Erasing flash buffer.";
394     client.CCeraseflashbuffer();
395
396 if(sys.argv[1]=="writedata"):
397     f=sys.argv[2];
398     start=0;
399     stop=0xFFFF;
400     if(len(sys.argv)>3):
401         start=int(sys.argv[3],16);
402     if(len(sys.argv)>4):
403         stop=int(sys.argv[4],16);
404     
405     h = IntelHex(f);
406     
407     for i in h._buf.keys():
408         if(i>=start and i<=stop):
409             client.CCpokedatabyte(i,h[i]);
410             if(i%0x100==0):
411                 print "%04x" % i;
412 #if(sys.argv[1]=="flashtest"):
413 #    client.CCflashtest();
414 if(sys.argv[1]=="peekdata"):
415     start=0x0000;
416     if(len(sys.argv)>2):
417         start=int(sys.argv[2],16);
418     stop=start;
419     if(len(sys.argv)>3):
420         stop=int(sys.argv[3],16);
421     print "Peeking from %04x to %04x." % (start,stop);
422     while start<=stop:
423         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
424         start=start+1;
425 if(sys.argv[1]=="peek"):
426     start=0x0000;
427     if(len(sys.argv)>2):
428         start=int(sys.argv[2],16);
429     stop=start;
430     if(len(sys.argv)>3):
431         stop=int(sys.argv[3],16);
432     print "Peeking from %04x to %04x." % (start,stop);
433     while start<=stop:
434         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
435         start=start+1;
436
437 if(sys.argv[1]=="peekcode"):
438     start=0x0000;
439     if(len(sys.argv)>2):
440         start=int(sys.argv[2],16);
441     stop=start;
442     if(len(sys.argv)>3):
443         stop=int(sys.argv[3],16);
444     print "Peeking from %04x to %04x." % (start,stop);
445     while start<=stop:
446         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
447         start=start+1;
448 if(sys.argv[1]=="pokedata"):
449     start=0x0000;
450     val=0x00;
451     if(len(sys.argv)>2):
452         start=int(sys.argv[2],16);
453     if(len(sys.argv)>3):
454         val=int(sys.argv[3],16);
455     print "Poking %04x to become %02x." % (start,val);
456     client.CCpokedatabyte(start,val);
457
458 client.stop();
459 """