updated features for two different types of sniffing. fixed and scrolling. This can...
[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=GoodFETARM7();
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...\n\n"
19     client.start()
20     print "STARTUP: %s\n"%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     print "Testing readChunk/writeChunk"
113     mem=client.ARMreadChunk(0x200000,32)
114     client.ARMwriteChunk(0x200000,mem)
115     mem2=client.ARMreadChunk(0x200000,32)
116     if (mem != mem2):
117         print "Failed: \n%s\n%s"%(repr([hex(x) for x in mem]), repr([hex(x) for x in mem2]))
118     else:
119         print "Passed."
120
121
122 def test1():
123     global data
124     print "\n\nTesting JTAG for ARM\n"
125     client.writecmd(0x33,0xd0,4,[0x40,0x40,0x40,0x40]); print "loopback:   \t %s"%repr(client.data)                  # loopback
126     data.append(client.data)
127     client.writecmd(0x33,0xd1,2,[1,0]); print "scanchain1:\t %s"%repr(client.data)               # set scan chain
128     data.append(client.data)
129     client.writecmd(0x33,0xd2,0,[]); print "debug state:\t %s"%repr(client.data)                  # get dbg state
130     data.append(client.data)
131     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
132     data.append(client.data)
133     client.writecmd(0x33,0xd3,0,[0,0,0x8e,0xe5]); print "exec_stuff: \t %s"%repr(client.data)     # execute instruction
134     data.append(client.data)
135     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
136     data.append(client.data)
137     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
138     data.append(client.data)
139     client.writecmd(0x33,0xd3,0,[0,0,0xa0,0xe1]); print "exec_nop: \t %s"%repr(client.data)     # execute instruction
140     data.append(client.data)
141     client.writecmd(0x33,0xd6,0,[]); print "shift_dr_32: \t %s"%repr(client.data)                  # dr_shift32
142     data.append(client.data)
143     client.writecmd(0x33,0xd5,8,[3, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40]); print "set_register:\t %s"%repr(client.data)                  # set register
144     data.append(client.data)
145     client.writecmd(0x33,0xd4,1,[3]); print "get_register:\t %s"%repr(client.data)                  # get register
146     data.append(client.data)
147     client.writecmd(0x33,0xd7,0,[]); print "chain1:      \t %s"%repr(client.data)                  # chain1
148     data.append(client.data)
149     client.writecmd(0x33,0xd8,0,[]); print "read_chain2: \t %s"%repr(client.data)                  # read chain2
150     data.append(client.data)
151     client.writecmd(0x33,0xd9,0,[]); print "idcode:      \t %s"%repr(client.data)                  # read idcode
152     data.append(client.data)
153     client.writecmd(0x33,0xf0,2,[4,4,1,1]); print "f0:       \t %s"%repr(client.data)   # read idcode
154     data.append(client.data)
155     client.writecmd(0x33,0xdb,8,[0x0,4,4,4,4,4,4,4]); print "verb(0):     \t %s"%repr(client.data)
156     data.append(client.data)
157     client.writecmd(0x33,0xdb,8,[0x2,4,4,4,4,4,4,4]); print "verb(2):     \t %s"%repr(client.data)
158     data.append(client.data)
159     client.writecmd(0x33,0xdb,8,[0x3,4,4,4,4,4,4,4]); print "verb(3):     \t %s"%repr(client.data)
160     data.append(client.data)
161     client.writecmd(0x33,0xdb,8,[0x4,4,4,4,4,4,4,4]); print "verb(4):     \t %s"%repr(client.data)
162     data.append(client.data)
163     client.writecmd(0x33,0xdb,8,[0x5,4,4,4,4,4,4,4]); print "verb(5):     \t %s"%repr(client.data)
164     data.append(client.data)
165     client.writecmd(0x33,0xdb,8,[0x7,4,4,4,4,4,4,4]); print "verb(7):     \t %s"%repr(client.data)
166     data.append(client.data)
167     client.writecmd(0x33,0xdb,8,[0x9,4,4,4,4,4,4,4]); print "verb(9):     \t %s"%repr(client.data)
168     data.append(client.data)
169     client.writecmd(0x33,0xdb,8,[0xc,4,4,4,4,4,4,4]); print "verb(c):     \t %s"%repr(client.data)
170     data.append(client.data)
171     client.writecmd(0x33,0xdb,8,[0xe,0,0,0,0,0,0xa0,0xe1]); print "verb(e):     \t %s"%repr(client.data)
172     data.append(client.data)
173     client.writecmd(0x33,0xdb,8,[0xf,4,4,4,4,4,4,4]); print "verb(f):     \t %s"%repr(client.data)
174     data.append(client.data)
175
176 def test2():
177     global data
178     print "\n\nTesting JTAG for ARM\n"
179     print "IDCODE:      %x"%client.ARMident()
180     print "Debug State: %x"%client.ARMget_dbgstate ()
181     print "Debug State: %x"%client.ARMget_dbgstate ()
182     print "Debug State: %x"%client.ARMget_dbgstate ()
183     print "Debug CTRL:  %x"%client.ARMget_dbgctrl()
184     client.writecmd(0x33,0xda,0,[])
185     print "TEST CHAIN0: %s"%repr(client.data)
186     print "Debug State: %x"%client.ARMget_dbgstate ()
187     print "IDCODE:      %x"%client.ARMident()
188     print "Debug State: %x"%client.ARMget_dbgstate ()
189     client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
190     print "Loopback:   \t %s"%repr(client.data)                  # loopback
191     print "Debug State: %x"%client.ARMget_dbgstate ()
192     print "IDCODE:      %x"%client.ARMident()
193     print "GetPC: %x"%client.ARMgetPC()
194     print "IDCODE:      %x"%client.ARMident()
195     print "Debug State: %x"%client.ARMget_dbgstate ()
196     print "IDCODE:      %x"%client.ARMident()
197     print "set_register(3,0x41414141):  %x"%client.ARMset_register(3,0x41414141)
198     print "IDCODE:      %x"%client.ARMident()
199     print "Debug State: %x"%client.ARMget_dbgstate ()
200     print "IDCODE:      %x"%client.ARMident()
201     print "get_register(3):             %x"%client.ARMget_register(3)
202     print "IDCODE:      %x"%client.ARMident()
203     print "Debug State: %x"%client.ARMget_dbgstate ()
204     print "IDCODE:      %x"%client.ARMident()
205
206 def test3():
207     print "IDCODE:      %x"%client.ARMident()
208     print "Debug State: %x"%client.ARMget_dbgstate ()
209     client.writecmd(0x33,0xd0,4,[0xf7,0xf7,0xf7,0xf7])
210     print "Loopback:   \t %s"%repr(client.data)                  # loopback
211     client.writecmd(0x33,0xd5,8,[0,0,0,0,0xf7,0xf7,0xf7,0xf7])
212     print "test_set_reg:   \t %s"%repr(client.data)            
213     client.writecmd(0x33,0xd4,1,[0])
214     print "test_get_reg:   \t %s"%repr(client.data)           
215     print "set_register(3,0x41414141):  %x"%client.ARMset_register(3,0x41414141)
216     print "get_register(3):             %x"%client.ARMget_register(3)
217     client.writecmd(0x33,0xd4,1,[0])
218     print "test_get_reg:   \t %s"%repr(client.data)           
219
220 def test4():
221         print "IDCODE:      %x"%client.ARMident()
222         print "Debug State: %x"%client.ARMget_dbgstate ()
223         print "set_register(0,0x4141):  %x"%client.ARMset_register(0,0x4141)
224         print "get_register(0):             %x"%client.ARMget_register(0)
225         print "set_register(1,0x4141):  %x"%client.ARMset_register(1,0x4142)
226         print "get_register(1):             %x"%client.ARMget_register(1)
227         print "set_register(2,0x4141):  %x"%client.ARMset_register(2,0x4143)
228         print "get_register(2):             %x"%client.ARMget_register(2)
229         print "set_register(3,0x4141):  %x"%client.ARMset_register(3,0x4144)
230         print "get_register(3):             %x"%client.ARMget_register(3)
231         print "set_register(4,0x4141):  %x"%client.ARMset_register(4,0x4145)
232         print "get_register(4):             %x"%client.ARMget_register(4)
233         print "set_register(5,0x4141):  %x"%client.ARMset_register(5,0x4146)
234         print "get_register(5):             %x"%client.ARMget_register(5)
235         print "set_register(6,0x4141):  %x"%client.ARMset_register(6,0x4147)
236         print "get_register(6):             %x"%client.ARMget_register(6)
237         print "set_register(7,0x4141):  %x"%client.ARMset_register(7,0x4148)
238         print "get_register(7):             %x"%client.ARMget_register(7)
239         print "set_register(8,0x4141):  %x"%client.ARMset_register(8,0x4149)
240         print "get_register(8):             %x"%client.ARMget_register(8)
241         print "set_register(9,0x4141):  %x"%client.ARMset_register(9,0x4140)
242         print "get_register(9):             %x"%client.ARMget_register(9)
243         print "set_register(10,0x4141):  %x"%client.ARMset_register(10,0x4151)
244         print "get_register(10):             %x"%client.ARMget_register(10)
245         print "set_register(11,0x4141):  %x"%client.ARMset_register(11,0x4152)
246         print "get_register(11):             %x"%client.ARMget_register(11)
247         print "set_register(12,0x4141):  %x"%client.ARMset_register(12,0x4153)
248         print "get_register(12):             %x"%client.ARMget_register(12)
249         print "set_register(13,0x4141):  %x"%client.ARMset_register(13,0x4154)
250         print "get_register(13):             %x"%client.ARMget_register(13)
251         print "set_register(14,0x4141):  %x"%client.ARMset_register(14,0x4155)
252         print "get_register(14):             %x"%client.ARMget_register(14)
253         #print "set_register(15,0x4141):  %x"%client.ARMset_register(15,0x41414156)
254         #print "get_register(15):             %x"%client.ARMget_register(15)
255
256
257 seed = 0
258 def test5(start=0,end=15):
259     global results,seed
260     results = [[] for x in range(end)]
261     while True:
262         #print "IDCODE:      %x"%client.ARMident()
263         #print "Debug State: %x"%client.ARMget_dbgstate ()
264         for x in range(start,end):
265             num = client.ARMset_register(x,seed)
266             print "set_register(%d,0x%x):  %x"%(x,seed,num)
267             num = client.ARMget_register(x)
268             print "get_register(%d):             %x"%(x,num)
269             results[x].append(num)
270             if (num != seed):
271                 for y in range(13):
272                     num = client.ARMset_register(x,seed)
273                     print "set_register(%d,0x%x):  %x"%(x,seed,num)
274                     num = client.ARMget_register(x)
275                     print "get_register(%d):             %x"%(x,num)
276                     results[x].append(num)
277             seed += 1
278             client.ARMident()
279             client.ARMident()
280             print "Debug State: %x"%client.ARMget_dbgstate ()
281
282 def test6(start=0,end=15):
283     global results,seed
284     results = [[] for x in range(end)]
285     while True:
286         #print "IDCODE:      %x"%client.ARMident()
287         #print "Debug State: %x"%client.ARMget_dbgstate ()
288         for x in range(start,end):
289             num = client.ARMset_register(x,seed+x)
290             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
291             client.ARMident()
292             client.ARMident()
293         for x in range(start,end):
294             num = client.ARMget_register(x)
295             print "get_register(%d):             %x"%(x,num)
296             results[x].append(num)
297             if (num != seed+x):
298                 for y in range(13):
299                     num = client.ARMset_register(x,seed+x)
300                     print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
301                     num = client.ARMget_register(x)
302                     print "get_register(%d):             %x"%(x,num)
303                     results[x].append(num)
304             client.ARMident()
305             client.ARMident()
306             print "Debug State: %x"%client.ARMget_dbgstate ()
307         seed += 1
308
309 def test7(start=0,end=14):
310     global results,seed
311     results = [[] for x in range(end)]
312     while True:
313         #print "IDCODE:      %x"%client.ARMident()
314         #print "Debug State: %x"%client.ARMget_dbgstate ()
315         for x in range(end,start-1, -1):
316             num = client.ARMset_register(x,seed+x)
317             time.sleep(1)
318             print "set_register(%d,0x%x):  %x"%(x,seed+x,num)
319         for y in range(10):
320           for x in range(start,endi+1):
321             num = client.ARMget_register(x)
322             time.sleep(1)
323             print "get_register(%d):             %x"%(x,num)
324             results[x].append(num)
325         seed += 1
326
327 def readtest(start=0,end=14):
328     global results,seed
329     results = [[] for x in range(end)]
330     while True:
331         #print "IDCODE:      %x"%client.ARMident()
332         #print "Debug State: %x"%client.ARMget_dbgstate ()
333         for x in range(end,start, -1):
334             num = client.ARMget_register(x)
335             time.sleep(1)
336             print "get_register(%d):  %x"%(x,num)
337         for y in range(10):
338           for x in range(start,end,2):
339             num = client.ARMget_register(x)
340             time.sleep(1)
341             print "get_register(%d):             %x"%(x,num)
342             results[x].append(num)
343         seed += 1
344
345 init()
346
347
348 def printResults():
349     for y in range(len(results)):
350             x=results[y]
351             print "%.2x=%s"%(y,repr(["%x"%t for t in x]))
352
353 def ARMreadMem(self, adr, wrdcount):
354     retval = [] 
355     r0 = self.ARMget_register(5);        # store R0 and R1
356     r1 = self.ARMget_register(9);
357     #print >>sys.stderr,("CPSR:\t%x"%self.ARMget_regCPSR())
358     for word in range(adr, adr+(wrdcount*4), 4):
359         #sys.stdin.readline()
360         self.ARMset_register(5, word);        # write address into R0
361         self.ARMset_register(9, 0xdeadbeef)
362         self.ARM_nop(0)
363         self.ARM_nop(1)
364         self.ARMdebuginstr(0xe4959004L, 0); # push LDR R1, [R0], #4 into instruction pipeline  (autoincrements for consecutive reads)
365         self.ARM_nop(0)
366         self.ARMrestart()
367         self.ARMwaitDBG()
368         time.sleep(.4)
369         self.ARMdebuginstr(0x47146,0)
370         self.ARMdebuginstr(0x47147,0)
371         print hex(self.ARMget_register(9))
372         # FIXME: this may end up changing te current debug-state.  should we compare to current_dbgstate?
373         #print repr(self.data[4])
374         if (len(self.data)>4 and self.data[4] == '\x00'):
375           print >>sys.stderr,("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
376           raise Exception("FAILED TO READ MEMORY/RE-ENTER DEBUG MODE")
377           #return -1
378         else:
379           retval.append( self.ARMget_register(9) )  # read memory value from R1 register
380           #print >>sys.stderr,("CPSR: %x\t\tR0: %x\t\tR1: %x"%(self.ARMget_regCPSR(),self.ARMget_register(0),self.ARMget_register(1)))
381     self.ARMset_register(9, r1);       # restore R0 and R1 
382     self.ARMset_register(5, r0);
383     return retval
384
385 """
386   case 0xD0: // loopback test
387     cmddatalong[0] = 0x12345678;
388   case 0xD1: // Set Scan Chain
389     cmddatalong[0] = jtagarm7tdmi_scan_n(cmddataword[0]);
390   case 0xD2: //
391     cmddatalong[0] = jtagarm7tdmi_get_dbgstate();
392   case 0xD3:
393     cmddatalong[0] = jtagarm7tdmi_exec(cmddatalong[0]);
394   case 0xD4:
395     cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
396   case 0xD5:
397     cmddatalong[0] = jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
398   case 0xD6:
399     cmddatalong[0] = jtagarm7tdmi_dr_shift32(cmddatalong[0]);
400   case 0xD7:
401     cmddatalong[0] = jtagarm7tdmi_chain1(cmddatalong[0], 0);
402   case 0xD8:
403     cmddatalong[0] = jtagarm7tdmi_chain2_read(cmddata[0], 32);
404 """
405
406 """
407 if(sys.argv[1]=="test"):
408     client.CCtest();
409 if(sys.argv[1]=="deadtest"):
410     for i in range(1,10):
411         print "IDENT as %s" % client.CCidentstr();
412 if(sys.argv[1]=="dumpcode"):
413     f = sys.argv[2];
414     start=0x0000;
415     stop=0xFFFF;
416     if(len(sys.argv)>3):
417         start=int(sys.argv[3],16);
418     if(len(sys.argv)>4):
419         stop=int(sys.argv[4],16);
420     
421     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
422     h = IntelHex(None);
423     i=start;
424     while i<=stop:
425         h[i]=client.CCpeekcodebyte(i);
426         if(i%0x100==0):
427             print "Dumped %04x."%i;
428         i+=1;
429     h.write_hex_file(f);
430 if(sys.argv[1]=="dumpdata"):
431     f = sys.argv[2];
432     start=0xE000;
433     stop=0xFFFF;
434     if(len(sys.argv)>3):
435         start=int(sys.argv[3],16);
436     if(len(sys.argv)>4):
437         stop=int(sys.argv[4],16);
438     
439     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
440     h = IntelHex(None);
441     i=start;
442     while i<=stop:
443         h[i]=client.CCpeekdatabyte(i);
444         if(i%0x100==0):
445             print "Dumped %04x."%i;
446         i+=1;
447     h.write_hex_file(f);
448 if(sys.argv[1]=="status"):
449     print "Status: %s" %client.CCstatusstr();
450 if(sys.argv[1]=="erase"):
451     print "Status: %s" % client.CCstatusstr();
452     client.CCchiperase();
453     print "Status: %s" %client.CCstatusstr();
454
455 if(sys.argv[1]=="peekinfo"):
456     print "Select info flash."
457     client.CCwr_config(1);
458     print "Config is %02x" % client.CCrd_config();
459     
460     start=0x0000;
461     if(len(sys.argv)>2):
462         start=int(sys.argv[2],16);
463     stop=start;
464     if(len(sys.argv)>3):
465         stop=int(sys.argv[3],16);
466     print "Peeking from %04x to %04x." % (start,stop);
467     while start<=stop:
468         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
469         start=start+1;
470 if(sys.argv[1]=="poke"):
471     client.CCpokeirambyte(int(sys.argv[2],16),
472                           int(sys.argv[3],16));
473 if(sys.argv[1]=="randtest"):
474     #Seed RNG
475     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
476     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
477     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
478     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
479     
480     #Dump values
481     for foo in range(1,10):
482         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
483         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
484         client.CCreleasecpu();
485         client.CChaltcpu();
486     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
487 if(sys.argv[1]=="adctest"):
488     # ADCTest 0xDF3A 0xDF3B
489     print "ADC TEST %02x%02x" % (
490         client.CCpeekdatabyte(0xDF3A),
491         client.CCpeekdatabyte(0xDF3B));
492 if(sys.argv[1]=="config"):
493     print "Config is %02x" % client.CCrd_config();
494
495 if(sys.argv[1]=="flash"):
496      f=sys.argv[2];
497      start=0;
498      stop=0xFFFF;
499      if(len(sys.argv)>3):
500          start=int(sys.argv[3],16);
501      if(len(sys.argv)>4):
502          stop=int(sys.argv[4],16);
503    
504      h = IntelHex(f);
505      page = 0x0000;
506      pagelen = 2048; #2kB pages in 32-bit words
507      bcount = 0;
508      
509      print "Wiping Flash."
510      #Wipe all of flash.
511      #client.CCchiperase();
512      #Wipe the RAM buffer for the next flash page.
513      #client.CCeraseflashbuffer();
514      for i in h._buf.keys():
515          while(i>page+pagelen):
516              if bcount>0:
517                  client.CCflashpage(page);
518                  #client.CCeraseflashbuffer();
519                  bcount=0;
520                  print "Flashed page at %06x" % page
521              page+=pagelen;
522              
523          #Place byte into buffer.
524          client.CCpokedatabyte(0xF000+i-page,
525                                h[i]);
526          bcount+=1;
527          if(i%0x100==0):
528                 print "Buffering %04x toward %06x" % (i,page);
529      #last page
530      client.CCflashpage(page);
531      print "Flashed final page at %06x" % page;
532      
533 if(sys.argv[1]=="lock"):
534     print "Status: %s" %client.CCstatusstr();
535     client.CClockchip();
536     print "Status: %s" %client.CCstatusstr();
537 if(sys.argv[1]=="flashpage"):
538     target=0;
539     if(len(sys.argv)>2):
540         target=int(sys.argv[2],16);
541     print "Writing a page of flash from 0xF000 in XDATA"
542     client.CCflashpage(target);
543 if(sys.argv[1]=="erasebuffer"):
544     print "Erasing flash buffer.";
545     client.CCeraseflashbuffer();
546
547 if(sys.argv[1]=="writedata"):
548     f=sys.argv[2];
549     start=0;
550     stop=0xFFFF;
551     if(len(sys.argv)>3):
552         start=int(sys.argv[3],16);
553     if(len(sys.argv)>4):
554         stop=int(sys.argv[4],16);
555     
556     h = IntelHex(f);
557     
558     for i in h._buf.keys():
559         if(i>=start and i<=stop):
560             client.CCpokedatabyte(i,h[i]);
561             if(i%0x100==0):
562                 print "%04x" % i;
563 #if(sys.argv[1]=="flashtest"):
564 #    client.CCflashtest();
565 if(sys.argv[1]=="peekdata"):
566     start=0x0000;
567     if(len(sys.argv)>2):
568         start=int(sys.argv[2],16);
569     stop=start;
570     if(len(sys.argv)>3):
571         stop=int(sys.argv[3],16);
572     print "Peeking from %04x to %04x." % (start,stop);
573     while start<=stop:
574         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
575         start=start+1;
576 if(sys.argv[1]=="peek"):
577     start=0x0000;
578     if(len(sys.argv)>2):
579         start=int(sys.argv[2],16);
580     stop=start;
581     if(len(sys.argv)>3):
582         stop=int(sys.argv[3],16);
583     print "Peeking from %04x to %04x." % (start,stop);
584     while start<=stop:
585         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
586         start=start+1;
587
588 if(sys.argv[1]=="peekcode"):
589     start=0x0000;
590     if(len(sys.argv)>2):
591         start=int(sys.argv[2],16);
592     stop=start;
593     if(len(sys.argv)>3):
594         stop=int(sys.argv[3],16);
595     print "Peeking from %04x to %04x." % (start,stop);
596     while start<=stop:
597         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
598         start=start+1;
599 if(sys.argv[1]=="pokedata"):
600     start=0x0000;
601     val=0x00;
602     if(len(sys.argv)>2):
603         start=int(sys.argv[2],16);
604     if(len(sys.argv)>3):
605         val=int(sys.argv[3],16);
606     print "Poking %04x to become %02x." % (start,val);
607     client.CCpokedatabyte(start,val);
608
609 client.stop();
610 """