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