3da4d04cf13d7faa4f3e469da70ed54609040750
[goodfet] / firmware / goodfet.c
1 /*! \file goodfet.c\r
2   \author Travis Goodspeed\r
3   \brief Main module.\r
4   \r
5   This is the main module of the GoodFET, which calls the initialization\r
6   routines and delegates commands to the various applications.\r
7 */\r
8 \r
9 \r
10 #include "platform.h"\r
11 #include "command.h"\r
12 #include "apps.h"\r
13 #include "glitch.h"\r
14 \r
15 \r
16 //LED on P1.0\r
17 //IO on P5\r
18 \r
19 //! Initialize registers and all that jazz.\r
20 void init(){\r
21   int i;\r
22   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer\r
23   \r
24   //LED out and on.\r
25   PLEDDIR |= PLEDPIN;\r
26   PLEDOUT &= ~PLEDPIN;\r
27   \r
28   //Setup clocks, unique to each '430.\r
29   msp430_init_dco();\r
30   msp430_init_uart();\r
31   \r
32   //DAC should be at full voltage if it exists.\r
33   #ifdef DAC12IR\r
34   //glitchvoltages(0xfff,0xfff);\r
35   ADC12CTL0 = REF2_5V + REFON;                  // Internal 2.5V ref on\r
36   for(i=0;i!=0xFFFF;i++) asm("nop");\r
37   DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1\r
38   DAC12_0DAT = 0xFFF; //Max voltage\r
39   #endif\r
40   \r
41   //Enable Interrupts.\r
42   //eint();\r
43 }\r
44 \r
45 \r
46 //! Handle a command.\r
47 void handle(unsigned char app,\r
48             unsigned char verb,\r
49             unsigned long len){\r
50   //debugstr("GoodFET");\r
51   P1OUT&=~1;\r
52   switch(app){\r
53   case GLITCH:\r
54     glitchhandle(app,verb,len);\r
55     break;\r
56   case MONITOR:\r
57     monitorhandle(app,verb,len);\r
58     break;\r
59   case SPI:\r
60     spihandle(app,verb,len);\r
61     break;\r
62   case AVR:\r
63     avrhandle(app,verb,len);\r
64     break;\r
65   case I2CAPP:\r
66     i2chandle(app,verb,len);\r
67     break;\r
68   case CHIPCON:\r
69     cchandle(app,verb,len);\r
70     break;\r
71   case JTAG:\r
72     jtaghandle(app,verb,len);\r
73     break;\r
74   case EJTAG:\r
75     ejtaghandle(app,verb,len);\r
76     break;\r
77   case JTAG430: //Also JTAG430X, JTAG430X2\r
78     jtag430x2handle(app,verb,len);\r
79     break;\r
80   default:\r
81     if(pluginhandle){\r
82       pluginhandle(app,verb,len);\r
83     }else{\r
84       debugstr("Plugin missing.");\r
85       debughex(app);\r
86       txdata(app,NOK,0);\r
87     }\r
88     break;\r
89   }\r
90 }\r
91 \r
92 //! Main loop.\r
93 int main(void)\r
94 {\r
95   volatile unsigned int i;\r
96   unsigned char app, verb;\r
97   unsigned long len;\r
98   // MSP reboot count for reset input & reboot function located at 0xFFFE\r
99   volatile unsigned int reset_count = 0;\r
100   void (*reboot_function)(void) = (void *) 0xFFFE;\r
101   \r
102   init();\r
103 \r
104   txstring(MONITOR,OK,"http://goodfet.sf.net/");\r
105   \r
106   \r
107   //Command loop.  There's no end!\r
108   while(1){\r
109     //Magic 3\r
110     app=serial_rx();\r
111 \r
112         // If the app is the reset byte (0x80) increment and loop\r
113         if (app == 0x80) {\r
114                 reset_count++;\r
115 \r
116                 if (reset_count > 4) {\r
117                         // We could trigger the WDT with either:\r
118                         // WDTCTL = 0;\r
119                         // or\r
120                         // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00;\r
121                         // but instead we'll jump to our reboot function pointer\r
122                         (*reboot_function)();\r
123                 }\r
124 \r
125                 continue;\r
126         } else {\r
127                 reset_count = 0;\r
128         }\r
129 \r
130     verb=serial_rx();\r
131     //len=serial_rx();\r
132     len=rxword();\r
133     \r
134     //Read data, looking for buffer overflow.y\r
135     if(len<=CMDDATALEN){\r
136       for(i=0;i<len;i++){\r
137         cmddata[i]=serial_rx();\r
138       }\r
139       handle(app,verb,len);\r
140     }else{\r
141       //Listen to the blaberring.\r
142       for(i-0;i<len;i++)\r
143         serial_rx();\r
144       //Reply with an error.\r
145       debugstr("Buffer length exceeded.");\r
146       txdata(MONITOR,NOK,0);\r
147     }\r
148   }\r
149 }\r
150 \r