7 from GoodFETARM7 import GoodFETARM
8 from intelhex import IntelHex16bit, IntelHex
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]
25 #Initialize FET and set baud rate
32 if(sys.argv[1]=="info"):
37 if(sys.argv[1]=="dump"):
42 start=int(sys.argv[3],16)
44 stop=int(sys.argv[4],16)
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
54 #data=client.ARMreadMem(i, 48)
55 data=client.ARMreadChunk(i, 48, verbose=0)
56 print "Dumped %06x."%i
58 if i<=stop and dword != 0xdeadbeef:
59 h.puts( i, struct.pack("<I", dword) )
61 # FIXME: get mcu state and return it to that state
66 if(sys.argv[1]=="erase"):
67 print "Erasing main flash memory."
70 if(sys.argv[1]=="eraseinfo"):
71 print "Erasing info memory."
76 if(sys.argv[1]=="ivt"):
77 client.ARMreprChunk(0xFFC0,0xFFFF)
79 if(sys.argv[1]=="regs"):
81 print "r%i=%04x" % (i,client.ARMget_register(i))
83 if(sys.argv[1]=="flash"):
88 start=int(sys.argv[3],16)
90 stop=int(sys.argv[4],16)
95 #Should this be default?
96 #Makes flashing multiple images inconvenient.
97 #client.ARMmasserase()
99 count=0; #Bytes in commit.
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)
111 if(i>=start and i<stop and i&1==0):
117 vals+=[val&0xff,(val&0xff00)>>8]
120 if count>0: #last commit, ivt
121 client.ARMpokeflashblock(first,vals)
124 if(sys.argv[1]=="verify"):
129 start=int(sys.argv[3],16)
131 stop=int(sys.argv[4],16)
135 for i in h._buf.keys():
136 if(i>=start and i<stop and i&1==0):
139 print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1])
145 if(sys.argv[1]=="peek"):
148 start=int(sys.argv[2],16)
152 stop=int(sys.argv[3],16)
154 print "Peeking from %04x to %04x." % (start,stop)
156 for dword in client.ARMreadChunk(start, (stop-start)/4, verbose=0):
157 print "%.4x: %.8x" % (start, dword)
161 if(sys.argv[1]=="poke"):
165 start=int(sys.argv[2],16)
167 val=int(sys.argv[3],16)
169 print "Poking %06x to become %04x." % (start,val)
171 #???while client.ARMreadMem(start)[0]&(~val)>0:
172 client.ARMwriteChunk(start, [val])
173 print "Poked to %.8x" % client.ARMreadMem(start)[0]
177 if(sys.argv[1]=="reset"):
178 #Set PC to RESET vector's value.
180 #client.ARMsetPC(0x00000000)
181 #client.ARMset_regCPSR(0)
182 #client.ARMreleasecpu()
183 client.ARMresettarget(1000)
185 #client.ARMreleasecpu()