Construction menu item>
[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 flash $foo.hex [0x$start 0x$stop]" % sys.argv[0];
16     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
17     print "%s poke 0x$adr 0x$val" % sys.argv[0];
18     print "%s peek 0x$start [0x$stop]" % sys.argv[0];
19     print "%s run" % sys.argv[0];
20     sys.exit();
21
22 #Initialize FET and set baud rate
23 client=GoodFETMSP430();
24 client.serInit()
25
26 #Connect to target
27 client.setup();
28 #print "setup"
29
30 #Identify model number.
31 client.start();
32
33 #print "started"
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     client.MSP430masserase();
69 if(sys.argv[1]=="ivt"):
70     client.MSP430dumpmem(0xFFE0,0xFFFF);
71 if(sys.argv[1]=="flash"):
72     f=sys.argv[2];
73     start=0;
74     stop=0xFFFF;
75     if(len(sys.argv)>3):
76         start=int(sys.argv[3],16);
77     if(len(sys.argv)>4):
78         stop=int(sys.argv[4],16);
79     
80     h = IntelHex16bit(f);
81     
82     #Should this be default?
83     #Makes flashing multiple images inconvenient.
84     client.MSP430masserase();
85     
86     count=0; #Bytes in commit.
87     first=0;
88     vals=[];
89     last=0;  #Last address committed.
90     for i in h._buf.keys():
91         if((count>0x40 or last+2!=i) and count>0 and i&1==0):
92             #print "%i, %x, %x" % (len(vals), last, i);
93             client.MSP430pokeflashblock(first,vals);
94             count=0;
95             first=0;
96             last=0;
97             vals=[];
98         if(i>=start and i<stop  and i&1==0):
99             val=h[i>>1];
100             if(count==0):
101                 first=i;
102             last=i;
103             count+=2;
104             #val2=client.MSP430pokeflash(i,val);
105             #if(val!=val2):
106             #    print "Write error at %04x, %04x!=%04x." %(
107             #        i, val, val2);
108             vals+=[val&0xff,(val&0xff00)>>8];
109             if(i%0x100==0):
110                 print "%04x" % i;
111     if count>0: #last commit, ivt
112         client.MSP430pokeflashblock(first,vals);
113 if(sys.argv[1]=="verify"):
114     f=sys.argv[2];
115     start=0;
116     stop=0xFFFF;
117     if(len(sys.argv)>3):
118         start=int(sys.argv[3],16);
119     if(len(sys.argv)>4):
120         stop=int(sys.argv[4],16);
121     
122     h = IntelHex16bit(f);
123     for i in h._buf.keys():
124         if(i>=start and i<stop and i&1==0):
125             peek=client.MSP430peek(i)
126             if(h[i>>1]!=peek):
127                 print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]);
128             if(i%0x100==0):
129                 print "%04x" % i;
130 if(sys.argv[1]=="peek"):
131     start=0x0000;
132     if(len(sys.argv)>2):
133         start=int(sys.argv[2],16);
134     stop=start;
135     if(len(sys.argv)>3):
136         stop=int(sys.argv[3],16);
137     print "Peeking from %04x to %04x." % (start,stop);
138     while start<=stop:
139         print "%04x: %04x" % (start,client.MSP430peek(start));
140         start=start+2;
141
142 if(sys.argv[1]=="poke"):
143     start=0x0000;
144     val=0x00;
145     if(len(sys.argv)>2):
146         start=int(sys.argv[2],16);
147     if(len(sys.argv)>3):
148         val=int(sys.argv[3],16);
149     print "Poking %06x to become %04x." % (start,val);
150     
151     while client.MSP430peek(start)!=val:
152         client.MSP430pokeflash(start,val);
153         print "Poked to %04x" % client.MSP430peek(start);
154
155
156 if(sys.argv[1]=="run"):
157     #Set PC to RESET vector's value.
158     #client.MSP430setPC(client.MSP430peek(0xfffe));
159     #client.MSP430releasecpu();
160     client.MSP430run();
161
162 if(sys.argv[1]=="whatever"):
163     for i in [0x24FF, 0x2500, 0x2502, 0x2504]:
164         print "%04x" % client.MSP430peek(i);
165
166 #client.MSP430releasecpu();
167 #client.MSP430stop();