From 6097d6dc581f9331d80c8f1a04d307dd68a2fd0d Mon Sep 17 00:00:00 2001 From: travisutk Date: Tue, 23 Feb 2010 03:09:34 +0000 Subject: [PATCH 1/1] More of a console, approaching standard commandset for Chipcon port. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@346 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFET.py | 7 ++++-- client/GoodFETCC.py | 48 ++++++++++++++++++++++++++++++++++++---- client/GoodFETConsole.py | 35 ++++++++++++++++++++++++----- client/Makefile | 4 ++-- client/goodfet | 2 ++ client/goodfet.cc | 30 +------------------------ 6 files changed, 84 insertions(+), 42 deletions(-) diff --git a/client/GoodFET.py b/client/GoodFET.py index d2beb5c..264a738 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -254,6 +254,8 @@ class GoodFET: print "Self-test complete."; + # The following functions ought to be implemented in + # every client. def infostring(self): a=self.peekbyte(0xff0); @@ -271,8 +273,9 @@ class GoodFET: return; def status(self): return; - - + def flash(self,file): + """Flash an intel hex file to code memory.""" + print "Flash not implemented."; def peek32(self,address, memory="vn"): return (self.peek16(address,memory)+ (self.peek16(address+2,memory)<<16)); diff --git a/client/GoodFETCC.py b/client/GoodFETCC.py index 894db94..94fcafd 100644 --- a/client/GoodFETCC.py +++ b/client/GoodFETCC.py @@ -12,7 +12,7 @@ from GoodFET import GoodFET; from intelhex import IntelHex; class GoodFETCC(GoodFET): - """A GoodFET variant for use with Chipcon 8051 Zigbeema SoC.""" + """A GoodFET variant for use with Chipcon 8051 Zigbee SoC.""" APP=0x30; def CChaltcpu(self): @@ -132,9 +132,15 @@ class GoodFETCC(GoodFET): def CCdebuginstr(self,instr): self.writecmd(0x30,0x88,len(instr),instr); return ord(self.data[0]); - def peek8(self,address, memory="vn"): - return self.CCpeekcodebyte(address); - + def peek8(self,address, memory="code"): + if(memory=="code" or memory=="flash" or memory=="vn"): + return self.CCpeekcodebyte(address); + elif(memory=="data" or memory=="xdata" or memory=="ram"): + return self.CCpeekdatabyte(address); + elif(memory=="idata" or memory=="iram"): + return self.CCpeekirambyte(address); + print "%s is an unknown memory." % memory; + return 0xdead; def CCpeekcodebyte(self,adr): """Read the contents of code memory at an address.""" self.data=[adr&0xff, (adr&0xff00)>>8]; @@ -233,3 +239,37 @@ class GoodFETCC(GoodFET): (adr>>24)&0xFF]; print "Flashing buffer to 0x%06x" % adr; self.writecmd(0x30,0x95,4,data); + + def flash(self,file): + """Flash an intel hex file to code memory.""" + print "Flashing %s" % file; + + h = IntelHex(file); + page = 0x0000; + pagelen = self.CCpagesize(); #Varies by chip. + + #print "page=%04x, pagelen=%04x" % (page,pagelen); + + bcount = 0; + + #Wipe the RAM buffer for the next flash page. + self.CCeraseflashbuffer(); + for i in h._buf.keys(): + while(i>=page+pagelen): + if bcount>0: + self.CCflashpage(page); + #client.CCeraseflashbuffer(); + bcount=0; + print "Flashed page at %06x" % page + page+=pagelen; + + #Place byte into buffer. + self.CCpokedatabyte(0xF000+i-page, + h[i]); + bcount+=1; + if(i%0x100==0): + print "Buffering %04x toward %06x" % (i,page); + #last page + self.CCflashpage(page); + print "Flashed final page at %06x" % page; + diff --git a/client/GoodFETConsole.py b/client/GoodFETConsole.py index 14fc3e3..72077e7 100644 --- a/client/GoodFETConsole.py +++ b/client/GoodFETConsole.py @@ -5,7 +5,7 @@ # # This code is being rewritten and refactored. You've been warned! -import sys; +import sys, os; import binascii; from GoodFET import GoodFET; @@ -21,13 +21,28 @@ class GoodFETConsole(): client.start(); def handle(self, str): """Handle a command string. First word is command.""" + #Lines beginning with # are comments. + if(str[0]=="#"): return; + #Lines beginning with ! are Python. + if(str[0]=="!"): + try: + exec(str.lstrip('!')); + except: + print sys.exc_info()[0]; + return; + #Backtick (`) indicates shell commands. + if(str[0]=='`'): + os.system(str.lstrip('`')); + return; + #By this point, we're looking at a GoodFET command. args=str.split(); if len(args)==0: return; try: eval("self.CMD%s(args)" % args[0]) - except AttributeError: - print "Unknown command '%s'." % args[0]; + except: + print sys.exc_info()[0]; + #print "Unknown command '%s'." % args[0]; def CMDinfo(self,args): print self.client.infostring() def CMDlock(self,args): @@ -44,6 +59,16 @@ class GoodFETConsole(): return; def CMDpeek(self,args): adr=eval(args[1]); - print "0x%08x:= 0x%04x" % (adr, self.client.peek16(adr)); - return; + memory="vn"; + if(len(args)>2): + memory=args[2]; + print "0x%08x:= 0x%04x" % (adr, self.client.peek16(adr,memory)); + def CMDflash(self,args): + file=args[1]; + self.client.flash(self.expandfilename(file)); + def expandfilename(self,filename): + if(filename[0]=='~'): + return "%s%s" % (os.environ.get("HOME"),filename.lstrip('~')); + return filename; + diff --git a/client/Makefile b/client/Makefile index 27933cb..c2e88af 100644 --- a/client/Makefile +++ b/client/Makefile @@ -1,8 +1,8 @@ link: - rm -f /usr/local/bin/goodfet.* + rm -f /usr/local/bin/goodfet.* /usr/local/bin/goodfet rm -rf *~ - ln -s `pwd`/goodfet.* /usr/local/bin/ + ln -s `pwd`/goodfet `pwd`/goodfet.* /usr/local/bin/ install: #Try 'make link' instead. diff --git a/client/goodfet b/client/goodfet index 8a510a9..a42a2c8 100755 --- a/client/goodfet +++ b/client/goodfet @@ -18,6 +18,8 @@ from intelhex import IntelHex; if(len(sys.argv)==1): print "Usage: %s driver\n" % sys.argv[0]; print "driver:= GoodFETCC GoodFETMSP430"; + print; + print "This is an unfinished client. You probably want goodfet.$chip instead."; sys.exit(1); driver=sys.argv[1]; diff --git a/client/goodfet.cc b/client/goodfet.cc index 7dbb59a..a7b208f 100755 --- a/client/goodfet.cc +++ b/client/goodfet.cc @@ -146,35 +146,7 @@ if(sys.argv[1]=="flash"): if(len(sys.argv)>4): stop=int(sys.argv[4],16); - h = IntelHex(f); - page = 0x0000; - pagelen = client.CCpagesize(); #2048; #2kB pages in 32-bit words - - print "page=%04x, pagelen=%04x" % (page,pagelen); - - bcount = 0; - - #Wipe the RAM buffer for the next flash page. - client.CCeraseflashbuffer(); - for i in h._buf.keys(): - while(i>=page+pagelen): - if bcount>0: - client.CCflashpage(page); - #client.CCeraseflashbuffer(); - bcount=0; - print "Flashed page at %06x" % page - page+=pagelen; - - #Place byte into buffer. - client.CCpokedatabyte(0xF000+i-page, - h[i]); - bcount+=1; - if(i%0x100==0): - print "Buffering %04x toward %06x" % (i,page); - #last page - client.CCflashpage(page); - print "Flashed final page at %06x" % page; - + client.flash(f); if(sys.argv[1]=="lock"): print "Status: %s" %client.status(); client.CClockchip(); -- 2.20.1