ec1a5c80a5752bbe72332085927330553069846c
[goodfet] / firmware / lib / msp430.c
1 /*! \file msp430.c
2   \author Travis Goodspeed
3   \brief MSP430-generic functions.
4 */
5
6
7 //Silently be empty if not an MSP430.
8 #ifdef MSP430
9
10
11 #include "platform.h"
12 #include "command.h"
13 #include "apps.h"
14 #include "glitch.h"
15
16 void led_init()
17 {
18         PLEDDIR |= PLEDPIN;
19 }
20 void led_on()
21 {
22         PLEDOUT |= PLEDPIN;
23 }
24 void led_off()
25 {
26   PLEDOUT&=~PLEDPIN;
27
28 }
29 void led_toggle()
30 {
31         PLEDOUT ^= PLEDPIN;
32 }
33
34 //! Initialize MSP430 registers and all that jazz.
35 void msp430_init(){
36         WDTCTL = WDTPW + WDTHOLD;                                       // Stop watchdog timer
37
38         //LED out and on.
39         led_init();
40         led_off();
41
42
43         /* P5.0 out and low; this is chosen for the PIC app (in which P5.0
44          is !MCLR) to ensure that an attached PIC chip, if present, is
45          immediately driven to reset state. A brief explanation of why this
46          is important follows.
47
48         At least dsPIC33F and PIC24H --and very likely other 16-bit PIC
49         families-- draw a large amount of current when running, especially
50         when using a fast clock: from 60 mA up to approx. 90 mA.  If the
51         PIC target begins to run before the client can request a new ICSP
52         session, which requires much less current (e.g., less than 2 mA),
53         then the MSP430 chip on the GoodFET will fail to start and the FTDI
54         may have trouble communicating with the client. The latter likely
55         relates to the FTDI on-chip 3V3 regulator being specified up to
56         only 50 mA. */
57
58
59         //P5REN &= ~BIT0; //DO NOT UNCOMMENT.  Breaks GF1x support.
60
61         //This will have to be cut soon.        Use pulling resistors instead.
62         /*
63         P5DIR |= BIT0;
64         P5OUT &= ~BIT0;
65         */
66
67         //Setup clocks, unique to each '430.
68         msp430_init_dco();
69         msp430_init_uart();
70
71         //DAC should be at full voltage if it exists.
72 #ifdef DAC12IR
73         //glitchvoltages(0xfff,0xfff);
74         ADC12CTL0 = REF2_5V + REFON;                                    // Internal 2.5V ref on
75         //for(i=0;i!=0xFFFF;i++) asm("nop"); //DO NOT UNCOMMENT, breaks GCC4
76         DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
77         DAC12_0DAT = 0xFFF; //Max voltage 0xfff
78         DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
79         DAC12_1DAT = 0x000; //Min voltage 0x000
80 #endif
81
82         /** FIXME
83
84           This part is really ugly.  GSEL (P5.7) must be high to select
85           normal voltage, but a lot of applications light to swing it low
86           to be a nuissance.  To get around this, we assume that anyone
87           with a glitching FET will also have a DAC, then we set that DAC
88           to a high voltage.
89
90           At some point, each target must be sanitized to show that it
91           doesn't clear P5OUT or P5DIR.
92         */
93         P5DIR|=BIT7; P5OUT=BIT7; //Normal Supply
94         //P5DIR&=~BIT7; //Glitch Supply
95
96         //Enable Interrupts.
97         //eint();
98
99 }
100
101 //MSP430
102 #endif