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 ccspihandle(app,verb,len);
104 avrhandle(app,verb,len);
107 pichandle(app,verb,len);
111 i2chandle(app,verb,len);
114 cchandle(app,verb,len);
117 jtaghandle(app,verb,len);
120 ejtaghandle(app,verb,len);
122 case JTAG430: //Also JTAG430X, JTAG430X2
123 //Revert this when X2 support returns.
124 jtag430x2handle(app,verb,len);
125 //jtag430handle(app,verb,len);
128 smartcardhandle(app,verb,len);
131 jtagarm7tdmihandle(app,verb,len);
135 pluginhandle(app,verb,len);
137 debugstr("Plugin missing.");
148 volatile unsigned int i;
149 unsigned char app, verb;
151 // MSP reboot count for reset input & reboot function located at 0xFFFE
152 volatile unsigned int reset_count = 0;
153 void (*reboot_function)(void) = (void *) 0xFFFE;
157 txstring(MONITOR,OK,"http://goodfet.sf.net/");
160 //Command loop. There's no end!
165 // If the app is the reset byte (0x80) increment and loop
169 if (reset_count > 4) {
170 // We could trigger the WDT with either:
173 // WDTCTL = WDTPW + WDTCNTCL + WDTSSEL + 0x00;
174 // but instead we'll jump to our reboot function pointer
175 (*reboot_function)();
187 //Read data, looking for buffer overflow.y
190 cmddata[i]=serial_rx();
192 handle(app,verb,len);
194 //Listen to the blaberring.
197 //Reply with an error.
198 debugstr("Buffer length exceeded.");
199 txdata(MONITOR,NOK,0);