Rough draft of CALL/EXEC support for the Monitor.
[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   WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer\r
22   \r
23   //LED out and on.\r
24   PLEDDIR |= PLEDPIN;\r
25   PLEDOUT &= ~PLEDPIN;\r
26   \r
27   //Setup clocks, unique to each '430.\r
28   msp430_init_dco();\r
29   msp430_init_uart();\r
30   \r
31   //Enable Interrupts.\r
32   //eint();\r
33 }\r
34 \r
35 \r
36 //! Handle a command.\r
37 void handle(unsigned char app,\r
38             unsigned char verb,\r
39             unsigned long len){\r
40   //debugstr("GoodFET");\r
41   P1OUT&=~1;\r
42   switch(app){\r
43   case GLITCH:\r
44     glitchhandle(app,verb,len);\r
45     break;\r
46   case MONITOR:\r
47     monitorhandle(app,verb,len);\r
48     break;\r
49   case SPI:\r
50     spihandle(app,verb,len);\r
51     break;\r
52   case AVR:\r
53     avrhandle(app,verb,len);\r
54     break;\r
55   case I2CAPP:\r
56     i2chandle(app,verb,len);\r
57     break;\r
58   case CHIPCON:\r
59     cchandle(app,verb,len);\r
60     break;\r
61   case JTAG:\r
62     jtaghandle(app,verb,len);\r
63     break;\r
64   case JTAG430: //Also JTAG430X, JTAG430X2\r
65     jtag430x2handle(app,verb,len);\r
66     break;\r
67   default:\r
68     if(pluginhandle){\r
69       pluginhandle(app,verb,len);\r
70     }else{\r
71       debugstr("Plugin missing.");\r
72       txdata(app,NOK,0);\r
73     }\r
74       \r
75     break;\r
76   }\r
77 }\r
78 \r
79 //! Main loop.\r
80 int main(void)\r
81 {\r
82   volatile unsigned int i;\r
83   unsigned char app, verb;\r
84   unsigned long len;\r
85   \r
86   init();\r
87   glitchsetup();\r
88   \r
89   txstring(MONITOR,OK,"http://goodfet.sf.net/");\r
90   \r
91   \r
92   //Command loop.  There's no end!\r
93   while(1){\r
94     //Magic 3\r
95     app=serial_rx();\r
96     verb=serial_rx();\r
97     //len=serial_rx();\r
98     len=rxword();\r
99     \r
100     //Read data, looking for buffer overflow.y\r
101     if(len<=CMDDATALEN){\r
102       for(i=0;i<len;i++){\r
103         cmddata[i]=serial_rx();\r
104       }\r
105       handle(app,verb,len);\r
106     }else{\r
107       //Listen to the blaberring.\r
108       for(i-0;i<len;i++)\r
109         serial_rx();\r
110       //Reply with an error.\r
111       debugstr("Buffer length exceeded.");\r
112       txdata(MONITOR,NOK,0);\r
113     }\r
114   }\r
115 }\r
116 \r