Proper self-calibration of the DCO.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 9 May 2010 23:30:47 +0000 (23:30 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Sun, 9 May 2010 23:30:47 +0000 (23:30 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@487 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

client/GoodFET.py
firmware/Makefile
firmware/apps/monitor/monitor.c
firmware/include/command.h
firmware/lib/msp430x1612.c
firmware/lib/msp430x2618.c

index 583f1b1..ec1c470 100755 (executable)
@@ -69,7 +69,7 @@ class GoodFET:
         return self.symbols.get(name);
     def timeout(self):
         print "timeout\n";
-    def serInit(self, port=None, timeout=1):
+    def serInit(self, port=None, timeout=0.5):
         """Open the serial port"""
         # Make timeout None to wait forever, 0 for non-blocking mode.
         
@@ -95,7 +95,10 @@ class GoodFET:
             )
         
         self.verb=0;
+        attempts=0;
         while self.verb!=0x7F:
+            self.serialport.flushInput()
+            self.serialport.flushOutput()
             #Explicitly set RTS and DTR to halt board.
             self.serialport.setRTS(1);
             self.serialport.setDTR(1);
@@ -103,14 +106,13 @@ class GoodFET:
             self.serialport.setDTR(0);
             self.serialport.flushInput()
             self.serialport.flushOutput()
-        
-            #Read and handle the initial command.
-            #time.sleep(1);
+            #time.sleep(.1);
+            attempts=attempts+1;
             self.readcmd(); #Read the first command.
-            #if(self.verb!=0x7F):
-            #    print "Verb %02x is wrong.  Incorrect firmware or bad Info guess?" % self.verb;
-            #    print "http://goodfet.sf.net/faq/";
-        #print "Connected."
+            
+        #print "Connected after %02i attempts." % attempts;
+        self.mon_connected();
+        
     def getbuffer(self,size=0x1c00):
         writecmd(0,0xC2,[size&0xFF,(size>>16)&0xFF]);
         print "Got %02x%02x buffer size." % (self.data[1],self.data[0]);
@@ -221,7 +223,9 @@ class GoodFET:
         self.besilent=s;
         print "besilent is %i" % self.besilent;
         self.writecmd(0,0xB0,1,[s]);
-        
+    def mon_connected(self):
+        """Announce to the monitor that the connection is good."""
+        self.writecmd(0,0xB1,0,[]);
     def out(self,byte):
         """Write a byte to P5OUT."""
         self.writecmd(0,0xA1,1,[byte]);
index 8841106..83ee212 100644 (file)
@@ -1,10 +1,10 @@
 
 #include `uname`.mak
-GOODFET?=/dev/ttyUSB0
+#GOODFET?=/dev/ttyUSB0
 
 
 #For tos-bsl, use --invert-reset --invert-test
-BSL?=goodfet.bsl -c $(GOODFET) --speed=38400
+BSL?=goodfet.bsl --speed=38400
 
 
 #One of these should be defined explicitly.
index 85c523f..3a94b44 100644 (file)
@@ -75,6 +75,10 @@ void monitorhandle(unsigned char app,
     silent=cmddata[0];
     txdata(app,verb,1);
     break;
+  case MONITOR_CONNECTED:
+    msp430_init_dco_done();
+    txdata(app,verb,0);
+    break;
   }
 }
 
index 1938b40..c1dab45 100644 (file)
@@ -58,6 +58,7 @@ extern unsigned char silent;
 #define MONITOR_IN  0xA2
 
 #define MONITOR_SILENT 0xB0
+#define MONITOR_CONNECTED 0xB1
 
 #define MONITOR_READBUF 0xC0
 #define MONITOR_WRITEBUF 0xC1
index 386119f..d125b78 100644 (file)
@@ -142,6 +142,13 @@ void msp430_init_uart(){
 }
  */
 
+
+//! Initialization is correct.
+void msp430_init_dco_done(){
+  //Nothing to do for the 1612.
+}
+
+
 void msp430_init_dco() {
 /* This code taken from the FU Berlin sources and reformatted. */
   //
index b3dae0e..587d6e2 100644 (file)
@@ -8,7 +8,6 @@
 #include <io.h>
 #include <iomacros.h>
 
-
 //! Receive a byte.
 unsigned char serial_rx(){
   char c;
@@ -120,8 +119,15 @@ CALDCO_16MHZ 0x87 CALBC1_16MHZ 0x8f   2618-006.txt
 CALDCO_16MHZ 0x96 CALBC1_16MHZ 0x8f   2619-001.txt
 */
 
+//! Initialization is correct.
+void msp430_init_dco_done(){
+  char *choice=(char *) 0x200; //First word of RAM.
+  choice[0]--;
+}
+
 //! Initialize the MSP430 clock.
 void msp430_init_dco() {
+  int i=1000;
   char *choice=(char *) 0x200; //First word of RAM.
   #ifdef __MSP430_HAS_PORT8__
   P8SEL = 0; // disable XT2 on P8.7/8
@@ -132,7 +138,15 @@ void msp430_init_dco() {
     BCSCTL1 = CALBC1_16MHZ;
     DCOCTL = CALDCO_16MHZ;
   }else{
-    //Info is missing, guess at a good value.
+    /*
+      Info is missing, guess at a good value.
+      
+      For now, the choice doesn't jump backward after a successful
+      connection.  For that reason, keep this list as small as possible.
+      Future revisions will subtract one from choice[0] after a successful
+      connection, keeping choice[1] as the target.
+    */
+      
     #define CHOICES 4
     DCOCTL = 0x00; //clear DCO
     switch(choice[0]++%CHOICES){
@@ -156,6 +170,9 @@ void msp430_init_dco() {
     }
   }
   
+  //Minor delay.
+  while(i--);
+  
   return;
 }