From a3d7a436f4ce838f5504204fa5d36f48e389833c Mon Sep 17 00:00:00 2001 From: travisutk Date: Mon, 7 Feb 2011 01:01:11 +0000 Subject: [PATCH] Fixed support for GCC4. The problem was a while loop of asm("nop") that was somehow broken in optimization. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@897 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- firmware/Makefile | 4 +- firmware/goodfet.c | 127 +++++++++++++++++++++------------------------ 2 files changed, 62 insertions(+), 69 deletions(-) diff --git a/firmware/Makefile b/firmware/Makefile index b0ec46a..d0bffc7 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -93,7 +93,7 @@ CC=msp430-gcc -Wall -Os -g -mmcu=$(mcu) -D$(mcu) -D$(platform) -Dplatform=$(plat #config = monitor sbw chipcon nrf ccspi spi jtagarm7 jtag430 jtag430x2 avr # New default. -config = monitor chipcon ccspi nrf spi jtagarm7 jtag430 jtag430x2 avr +config ?= monitor chipcon ccspi nrf spi jtagarm7 jtag430 jtag430x2 avr # Build the needed list of app and lib object files from the config @@ -311,7 +311,7 @@ verify: dumpinfo: $(BSL) --dumpinfo $(app).c: config builddate appsfiles err -$(app): $(app).c $(libs) $(apps) +$(app): $(libs) $(apps) $(app).hex: $(app) msp430-objcopy goodfet -O ihex goodfet.hex m4s: $(app).hex diff --git a/firmware/goodfet.c b/firmware/goodfet.c index a3f3587..6a79c16 100644 --- a/firmware/goodfet.c +++ b/firmware/goodfet.c @@ -56,12 +56,13 @@ void init() //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"); + //for(i=0;i!=0xFFFF;i++) asm("nop"); //DO NOT UNCOMMENT, break 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 @@ -71,7 +72,7 @@ void init() /** 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 + normal voltage, but a lot of applications like 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. @@ -85,6 +86,8 @@ void init() //Enable Interrupts. //eint(); + + #ifdef INITPLATFORM INITPLATFORM; #endif @@ -120,71 +123,61 @@ void handle(uint8_t const app, //! Main loop. -int main(void) -{ - volatile unsigned int i; - unsigned char app, verb; - unsigned long len; - // MSP reboot count for reset input & reboot function located at 0xFFFE - volatile unsigned int reset_count = 0; - void (*reboot_function)(void) = (void *) 0xFFFE; - - init(); +int main(void){ + volatile unsigned int i; + unsigned char app, verb; + unsigned long len; + // MSP reboot count for reset input & reboot function located at 0xFFFE + volatile unsigned int reset_count = 0; + void (*reboot_function)(void) = (void *) 0xFFFE; + + init(); - txstring(MONITOR,OK,"http://goodfet.sf.net/"); + txstring(MONITOR,OK,"http://goodfet.sf.net/"); - //Command loop. There's no end! - while(1) - { - //Magic 3 - app = serial_rx(); - - // If the app is the reset byte (0x80) increment and loop - if (app == RESET) - { - reset_count++; - - if (reset_count > 4) - { - // We could trigger the WDT with either: - // WDTCTL = 0; - // or - // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00; - // but instead we'll jump to our reboot function pointer - (*reboot_function)(); - } - - continue; - } - else - { - reset_count = 0; - } - - verb = serial_rx(); - //len=serial_rx(); - len = rxword(); - - //Read data, looking for buffer overflow.y - if(len <= CMDDATALEN) - { - for(i = 0; i < len; i++) - { - cmddata[i] = serial_rx(); - } - - handle(app,verb,len); - } - else - { - //Listen to the blaberring. - for(i = 0; i < len; i++) - serial_rx(); - - //Reply with an error. - debugstr("Buffer length exceeded."); - txdata(MONITOR,NOK,0); - } - } + //Command loop. There's no end! + while(1){ + //Magic 3 + app = serial_rx(); + + // If the app is the reset byte (0x80) increment and loop + if (app == RESET){ + reset_count++; + + if (reset_count > 4){ + // We could trigger the WDT with either: + // WDTCTL = 0; + // or + // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00; + // but instead we'll jump to our reboot function pointer + (*reboot_function)(); + } + + continue; + }else{ + reset_count = 0; + } + + verb = serial_rx(); + //len=serial_rx(); + len = rxword(); + + //Read data, looking for buffer overflow.y + if(len <= CMDDATALEN){ + for(i = 0; i < len; i++){ + cmddata[i] = serial_rx(); + } + + handle(app,verb,len); + }else{ + //Listen to the blaberring. + for(i = 0; i < len; i++) + serial_rx(); + + //Reply with an error. + debugstr("Buffer length exceeded."); + txdata(MONITOR,NOK,0); + } + } } -- 2.20.1