8ff94b641f3686d8e376883a040a96cc39c924ea
[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 \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 //! Handle a command.\r
36 void handle(unsigned char app,\r
37             unsigned char verb,\r
38             unsigned long len){\r
39   //debugstr("GoodFET");\r
40   switch(app){\r
41   case MONITOR:\r
42     monitorhandle(app,verb,len);\r
43     break;\r
44   case SPI:\r
45     spihandle(app,verb,len);\r
46     break;\r
47   case AVR:\r
48     avrhandle(app,verb,len);\r
49     break;\r
50   case I2CAPP:\r
51     i2chandle(app,verb,len);\r
52     break;\r
53   case CHIPCON:\r
54     cchandle(app,verb,len);\r
55     break;\r
56   case JTAG:\r
57     jtaghandle(app,verb,len);\r
58     break;\r
59   case JTAG430: //Also JTAG430X, JTAG430X2\r
60     jtag430x2handle(app,verb,len);\r
61     break;\r
62   default:\r
63     if(pluginhandle){\r
64       pluginhandle(app,verb,len);\r
65     }else{\r
66       debugstr("Plugin missing.");\r
67       txdata(app,NOK,0);\r
68     }\r
69       \r
70     break;\r
71   }\r
72 }\r
73 \r
74 //! Main loop.\r
75 int main(void)\r
76 {\r
77   volatile unsigned int i;\r
78   unsigned char app, verb;\r
79   unsigned long len;\r
80   \r
81   init();\r
82   \r
83   txstring(MONITOR,OK,"http://goodfet.sf.net/");\r
84   \r
85   //Command loop.  There's no end!\r
86   while(1){\r
87     //Magic 3\r
88     app=serial_rx();\r
89     verb=serial_rx();\r
90     //len=serial_rx();\r
91     len=rxword();\r
92     \r
93     //Read data, looking for buffer overflow.y\r
94     if(len<=CMDDATALEN){\r
95       for(i=0;i<len;i++){\r
96         cmddata[i]=serial_rx();\r
97       }\r
98       handle(app,verb,len);\r
99     }else{\r
100       //Listen to the blaberring.\r
101       for(i-0;i<len;i++)\r
102         serial_rx();\r
103       //Reply with an error.\r
104       debugstr("Buffer length exceeded.");\r
105       txdata(MONITOR,NOK,0);\r
106     }\r
107   }\r
108 }\r
109 \r