2 \author Travis Goodspeed <travis at radiantmachines.com>
4 This is an implementation of the MSP430X2 JTAG protocol
5 for the GoodFET project at http://goodfet.sf.net/
7 See the license file for details of proper use.
17 unsigned char jtag430x2_jtagid(){
19 return jtagid=jtag_ir_shift8(IR_BYPASS);
21 //! Start JTAG, take pins
22 unsigned char jtag430x2_start(){
25 //Known-good starting position.
26 //Might be unnecessary.
32 //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG
45 //Perform a reset and disable watchdog.
46 return jtag430x2_jtagid();
50 unsigned int jtag430_coreid(){
51 jtag_ir_shift8(IR_COREIP_ID);
52 return jtag_dr_shift16(0);
55 //! Grab the device ID.
56 unsigned long jtag430_deviceid(){
57 jtag_ir_shift8(IR_DEVICE_ID);
58 return jtag_dr_shift20(0);
62 //! Write data to address
63 void jtag430x2_writemem(unsigned long adr,
65 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
66 if(jtag_dr_shift16(0) & 0x0301){
68 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
70 jtag_dr_shift16(0x0500);//word mode
72 jtag_dr_shift16(0x0510);//byte mode
73 jtag_ir_shift8(IR_ADDR_16BIT);
78 jtag_ir_shift8(IR_DATA_TO_ADDR);
79 jtag_dr_shift16(data);//16 word
82 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
83 jtag_dr_shift16(0x0501);
90 while(1) P1OUT^=1; //loop if locked up
94 //! Read data from address
95 unsigned int jtag430x2_readmem(unsigned long adr){
99 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
100 }while(!(jtag_dr_shift16(0) & 0x0301));
102 if(jtag_dr_shift16(0) & 0x0301){
105 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
107 jtag_dr_shift16(0x0501);//word read
109 jtag_dr_shift16(0x0511);//byte read
112 jtag_ir_shift8(IR_ADDR_16BIT);
113 jtag_dr_shift20(adr); //20
115 jtag_ir_shift8(IR_DATA_TO_ADDR);
118 toret = jtag_dr_shift16(0x0000);
133 unsigned int jtag430x2_syncpor(){
134 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
135 jtag_dr_shift16(0x1501); //JTAG mode
136 while(!(jtag_dr_shift16(0) & 0x200));
137 return jtag430x2_por();
140 //! Executes an MSP430X2 POR
141 unsigned int jtag430x2_por(){
148 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
149 jtag_dr_shift16(0x0C01);
150 jtag_dr_shift16(0x0401);
153 for (i = 0; i < 10; i++){
158 jtag_dr_shift16(0x0501);
166 jtag430x2_writemem(0x015C, 0x5A80);
169 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
170 if(jtag_dr_shift16(0) & 0x0301)
178 unsigned int jtag430x2_fusecheck(){
181 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
182 if(jtag_dr_shift16(0xAAAA)==0x5555)
189 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
190 void jtag430x2handle(unsigned char app,
193 register char blocks;
198 //jtag430_resettap();
203 do cmddata[0]=jtag430x2_start();
204 while(cmddata[0]==00 || cmddata[0]==0xFF);
207 if(jtagid==MSP430JTAGID){
208 jtag430mode=MSP430MODE;
210 }else if(jtagid==MSP430X2JTAGID){
211 jtag430mode=MSP430X2MODE;
218 jtag430x2_fusecheck();
226 case JTAG430_READMEM:
228 blocks=(len>4?cmddata[4]:1);
232 cmddataword[0]=jtag430x2_readmem(at);
247 val=jtag430x2_readmem(at);
251 serial_tx((val&0xFF00)>>8);
256 case JTAG430_COREIP_ID:
257 cmddataword[0]=jtag430_coreid();
260 case JTAG430_DEVICE_ID:
261 cmddatalong[0]=jtag430_deviceid();
264 case JTAG430_HALTCPU:
265 //jtag430x2_haltcpu();
267 case JTAG430_RELEASECPU:
268 case JTAG430_SETINSTRFETCH:
269 case JTAG430_WRITEMEM:
271 jtag430x2_writemem(cmddatalong[0],
273 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
276 case JTAG430_WRITEFLASH:
277 case JTAG430_ERASEFLASH:
280 jtaghandle(app,verb,len);