e233d659ceaae5831509687000123c95effca7e6
[goodfet] / client / goodfet.cc
1 #!/usr/bin/env python
2 # GoodFET Chipcon Example
3
4 # (C) 2009 Travis Goodspeed <travis at radiantmachines.com>
5 #
6 # This code is being rewritten and refactored.  You've been warned!
7
8 import sys;
9 import binascii;
10
11 from GoodFETCC import GoodFETCC;
12 from intelhex import IntelHex;
13
14
15 if(len(sys.argv)==1):
16     print "Usage: %s verb [objects]\n" % sys.argv[0];
17     print "%s test" % sys.argv[0];
18     print "%s info" % sys.argv[0];
19     print "%s dumpcode $foo.hex [0x$start 0x$stop]" % sys.argv[0];
20     print "%s dumpdata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
21     print "%s erase" % sys.argv[0];
22     print "%s writedata $foo.hex [0x$start 0x$stop]" % sys.argv[0];
23     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
24     print "%s peekdata 0x$start [0x$stop]" % sys.argv[0];
25     print "%s pokedata 0x$adr 0x$val" % sys.argv[0];
26     #print "%s peekcode 0x$start [0x$stop]" % sys.argv[0];
27     sys.exit();
28
29 #Initailize FET and set baud rate
30 client=GoodFETCC();
31 client.serInit()
32
33 #Connect to target
34 client.CCsetup();
35 client.CCstart();
36
37 if(sys.argv[1]=="test"):
38     client.CCtest();
39 if(sys.argv[1]=="deadtest"):
40     for i in range(1,10):
41         print "IDENT as %s" % client.CCidentstr();
42 if(sys.argv[1]=="dumpcode"):
43     f = sys.argv[2];
44     start=0x0000;
45     stop=0xFFFF;
46     if(len(sys.argv)>3):
47         start=int(sys.argv[3],16);
48     if(len(sys.argv)>4):
49         stop=int(sys.argv[4],16);
50     
51     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
52     h = IntelHex(None);
53     i=start;
54     while i<=stop:
55         h[i]=client.CCpeekcodebyte(i);
56         if(i%0x100==0):
57             print "Dumped %04x."%i;
58         i+=1;
59     h.write_hex_file(f);
60 if(sys.argv[1]=="dumpdata"):
61     f = sys.argv[2];
62     start=0xE000;
63     stop=0xFFFF;
64     if(len(sys.argv)>3):
65         start=int(sys.argv[3],16);
66     if(len(sys.argv)>4):
67         stop=int(sys.argv[4],16);
68     
69     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
70     h = IntelHex(None);
71     i=start;
72     while i<=stop:
73         h[i]=client.CCpeekdatabyte(i);
74         if(i%0x100==0):
75             print "Dumped %04x."%i;
76         i+=1;
77     h.write_hex_file(f);
78 if(sys.argv[1]=="status"):
79     print "Status: %s" %client.CCstatusstr();
80 if(sys.argv[1]=="erase"):
81     print "Status: %s" % client.CCstatusstr();
82     client.CCchiperase();
83     print "Status: %s" %client.CCstatusstr();
84
85 if(sys.argv[1]=="peekinfo"):
86     print "Select info flash."
87     client.CCwr_config(1);
88     print "Config is %02x" % client.CCrd_config();
89     
90     start=0x0000;
91     if(len(sys.argv)>2):
92         start=int(sys.argv[2],16);
93     stop=start;
94     if(len(sys.argv)>3):
95         stop=int(sys.argv[3],16);
96     print "Peeking from %04x to %04x." % (start,stop);
97     while start<=stop:
98         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
99         start=start+1;
100
101 if(sys.argv[1]=="config"):
102     print "Config is %02x" % client.CCrd_config();
103
104 if(sys.argv[1]=="flash"):
105      f=sys.argv[2];
106      start=0;
107      stop=0xFFFF;
108      if(len(sys.argv)>3):
109          start=int(sys.argv[3],16);
110      if(len(sys.argv)>4):
111          stop=int(sys.argv[4],16);
112    
113      h = IntelHex(f);
114      page = 0x0000;
115      pagelen = 2048; #2kB pages in 32-bit words
116      bcount = 0;
117      
118      #Wipe all of flash.
119      client.CCchiperase();
120      #Wipe the RAM buffer for the next flash page.
121      client.CCeraseflashbuffer();
122      for i in h._buf.keys():
123          while(i>page+pagelen):
124              if bcount>0:
125                  client.CCflashpage(page);
126                  client.CCeraseflashbuffer();
127                  bcount=0;
128                  print "Flashed page at %06x" % page
129              page+=pagelen;
130              
131          #Place byte into buffer.
132          client.CCpokedatabyte(0xF000+i-page,
133                                h[i]);
134          bcount+=1;
135          if(i%0x100==0):
136                 print "%04x at %06x" % (i,page);
137      #last page
138      client.CCflashpage(page);
139      print "Flashed final page at %06x" % page;
140      
141 if(sys.argv[1]=="lock"):
142     print "Status: %s" %client.CCstatusstr();
143     client.CClockchip();
144     print "Status: %s" %client.CCstatusstr();
145 if(sys.argv[1]=="flashpage"):
146     target=0;
147     if(len(sys.argv)>2):
148         target=int(sys.argv[2],16);
149     print "Writing a page of flash from 0xF000 in XDATA"
150     client.CCflashpage(target);
151 if(sys.argv[1]=="erasebuffer"):
152     print "Erasing flash buffer.";
153     client.CCeraseflashbuffer();
154
155 if(sys.argv[1]=="writedata"):
156     f=sys.argv[2];
157     start=0;
158     stop=0xFFFF;
159     if(len(sys.argv)>3):
160         start=int(sys.argv[3],16);
161     if(len(sys.argv)>4):
162         stop=int(sys.argv[4],16);
163     
164     h = IntelHex(f);
165     
166     for i in h._buf.keys():
167         if(i>=start and i<=stop):
168             client.CCpokedatabyte(i,h[i]);
169             if(i%0x100==0):
170                 print "%04x" % i;
171 #if(sys.argv[1]=="flashtest"):
172 #    client.CCflashtest();
173 if(sys.argv[1]=="peekdata"):
174     start=0x0000;
175     if(len(sys.argv)>2):
176         start=int(sys.argv[2],16);
177     stop=start;
178     if(len(sys.argv)>3):
179         stop=int(sys.argv[3],16);
180     print "Peeking from %04x to %04x." % (start,stop);
181     while start<=stop:
182         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
183         start=start+1;
184 if(sys.argv[1]=="peekcode"):
185     start=0x0000;
186     if(len(sys.argv)>2):
187         start=int(sys.argv[2],16);
188     stop=start;
189     if(len(sys.argv)>3):
190         stop=int(sys.argv[3],16);
191     print "Peeking from %04x to %04x." % (start,stop);
192     while start<=stop:
193         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
194         start=start+1;
195 if(sys.argv[1]=="pokedata"):
196     start=0x0000;
197     val=0x00;
198     if(len(sys.argv)>2):
199         start=int(sys.argv[2],16);
200     if(len(sys.argv)>3):
201         val=int(sys.argv[3],16);
202     print "Poking %04x to become %02x." % (start,val);
203     client.CCpokedatabyte(start,val);
204
205 client.CCstop();