More of a console, approaching standard commandset for Chipcon port.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Tue, 23 Feb 2010 03:09:34 +0000 (03:09 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Tue, 23 Feb 2010 03:09:34 +0000 (03:09 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@346 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/GoodFETCC.py
client/GoodFETConsole.py
client/Makefile
client/goodfet
client/goodfet.cc

index d2beb5c..264a738 100755 (executable)
@@ -254,6 +254,8 @@ class GoodFET:
         print "Self-test complete.";
     
     
         print "Self-test complete.";
     
     
+    # The following functions ought to be implemented in
+    # every client.
 
     def infostring(self):
         a=self.peekbyte(0xff0);
 
     def infostring(self):
         a=self.peekbyte(0xff0);
@@ -271,8 +273,9 @@ class GoodFET:
         return;
     def status(self):
         return;
         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));
     def peek32(self,address, memory="vn"):
         return (self.peek16(address,memory)+
                 (self.peek16(address+2,memory)<<16));
index 894db94..94fcafd 100644 (file)
@@ -12,7 +12,7 @@ from GoodFET import GoodFET;
 from intelhex import IntelHex;
 
 class GoodFETCC(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):
     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 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];
     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);
               (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;
+                        
index 14fc3e3..72077e7 100644 (file)
@@ -5,7 +5,7 @@
 #
 # This code is being rewritten and refactored.  You've been warned!
 
 #
 # This code is being rewritten and refactored.  You've been warned!
 
-import sys;
+import sys, os;
 import binascii;
 
 from GoodFET import GoodFET;
 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."""
         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])
         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):
     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]);
         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;
+    
     
     
index 27933cb..c2e88af 100644 (file)
@@ -1,8 +1,8 @@
 
 
 link:
 
 
 link:
-       rm -f /usr/local/bin/goodfet.*
+       rm -f /usr/local/bin/goodfet.* /usr/local/bin/goodfet
        rm -rf *~
        rm -rf *~
-       ln -s `pwd`/goodfet.* /usr/local/bin/
+       ln -s `pwd`/goodfet `pwd`/goodfet.* /usr/local/bin/
 install:
        #Try 'make link' instead.
 install:
        #Try 'make link' instead.
index 8a510a9..a42a2c8 100755 (executable)
@@ -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";
 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];
     sys.exit(1);
 
 driver=sys.argv[1];
index 7dbb59a..a7b208f 100755 (executable)
@@ -146,35 +146,7 @@ if(sys.argv[1]=="flash"):
      if(len(sys.argv)>4):
          stop=int(sys.argv[4],16);
    
      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();
 if(sys.argv[1]=="lock"):
     print "Status: %s" %client.status();
     client.CClockchip();