X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fgoodfet.c;h=b9c500c8ca388f7482f5cd3e7046a2bec7afdaf9;hp=6a79c16815496ac951a2c754dfdc17bb837f3a3e;hb=ef478608abc99029a46aaf682c0e2022a70877ed;hpb=a3d7a436f4ce838f5504204fa5d36f48e389833c diff --git a/firmware/goodfet.c b/firmware/goodfet.c index 6a79c16..b9c500c 100644 --- a/firmware/goodfet.c +++ b/firmware/goodfet.c @@ -18,10 +18,6 @@ //! Initialize registers and all that jazz. void init() { -#ifdef DAC12IR - int i; -#endif - WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer //LED out and on. @@ -56,13 +52,12 @@ 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"); //DO NOT UNCOMMENT, break GCC4. + //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 @@ -72,7 +67,7 @@ void init() /** FIXME This part is really ugly. GSEL (P5.7) must be high to select - normal voltage, but a lot of applications like to swing it low + 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. @@ -86,98 +81,109 @@ void init() //Enable Interrupts. //eint(); - - - #ifdef INITPLATFORM - INITPLATFORM; - #endif +#ifdef INITPLATFORM + INITPLATFORM +#endif } //! Handle a command. void handle(uint8_t const app, - uint8_t const verb, - uint32_t const len){ - int i; - - //debugstr("GoodFET"); - PLEDOUT&=~PLEDPIN; - - // find the app and call the handle fn - for(i = 0; i < num_apps; i++){ - if(apps[i]->app == app){ - // call the app's handle fn - (*(apps[i]->handle))(app, verb, len); - - // exit early - return; - } - } - - // if we get here, then the desired app is not copiled in - // this firmware - debugstr("App missing."); - debughex(app); - txdata(app, NOK, 0); + uint8_t const verb, + uint32_t const len) +{ + int i; + + //debugstr("GoodFET"); + PLEDOUT&=~PLEDPIN; + + // find the app and call the handle fn + for(i = 0; i < num_apps; i++) + { + if(apps[i]->app == app) + { + // call the app's handle fn + (*(apps[i]->handle))(app, verb, len); + + // exit early + return; + } + } + + // if we get here, then the desired app is not copiled in + // this firmware + debugstr("App missing."); + debughex(app); + txdata(app, NOK, 0); } //! 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); + } + } }