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"
36 //! Write data to address
37 void jtag430x2_writemem(unsigned long adr,
39 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
40 if(jtag_dr_shift16(0) & 0x0301){
42 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
44 jtag_dr_shift16(0x0500);//word mode
46 jtag_dr_shift16(0x0510);//byte mode
47 jtag_ir_shift8(IR_ADDR_16BIT);
52 jtag_ir_shift8(IR_DATA_TO_ADDR);
53 jtag_dr_shift16(data);//16 word
56 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
57 jtag_dr_shift16(0x0501);
64 while(1) PLEDOUT^=PLEDPIN; //loop if locked up
68 //! Read data from address
69 unsigned int jtag430x2_readmem(unsigned long adr){
71 //unsigned int tries=5;
75 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
76 //}while(!(jtag_dr_shift16(0) & 0x0301));
78 if(jtag_dr_shift16(0) & 0x0301){
81 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
84 jtag_dr_shift16(0x0501);//word read
86 //jtag_dr_shift16(0x0511);//byte read
89 jtag_ir_shift8(IR_ADDR_16BIT);
90 jtag_dr_shift20(adr); //20
92 jtag_ir_shift8(IR_DATA_TO_ADDR);
95 toret = jtag_dr_shift16(0x0000);
109 unsigned int jtag430x2_syncpor(){
110 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
111 jtag_dr_shift16(0x1501); //JTAG mode
112 while(!(jtag_dr_shift16(0) & 0x200));
113 return jtag430x2_por();
116 //! Executes an MSP430X2 POR
117 unsigned int jtag430x2_por(){
124 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
125 jtag_dr_shift16(0x0C01);
126 jtag_dr_shift16(0x0401);
129 for (i = 0; i < 10; i++){
134 jtag_dr_shift16(0x0501);
142 jtag430x2_writemem(0x015C, 0x5A80);
145 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
146 if(jtag_dr_shift16(0) & 0x0301)
154 unsigned int jtag430x2_fusecheck(){
157 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
158 if(jtag_dr_shift16(0xAAAA)==0x5555)
165 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
166 void jtag430x2_handle_fn( uint8_t const app,
170 register char blocks;
175 //jtag430_resettap();
177 if(verb!=START && jtag430mode==MSP430MODE){
178 (*(jtag430_app.handle))(app,verb,len);
186 cmddata[0]=jtag430x2_start();
187 //while(cmddata[0]==00 || cmddata[0]==0xFF);
190 if(jtagid==MSP430JTAGID){
191 debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
193 }else if(jtagid==MSP430X2JTAGID){
194 jtag430mode=MSP430X2MODE;
197 debugstr("JTAG version unknown.");
202 jtag430x2_fusecheck();
210 case JTAG430_READMEM:
212 blocks=(len>4?cmddata[4]:1);
223 val=jtag430x2_readmem(at);
227 serial_tx((val&0xFF00)>>8);
232 case JTAG430_COREIP_ID:
233 cmddataword[0]=jtag430_coreid();
236 case JTAG430_DEVICE_ID:
237 cmddatalong[0]=jtag430_deviceid();
240 case JTAG430_WRITEFLASH:
241 case JTAG430_WRITEMEM:
243 jtag430x2_writemem(cmddatalong[0],
245 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
249 //unimplemented functions
250 case JTAG430_HALTCPU:
251 case JTAG430_RELEASECPU:
252 case JTAG430_SETINSTRFETCH:
254 case JTAG430_ERASEFLASH:
256 debugstr("This function is not yet implemented for MSP430X2.");
261 (*(jtag_app.handle))(app,verb,len);