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