#include "glitch.h"\r
\r
\r
-//LED on P1.0\r
-//IO on P5\r
-\r
//! Initialize registers and all that jazz.\r
void init(){\r
+ int i;\r
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer\r
\r
//LED out and on.\r
msp430_init_dco();\r
msp430_init_uart();\r
\r
+ //DAC should be at full voltage if it exists.\r
+#ifdef DAC12IR\r
+ //glitchvoltages(0xfff,0xfff);\r
+ ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on\r
+ for(i=0;i!=0xFFFF;i++) asm("nop");\r
+ DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1\r
+ DAC12_0DAT = 0xFFF; //Max voltage 0xfff\r
+ DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1\r
+ DAC12_1DAT = 0x000; //Min voltage 0x000\r
+#endif\r
+ \r
+ /** FIXME\r
+ \r
+ This part is really ugly. GSEL (P5.7) must be high to select\r
+ normal voltage, but a lot of applications light to swing it low\r
+ to be a nuissance. To get around this, we assume that anyone\r
+ with a glitching FET will also have a DAC, then we set that DAC\r
+ to a high voltage.\r
+ \r
+ At some point, each target must be sanitized to show that it\r
+ doesn't clear P5OUT or P5DIR.\r
+ */\r
+ P5DIR|=BIT7; P5OUT=BIT7; //Normal Supply\r
+ P5DIR&=~BIT7; //Glitch Supply\r
+ \r
//Enable Interrupts.\r
//eint();\r
}\r
case JTAG:\r
jtaghandle(app,verb,len);\r
break;\r
+ case EJTAG:\r
+ ejtaghandle(app,verb,len);\r
+ break;\r
case JTAG430: //Also JTAG430X, JTAG430X2\r
jtag430x2handle(app,verb,len);\r
break;\r
pluginhandle(app,verb,len);\r
}else{\r
debugstr("Plugin missing.");\r
+ debughex(app);\r
txdata(app,NOK,0);\r
}\r
- \r
break;\r
}\r
}\r
volatile unsigned int i;\r
unsigned char app, verb;\r
unsigned long len;\r
+ // MSP reboot count for reset input & reboot function located at 0xFFFE\r
+ volatile unsigned int reset_count = 0;\r
+ void (*reboot_function)(void) = (void *) 0xFFFE;\r
\r
init();\r
\r
while(1){\r
//Magic 3\r
app=serial_rx();\r
+\r
+ // If the app is the reset byte (0x80) increment and loop\r
+ if (app == 0x80) {\r
+ reset_count++;\r
+\r
+ if (reset_count > 4) {\r
+ // We could trigger the WDT with either:\r
+ // WDTCTL = 0;\r
+ // or\r
+ // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00;\r
+ // but instead we'll jump to our reboot function pointer\r
+ (*reboot_function)();\r
+ }\r
+\r
+ continue;\r
+ } else {\r
+ reset_count = 0;\r
+ }\r
+\r
verb=serial_rx();\r
//len=serial_rx();\r
len=rxword();\r