e1f8be28f7610b00abc4c6d9824cbc4380145ee0
[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   //Set to high voltage.
19   DAC12_0DAT = glitchH;
20   
21   //Reconfigure TACTL.
22   TACTL=0;           //Clear dividers.
23   TACTL|=TACLR;      //Clear TimerA Config
24   TACTL|=
25     TASSEL_SMCLK |   //SMCLK source,
26     MC_1 |            //Count up to CCR0
27     TAIE;            //Enable Interrupt
28   CCTL0 = CCIE;                         // CCR0 interrupt enabled
29   CCR0 = glitchcount;
30   
31   //Enable general interrupts, just in case.
32   _EINT();
33 #endif
34 }
35
36 //! Setup glitching.
37 void glitchsetup(){
38 #ifdef DAC12IR
39   //Set GSEL high to disable glitching.
40
41   P5DIR|=0x80;
42   P6DIR|=BIT6+BIT5;
43   
44   P5OUT|=0x80;
45   P6OUT|=BIT6+BIT5;
46   
47   glitchsetupdac();
48
49   WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
50   TACTL = TASSEL1 + TACLR;              // SMCLK, clear TAR
51   CCTL0 = CCIE;                         // CCR0 interrupt enabled
52   CCR0 = glitchcount;
53   TACTL |= MC1;                         // Start Timer_A in continuous mode
54   _EINT();                              // Enable interrupts 
55 #endif
56 }
57
58 //! Setup analog chain for glitching.
59 void glitchsetupdac(){
60   glitchvoltages(glitchL,glitchH);
61 }
62
63 // Timer A0 interrupt service routine
64 interrupt(TIMERA0_VECTOR) Timer_A (void)
65 {
66 #ifdef DAC12IR
67   //debugstr("Glitching.");
68   DAC12_0DAT = glitchL;
69   asm("nop");
70   asm("nop");
71   asm("nop");
72   asm("nop");
73   asm("nop");
74   DAC12_0DAT = glitchH;
75 #endif
76   TACTL |= MC0;                         // Stop Timer_A;
77 }
78
79
80
81
82 u16 glitchH=0xfff, glitchL=0xfff,
83   glitchstate=2, glitchcount=0;
84
85 //! Glitch an application.
86 void glitchapp(u8 app){
87   debugstr("That app is not yet supported.");
88 }
89
90
91 //! Set glitching voltages.
92 void glitchvoltages(u16 low, u16 high){
93   int i;
94   glitchH=high;
95   glitchL=low;
96   
97   //debugstr("Set glitching voltages.");
98   
99   #ifdef DAC12IR
100   ADC12CTL0 = REF2_5V + REFON;                  // Internal 2.5V ref on
101   // Delay here for reference to settle.
102   for(i=0;i!=0xFFFF;i++) asm("nop");
103   DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
104   DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
105   // 1.0V 0x0666, 2.5V 0x0FFF
106   DAC12_0DAT = high;
107   DAC12_1DAT = low;
108   #endif 
109 }
110 //! Set glitching rate.
111 void glitchrate(u16 rate){
112   glitchcount=rate;
113 }
114
115 //! Handles a monitor command.
116 void glitchhandle(unsigned char app,
117                   unsigned char verb,
118                   unsigned long len){
119   switch(verb){
120   case GLITCHVOLTAGES:
121     glitchvoltages(cmddataword[0],
122                    cmddataword[1]);
123     txdata(app,verb,0);
124     break;
125   case GLITCHRATE:
126     glitchrate(cmddataword[0]);
127     txdata(app,verb,0);
128     break;
129   case GLITCHVERB:
130     //FIXME parameters don't work yet.
131     glitchprime();
132     handle(cmddata[0],cmddata[1],0);
133     break;
134   case GLITCHTIME:
135     _DINT();//disable interrupts
136     TACTL=0; //clear dividers
137     TACTL|=TACLR; //clear config
138     TACTL|=TASSEL_SMCLK| //smclk source
139       MC_2; //continuout mode.
140     
141     //perform the function
142     silent++;//Don't want the function to return anything.
143     handle(cmddata[0],cmddata[1],0);
144     silent--;
145     cmddataword[0]=TAR; //Return counter.
146     txdata(app,verb,2);
147     break;
148   case START:
149     glitchvoltages(0xFFF,0);//Inverted VCC and GND.
150     P5OUT|=BIT7;//Normal
151     P5DIR|=BIT7;
152     while(1){
153       P5OUT&=~BIT7;//Glitch
154       //asm("nop");//asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
155       asm("nop");
156       P5OUT|=BIT7;//Normal
157       asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
158       asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
159     }
160     txdata(app,verb,0);
161     break;
162   case STOP:
163   case GLITCHAPP:
164   default:
165     debugstr("Unknown glitching verb.");
166     txdata(app,NOK,0);
167   }
168 }