a7b208f2f2a9f0331d30f3ccdf8bfdf1ad06cf07
[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 peek 0x$iram" % sys.argv[0];
27     print "%s poke 0x$iram 0x$val" % sys.argv[0];
28     print "%s peekcode 0x$start [0x$stop]" % sys.argv[0];
29     sys.exit();
30
31 #Initailize FET and set baud rate
32 client=GoodFETCC();
33 client.serInit()
34
35 #Connect to target
36 client.setup();
37 client.start();
38
39 if(sys.argv[1]=="explore"):
40     print "Exploring undefined commands."
41     print "Status: %s" %client.status();
42     
43     cmd=0x04; #read status
44     for foo in range(0,0x5):
45         client.CCcmd([(0x0F<<3)|(0x00)|0x03,0x09<<3]);
46         print "Status %02x: %s" % (foo,client.status());
47     for foo in range(0,3):
48         print "PC: %04x" % client.CCgetPC();
49         
50 if(sys.argv[1]=="test"):
51     client.test();
52 if(sys.argv[1]=="deadtest"):
53     for i in range(1,10):
54         print "IDENT as %s" % client.CCidentstr();
55 if(sys.argv[1]=="dumpcode"):
56     f = sys.argv[2];
57     start=0x0000;
58     stop=0xFFFF;
59     if(len(sys.argv)>3):
60         start=int(sys.argv[3],16);
61     if(len(sys.argv)>4):
62         stop=int(sys.argv[4],16);
63     
64     print "Dumping code from %04x to %04x as %s." % (start,stop,f);
65     h = IntelHex(None);
66     i=start;
67     while i<=stop:
68         h[i]=client.CCpeekcodebyte(i);
69         if(i%0x100==0):
70             print "Dumped %04x."%i;
71         i+=1;
72     h.write_hex_file(f);
73 if(sys.argv[1]=="dumpdata"):
74     f = sys.argv[2];
75     start=0xE000;
76     stop=0xFFFF;
77     if(len(sys.argv)>3):
78         start=int(sys.argv[3],16);
79     if(len(sys.argv)>4):
80         stop=int(sys.argv[4],16);
81     
82     print "Dumping data from %04x to %04x as %s." % (start,stop,f);
83     h = IntelHex(None);
84     i=start;
85     while i<=stop:
86         h[i]=client.CCpeekdatabyte(i);
87         if(i%0x100==0):
88             print "Dumped %04x."%i;
89         i+=1;
90     h.write_hex_file(f);
91 if(sys.argv[1]=="status"):
92     print "Status: %s" %client.status();
93 if(sys.argv[1]=="info"):
94     print "%s" % client.CCidentstr();
95 if(sys.argv[1]=="erase"):
96     print "Status: %s" % client.status();
97     client.CCchiperase();
98     print "Status: %s" %client.status();
99
100 if(sys.argv[1]=="peekinfo"):
101     print "Select info flash."
102     client.CCwr_config(1);
103     print "Config is %02x" % client.CCrd_config();
104     
105     start=0x0000;
106     if(len(sys.argv)>2):
107         start=int(sys.argv[2],16);
108     stop=start;
109     if(len(sys.argv)>3):
110         stop=int(sys.argv[3],16);
111     print "Peeking from %04x to %04x." % (start,stop);
112     while start<=stop:
113         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
114         start=start+1;
115 if(sys.argv[1]=="poke"):
116     client.CCpokeirambyte(int(sys.argv[2],16),
117                           int(sys.argv[3],16));
118 if(sys.argv[1]=="randtest"):
119     #Seed RNG
120     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
121     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
122     client.CCpokeirambyte(0xBD,0x01); #RNDH=0x01
123     client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
124     
125     #Dump values
126     for foo in range(1,10):
127         print "%02x" % client.CCpeekirambyte(0xBD); #RNDH
128         client.CCpokeirambyte(0xB4,0x04); #ADCCON1=0x04
129         client.CCreleasecpu();
130         client.CChaltcpu();
131     print "%02x" % client.CCpeekdatabyte(0xDF61); #CHIP ID
132 if(sys.argv[1]=="adctest"):
133     # ADCTest 0xDF3A 0xDF3B
134     print "ADC TEST %02x%02x" % (
135         client.CCpeekdatabyte(0xDF3A),
136         client.CCpeekdatabyte(0xDF3B));
137 if(sys.argv[1]=="config"):
138     print "Config is %02x" % client.CCrd_config();
139
140 if(sys.argv[1]=="flash"):
141      f=sys.argv[2];
142      start=0;
143      stop=0xFFFF;
144      if(len(sys.argv)>3):
145          start=int(sys.argv[3],16);
146      if(len(sys.argv)>4):
147          stop=int(sys.argv[4],16);
148    
149      client.flash(f);
150 if(sys.argv[1]=="lock"):
151     print "Status: %s" %client.status();
152     client.CClockchip();
153     print "Status: %s" %client.status();
154 if(sys.argv[1]=="flashpage"):
155     target=0;
156     if(len(sys.argv)>2):
157         target=int(sys.argv[2],16);
158     print "Writing a page of flash from 0xF000 in XDATA"
159     client.CCflashpage(target);
160 if(sys.argv[1]=="erasebuffer"):
161     print "Erasing flash buffer.";
162     client.CCeraseflashbuffer();
163
164 if(sys.argv[1]=="writedata"):
165     f=sys.argv[2];
166     start=0;
167     stop=0xFFFF;
168     if(len(sys.argv)>3):
169         start=int(sys.argv[3],16);
170     if(len(sys.argv)>4):
171         stop=int(sys.argv[4],16);
172     
173     h = IntelHex(f);
174     
175     for i in h._buf.keys():
176         if(i>=start and i<=stop):
177             client.CCpokedatabyte(i,h[i]);
178             if(i%0x100==0):
179                 print "%04x" % i;
180 #if(sys.argv[1]=="flashtest"):
181 #    client.CCflashtest();
182 if(sys.argv[1]=="peekdata"):
183     start=0x0000;
184     if(len(sys.argv)>2):
185         start=int(sys.argv[2],16);
186     stop=start;
187     if(len(sys.argv)>3):
188         stop=int(sys.argv[3],16);
189     print "Peeking from %04x to %04x." % (start,stop);
190     while start<=stop:
191         print "%04x: %02x" % (start,client.CCpeekdatabyte(start));
192         start=start+1;
193 if(sys.argv[1]=="peek"):
194     start=0x0000;
195     if(len(sys.argv)>2):
196         start=int(sys.argv[2],16);
197     stop=start;
198     if(len(sys.argv)>3):
199         stop=int(sys.argv[3],16);
200     print "Peeking from %04x to %04x." % (start,stop);
201     while start<=stop:
202         print "%04x: %02x" % (start,client.CCpeekirambyte(start));
203         start=start+1;
204 if(sys.argv[1]=="verify"):
205     f=sys.argv[2];
206     start=0;
207     stop=0xFFFF;
208     if(len(sys.argv)>3):
209         start=int(sys.argv[3],16);
210     if(len(sys.argv)>4):
211         stop=int(sys.argv[4],16);
212     
213     h = IntelHex(f);
214     for i in h._buf.keys():
215         if(i>=start and i<stop):
216             peek=client.CCpeekcodebyte(i)
217             if(h[i]!=peek):
218                 print "ERROR at %04x, found %02x not %02x"%(i,peek,h[i]);
219             if(i%0x100==0):
220                 print "%04x" % i;
221 if(sys.argv[1]=="peekcode"):
222     start=0x0000;
223     if(len(sys.argv)>2):
224         start=int(sys.argv[2],16);
225     stop=start;
226     if(len(sys.argv)>3):
227         stop=int(sys.argv[3],16);
228     print "Peeking from %04x to %04x." % (start,stop);
229     while start<=stop:
230         print "%04x: %02x" % (start,client.CCpeekcodebyte(start));
231         start=start+1;
232 if(sys.argv[1]=="pokedata"):
233     start=0x0000;
234     val=0x00;
235     if(len(sys.argv)>2):
236         start=int(sys.argv[2],16);
237     if(len(sys.argv)>3):
238         val=int(sys.argv[3],16);
239     print "Poking %04x to become %02x." % (start,val);
240     client.CCpokedatabyte(start,val);
241
242 client.stop();