print "Self-test complete.";
+ # The following functions ought to be implemented in
+ # every client.
def infostring(self):
a=self.peekbyte(0xff0);
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));
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):
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];
(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;
+
#
# This code is being rewritten and refactored. You've been warned!
-import sys;
+import sys, os;
import binascii;
from GoodFET import GoodFET;
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):
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;
+
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.
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];
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();