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,
178 register char blocks;
183 //jtag430_resettap();
185 if(verb!=START && jtag430mode==MSP430MODE){
186 (*(jtag430_app.handle))(app,verb,len);
194 cmddata[0]=jtag430x2_start();
195 //while(cmddata[0]==00 || cmddata[0]==0xFF);
198 if(jtagid==MSP430JTAGID){
199 //debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
200 jtag430mode=MSP430MODE;
202 /* So the way this works is that a width of 20 does some
203 backward-compatibility finagling, causing the correct value
204 to be exchanged for addresses on 16-bit chips as well as the
205 new MSP430X chips. (This has only been verified on the
206 MSP430F2xx family. TODO verify for others.)
211 //Perform a reset and disable watchdog.
213 jtag430_writemem(0x120,0x5a80);//disable watchdog
221 }else if(jtagid==MSP430X2JTAGID){
222 jtag430mode=MSP430X2MODE;
225 debugstr("JTAG version unknown.");
232 jtag430x2_fusecheck();
240 case JTAG430_READMEM:
244 //Fetch large blocks for bulk fetches,
245 //small blocks for individual peeks.
247 l=(cmddataword[2]);//always even.
256 //jtag430_resettap();
259 val=jtag430x2_readmem(at);
263 serial_tx((val&0xFF00)>>8);
267 case JTAG430_COREIP_ID:
268 cmddataword[0]=jtag430_coreid();
271 case JTAG430_DEVICE_ID:
272 cmddatalong[0]=jtag430_deviceid();
275 case JTAG430_WRITEFLASH:
276 case JTAG430_WRITEMEM:
278 jtag430x2_writemem(cmddatalong[0],
280 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
284 //unimplemented functions
285 case JTAG430_HALTCPU:
286 //jtag430x2_haltcpu();
287 debugstr("Warning, not trying to halt for lack of code.");
290 case JTAG430_RELEASECPU:
291 case JTAG430_SETINSTRFETCH:
293 case JTAG430_ERASEFLASH:
295 debugstr("This function is not yet implemented for MSP430X2.");
300 (*(jtag_app.handle))(app,verb,len);