Post-Shmoocon commit.
[goodfet] / client / goodfet.msp430
1 #!/usr/bin/env python
2
3 import sys;
4 import binascii;
5
6 from GoodFETMSP430 import GoodFETMSP430;
7 from intelhex import IntelHex16bit, IntelHex;
8
9
10 if(len(sys.argv)==1):
11     print "Usage: %s verb [objects]\n" % sys.argv[0];
12     print "%s test" % sys.argv[0];
13     print "%s selftest" % sys.argv[0];
14     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0];
15     print "%s erase" % sys.argv[0];
16     print "%s eraseinfo" % sys.argv[0];
17     print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
18     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
19     print "%s poke 0x$adr 0x$val" % sys.argv[0];
20     print "%s serial [$val]" % sys.argv[0];
21     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
22     print "%s run" % sys.argv[0];
23     sys.exit();
24
25 #Initialize FET and set baud rate
26 client=GoodFETMSP430();
27 client.serInit()
28
29 #Connect to target
30 client.setup();
31 #print "setup"
32
33 #Identify model number.
34 client.start();
35
36 if(sys.argv[1]=="info"):
37     #print "Model    %08x " % client.MSP430deviceid();
38     #print "Core     %04x " % client.MSP430coreid();
39     #print "Identity %04x" % client.MSP430ident();
40     print "Identifies as %s (%04x)" % (
41         client.MSP430identstr(),
42         client.MSP430ident());
43 if(sys.argv[1]=="test"):
44     client.MSP430test();
45 if(sys.argv[1]=="glitch"):
46     for foo in range(0,100):
47         print "Identifies as %04x" % client.MSP430ident();
48 if(sys.argv[1]=="dump"):
49     f = sys.argv[2];
50     start=0x0200;
51     stop=0xFFFF;
52     if(len(sys.argv)>3):
53         start=int(sys.argv[3],16);
54     if(len(sys.argv)>4):
55         stop=int(sys.argv[4],16);
56     
57     print "Dumping from %04x to %04x as %s." % (start,stop,f);
58     #h = IntelHex16bit(None);
59     h = IntelHex(None);
60     i=start;
61     while i<=stop:
62         data=client.MSP430peekblock(i);
63         print "Dumped %06x."%i;
64         for j in data:
65             if i<=stop: h[i]=ord(j);
66             i+=1;
67     h.write_hex_file(f);
68 if(sys.argv[1]=="erase"):
69     print "Erasing main flash memory."
70     client.MSP430masserase();
71 if(sys.argv[1]=="eraseinfo"):
72     print "Erasing info memory."
73     client.MSP430infoerase();
74
75 if(sys.argv[1]=="selftest"):
76     import time;
77     
78     entry=client.peek16(0xFFC0);
79     print "Calling self-test at 0x%04x." %entry;
80     print "Memory from 0x3020 to 0x3030 should be zeroed.";
81     
82     for i in range(0x3020,0x3030):
83         client.MSP430poke(i,0xFFFF);
84     client.MSP430setPC(entry);
85     time.sleep(5);
86     errors=0;
87     
88     if(client.peek8(0x302F)==0xFF):
89         print "Test not run.  Try again.";
90         exit(0);
91     
92     for i in range(0x3020,0x3030,2):
93         ret=client.peek16(i);
94         if ret!=0:
95             errors=errors+1;
96             print "Failure at 0x%04x, returned %02xh." % (i,ret);
97         
98     if errors==0:
99         print "Test succeeded.  Board is ready to ship."
100     else:
101         print "Test failed.  Is it soldered correctly?"
102     #client.MSP430dumpmem(0x3020,0x3030);
103     
104 if(sys.argv[1]=="ivt"):
105     client.MSP430dumpmem(0xFFC0,0xFFFF);
106 if(sys.argv[1]=="regs"):
107     for i in range(0,16):
108         print "r%i=%04x" % (i,client.MSP430getreg(i));
109
110 if(sys.argv[1]=="flash"):
111     f=sys.argv[2];
112     start=0;
113     stop=0x10000;
114     if(len(sys.argv)>3):
115         start=int(sys.argv[3],16);
116     if(len(sys.argv)>4):
117         stop=int(sys.argv[4],16);
118     
119     h = IntelHex16bit(f);
120     
121     #Should this be default?
122     #Makes flashing multiple images inconvenient.
123     #client.MSP430masserase();
124     
125     count=0; #Bytes in commit.
126     first=0;
127     vals=[];
128     last=0;  #Last address committed.
129     for i in h._buf.keys():
130         if((count>0x40 or last+2!=i) and count>0 and i&1==0):
131             #print "%i, %x, %x" % (len(vals), last, i);
132             client.MSP430pokeflashblock(first,vals);
133             count=0;
134             first=0;
135             last=0;
136             vals=[];
137         if(i>=start and i<stop  and i&1==0):
138             val=h[i>>1];
139             if(count==0):
140                 first=i;
141             last=i;
142             count+=2;
143             vals+=[val&0xff,(val&0xff00)>>8];
144             if(i%0x100==0):
145                 print "%04x" % i;
146     if count>0: #last commit, ivt
147         client.MSP430pokeflashblock(first,vals);
148 if(sys.argv[1]=="verify"):
149     f=sys.argv[2];
150     start=0;
151     stop=0xFFFF;
152     if(len(sys.argv)>3):
153         start=int(sys.argv[3],16);
154     if(len(sys.argv)>4):
155         stop=int(sys.argv[4],16);
156     
157     h = IntelHex16bit(f);
158     for i in h._buf.keys():
159         if(i>=start and i<stop and i&1==0):
160             peek=client.MSP430peek(i)
161             if(h[i>>1]!=peek):
162                 print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]);
163             if(i%0x100==0):
164                 print "%04x" % i;
165 if(sys.argv[1]=="peek"):
166     start=0x0000;
167     if(len(sys.argv)>2):
168         start=int(sys.argv[2],16);
169     stop=start;
170     if(len(sys.argv)>3):
171         stop=int(sys.argv[3],16);
172     print "Peeking from %04x to %04x." % (start,stop);
173     while start<=stop:
174         print "%04x: %04x" % (start,client.MSP430peek(start));
175         start=start+2;
176
177 if(sys.argv[1]=="poke"):
178     start=0x0000;
179     val=0x00;
180     if(len(sys.argv)>2):
181         start=int(sys.argv[2],16);
182     if(len(sys.argv)>3):
183         val=int(sys.argv[3],16);
184     print "Poking %06x to become %04x." % (start,val);
185     
186     while client.MSP430peek(start)&(~val)>0:
187         client.MSP430pokeflash(start,val);
188         print "Poked to %04x" % client.MSP430peek(start);
189 if(sys.argv[1]=="serial"):
190     oid=0xdeadbeef;
191     if(len(sys.argv)>2):
192         oid=eval(sys.argv[2]);
193     else:
194         #Crashes Windows.
195         #simpchin=u=unichr(24207)+unichr(21015)+unichr(21495);  #Chinese for "Serial Number".
196         #print simpchin;
197         
198         oid=input(u"Serial Number? ");
199     adr=0xFFB0;
200     if(len(sys.argv)>2):
201         start=int(sys.argv[2],16);
202     if(len(sys.argv)>3):
203         val=int(sys.argv[3],16);
204     print "Poking 32-bit OID to 0x%04x as %08x." % (adr,oid);
205     client.MSP430pokeflash(adr,oid&0xFFFF);
206     client.MSP430pokeflash(adr+2,(oid>>16)&0xFFFF);
207
208 if(sys.argv[1]=="run"):
209     #Set PC to RESET vector's value.
210     #client.MSP430setPC(client.MSP430peek(0xfffe));
211     #client.MSP430releasecpu();
212     client.MSP430run();
213
214 if(sys.argv[1]=="whatever"):
215     for i in [0x24FF, 0x2500, 0x2502, 0x2504]:
216         print "%04x" % client.MSP430peek(i);
217
218 #client.MSP430releasecpu();
219 #client.MSP430stop();