From 01e894aa7830034da7f80035c08cddb8e2ba4e48 Mon Sep 17 00:00:00 2001 From: dodge-this Date: Mon, 12 Nov 2012 13:22:57 +0000 Subject: [PATCH] updates to use the ARMresettarget() for "goodfet.arm7 reset" which uses the nRST pin git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@1332 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFETARM7.py | 6 +- client/goodfet.arm7 | 140 ++++++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 70 deletions(-) diff --git a/client/GoodFETARM7.py b/client/GoodFETARM7.py index 307a1fe..207670b 100644 --- a/client/GoodFETARM7.py +++ b/client/GoodFETARM7.py @@ -396,6 +396,7 @@ class GoodFETARM(GoodFET): self.ARMset_register(15,self.storedPC&0xfffffffc) print "CPSR: (%s) %s"%(self.ARMget_regCPSRstr()) halt = ARMhaltcpu + def ARMreleasecpu(self): """Resume the CPU.""" # restore registers FIXME: DO THIS @@ -432,8 +433,8 @@ class GoodFETARM(GoodFET): self.ARM_nop(0) self.ARMrestart() - resume = ARMreleasecpu + def resettap(self): self.writecmd(0x13, RESETTAP, 0,[]) def ARMsetModeARM(self): @@ -600,8 +601,9 @@ class GoodFETARM(GoodFET): 0x02 : "force dbgrq", 0x01 : "force dbgack" } - def ARMresettarget(self, delay=10): + def ARMresettarget(self, delay=1000): return self.writecmd(0x13,RESETTARGET,2, [ delay&0xff, (delay>>8)&0xff ] ) + def ARMchain0(self, address, bits=0x819684c054, data=0): bulk = chop(address,4) bulk.extend(chop(bits,8)) diff --git a/client/goodfet.arm7 b/client/goodfet.arm7 index f5e689e..755df5c 100755 --- a/client/goodfet.arm7 +++ b/client/goodfet.arm7 @@ -1,8 +1,8 @@ #!/usr/bin/env python -import sys; +import sys import struct -import binascii; +import binascii from GoodFETARM7 import GoodFETARM from intelhex import IntelHex16bit, IntelHex @@ -23,133 +23,135 @@ if(len(sys.argv)==1): sys.exit() #Initialize FET and set baud rate -client=GoodFETARM(); +client=GoodFETARM() client.serInit() -client.setup(); -client.start(); +client.setup() +client.start() if(sys.argv[1]=="info"): - pass + client.halt() + client.resume() + if(sys.argv[1]=="dump"): - f = sys.argv[2]; - start=0x00000000; - stop=0xFFFFFFFF; + f = sys.argv[2] + start=0x00000000 + stop=0xFFFFFFFF if(len(sys.argv)>3): - start=int(sys.argv[3],16); + start=int(sys.argv[3],16) if(len(sys.argv)>4): - stop=int(sys.argv[4],16); + stop=int(sys.argv[4],16) - print "Dumping from %04x to %04x as %s." % (start,stop,f); - #h = IntelHex16bit(None); + print "Dumping from %04x to %04x as %s." % (start,stop,f) + #h = IntelHex16bit(None) # FIXME: get mcu state and return it to that state client.halt() - h = IntelHex(None); - i=start; + h = IntelHex(None) + i=start while i<=stop: - #data=client.ARMreadMem(i, 48); - data=client.ARMreadChunk(i, 48, verbose=0); - print "Dumped %06x."%i; + #data=client.ARMreadMem(i, 48) + data=client.ARMreadChunk(i, 48, verbose=0) + print "Dumped %06x."%i for dword in data: if i<=stop and dword != 0xdeadbeef: h.puts( i, struct.pack("3): - start=int(sys.argv[3],16); + start=int(sys.argv[3],16) if(len(sys.argv)>4): - stop=int(sys.argv[4],16); + stop=int(sys.argv[4],16) client.halt() - h = IntelHex16bit(f); + h = IntelHex16bit(f) #Should this be default? #Makes flashing multiple images inconvenient. - #client.ARMmasserase(); + #client.ARMmasserase() count=0; #Bytes in commit. - first=0; - vals=[]; + first=0 + vals=[] last=0; #Last address committed. for i in h._buf.keys(): if((count>0x40 or last+2!=i) and count>0 and i&1==0): - #print "%i, %x, %x" % (len(vals), last, i); - client.ARMpokeflashblock(first,vals); - count=0; - first=0; - last=0; - vals=[]; + #print "%i, %x, %x" % (len(vals), last, i) + client.ARMpokeflashblock(first,vals) + count=0 + first=0 + last=0 + vals=[] if(i>=start and i>1]; + val=h[i>>1] if(count==0): - first=i; - last=i; - count+=2; - vals+=[val&0xff,(val&0xff00)>>8]; + first=i + last=i + count+=2 + vals+=[val&0xff,(val&0xff00)>>8] if(i%0x100==0): - print "%04x" % i; + print "%04x" % i if count>0: #last commit, ivt - client.ARMpokeflashblock(first,vals); + client.ARMpokeflashblock(first,vals) client.resume() if(sys.argv[1]=="verify"): - f=sys.argv[2]; - start=0; - stop=0xFFFF; + f=sys.argv[2] + start=0 + stop=0xFFFF if(len(sys.argv)>3): - start=int(sys.argv[3],16); + start=int(sys.argv[3],16) if(len(sys.argv)>4): - stop=int(sys.argv[4],16); + stop=int(sys.argv[4],16) client.halt() - h = IntelHex16bit(f); + h = IntelHex16bit(f) for i in h._buf.keys(): if(i>=start and i>1]!=peek): - print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]); + print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]) if(i%0x100==0): - print "%04x" % i; + print "%04x" % i client.resume() if(sys.argv[1]=="peek"): - start = 0x0000; + start = 0x0000 if(len(sys.argv)>2): - start=int(sys.argv[2],16); + start=int(sys.argv[2],16) - stop = start+4; + stop = start+4 if(len(sys.argv)>3): - stop=int(sys.argv[3],16); + stop=int(sys.argv[3],16) - print "Peeking from %04x to %04x." % (start,stop); + print "Peeking from %04x to %04x." % (start,stop) client.halt() for dword in client.ARMreadChunk(start, (stop-start)/4, verbose=0): print "%.4x: %.8x" % (start, dword) @@ -157,14 +159,14 @@ if(sys.argv[1]=="peek"): client.resume() if(sys.argv[1]=="poke"): - start=0x0000; - val=0x00; + start=0x0000 + val=0x00 if(len(sys.argv)>2): - start=int(sys.argv[2],16); + start=int(sys.argv[2],16) if(len(sys.argv)>3): - val=int(sys.argv[3],16); + val=int(sys.argv[3],16) - print "Poking %06x to become %04x." % (start,val); + print "Poking %06x to become %04x." % (start,val) client.halt() #???while client.ARMreadMem(start)[0]&(~val)>0: client.ARMwriteChunk(start, [val]) @@ -175,8 +177,10 @@ if(sys.argv[1]=="poke"): if(sys.argv[1]=="reset"): #Set PC to RESET vector's value. - client.ARMsetPC(0x00000000); - client.ARMreleasecpu(); + #client.ARMsetPC(0x00000000) + #client.ARMset_regCPSR(0) + #client.ARMreleasecpu() + client.ARMresettarget(1000) -#client.ARMreleasecpu(); -#client.ARMstop(); +#client.ARMreleasecpu() +#client.ARMstop() -- 2.20.1