2 \author Travis Goodspeed <travis at radiantmachines.com>
3 \brief MSP430X2 JTAG (20-bit)
11 void jtag430x2_handle_fn( uint8_t const app,
16 // define the jtag430x2 app's app_t
17 app_t const jtag430x2_app = {
28 "\tThe JTAG430X2 app extends the basic JTAG app with support\n"
29 "\tfor 20-bit MSP430X2 devices, such as the MSP430F5xx Family.\n"
34 unsigned int jtag430_coreid(){
35 jtag_ir_shift8(IR_COREIP_ID);
36 return jtag_dr_shift16(0);
39 //! Grab the device ID.
40 unsigned long jtag430_deviceid(){
41 jtag_ir_shift8(IR_DEVICE_ID);
42 return jtag_dr_shift20(0);
46 //! Write data to address
47 void jtag430x2_writemem(unsigned long adr,
49 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
50 if(jtag_dr_shift16(0) & 0x0301){
52 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
54 jtag_dr_shift16(0x0500);//word mode
56 jtag_dr_shift16(0x0510);//byte mode
57 jtag_ir_shift8(IR_ADDR_16BIT);
62 jtag_ir_shift8(IR_DATA_TO_ADDR);
63 jtag_dr_shift16(data);//16 word
66 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
67 jtag_dr_shift16(0x0501);
74 while(1) PLEDOUT^=PLEDPIN; //loop if locked up
78 //! Read data from address
79 unsigned int jtag430x2_readmem(unsigned long adr){
81 //unsigned int tries=5;
85 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
86 }while(!(jtag_dr_shift16(0) & 0x0301));
88 if(jtag_dr_shift16(0) & 0x0301){
91 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
93 jtag_dr_shift16(0x0501);//word read
95 jtag_ir_shift8(IR_ADDR_16BIT);
96 jtag_dr_shift20(adr); //20
98 jtag_ir_shift8(IR_DATA_TO_ADDR);
101 toret = jtag_dr_shift16(0x0000);
117 unsigned int jtag430x2_syncpor(){
118 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
119 jtag_dr_shift16(0x1501); //JTAG mode
120 while(!(jtag_dr_shift16(0) & 0x200)); //0x100 or 0x200?
121 return jtag430x2_por();
124 //! Executes an MSP430X2 POR
125 unsigned int jtag430x2_por(){
132 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
133 jtag_dr_shift16(0x0C01);
134 jtag_dr_shift16(0x0401);
137 for (i = 0; i < 10; i++){
142 jtag_dr_shift16(0x0501);
150 jtag430x2_writemem(0x015C, 0x5A80);
153 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
154 if(jtag_dr_shift16(0) & 0x0301)
162 unsigned int jtag430x2_fusecheck(){
165 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
166 if(jtag_dr_shift16(0xAAAA)==0x5555)
173 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
174 void jtag430x2_handle_fn( uint8_t const app,
181 //jtag430_resettap();
183 if(verb!=START && jtag430mode==MSP430MODE){
184 (*(jtag430_app.handle))(app,verb,len);
192 cmddata[0]=jtag430x2_start();
193 //while(cmddata[0]==00 || cmddata[0]==0xFF);
196 if(jtagid==MSP430JTAGID){
197 //debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
198 jtag430mode=MSP430MODE;
200 /* So the way this works is that a width of 20 does some
201 backward-compatibility finagling, causing the correct value
202 to be exchanged for addresses on 16-bit chips as well as the
203 new MSP430X chips. (This has only been verified on the
204 MSP430F2xx family. TODO verify for others.)
209 //Perform a reset and disable watchdog.
211 jtag430_writemem(0x120,0x5a80);//disable watchdog
219 }else if(jtagid==MSP430X2JTAGID){
220 jtag430mode=MSP430X2MODE;
223 debugstr("JTAG version unknown.");
230 jtag430x2_fusecheck();
238 case JTAG430_READMEM:
242 //Fetch large blocks for bulk fetches,
243 //small blocks for individual peeks.
245 l=(cmddataword[2]);//always even.
254 //jtag430_resettap();
257 val=jtag430x2_readmem(at);
261 serial_tx((val&0xFF00)>>8);
265 case JTAG430_COREIP_ID:
266 cmddataword[0]=jtag430_coreid();
269 case JTAG430_DEVICE_ID:
270 cmddatalong[0]=jtag430_deviceid();
273 case JTAG430_WRITEFLASH:
274 case JTAG430_WRITEMEM:
276 jtag430x2_writemem(cmddatalong[0],
278 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
282 //unimplemented functions
283 case JTAG430_HALTCPU:
284 //jtag430x2_haltcpu();
285 debugstr("Warning, not trying to halt for lack of code.");
288 case JTAG430_RELEASECPU:
289 case JTAG430_SETINSTRFETCH:
291 case JTAG430_ERASEFLASH:
293 debugstr("This function is not yet implemented for MSP430X2.");
298 (*(jtag_app.handle))(app,verb,len);