44f5d04a9d59ad261ccf42080c2049c51c237532
[goodfet] / client / gplay-arm.py
1 #!/usr/bin/env ipython
2 import sys, struct, binascii
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 init()
119 print "Don't forget to 'client.stop()' if you want to exit cleanly"
120
121
122
123 """
124   case 0xD0: // loopback test
125     cmddatalong[0] = 0x12345678;
126   case 0xD1: // Set Scan Chain
127     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
128   case 0xD2: //
129     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
130   case 0xD3:
131     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
132   case 0xD4:
133     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
134   case 0xD5:
135     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
136   case 0xD6:
137     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
138   case 0xD7:
139     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
140   case 0xD8:
141     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
142 """
143
144 """
145 if(sys.argv[1]=="test"):
146     client.CCtest();
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"):
151     f = sys.argv[2];
152     start=0x0000;
153     stop=0xFFFF;
154     if(len(sys.argv)>3):
155         start=int(sys.argv[3],16);
156     if(len(sys.argv)>4):
157         stop=int(sys.argv[4],16);
158     
159     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
160     h = IntelHex(None);
161     i=start;
162     while i<=stop:
163         h[i]=client.CCpeekcodebyte(i);
164         if(i%0x100==0):
165             print "Dumped %04x."%i;
166         i+=1;
167     h.write_hex_file(f);
168 if(sys.argv[1]=="dumpdata"):
169     f = sys.argv[2];
170     start=0xE000;
171     stop=0xFFFF;
172     if(len(sys.argv)>3):
173         start=int(sys.argv[3],16);
174     if(len(sys.argv)>4):
175         stop=int(sys.argv[4],16);
176     
177     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
178     h = IntelHex(None);
179     i=start;
180     while i<=stop:
181         h[i]=client.CCpeekdatabyte(i);
182         if(i%0x100==0):
183             print "Dumped %04x."%i;
184         i+=1;
185     h.write_hex_file(f);
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();
192
193 if(sys.argv[1]=="peekinfo"):
194     print "Select info flash."
195     client.CCwr_config(1);
196     print "Config is %02x" % client.CCrd_config();
197     
198     start=0x0000;
199     if(len(sys.argv)>2):
200         start=int(sys.argv[2],16);
201     stop=start;
202     if(len(sys.argv)>3):
203         stop=int(sys.argv[3],16);
204     print "Peeking from %04x to %04x." % (start,stop);
205     while start<=stop:
206         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
207         start=start+1;
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"):
212     #Seed RNG
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
217     
218     #Dump values
219     for foo in range(1,10):
220         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
221         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
222         client.CCreleasecpu();
223         client.CChaltcpu();
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();
232
233 if(sys.argv[1]=="flash"):
234      f=sys.argv[2];
235      start=0;
236      stop=0xFFFF;
237      if(len(sys.argv)>3):
238          start=int(sys.argv[3],16);
239      if(len(sys.argv)>4):
240          stop=int(sys.argv[4],16);
241    
242      h = IntelHex(f);
243      page = 0x0000;
244      pagelen = 2048; #2kB pages in 32-bit words
245      bcount = 0;
246      
247      print "Wiping Flash."
248      #Wipe all of 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):
254              if bcount>0:
255                  client.CCflashpage(page);
256                  #client.CCeraseflashbuffer();
257                  bcount=0;
258                  print "Flashed page at %06x" % page
259              page+=pagelen;
260              
261          #Place byte into buffer.
262          client.CCpokedatabyte(0xF000+i-page,
263                                h[i]);
264          bcount+=1;
265          if(i%0x100==0):
266                 print "Buffering %04x toward %06x" % (i,page);
267      #last page
268      client.CCflashpage(page);
269      print "Flashed final page at %06x" % page;
270      
271 if(sys.argv[1]=="lock"):
272     print "Status: %s" %client.CCstatusstr();
273     client.CClockchip();
274     print "Status: %s" %client.CCstatusstr();
275 if(sys.argv[1]=="flashpage"):
276     target=0;
277     if(len(sys.argv)>2):
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();
284
285 if(sys.argv[1]=="writedata"):
286     f=sys.argv[2];
287     start=0;
288     stop=0xFFFF;
289     if(len(sys.argv)>3):
290         start=int(sys.argv[3],16);
291     if(len(sys.argv)>4):
292         stop=int(sys.argv[4],16);
293     
294     h = IntelHex(f);
295     
296     for i in h._buf.keys():
297         if(i>=start and i<=stop):
298             client.CCpokedatabyte(i,h[i]);
299             if(i%0x100==0):
300                 print "%04x" % i;
301 #if(sys.argv[1]=="flashtest"):
302 #    client.CCflashtest();
303 if(sys.argv[1]=="peekdata"):
304     start=0x0000;
305     if(len(sys.argv)>2):
306         start=int(sys.argv[2],16);
307     stop=start;
308     if(len(sys.argv)>3):
309         stop=int(sys.argv[3],16);
310     print "Peeking from %04x to %04x." % (start,stop);
311     while start<=stop:
312         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
313         start=start+1;
314 if(sys.argv[1]=="peek"):
315     start=0x0000;
316     if(len(sys.argv)>2):
317         start=int(sys.argv[2],16);
318     stop=start;
319     if(len(sys.argv)>3):
320         stop=int(sys.argv[3],16);
321     print "Peeking from %04x to %04x." % (start,stop);
322     while start<=stop:
323         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
324         start=start+1;
325
326 if(sys.argv[1]=="peekcode"):
327     start=0x0000;
328     if(len(sys.argv)>2):
329         start=int(sys.argv[2],16);
330     stop=start;
331     if(len(sys.argv)>3):
332         stop=int(sys.argv[3],16);
333     print "Peeking from %04x to %04x." % (start,stop);
334     while start<=stop:
335         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
336         start=start+1;
337 if(sys.argv[1]=="pokedata"):
338     start=0x0000;
339     val=0x00;
340     if(len(sys.argv)>2):
341         start=int(sys.argv[2],16);
342     if(len(sys.argv)>3):
343         val=int(sys.argv[3],16);
344     print "Poking %04x to become %02x." % (start,val);
345     client.CCpokedatabyte(start,val);
346
347 client.stop();
348 """