From 0fdf6e0b883ba3f7661e555145a3601609729e89 Mon Sep 17 00:00:00 2001 From: travisutk Date: Sun, 17 Apr 2011 21:29:30 +0000 Subject: [PATCH 1/1] More work toward an AVR port. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@994 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- firmware/Makefile | 40 ++++++++++------- firmware/goodfet.c | 73 ++++--------------------------- firmware/include/msp430.h | 3 ++ firmware/include/platform.h | 2 +- firmware/lib/msp430.c | 85 +++++++++++++++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 82 deletions(-) create mode 100644 firmware/include/msp430.h create mode 100644 firmware/lib/msp430.c diff --git a/firmware/Makefile b/firmware/Makefile index 11eaddb..643163d 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,9 +1,11 @@ #include `uname`.mak -GOODFET?=/dev/ttyUSB0 +GOODFET?=/dev/tty.usbser* +#For Arduino, +#BSL?=avrdude -V -F -c stk500v1 -p m328p -b 57600 -P /dev/tty.usbserial-* -U flash:w:blink.hex #For tos-bsl, use --invert-reset --invert-test -BSL?=goodfet.bsl --speed=38400 +MSP430BSL?=goodfet.bsl --speed=38400 #One of these should be defined explicitly. #Default removed because of confusion. @@ -11,21 +13,24 @@ BSL?=goodfet.bsl --speed=38400 #mcu?=msp430x2274 #mcu?=msp430x2618 #mcu?=msp430x1612 +#mcu?=atmega168 mcu?=RUNCONFIG -#platform=goodfet -#platform=telosb -#platform=z1 -#platform=nhbadge -#platform=nhbadgeb +#platform?=goodfet +#platform?=telosb +#platform?=z1 +#platform?=nhbadge +#platform?=nhbadgeb +#platofrm?=arduino platform?=goodfet #N.B., gcc WILL NOT BITCH if this file doesn't exist. -#GCCINC=-T ldscripts/161x.x -GCCINC=-T ldscripts/$(mcu).x +GCCINC?=-T ldscripts/$(mcu).x -CCEXTRA?= -D$(mcu) -D$(platform) -Dplatform=$(platform) -DGCC $(GCCINC) -I include -I platforms +#GCC?=avr-gcc GCC?=msp430-gcc + +CCEXTRA?= -D$(mcu) -D$(platform) -Dplatform=$(platform) -DGCC $(GCCINC) -I include -I platforms CC=$(GCC) -Wall -Os -fno-strict-aliasing -g -mmcu=$(mcu) $(CCEXTRA) # Available Applications @@ -102,7 +107,7 @@ config ?= monitor chipcon spi jtag430 jtag430x2 avr openocd ccspi # Build the needed list of app and lib object files from the config apps= -libs= lib/$(mcu).o lib/command.o lib/dco_calib.o lib/apps.o +libs= lib/$(mcu).o lib/command.o lib/dco_calib.o lib/apps.o lib/msp430.o hdrs= ERR= @@ -315,14 +320,17 @@ goodfet.hex: goodfet run: ../client/goodfet.msp430 test +avrinstall: $(app).hex + #to be merged + avrdude -V -F -c stk500v1 -p m328p -b 57600 -P $(GOODFET) -U flash:w:$(app).hex install: $(app).hex - $(BSL) -e -p $(app).hex + $(MSP430BSL) -e -p $(app).hex installinfo: - $(BSL) -P $(app).hex -p info.txt || true #MSP430F2xx targets only, inelegant. + $(MSP430BSL) -P $(app).hex -p info.txt || true #MSP430F2xx targets only, inelegant. verify: - $(BSL) -P $(app).hex -v $(app).hex + $(MSP430BSL) -P $(app).hex -v $(app).hex dumpinfo: - $(BSL) --dumpinfo + $(MSP430BSL) --dumpinfo $(app).c: config builddate appsfiles err $(app): $(libs) $(apps) $(app).hex: $(app) @@ -330,7 +338,7 @@ $(app).hex: $(app) m4s: $(app).hex msp430-objdump -D -m msp430 $(app).hex | m4s init erase: - $(BSL) -e + $(MSP430BSL) -e clean: rm -f $(app) $(app).hex $(libs) $(apps) lib/apps.c include/config.h include/builddate.h include/apps.h docs: diff --git a/firmware/goodfet.c b/firmware/goodfet.c index b9c500c..5d33b39 100644 --- a/firmware/goodfet.c +++ b/firmware/goodfet.c @@ -15,78 +15,21 @@ #define RESET 0x80 // not a real app -- causes firmware to reset #define DEBUGAPP 0xFF -//! Initialize registers and all that jazz. -void init() -{ - WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer - - //LED out and on. - PLEDDIR |= PLEDPIN; - PLEDOUT &= ~PLEDPIN; - - - /* P5.0 out and low; this is chosen for the PIC app (in which P5.0 - is !MCLR) to ensure that an attached PIC chip, if present, is - immediately driven to reset state. A brief explanation of why this - is important follows. - - At least dsPIC33F and PIC24H --and very likely other 16-bit PIC - families-- draw a large amount of current when running, especially - when using a fast clock: from 60 mA up to approx. 90 mA. If the - PIC target begins to run before the client can request a new ICSP - session, which requires much less current (e.g., less than 2 mA), - then the MSP430 chip on the GoodFET will fail to start and the FTDI - may have trouble communicating with the client. The latter likely - relates to the FTDI on-chip 3V3 regulator being specified up to - only 50 mA. */ - - - //P5REN &= ~BIT0; //DO NOT UNCOMMENT. Breaks GF1x support. - - //This will have to be cut soon. Use pulling resistors instead. - /* - P5DIR |= BIT0; - P5OUT &= ~BIT0; - */ - - //Setup clocks, unique to each '430. - msp430_init_dco(); - msp430_init_uart(); - - //DAC should be at full voltage if it exists. -#ifdef DAC12IR - //glitchvoltages(0xfff,0xfff); - ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on - //for(i=0;i!=0xFFFF;i++) asm("nop"); //DO NOT UNCOMMENT, breaks GCC4 - DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1 - DAC12_0DAT = 0xFFF; //Max voltage 0xfff - DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1 - DAC12_1DAT = 0x000; //Min voltage 0x000 +//! General init function, calls platform-specific one. +void init(){ +#ifdef MSP430 + msp430_init(); +#else +#warning "No init() routine for this platform!" #endif - /** FIXME - - This part is really ugly. GSEL (P5.7) must be high to select - normal voltage, but a lot of applications light to swing it low - to be a nuissance. To get around this, we assume that anyone - with a glitching FET will also have a DAC, then we set that DAC - to a high voltage. - - At some point, each target must be sanitized to show that it - doesn't clear P5OUT or P5DIR. - */ - P5DIR|=BIT7; P5OUT=BIT7; //Normal Supply - //P5DIR&=~BIT7; //Glitch Supply - - //Enable Interrupts. - //eint(); - #ifdef INITPLATFORM - INITPLATFORM + INITPLATFORM #endif } + //! Handle a command. void handle(uint8_t const app, uint8_t const verb, diff --git a/firmware/include/msp430.h b/firmware/include/msp430.h new file mode 100644 index 0000000..746ae51 --- /dev/null +++ b/firmware/include/msp430.h @@ -0,0 +1,3 @@ + +void msp430_init(); + diff --git a/firmware/include/platform.h b/firmware/include/platform.h index d1efb89..071e30f 100644 --- a/firmware/include/platform.h +++ b/firmware/include/platform.h @@ -15,7 +15,7 @@ #include #include #include - +#include "msp430.h" #endif #include "config.h" diff --git a/firmware/lib/msp430.c b/firmware/lib/msp430.c new file mode 100644 index 0000000..3a71e14 --- /dev/null +++ b/firmware/lib/msp430.c @@ -0,0 +1,85 @@ +/*! \file msp430.c + \author Travis Goodspeed + \brief MSP430-generic functions. +*/ + + +//Silently be empty if not an MSP430. +#ifdef MSP430 + + +#include "platform.h" +#include "command.h" +#include "apps.h" +#include "glitch.h" + + +//! Initialize MSP430 registers and all that jazz. +void msp430_init(){ + WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer + + //LED out and on. + PLEDDIR |= PLEDPIN; + PLEDOUT &= ~PLEDPIN; + + + /* P5.0 out and low; this is chosen for the PIC app (in which P5.0 + is !MCLR) to ensure that an attached PIC chip, if present, is + immediately driven to reset state. A brief explanation of why this + is important follows. + + At least dsPIC33F and PIC24H --and very likely other 16-bit PIC + families-- draw a large amount of current when running, especially + when using a fast clock: from 60 mA up to approx. 90 mA. If the + PIC target begins to run before the client can request a new ICSP + session, which requires much less current (e.g., less than 2 mA), + then the MSP430 chip on the GoodFET will fail to start and the FTDI + may have trouble communicating with the client. The latter likely + relates to the FTDI on-chip 3V3 regulator being specified up to + only 50 mA. */ + + + //P5REN &= ~BIT0; //DO NOT UNCOMMENT. Breaks GF1x support. + + //This will have to be cut soon. Use pulling resistors instead. + /* + P5DIR |= BIT0; + P5OUT &= ~BIT0; + */ + + //Setup clocks, unique to each '430. + msp430_init_dco(); + msp430_init_uart(); + + //DAC should be at full voltage if it exists. +#ifdef DAC12IR + //glitchvoltages(0xfff,0xfff); + ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on + //for(i=0;i!=0xFFFF;i++) asm("nop"); //DO NOT UNCOMMENT, breaks GCC4 + DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1 + DAC12_0DAT = 0xFFF; //Max voltage 0xfff + DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1 + DAC12_1DAT = 0x000; //Min voltage 0x000 +#endif + + /** FIXME + + This part is really ugly. GSEL (P5.7) must be high to select + normal voltage, but a lot of applications light to swing it low + to be a nuissance. To get around this, we assume that anyone + with a glitching FET will also have a DAC, then we set that DAC + to a high voltage. + + At some point, each target must be sanitized to show that it + doesn't clear P5OUT or P5DIR. + */ + P5DIR|=BIT7; P5OUT=BIT7; //Normal Supply + //P5DIR&=~BIT7; //Glitch Supply + + //Enable Interrupts. + //eint(); + +} + +//MSP430 +#endif -- 2.20.1