x00t!
[goodfet] / client / gplay-arm.py
1 #!/usr/bin/env ipython
2 import sys, struct, binascii,time
3 from GoodFETARM7 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 test():
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())
36     print
37     print "Testing Register Read/Writes"
38     print " Storing old values"
39     originalregs = [client.ARMget_register(x) for x in xrange(16)]
40
41     print "Simple test"
42     test = [None for x in xrange(15)]
43     control = [x for x in xrange(15)]
44     for x in xrange(15):
45         client.ARMset_register(x,control[x])
46         test[x] = client.ARMget_register(x)
47     if control != test:
48         print "FAIL"
49         print "Control:",control
50         print "Test:   ",test
51
52     print "A little harder..."
53     test = [None for x in xrange(15)]
54     control = [4*x for x in xrange(15)]
55     for x in xrange(15):
56         client.ARMset_register(x,control[x])
57         test[x] = client.ARMget_register(x)
58     if control != test:
59         print "FAIL"
60         print "Control:",control
61         print "Test:   ",test
62
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
68             for x in xrange(15):
69                 client.ARMset_register(x,control[x])
70                 test[x] = client.ARMget_register(x)
71             if control != test:
72                 print "FAIL"
73                 print "Control:",control
74                 print "Test:   ",test
75
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
81             for x in xrange(15):
82                 client.ARMset_register(x,control[x])
83                 test[x] = client.ARMget_register(x)
84             if control != test:
85                 print "FAIL"
86                 print "Control:",control
87                 print "Test:   ",test
88
89     test = [None for x in xrange(15)]
90     control = [0x100*x for x in xrange(15)]
91     for x in xrange(15):
92         client.ARMset_register(x,control[x])
93         test[x] = client.ARMget_register(x)
94     if control != test:
95         print "FAIL"
96         print "Control:",control
97         print "Test:   ",test
98
99     print "Resetting original register values..."
100     for x in xrange(16):
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
105
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()
112
113 def test1():
114     global data
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)
166
167 def test2():
168     global 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()
196
197 def test3():
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)           
210
211 def test4():
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)
246
247
248 seed = 0
249 def test5(start=0,end=15):
250     global results,seed
251     results = [[] for x in range(end)]
252     while True:
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)
261             if (num != seed):
262                 for y in range(13):
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)
268             seed += 1
269             client.ARMident()
270             client.ARMident()
271             print "Debug State: %x"%client.ARMget_dbgstate ()
272
273 def test6(start=0,end=15):
274     global results,seed
275     results = [[] for x in range(end)]
276     while True:
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)
282             client.ARMident()
283             client.ARMident()
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)
288             if (num != seed+x):
289                 for y in range(13):
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)
295             client.ARMident()
296             client.ARMident()
297             print "Debug State: %x"%client.ARMget_dbgstate ()
298         seed += 1
299
300 def test7(start=0,end=14):
301     global results,seed
302     results = [[] for x in range(end)]
303     while True:
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)
308             time.sleep(1)
309             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
310         for y in range(10):
311           for x in range(start,endi+1):
312             num = client.ARMget_register(x)
313             time.sleep(1)
314             print "get_register(%d):             %x"%(x,num)
315             results[x].append(num)
316         seed += 1
317
318 def readtest(start=0,end=14):
319     global results,seed
320     results = [[] for x in range(end)]
321     while True:
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)
326             time.sleep(1)
327             print "get_register(%d):  %x"%(x,num)
328         for y in range(10):
329           for x in range(start,end,2):
330             num = client.ARMget_register(x)
331             time.sleep(1)
332             print "get_register(%d):             %x"%(x,num)
333             results[x].append(num)
334         seed += 1
335
336 init()
337 print "Don't forget to 'client.stop()' if you want to exit cleanly"
338
339
340 def printResults():
341     for y in range(len(results)):
342             x=results[y]
343             print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
344
345 def ARMreadMem(self, adr, wrdcount):
346     retval = [] 
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)
354         self.ARM_nop(0)
355         self.ARM_nop(1)
356         self.ARMdebuginstr(0xe4959004L, 0); # push LDR R1, [R0], #4 into instruction pipeline  (autoincrements for consecutive reads)
357         self.ARM_nop(0)
358         self.ARMrestart()
359         self.ARMwaitDBG()
360         time.sleep(.4)
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")
369           #return -1
370         else:
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);
375     return retval
376
377 """
378   case 0xD0: // loopback test
379     cmddatalong[0] = 0x12345678;
380   case 0xD1: // Set Scan Chain
381     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
382   case 0xD2: //
383     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
384   case 0xD3:
385     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
386   case 0xD4:
387     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
388   case 0xD5:
389     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
390   case 0xD6:
391     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
392   case 0xD7:
393     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
394   case 0xD8:
395     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
396 """
397
398 """
399 if(sys.argv[1]=="test"):
400     client.CCtest();
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"):
405     f = sys.argv[2];
406     start=0x0000;
407     stop=0xFFFF;
408     if(len(sys.argv)>3):
409         start=int(sys.argv[3],16);
410     if(len(sys.argv)>4):
411         stop=int(sys.argv[4],16);
412     
413     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
414     h = IntelHex(None);
415     i=start;
416     while i<=stop:
417         h[i]=client.CCpeekcodebyte(i);
418         if(i%0x100==0):
419             print "Dumped %04x."%i;
420         i+=1;
421     h.write_hex_file(f);
422 if(sys.argv[1]=="dumpdata"):
423     f = sys.argv[2];
424     start=0xE000;
425     stop=0xFFFF;
426     if(len(sys.argv)>3):
427         start=int(sys.argv[3],16);
428     if(len(sys.argv)>4):
429         stop=int(sys.argv[4],16);
430     
431     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
432     h = IntelHex(None);
433     i=start;
434     while i<=stop:
435         h[i]=client.CCpeekdatabyte(i);
436         if(i%0x100==0):
437             print "Dumped %04x."%i;
438         i+=1;
439     h.write_hex_file(f);
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();
446
447 if(sys.argv[1]=="peekinfo"):
448     print "Select info flash."
449     client.CCwr_config(1);
450     print "Config is %02x" % client.CCrd_config();
451     
452     start=0x0000;
453     if(len(sys.argv)>2):
454         start=int(sys.argv[2],16);
455     stop=start;
456     if(len(sys.argv)>3):
457         stop=int(sys.argv[3],16);
458     print "Peeking from %04x to %04x." % (start,stop);
459     while start<=stop:
460         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
461         start=start+1;
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"):
466     #Seed RNG
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
471     
472     #Dump values
473     for foo in range(1,10):
474         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
475         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
476         client.CCreleasecpu();
477         client.CChaltcpu();
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();
486
487 if(sys.argv[1]=="flash"):
488      f=sys.argv[2];
489      start=0;
490      stop=0xFFFF;
491      if(len(sys.argv)>3):
492          start=int(sys.argv[3],16);
493      if(len(sys.argv)>4):
494          stop=int(sys.argv[4],16);
495    
496      h = IntelHex(f);
497      page = 0x0000;
498      pagelen = 2048; #2kB pages in 32-bit words
499      bcount = 0;
500      
501      print "Wiping Flash."
502      #Wipe all of 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):
508              if bcount>0:
509                  client.CCflashpage(page);
510                  #client.CCeraseflashbuffer();
511                  bcount=0;
512                  print "Flashed page at %06x" % page
513              page+=pagelen;
514              
515          #Place byte into buffer.
516          client.CCpokedatabyte(0xF000+i-page,
517                                h[i]);
518          bcount+=1;
519          if(i%0x100==0):
520                 print "Buffering %04x toward %06x" % (i,page);
521      #last page
522      client.CCflashpage(page);
523      print "Flashed final page at %06x" % page;
524      
525 if(sys.argv[1]=="lock"):
526     print "Status: %s" %client.CCstatusstr();
527     client.CClockchip();
528     print "Status: %s" %client.CCstatusstr();
529 if(sys.argv[1]=="flashpage"):
530     target=0;
531     if(len(sys.argv)>2):
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();
538
539 if(sys.argv[1]=="writedata"):
540     f=sys.argv[2];
541     start=0;
542     stop=0xFFFF;
543     if(len(sys.argv)>3):
544         start=int(sys.argv[3],16);
545     if(len(sys.argv)>4):
546         stop=int(sys.argv[4],16);
547     
548     h = IntelHex(f);
549     
550     for i in h._buf.keys():
551         if(i>=start and i<=stop):
552             client.CCpokedatabyte(i,h[i]);
553             if(i%0x100==0):
554                 print "%04x" % i;
555 #if(sys.argv[1]=="flashtest"):
556 #    client.CCflashtest();
557 if(sys.argv[1]=="peekdata"):
558     start=0x0000;
559     if(len(sys.argv)>2):
560         start=int(sys.argv[2],16);
561     stop=start;
562     if(len(sys.argv)>3):
563         stop=int(sys.argv[3],16);
564     print "Peeking from %04x to %04x." % (start,stop);
565     while start<=stop:
566         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
567         start=start+1;
568 if(sys.argv[1]=="peek"):
569     start=0x0000;
570     if(len(sys.argv)>2):
571         start=int(sys.argv[2],16);
572     stop=start;
573     if(len(sys.argv)>3):
574         stop=int(sys.argv[3],16);
575     print "Peeking from %04x to %04x." % (start,stop);
576     while start<=stop:
577         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
578         start=start+1;
579
580 if(sys.argv[1]=="peekcode"):
581     start=0x0000;
582     if(len(sys.argv)>2):
583         start=int(sys.argv[2],16);
584     stop=start;
585     if(len(sys.argv)>3):
586         stop=int(sys.argv[3],16);
587     print "Peeking from %04x to %04x." % (start,stop);
588     while start<=stop:
589         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
590         start=start+1;
591 if(sys.argv[1]=="pokedata"):
592     start=0x0000;
593     val=0x00;
594     if(len(sys.argv)>2):
595         start=int(sys.argv[2],16);
596     if(len(sys.argv)>3):
597         val=int(sys.argv[3],16);
598     print "Poking %04x to become %02x." % (start,val);
599     client.CCpokedatabyte(start,val);
600
601 client.stop();
602 """