updates to use the ARMresettarget() for "goodfet.arm7 reset" which uses the nRST pin
[goodfet] / client / goodfet.arm7
1 #!/usr/bin/env python
2
3 import sys
4 import struct
5 import binascii
6
7 from GoodFETARM7 import GoodFETARM
8 from intelhex import IntelHex16bit, IntelHex
9
10
11 if(len(sys.argv)==1):
12     print "Usage: %s verb [objects]\n" % sys.argv[0]
13     # halt, resume... but need for flash and dump to leave it as it was
14     print "%s info" % sys.argv[0]
15     print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0]
16     print "%s erase" % sys.argv[0]
17     print "%s eraseinfo" % sys.argv[0]
18     print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0]
19     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0]
20     print "%s poke 0x$adr 0x$val" % sys.argv[0]
21     print "%s peek 0x$start [0x$stop]" % sys.argv[0]
22     print "%s reset" % sys.argv[0]
23     sys.exit()
24
25 #Initialize FET and set baud rate
26 client=GoodFETARM()
27 client.serInit()
28
29 client.setup()
30 client.start()
31
32 if(sys.argv[1]=="info"):
33     client.halt()
34     client.resume()
35
36
37 if(sys.argv[1]=="dump"):
38     f = sys.argv[2]
39     start=0x00000000
40     stop=0xFFFFFFFF
41     if(len(sys.argv)>3):
42         start=int(sys.argv[3],16)
43     if(len(sys.argv)>4):
44         stop=int(sys.argv[4],16)
45     
46     print "Dumping from %04x to %04x as %s." % (start,stop,f)
47     #h = IntelHex16bit(None)
48     # FIXME: get mcu state and return it to that state
49     client.halt()
50
51     h = IntelHex(None)
52     i=start
53     while i<=stop:
54         #data=client.ARMreadMem(i, 48)
55         data=client.ARMreadChunk(i, 48, verbose=0)
56         print "Dumped %06x."%i
57         for dword in data:
58             if i<=stop and dword != 0xdeadbeef:
59                 h.puts( i, struct.pack("<I", dword) )
60             i+=4
61     # FIXME: get mcu state and return it to that state
62     client.resume()
63     h.write_hex_file(f)
64
65 '''
66 if(sys.argv[1]=="erase"):
67     print "Erasing main flash memory."
68     client.ARMmasserase()
69
70 if(sys.argv[1]=="eraseinfo"):
71     print "Erasing info memory."
72     client.ARMinfoerase()
73
74     
75 '''
76 if(sys.argv[1]=="ivt"):
77     client.ARMreprChunk(0xFFC0,0xFFFF)
78
79 if(sys.argv[1]=="regs"):
80     for i in range(0,16):
81         print "r%i=%04x" % (i,client.ARMget_register(i))
82
83 if(sys.argv[1]=="flash"):
84     f=sys.argv[2]
85     start=0
86     stop=0x10000
87     if(len(sys.argv)>3):
88         start=int(sys.argv[3],16)
89     if(len(sys.argv)>4):
90         stop=int(sys.argv[4],16)
91     
92     client.halt()
93     h = IntelHex16bit(f)
94     
95     #Should this be default?
96     #Makes flashing multiple images inconvenient.
97     #client.ARMmasserase()
98     
99     count=0; #Bytes in commit.
100     first=0
101     vals=[]
102     last=0;  #Last address committed.
103     for i in h._buf.keys():
104         if((count>0x40 or last+2!=i) and count>0 and i&1==0):
105             #print "%i, %x, %x" % (len(vals), last, i)
106             client.ARMpokeflashblock(first,vals)
107             count=0
108             first=0
109             last=0
110             vals=[]
111         if(i>=start and i<stop  and i&1==0):
112             val=h[i>>1]
113             if(count==0):
114                 first=i
115             last=i
116             count+=2
117             vals+=[val&0xff,(val&0xff00)>>8]
118             if(i%0x100==0):
119                 print "%04x" % i
120     if count>0: #last commit, ivt
121         client.ARMpokeflashblock(first,vals)
122     client.resume()
123
124 if(sys.argv[1]=="verify"):
125     f=sys.argv[2]
126     start=0
127     stop=0xFFFF
128     if(len(sys.argv)>3):
129         start=int(sys.argv[3],16)
130     if(len(sys.argv)>4):
131         stop=int(sys.argv[4],16)
132     
133     client.halt()
134     h = IntelHex16bit(f)
135     for i in h._buf.keys():
136         if(i>=start and i<stop and i&1==0):
137             peek=client.ARMreadMem(i)
138             if(h[i>>1]!=peek):
139                 print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1])
140             if(i%0x100==0):
141                 print "%04x" % i
142     client.resume()
143
144
145 if(sys.argv[1]=="peek"):
146     start = 0x0000
147     if(len(sys.argv)>2):
148         start=int(sys.argv[2],16)
149
150     stop = start+4
151     if(len(sys.argv)>3):
152         stop=int(sys.argv[3],16)
153
154     print "Peeking from %04x to %04x." % (start,stop)
155     client.halt()
156     for dword in client.ARMreadChunk(start, (stop-start)/4, verbose=0):
157         print "%.4x: %.8x" % (start, dword)
158         start += 4
159     client.resume()
160
161 if(sys.argv[1]=="poke"):
162     start=0x0000
163     val=0x00
164     if(len(sys.argv)>2):
165         start=int(sys.argv[2],16)
166     if(len(sys.argv)>3):
167         val=int(sys.argv[3],16)
168     
169     print "Poking %06x to become %04x." % (start,val)
170     client.halt()
171     #???while client.ARMreadMem(start)[0]&(~val)>0:
172     client.ARMwriteChunk(start, [val])
173     print "Poked to %.8x" % client.ARMreadMem(start)[0]
174     client.resume()
175
176
177 if(sys.argv[1]=="reset"):
178     #Set PC to RESET vector's value.
179     
180     #client.ARMsetPC(0x00000000)
181     #client.ARMset_regCPSR(0)
182     #client.ARMreleasecpu()
183     client.ARMresettarget(1000)
184
185 #client.ARMreleasecpu()
186 #client.ARMstop()