From f217c730250832ae74a60b9d494111eac3763fd6 Mon Sep 17 00:00:00 2001 From: travisutk Date: Sun, 9 May 2010 23:30:47 +0000 Subject: [PATCH 1/1] Proper self-calibration of the DCO. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@487 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- client/GoodFET.py | 22 +++++++++++++--------- firmware/Makefile | 4 ++-- firmware/apps/monitor/monitor.c | 4 ++++ firmware/include/command.h | 1 + firmware/lib/msp430x1612.c | 7 +++++++ firmware/lib/msp430x2618.c | 21 +++++++++++++++++++-- 6 files changed, 46 insertions(+), 13 deletions(-) diff --git a/client/GoodFET.py b/client/GoodFET.py index 583f1b1..ec1c470 100755 --- a/client/GoodFET.py +++ b/client/GoodFET.py @@ -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]); diff --git a/firmware/Makefile b/firmware/Makefile index 8841106..83ee212 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -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. diff --git a/firmware/apps/monitor/monitor.c b/firmware/apps/monitor/monitor.c index 85c523f..3a94b44 100644 --- a/firmware/apps/monitor/monitor.c +++ b/firmware/apps/monitor/monitor.c @@ -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; } } diff --git a/firmware/include/command.h b/firmware/include/command.h index 1938b40..c1dab45 100644 --- a/firmware/include/command.h +++ b/firmware/include/command.h @@ -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 diff --git a/firmware/lib/msp430x1612.c b/firmware/lib/msp430x1612.c index 386119f..d125b78 100644 --- a/firmware/lib/msp430x1612.c +++ b/firmware/lib/msp430x1612.c @@ -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. */ // diff --git a/firmware/lib/msp430x2618.c b/firmware/lib/msp430x2618.c index b3dae0e..587d6e2 100644 --- a/firmware/lib/msp430x2618.c +++ b/firmware/lib/msp430x2618.c @@ -8,7 +8,6 @@ #include #include - //! 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; } -- 2.20.1