2 \author Travis Goodspeed
5 This is the main module of the GoodFET, which calls the initialization
6 routines and delegates commands to the various applications.
16 //! Initialize registers and all that jazz.
22 WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
29 /* P5.0 out and low; this is chosen for the PIC app (in which P5.0
30 is !MCLR) to ensure that an attached PIC chip, if present, is
31 immediately driven to reset state. A brief explanation of why this
34 At least dsPIC33F and PIC24H --and very likely other 16-bit PIC
35 families-- draw a large amount of current when running, especially
36 when using a fast clock: from 60 mA up to approx. 90 mA. If the
37 PIC target begins to run before the client can request a new ICSP
38 session, which requires much less current (e.g., less than 2 mA),
39 then the MSP430 chip on the GoodFET will fail to start and the FTDI
40 may have trouble communicating with the client. The latter likely
41 relates to the FTDI on-chip 3V3 regulator being specified up to
47 //Setup clocks, unique to each '430.
51 //DAC should be at full voltage if it exists.
53 //glitchvoltages(0xfff,0xfff);
54 ADC12CTL0 = REF2_5V + REFON; // Internal 2.5V ref on
55 for(i=0;i!=0xFFFF;i++) asm("nop");
56 DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
57 DAC12_0DAT = 0xFFF; //Max voltage 0xfff
58 DAC12_1CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; // Int ref gain 1
59 DAC12_1DAT = 0x000; //Min voltage 0x000
64 This part is really ugly. GSEL (P5.7) must be high to select
65 normal voltage, but a lot of applications light to swing it low
66 to be a nuissance. To get around this, we assume that anyone
67 with a glitching FET will also have a DAC, then we set that DAC
70 At some point, each target must be sanitized to show that it
71 doesn't clear P5OUT or P5DIR.
73 P5DIR|=BIT7; P5OUT=BIT7; //Normal Supply
74 //P5DIR&=~BIT7; //Glitch Supply
82 void handle(unsigned char app,
85 //debugstr("GoodFET");
89 glitchhandle(app,verb,len);
92 monitorhandle(app,verb,len);
95 spihandle(app,verb,len);
98 nrfhandle(app,verb,len);
101 avrhandle(app,verb,len);
104 pichandle(app,verb,len);
108 i2chandle(app,verb,len);
111 cchandle(app,verb,len);
114 jtaghandle(app,verb,len);
117 ejtaghandle(app,verb,len);
119 case JTAG430: //Also JTAG430X, JTAG430X2
120 //Revert this when X2 support returns.
121 jtag430x2handle(app,verb,len);
122 //jtag430handle(app,verb,len);
125 smartcardhandle(app,verb,len);
128 jtagarm7tdmihandle(app,verb,len);
132 pluginhandle(app,verb,len);
134 debugstr("Plugin missing.");
145 volatile unsigned int i;
146 unsigned char app, verb;
148 // MSP reboot count for reset input & reboot function located at 0xFFFE
149 volatile unsigned int reset_count = 0;
150 void (*reboot_function)(void) = (void *) 0xFFFE;
154 txstring(MONITOR,OK,"http://goodfet.sf.net/");
157 //Command loop. There's no end!
162 // If the app is the reset byte (0x80) increment and loop
166 if (reset_count > 4) {
167 // We could trigger the WDT with either:
170 // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00;
171 // but instead we'll jump to our reboot function pointer
172 (*reboot_function)();
184 //Read data, looking for buffer overflow.y
187 cmddata[i]=serial_rx();
189 handle(app,verb,len);
191 //Listen to the blaberring.
194 //Reply with an error.
195 debugstr("Buffer length exceeded.");
196 txdata(MONITOR,NOK,0);