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"
32 //! Shift 20 bits of the DR.
33 uint32_t jtag430_dr_shift_20(uint32_t in)
35 if (!in_run_test_idle())
37 debugstr("Not in run-test-idle state");
41 // get intot the right state
43 jtag_shift_register();
45 // shift DR, then idle
46 return jtag_trans_n(in, 20, MSB);
50 unsigned int jtag430_coreid(){
51 jtag_ir_shift_8(IR_COREIP_ID);
52 return jtag_dr_shift_16(0);
55 //! Grab the device ID.
56 unsigned long jtag430_deviceid(){
57 jtag_ir_shift_8(IR_DEVICE_ID);
58 return jtag430_dr_shift_20(0);
62 //! Write data to address
63 void jtag430x2_writemem(unsigned long adr,
65 jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE);
66 if(jtag_dr_shift_16(0) & 0x0301){
68 jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
70 jtag_dr_shift_16(0x0500);//word mode
72 jtag_dr_shift_16(0x0510);//byte mode
73 jtag_ir_shift_8(IR_ADDR_16BIT);
74 jtag430_dr_shift_20(adr);
78 jtag_ir_shift_8(IR_DATA_TO_ADDR);
79 jtag_dr_shift_16(data);//16 word
82 jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
83 jtag_dr_shift_16(0x0501);
90 while(1) PLEDOUT^=PLEDPIN; //loop if locked up
94 //! Read data from address
95 unsigned int jtag430x2_readmem(unsigned long adr){
97 //unsigned int tries=5;
101 jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE);
102 }while(!(jtag_dr_shift_16(0) & 0x0301));
104 if(jtag_dr_shift_16(0) & 0x0301){
107 jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
109 jtag_dr_shift_16(0x0501);//word read
111 jtag_ir_shift_8(IR_ADDR_16BIT);
112 jtag430_dr_shift_20(adr); //20
114 jtag_ir_shift_8(IR_DATA_TO_ADDR);
117 toret = jtag_dr_shift_16(0x0000);
133 unsigned int jtag430x2_syncpor(){
134 jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
135 jtag_dr_shift_16(0x1501); //JTAG mode
136 while(!(jtag_dr_shift_16(0) & 0x200)); //0x100 or 0x200?
137 return jtag430x2_por();
140 //! Executes an MSP430X2 POR
141 unsigned int jtag430x2_por(){
148 jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
149 jtag_dr_shift_16(0x0C01);
150 jtag_dr_shift_16(0x0401);
153 for (i = 0; i < 10; i++){
158 jtag_dr_shift_16(0x0501);
166 jtag430x2_writemem(0x015C, 0x5A80);
169 jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE);
170 if(jtag_dr_shift_16(0) & 0x0301)
178 unsigned int jtag430x2_fusecheck(){
181 jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE);
182 if(jtag_dr_shift_16(0xAAAA)==0x5555)
189 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
190 void jtag430x2_handle_fn( uint8_t const app,
197 //jtag430_resettap();
199 if(verb!=START && jtag430mode==MSP430MODE){
200 (*(jtag430_app.handle))(app,verb,len);
208 cmddata[0]=jtag430x2_start();
209 //while(cmddata[0]==00 || cmddata[0]==0xFF);
212 if(jtagid==MSP430JTAGID){
213 //debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
214 jtag430mode=MSP430MODE;
216 /* So the way this works is that a width of 20 does some
217 backward-compatibility finagling, causing the correct value
218 to be exchanged for addresses on 16-bit chips as well as the
219 new MSP430X chips. (This has only been verified on the
220 MSP430F2xx family. TODO verify for others.)
225 //Perform a reset and disable watchdog.
227 jtag430_writemem(0x120,0x5a80);//disable watchdog
234 }else if(jtagid==MSP430X2JTAGID){
235 jtag430mode=MSP430X2MODE;
238 debugstr("JTAG version unknown.");
243 jtag430x2_fusecheck();
251 case JTAG430_READMEM:
255 //Fetch large blocks for bulk fetches,
256 //small blocks for individual peeks.
258 l=(cmddataword[2]);//always even.
267 //jtag430_resettap();
270 val=jtag430x2_readmem(at);
274 serial_tx((val&0xFF00)>>8);
278 case JTAG430_COREIP_ID:
279 cmddataword[0]=jtag430_coreid();
282 case JTAG430_DEVICE_ID:
283 cmddatalong[0]=jtag430_deviceid();
286 case JTAG430_WRITEFLASH:
287 case JTAG430_WRITEMEM:
289 jtag430x2_writemem(cmddatalong[0],
291 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
295 //unimplemented functions
296 case JTAG430_HALTCPU:
297 //jtag430x2_haltcpu();
298 debugstr("Warning, not trying to halt for lack of code.");
301 case JTAG430_RELEASECPU:
302 case JTAG430_SETINSTRFETCH:
304 case JTAG430_ERASEFLASH:
306 debugstr("This function is not yet implemented for MSP430X2.");
311 (*(jtag_app.handle))(app,verb,len);