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 = {
29 "\tThe JTAG430X2 app extends the basic JTAG app with support\n"
30 "\tfor 20-bit MSP430 devices.\n"
37 unsigned char jtag430x2_jtagid(){
39 return jtagid=jtag_ir_shift8(IR_BYPASS);
41 //! Start JTAG, take pins
42 unsigned char jtag430x2_start(){
45 //Known-good starting position.
46 //Might be unnecessary.
52 //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG
65 //Perform a reset and disable watchdog.
66 return jtag430x2_jtagid();
70 unsigned int jtag430_coreid(){
71 jtag_ir_shift8(IR_COREIP_ID);
72 return jtag_dr_shift16(0);
75 //! Grab the device ID.
76 unsigned long jtag430_deviceid(){
77 jtag_ir_shift8(IR_DEVICE_ID);
78 return jtag_dr_shift20(0);
82 //! Write data to address
83 void jtag430x2_writemem(unsigned long adr,
85 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
86 if(jtag_dr_shift16(0) & 0x0301){
88 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
90 jtag_dr_shift16(0x0500);//word mode
92 jtag_dr_shift16(0x0510);//byte mode
93 jtag_ir_shift8(IR_ADDR_16BIT);
98 jtag_ir_shift8(IR_DATA_TO_ADDR);
99 jtag_dr_shift16(data);//16 word
102 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
103 jtag_dr_shift16(0x0501);
110 while(1) PLEDOUT^=PLEDPIN; //loop if locked up
114 //! Read data from address
115 unsigned int jtag430x2_readmem(unsigned long adr){
116 unsigned int toret=0;
117 //unsigned int tries=5;
121 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
122 //}while(!(jtag_dr_shift16(0) & 0x0301));
124 if(jtag_dr_shift16(0) & 0x0301){
127 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
130 jtag_dr_shift16(0x0501);//word read
132 //jtag_dr_shift16(0x0511);//byte read
135 jtag_ir_shift8(IR_ADDR_16BIT);
136 jtag_dr_shift20(adr); //20
138 jtag_ir_shift8(IR_DATA_TO_ADDR);
141 toret = jtag_dr_shift16(0x0000);
155 unsigned int jtag430x2_syncpor(){
156 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
157 jtag_dr_shift16(0x1501); //JTAG mode
158 while(!(jtag_dr_shift16(0) & 0x200));
159 return jtag430x2_por();
162 //! Executes an MSP430X2 POR
163 unsigned int jtag430x2_por(){
170 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
171 jtag_dr_shift16(0x0C01);
172 jtag_dr_shift16(0x0401);
175 for (i = 0; i < 10; i++){
180 jtag_dr_shift16(0x0501);
188 jtag430x2_writemem(0x015C, 0x5A80);
191 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
192 if(jtag_dr_shift16(0) & 0x0301)
200 unsigned int jtag430x2_fusecheck(){
203 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
204 if(jtag_dr_shift16(0xAAAA)==0x5555)
211 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
212 void jtag430x2_handle_fn( uint8_t const app,
216 register char blocks;
221 //jtag430_resettap();
223 if(verb!=START && jtag430mode==MSP430MODE){
224 (*(jtag430_app.handle))(app,verb,len);
232 cmddata[0]=jtag430x2_start();
233 //while(cmddata[0]==00 || cmddata[0]==0xFF);
236 if(jtagid==MSP430JTAGID){
237 jtag430mode=MSP430MODE;
239 /* So the way this works is that a width of 20 does some
240 backward-compatibility finagling, causing the correct value
241 to be exchanged for addresses on 16-bit chips as well as the
242 new MSP430X chips. (This has only been verified on the
243 MSP430F2xx family. TODO verify for others.)
248 //Perform a reset and disable watchdog.
250 jtag430_writemem(0x120,0x5a80);//disable watchdog
257 }else if(jtagid==MSP430X2JTAGID){
258 jtag430mode=MSP430X2MODE;
261 debugstr("JTAG version unknown.");
266 jtag430x2_fusecheck();
274 case JTAG430_READMEM:
276 blocks=(len>4?cmddata[4]:1);
287 val=jtag430x2_readmem(at);
291 serial_tx((val&0xFF00)>>8);
296 case JTAG430_COREIP_ID:
297 cmddataword[0]=jtag430_coreid();
300 case JTAG430_DEVICE_ID:
301 cmddatalong[0]=jtag430_deviceid();
304 case JTAG430_WRITEFLASH:
305 case JTAG430_WRITEMEM:
307 jtag430x2_writemem(cmddatalong[0],
309 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
313 //unimplemented functions
314 case JTAG430_HALTCPU:
315 case JTAG430_RELEASECPU:
316 case JTAG430_SETINSTRFETCH:
318 case JTAG430_ERASEFLASH:
320 debugstr("This function is not yet implemented for MSP430X2.");
325 (*(jtag_app.handle))(app,verb,len);