#!/usr/bin/env python import sys import struct import binascii from GoodFETARM7 import GoodFETARM from intelhex import IntelHex16bit, IntelHex if(len(sys.argv)==1): print "Usage: %s verb [objects]\n" % sys.argv[0] # halt, resume... but need for flash and dump to leave it as it was print "%s info" % sys.argv[0] print "%s dump $foo.hex [0x$start 0x$stop]" % sys.argv[0] print "%s erase" % sys.argv[0] print "%s eraseinfo" % sys.argv[0] print "%s flash $foo.hex [0x$start 0x$stop]" % sys.argv[0] print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0] print "%s poke 0x$adr 0x$val" % sys.argv[0] print "%s peek 0x$start [0x$stop]" % sys.argv[0] print "%s reset" % sys.argv[0] sys.exit() #Initialize FET and set baud rate client=GoodFETARM() client.serInit() client.setup() client.start() if(sys.argv[1]=="info"): client.halt() client.resume() if(sys.argv[1]=="dump"): f = sys.argv[2] start=0x00000000 stop=0xFFFFFFFF if(len(sys.argv)>3): start=int(sys.argv[3],16) if(len(sys.argv)>4): stop=int(sys.argv[4],16) 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 while i<=stop: #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) if(len(sys.argv)>4): stop=int(sys.argv[4],16) client.halt() h = IntelHex16bit(f) #Should this be default? #Makes flashing multiple images inconvenient. #client.ARMmasserase() count=0; #Bytes in commit. 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=[] if(i>=start and i>1] if(count==0): first=i last=i count+=2 vals+=[val&0xff,(val&0xff00)>>8] if(i%0x100==0): print "%04x" % i if count>0: #last commit, ivt client.ARMpokeflashblock(first,vals) client.resume() if(sys.argv[1]=="verify"): f=sys.argv[2] start=0 stop=0xFFFF if(len(sys.argv)>3): start=int(sys.argv[3],16) if(len(sys.argv)>4): stop=int(sys.argv[4],16) client.halt() 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]) if(i%0x100==0): print "%04x" % i client.resume() if(sys.argv[1]=="peek"): start = 0x0000 if(len(sys.argv)>2): start=int(sys.argv[2],16) stop = start+4 if(len(sys.argv)>3): stop=int(sys.argv[3],16) 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) start += 4 client.resume() if(sys.argv[1]=="poke"): start=0x0000 val=0x00 if(len(sys.argv)>2): start=int(sys.argv[2],16) if(len(sys.argv)>3): val=int(sys.argv[3],16) print "Poking %06x to become %04x." % (start,val) client.halt() #???while client.ARMreadMem(start)[0]&(~val)>0: client.ARMwriteChunk(start, [val]) print "Poked to %.8x" % client.ARMreadMem(start)[0] client.resume() if(sys.argv[1]=="reset"): #Set PC to RESET vector's value. #client.ARMsetPC(0x00000000) #client.ARMset_regCPSR(0) #client.ARMreleasecpu() client.ARMresettarget(1000) #client.ARMreleasecpu() #client.ARMstop()