53b037682cfad9fee95abfbd4bf064979cc2d26a
[goodfet] / firmware / apps / glitch / glitch.c
1 /*! \file glitch.c
2   \author Travis Goodspeed
3   \brief Glitching Support for GoodFET20
4   
5   See the TI example MSP430x261x_dac12_01.c for usage of the DAC.
6   This module sends odd and insufficient voltages on P6.6/DAC0
7   in order to bypass security restrictions of target devices.
8 */
9
10 #include "platform.h"
11 #include "command.h"
12 #include "glitch.h"
13
14
15 //! Call this before the function to be glitched.
16 void glitchprime(){
17 #ifdef DAC12IR
18   WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
19   
20   glitchsetup();
21   _EINT();
22   return;
23 #endif
24 }
25
26 //! Setup glitching.
27 void glitchsetup(){
28 #ifdef DAC12IR
29   //Set GSEL high to disable glitching.
30   
31   //Normal voltage, use resistors instead of output.
32   //P5DIR=0x80;   //ONLY glitch pin is output.
33   P5OUT|=0x80;  //It MUST begin high.
34   //P5REN|=0x7F;  //Resistors pull high and low weakly.
35   
36   P6DIR|=BIT6+BIT5;
37   P6OUT|=BIT6+BIT5;
38   
39   WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
40   TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR
41   CCTL0 = CCIE;                         // CCR0 interrupt enabled
42   CCR0 = glitchcount+0x10;              // Compare Value
43   TACTL |= MC_2;                        // continuous mode.
44 #endif
45 }
46
47 // Timer A0 interrupt service routine
48 interrupt(TIMERA0_VECTOR) Timer_A (void){
49   P5OUT^=BIT7;//Glitch
50   //P5DIR=BIT7; //All else high impedance.
51   P5OUT^=BIT7;//Normal
52   return;
53 }
54
55
56 u16 glitchcount=0;
57
58 //! Glitch an application.
59 void glitchapp(u8 app){
60   debugstr("That app is not yet supported.");
61 }
62
63
64 //! Set glitching voltages.
65 void glitchvoltages(u16 gnd, u16 vcc){
66   int i;
67   //debugstr("Set glitching voltages: GND and VCC");
68   //debughex(gnd);
69   //debughex(vcc);
70   
71   /** N.B., because this is confusing as hell.  As per Page 86 of
72       SLAS541F, P6SEL is not what controls the use of the DAC0/DAC1
73       functions on P6.6 and P6.5.  Instead, CAPD or DAC12AMP>0 sets
74       the state.
75   */
76   
77   #ifdef DAC12IR
78   ADC12CTL0 = REF2_5V + REFON;                  // Internal 2.5V ref on
79   // Delay here for reference to settle.
80   for(i=0;i!=0xFFFF;i++) asm("nop");
81   DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
82   DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
83   // 1.0V 0x0666, 2.5V 0x0FFF
84   DAC12_0DAT = vcc; //high;
85   DAC12_1DAT = gnd; //low;
86   #endif 
87 }
88 //! Set glitching rate.
89 void glitchrate(u16 rate){
90   glitchcount=rate;
91 }
92
93 //! Handles a monitor command.
94 void glitchhandle(unsigned char app,
95                   unsigned char verb,
96                   unsigned long len){
97   switch(verb){
98   case GLITCHVOLTAGES:
99     glitchvoltages(cmddataword[0],
100                    cmddataword[1]);
101     txdata(app,verb,0);
102     break;
103   case GLITCHRATE:
104     glitchrate(cmddataword[0]);
105     txdata(app,verb,0);
106     break;
107   case GLITCHVERB:
108     //FIXME parameters don't work yet.
109     glitchprime();
110     TAR=0; //Reset clock.
111     handle(cmddata[0],cmddata[1],0);
112     TACTL |= MC0;// Stop Timer_A;
113     break;
114   case GLITCHTIME:
115     _DINT();//disable interrupts
116     TACTL=0; //clear dividers
117     TACTL|=TACLR; //clear config
118     TACTL|=TASSEL_SMCLK| //smclk source
119       MC_2; //continuous mode.
120     
121     //perform the function
122     silent++;//Don't want the function to return anything.
123     TAR=0;
124     handle(cmddata[0],cmddata[1],0);
125     cmddataword[0]=TAR; //Return counter.
126     silent--;
127     txdata(app,verb,2);
128     break;
129   case START:
130     //Testing mode, for looking at the glitch waveform.
131     glitchvoltages(0xFFF,0);//Inverted VCC and GND.
132     P5OUT|=BIT7;//Normal
133     P5DIR|=BIT7;
134     while(1){
135       P5OUT&=~BIT7;//Glitch
136       //asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
137       //asm("nop"); //Not necessary.
138       P5OUT|=BIT7;//Normal
139       asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
140       asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
141     }
142     txdata(app,verb,0);
143     break;
144   case STOP:
145   case GLITCHAPP:
146   default:
147     debugstr("Unknown glitching verb.");
148     txdata(app,NOK,0);
149   }
150 }