2 \author Travis Goodspeed <travis at radiantmachines.com>
3 \brief MSP430X2 JTAG (20-bit)
13 unsigned char jtag430x2_jtagid(){
15 return jtagid=jtag_ir_shift8(IR_BYPASS);
17 //! Start JTAG, take pins
18 unsigned char jtag430x2_start(){
21 //Known-good starting position.
22 //Might be unnecessary.
28 //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG
41 //Perform a reset and disable watchdog.
42 return jtag430x2_jtagid();
46 unsigned int jtag430_coreid(){
47 jtag_ir_shift8(IR_COREIP_ID);
48 return jtag_dr_shift16(0);
51 //! Grab the device ID.
52 unsigned long jtag430_deviceid(){
53 jtag_ir_shift8(IR_DEVICE_ID);
54 return jtag_dr_shift20(0);
58 //! Write data to address
59 void jtag430x2_writemem(unsigned long adr,
61 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
62 if(jtag_dr_shift16(0) & 0x0301){
64 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
66 jtag_dr_shift16(0x0500);//word mode
68 jtag_dr_shift16(0x0510);//byte mode
69 jtag_ir_shift8(IR_ADDR_16BIT);
74 jtag_ir_shift8(IR_DATA_TO_ADDR);
75 jtag_dr_shift16(data);//16 word
78 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
79 jtag_dr_shift16(0x0501);
86 while(1) P1OUT^=1; //loop if locked up
90 //! Read data from address
91 unsigned int jtag430x2_readmem(unsigned long adr){
93 //unsigned int tries=5;
97 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
98 }while(!(jtag_dr_shift16(0) & 0x0301));
100 if(jtag_dr_shift16(0) & 0x0301){
103 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
105 jtag_dr_shift16(0x0501);//word read
107 jtag_dr_shift16(0x0511);//byte read
110 jtag_ir_shift8(IR_ADDR_16BIT);
111 jtag_dr_shift20(adr); //20
113 jtag_ir_shift8(IR_DATA_TO_ADDR);
116 toret = jtag_dr_shift16(0x0000);
130 unsigned int jtag430x2_syncpor(){
131 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
132 jtag_dr_shift16(0x1501); //JTAG mode
133 while(!(jtag_dr_shift16(0) & 0x200));
134 return jtag430x2_por();
137 //! Executes an MSP430X2 POR
138 unsigned int jtag430x2_por(){
145 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
146 jtag_dr_shift16(0x0C01);
147 jtag_dr_shift16(0x0401);
150 for (i = 0; i < 10; i++){
155 jtag_dr_shift16(0x0501);
163 jtag430x2_writemem(0x015C, 0x5A80);
166 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
167 if(jtag_dr_shift16(0) & 0x0301)
175 unsigned int jtag430x2_fusecheck(){
178 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
179 if(jtag_dr_shift16(0xAAAA)==0x5555)
186 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
187 void jtag430x2handle(unsigned char app,
190 register char blocks;
195 //jtag430_resettap();
197 if(verb!=START && jtag430mode==MSP430MODE){
198 jtag430handle(app,verb,len);
206 cmddata[0]=jtag430x2_start();
207 //while(cmddata[0]==00 || cmddata[0]==0xFF);
210 if(jtagid==MSP430JTAGID){
211 jtag430mode=MSP430MODE;
214 //Perform a reset and disable watchdog.
216 jtag430_writemem(0x120,0x5a80);//disable watchdog
223 }else if(jtagid==MSP430X2JTAGID){
224 jtag430mode=MSP430X2MODE;
231 jtag430x2_fusecheck();
239 case JTAG430_READMEM:
241 blocks=(len>4?cmddata[4]:1);
245 txhead(app,verb,len);
252 val=jtag430x2_readmem(at);
256 serial_tx((val&0xFF00)>>8);
261 case JTAG430_COREIP_ID:
262 cmddataword[0]=jtag430_coreid();
265 case JTAG430_DEVICE_ID:
266 cmddatalong[0]=jtag430_deviceid();
270 case JTAG430_WRITEMEM:
272 jtag430x2_writemem(cmddatalong[0],
274 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
278 //unimplemented functions
279 case JTAG430_HALTCPU:
280 case JTAG430_RELEASECPU:
281 case JTAG430_SETINSTRFETCH:
282 case JTAG430_WRITEFLASH:
283 case JTAG430_ERASEFLASH:
288 jtaghandle(app,verb,len);