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);
94 jtag_dr_shift16(0x0501);//word read
96 //jtag_dr_shift16(0x0511);//byte read
99 jtag_ir_shift8(IR_ADDR_16BIT);
100 jtag_dr_shift20(adr); //20
102 jtag_ir_shift8(IR_DATA_TO_ADDR);
105 toret = jtag_dr_shift16(0x0000);
119 unsigned int jtag430x2_syncpor(){
120 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
121 jtag_dr_shift16(0x1501); //JTAG mode
122 while(!(jtag_dr_shift16(0) & 0x200));
123 return jtag430x2_por();
126 //! Executes an MSP430X2 POR
127 unsigned int jtag430x2_por(){
134 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
135 jtag_dr_shift16(0x0C01);
136 jtag_dr_shift16(0x0401);
139 for (i = 0; i < 10; i++){
144 jtag_dr_shift16(0x0501);
152 jtag430x2_writemem(0x015C, 0x5A80);
155 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
156 if(jtag_dr_shift16(0) & 0x0301)
164 unsigned int jtag430x2_fusecheck(){
167 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
168 if(jtag_dr_shift16(0xAAAA)==0x5555)
175 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
176 void jtag430x2_handle_fn( uint8_t const app,
180 register char blocks;
185 //jtag430_resettap();
187 if(verb!=START && jtag430mode==MSP430MODE){
188 (*(jtag430_app.handle))(app,verb,len);
196 cmddata[0]=jtag430x2_start();
197 //while(cmddata[0]==00 || cmddata[0]==0xFF);
200 if(jtagid==MSP430JTAGID){
201 //debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
202 jtag430mode=MSP430MODE;
204 /* So the way this works is that a width of 20 does some
205 backward-compatibility finagling, causing the correct value
206 to be exchanged for addresses on 16-bit chips as well as the
207 new MSP430X chips. (This has only been verified on the
208 MSP430F2xx family. TODO verify for others.)
213 //Perform a reset and disable watchdog.
215 jtag430_writemem(0x120,0x5a80);//disable watchdog
223 }else if(jtagid==MSP430X2JTAGID){
224 jtag430mode=MSP430X2MODE;
227 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);