f216a1fa925c91ac6634aa5646f963944ceb55b5
[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     print >>sys.stderr,"Connecting to goodfet..."
13     client.serInit()
14     #
15     #Connect to target
16     print >>sys.stderr,"Setting up JTAG ARM on goodfet..."
17     client.setup()
18     print >>sys.stderr,"Starting JTAG ARM on goodfet..."
19     client.start()
20     print "STARTUP: "+repr(client.data)
21     #
22
23 def print_registers():
24     return [ hex(client.ARMget_register(x)) for x in range(15) ]
25
26 def regwratchet(num,hi=13,lo=0):
27     for x in xrange(lo,hi+1):
28         client.ARMset_register(x,num)
29
30 def test1():
31     global data
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)
83
84 def test2():
85     global 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()
113
114 def test3():
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)           
127
128 def test4():
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)
163
164
165 seed = 0
166 def test5(start=0,end=15):
167     global results,seed
168     results = [[] for x in range(end)]
169     while True:
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)
178             if (num != seed):
179                 for y in range(13):
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)
185             seed += 1
186             client.ARMident()
187             client.ARMident()
188             print "Debug State: %x"%client.ARMget_dbgstate ()
189
190 def test6(start=0,end=15):
191     global results,seed
192     results = [[] for x in range(end)]
193     while True:
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)
199             client.ARMident()
200             client.ARMident()
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)
205             if (num != seed+x):
206                 for y in range(13):
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)
212             client.ARMident()
213             client.ARMident()
214             print "Debug State: %x"%client.ARMget_dbgstate ()
215         seed += 1
216
217 def test7(start=0,end=14):
218     global results,seed
219     results = [[] for x in range(end)]
220     while True:
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)
225             time.sleep(1)
226             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
227         for y in range(10):
228           for x in range(start,endi+1):
229             num = client.ARMget_register(x)
230             time.sleep(1)
231             print "get_register(%d):             %x"%(x,num)
232             results[x].append(num)
233         seed += 1
234
235 def readtest(start=0,end=14):
236     global results,seed
237     results = [[] for x in range(end)]
238     while True:
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)
243             time.sleep(1)
244             print "get_register(%d):  %x"%(x,num)
245         for y in range(10):
246           for x in range(start,end,2):
247             num = client.ARMget_register(x)
248             time.sleep(1)
249             print "get_register(%d):             %x"%(x,num)
250             results[x].append(num)
251         seed += 1
252
253 init()
254 print "Don't forget to 'client.stop()' if you want to exit cleanly"
255
256
257 def printResults():
258     for y in range(len(results)):
259             x=results[y]
260             print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
261
262 """
263   case 0xD0: // loopback test
264     cmddatalong[0] = 0x12345678;
265   case 0xD1: // Set Scan Chain
266     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
267   case 0xD2: //
268     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
269   case 0xD3:
270     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
271   case 0xD4:
272     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
273   case 0xD5:
274     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
275   case 0xD6:
276     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
277   case 0xD7:
278     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
279   case 0xD8:
280     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
281 """
282
283 """
284 if(sys.argv[1]=="test"):
285     client.CCtest();
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"):
290     f = sys.argv[2];
291     start=0x0000;
292     stop=0xFFFF;
293     if(len(sys.argv)>3):
294         start=int(sys.argv[3],16);
295     if(len(sys.argv)>4):
296         stop=int(sys.argv[4],16);
297     
298     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
299     h = IntelHex(None);
300     i=start;
301     while i<=stop:
302         h[i]=client.CCpeekcodebyte(i);
303         if(i%0x100==0):
304             print "Dumped %04x."%i;
305         i+=1;
306     h.write_hex_file(f);
307 if(sys.argv[1]=="dumpdata"):
308     f = sys.argv[2];
309     start=0xE000;
310     stop=0xFFFF;
311     if(len(sys.argv)>3):
312         start=int(sys.argv[3],16);
313     if(len(sys.argv)>4):
314         stop=int(sys.argv[4],16);
315     
316     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
317     h = IntelHex(None);
318     i=start;
319     while i<=stop:
320         h[i]=client.CCpeekdatabyte(i);
321         if(i%0x100==0):
322             print "Dumped %04x."%i;
323         i+=1;
324     h.write_hex_file(f);
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();
331
332 if(sys.argv[1]=="peekinfo"):
333     print "Select info flash."
334     client.CCwr_config(1);
335     print "Config is %02x" % client.CCrd_config();
336     
337     start=0x0000;
338     if(len(sys.argv)>2):
339         start=int(sys.argv[2],16);
340     stop=start;
341     if(len(sys.argv)>3):
342         stop=int(sys.argv[3],16);
343     print "Peeking from %04x to %04x." % (start,stop);
344     while start<=stop:
345         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
346         start=start+1;
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"):
351     #Seed RNG
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
356     
357     #Dump values
358     for foo in range(1,10):
359         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
360         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
361         client.CCreleasecpu();
362         client.CChaltcpu();
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();
371
372 if(sys.argv[1]=="flash"):
373      f=sys.argv[2];
374      start=0;
375      stop=0xFFFF;
376      if(len(sys.argv)>3):
377          start=int(sys.argv[3],16);
378      if(len(sys.argv)>4):
379          stop=int(sys.argv[4],16);
380    
381      h = IntelHex(f);
382      page = 0x0000;
383      pagelen = 2048; #2kB pages in 32-bit words
384      bcount = 0;
385      
386      print "Wiping Flash."
387      #Wipe all of 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):
393              if bcount>0:
394                  client.CCflashpage(page);
395                  #client.CCeraseflashbuffer();
396                  bcount=0;
397                  print "Flashed page at %06x" % page
398              page+=pagelen;
399              
400          #Place byte into buffer.
401          client.CCpokedatabyte(0xF000+i-page,
402                                h[i]);
403          bcount+=1;
404          if(i%0x100==0):
405                 print "Buffering %04x toward %06x" % (i,page);
406      #last page
407      client.CCflashpage(page);
408      print "Flashed final page at %06x" % page;
409      
410 if(sys.argv[1]=="lock"):
411     print "Status: %s" %client.CCstatusstr();
412     client.CClockchip();
413     print "Status: %s" %client.CCstatusstr();
414 if(sys.argv[1]=="flashpage"):
415     target=0;
416     if(len(sys.argv)>2):
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();
423
424 if(sys.argv[1]=="writedata"):
425     f=sys.argv[2];
426     start=0;
427     stop=0xFFFF;
428     if(len(sys.argv)>3):
429         start=int(sys.argv[3],16);
430     if(len(sys.argv)>4):
431         stop=int(sys.argv[4],16);
432     
433     h = IntelHex(f);
434     
435     for i in h._buf.keys():
436         if(i>=start and i<=stop):
437             client.CCpokedatabyte(i,h[i]);
438             if(i%0x100==0):
439                 print "%04x" % i;
440 #if(sys.argv[1]=="flashtest"):
441 #    client.CCflashtest();
442 if(sys.argv[1]=="peekdata"):
443     start=0x0000;
444     if(len(sys.argv)>2):
445         start=int(sys.argv[2],16);
446     stop=start;
447     if(len(sys.argv)>3):
448         stop=int(sys.argv[3],16);
449     print "Peeking from %04x to %04x." % (start,stop);
450     while start<=stop:
451         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
452         start=start+1;
453 if(sys.argv[1]=="peek"):
454     start=0x0000;
455     if(len(sys.argv)>2):
456         start=int(sys.argv[2],16);
457     stop=start;
458     if(len(sys.argv)>3):
459         stop=int(sys.argv[3],16);
460     print "Peeking from %04x to %04x." % (start,stop);
461     while start<=stop:
462         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
463         start=start+1;
464
465 if(sys.argv[1]=="peekcode"):
466     start=0x0000;
467     if(len(sys.argv)>2):
468         start=int(sys.argv[2],16);
469     stop=start;
470     if(len(sys.argv)>3):
471         stop=int(sys.argv[3],16);
472     print "Peeking from %04x to %04x." % (start,stop);
473     while start<=stop:
474         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
475         start=start+1;
476 if(sys.argv[1]=="pokedata"):
477     start=0x0000;
478     val=0x00;
479     if(len(sys.argv)>2):
480         start=int(sys.argv[2],16);
481     if(len(sys.argv)>3):
482         val=int(sys.argv[3],16);
483     print "Poking %04x to become %02x." % (start,val);
484     client.CCpokedatabyte(start,val);
485
486 client.stop();
487 """