MSP430X2 support is sufficient to read memory!
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Fri, 4 Sep 2009 09:04:55 +0000 (09:04 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Fri, 4 Sep 2009 09:04:55 +0000 (09:04 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@122 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
client/GoodFETMSP430.py
client/goodfet.msp430
firmware/apps/jtag/jtag430x2.c

index 3b4d9e7..912c9a6 100755 (executable)
@@ -64,8 +64,8 @@ class GoodFET:
         self.verb=ord(self.serialport.read(1));
         self.count=ord(self.serialport.read(1));
         self.data=self.serialport.read(self.count*blocks);
-        return self.data;
         #print "READ %02x %02x %02x " % (self.app, self.verb, self.count);
+        return self.data;
         
     #Monitor stuff
     def peekbyte(self,address):
index fc507c5..22b7ee8 100644 (file)
@@ -11,14 +11,30 @@ from GoodFET import GoodFET;
 
 class GoodFETMSP430(GoodFET):
     MSP430APP=0x11;  #Changed by inheritors.
+    CoreID=0;
+    DeviceID=0;
+    JTAGID=0;
+    MSP430ident=0;
     def MSP430setup(self):
         """Move the FET into the MSP430 JTAG application."""
-        print "Initializing MSP430.";
-        self.writecmd(0x11,0x10,0,self.data);
+        self.writecmd(self.MSP430APP,0x10,0,None);
+        
     def MSP430stop(self):
         """Stop debugging."""
         self.writecmd(self.MSP430APP,0x21,0,self.data);
-
+    
+    def MSP430coreid(self):
+        """Get the Core ID."""
+        self.writecmd(self.MSP430APP,0xF0);
+        CoreID=ord(self.data[0])+(ord(self.data[1])<<8);
+        return CoreID;
+    def MSP430deviceid(self):
+        """Get the Core ID."""
+        self.writecmd(self.MSP430APP,0xF1);
+        DeviceID=(
+            ord(self.data[0])+(ord(self.data[1])<<8)+
+            (ord(self.data[2])<<16)+(ord(self.data[3])<<24));
+        return DeviceID;
     def MSP430peek(self,adr):
         """Read the contents of memory at an address."""
         self.data=[adr&0xff, (adr&0xff00)>>8];
@@ -32,8 +48,12 @@ class GoodFETMSP430(GoodFET):
     def MSP430start(self):
         """Start debugging."""
         self.writecmd(self.MSP430APP,0x20,0,self.data);
-        ident=self.MSP430ident();
-        print "Target identifies as %04x." % ident;
+        self.JTAGID=ord(self.data[0]);
+        #print "Identified as %02x." % id;
+        if(self.JTAGID==0x89 or self.JTAGID==0x91):
+            print "Successfully connected."
+        else:
+            print "Error, misidentified as %02x." % id;
     
     def MSP430haltcpu(self):
         """Halt the CPU."""
@@ -57,8 +77,13 @@ class GoodFETMSP430(GoodFET):
         return self.data[0];
     def MSP430ident(self):
         """Grab self-identification word from 0x0FF0 as big endian."""
-        i=self.MSP430peek(0x0ff0);
-        return ((i&0xFF00)>>8)+((i&0xFF)<<8)
+        if(self.JTAGID==0x89):
+            i=self.MSP430peek(0x0ff0);
+            ident=((i&0xFF00)>>8)+((i&0xFF)<<8)
+        if(self.JTAGID==0x91):
+            i=self.MSP430peek(0x1A04);
+            ident=((i&0xFF00)>>8)+((i&0xFF)<<8)
+        return ident;
     def MSP430test(self):
         """Test MSP430 JTAG.  Requires that a chip be attached."""
         if self.MSP430ident()==0xffff:
@@ -90,7 +115,7 @@ class GoodFETMSP430(GoodFET):
         rval=ord(self.data[0])+(ord(self.data[1])<<8);
         if(val!=rval):
             print "FLASH WRITE ERROR AT %04x.  Found %04x, wrote %04x." % (adr,rval,val);
-            
+        
     def MSP430dumpbsl(self):
         self.MSP430dumpmem(0xC00,0xfff);
     def MSP430dumpallmem(self):
index d961c77..b1a129c 100755 (executable)
@@ -17,18 +17,20 @@ if(len(sys.argv)==1):
     print "%s verify $foo.hex [0x$start 0x$stop]" % sys.argv[0];
     sys.exit();
 
-#Initailize FET and set baud rate
+#Initialize FET and set baud rate
 client=GoodFETMSP430();
 client.serInit()
 
 #Connect to target
 client.MSP430setup();
-client.MSP430start();
 
-#client.setBaud(2);
+#Identify model number.
+client.MSP430start();
 
-if(sys.argv[1]=="monitortest"):
-    client.monitortest();
+if(sys.argv[1]=="info"):
+    print "Model    %04x " % client.MSP430coreid();
+    print "Core %08x " % client.MSP430deviceid();
+    print "Identity %04x" % client.MSP430ident();
 if(sys.argv[1]=="test"):
     client.MSP430test();
 if(sys.argv[1]=="dump"):
@@ -90,6 +92,18 @@ if(sys.argv[1]=="verify"):
                 print "ERROR at %04x, found %04x not %04x"%(i,peek,h[i>>1]);
             if(i%0x100==0):
                 print "%04x" % i;
+if(sys.argv[1]=="peek"):
+    start=0x0000;
+    if(len(sys.argv)>2):
+        start=int(sys.argv[2],16);
+    stop=start;
+    if(len(sys.argv)>3):
+        stop=int(sys.argv[3],16);
+    print "Peeking from %04x to %04x." % (start,stop);
+    while start<=stop:
+        print "%04x: %04x" % (start,client.MSP430peek(start));
+        start=start+2;
+
 
 if(sys.argv[1]=="whatever"):
     for i in [0x24FF, 0x2500, 0x2502, 0x2504]:
index 5cafafe..e496346 100644 (file)
@@ -56,61 +56,38 @@ unsigned long jtag430_deviceid(){
   return jtag_dr_shift20(0);
 }
 
-//! Set the program counter.
-void jtag430x2_setpc(unsigned long pc){
-  //From SLAU265.
-  
-  unsigned short Mova;
-  unsigned short Pc_l;
 
-  Mova  = 0x0080;
-  Mova += (unsigned short)((pc>>8) & 0x00000F00);
-  Pc_l  = (unsigned short)((pc & 0xFFFF));
+//! Read data from address
+unsigned int jtag430x2_readmem(unsigned long adr){
+  unsigned int toret=0;
 
-  // Check Full-Emulation-State at the beginning                                                                                                                                   
   jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
   if(jtag_dr_shift16(0) & 0x0301){
-      // MOVA #imm20, PC                                                                                                                                                             
-      CLRTCLK;
-      // take over bus control during clock LOW phase                                                                                                                                
-      jtag_ir_shift8(IR_DATA_16BIT);
-      SETTCLK;
-      jtag_dr_shift16(Mova);
-      jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
-      jtag_dr_shift16(0x1400);
-      jtag_ir_shift8(IR_DATA_16BIT);
-      CLRTCLK;
-      SETTCLK;
-      jtag_dr_shift16(Pc_l);
-      CLRTCLK;
-      SETTCLK;
-      jtag_dr_shift16(0x4303);
-      CLRTCLK;
-      jtag_ir_shift8(IR_ADDR_CAPTURE);
-      jtag_dr_shift20(0x00000);
-  }else{
-    while(1) P1OUT^=1; //Lock LED if locked up.
-  }
-}
-
+    // Read Memory                                                                                                                                                                 
+    CLRTCLK;
+    jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
+    if(adr>=0x100){
+      jtag_dr_shift16(0x0501);//word read
+    }else{
+      jtag_dr_shift16(0x0511);//byte read
+    }
+    jtag_ir_shift8(IR_ADDR_16BIT);
+    jtag_dr_shift20(adr);
 
-//! Read data from address
-unsigned int jtag430x2_readmem(unsigned int adr){
-  unsigned int toret;
-  
-  jtag430x2_setpc(adr);
-  SETTCLK;
-  jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
-  jtag_dr_shift16(0x0501);
-  jtag_ir_shift8(IR_ADDR_CAPTURE);
+    jtag_ir_shift8(IR_DATA_TO_ADDR);
+    SETTCLK;
+    CLRTCLK;
+    toret = jtag_dr_shift16(0x0000);
+    
+    SETTCLK;
+    // one or more cycle, so CPU is driving correct MAB
 
-  jtag_ir_shift8(IR_DATA_QUICK);
+    CLRTCLK;
+    SETTCLK;
+    // Processor is now again in Init State
+  }
 
-  SETTCLK;
-  CLRTCLK;
-  toret = jtag_dr_shift16(0);//read
 
-  jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
   
   return toret;
 }