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();
49 unsigned int jtag430_coreid(){
50 jtag_ir_shift8(IR_COREIP_ID);
51 return jtag_dr_shift16(0);
54 unsigned long jtag430_deviceid(){
55 jtag_ir_shift8(IR_DEVICE_ID);
56 return jtag_dr_shift20(0);
60 //! Write data to address
61 unsigned int jtag430x2_writemem(unsigned long adr,
63 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
64 if(jtag_ir_shift8(0) & 0x0301){
66 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
68 jtag_ir_shift8(0x0500);//word mode
70 jtag_ir_shift8(0x0510);//byte mode
71 jtag_ir_shift8(IR_ADDR_16BIT);
76 jtag_ir_shift8(IR_DATA_TO_ADDR);
77 jtag_ir_shift8(data);//16 word
80 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
81 jtag_ir_shift8(0x0501);
88 while(1) P1OUT^=1; //loop if locked up
92 //! Read data from address
93 unsigned int jtag430x2_readmem(unsigned long adr){
96 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
97 if(jtag_dr_shift16(0) & 0x0301){
100 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
102 jtag_dr_shift16(0x0501);//word read
104 jtag_dr_shift16(0x0511);//byte read
106 jtag_ir_shift8(IR_ADDR_16BIT);
107 jtag_dr_shift20(adr); //20
109 jtag_ir_shift8(IR_DATA_TO_ADDR);
112 toret = jtag_dr_shift16(0x0000);
115 // one or more cycle, so CPU is driving correct MAB
119 // Processor is now again in Init State
128 //! Handles classic MSP430 JTAG commands. Forwards others to JTAG.
129 void jtag430x2handle(unsigned char app,
136 do cmddata[0]=jtag430x2_start();
137 while(cmddata[0]==00 || cmddata[0]==0xFF);
140 if(jtagid==MSP430JTAGID){
141 jtag430mode=MSP430MODE;
143 }else if(jtagid==MSP430X2JTAGID){
144 jtag430mode=MSP430X2MODE;
151 //TAP setup, fuse check
152 //jtag430_resettap();
155 case JTAG430_READMEM:
157 cmddataword[0]=jtag430x2_readmem(cmddataword[0]);
158 //cmddataword[0]=jtag430_readmem(cmddataword[0]);
161 case JTAG430_COREIP_ID:
162 cmddataword[0]=jtag430_coreid();
165 case JTAG430_DEVICE_ID:
166 cmddatalong[0]=jtag430_deviceid();
169 case JTAG430_HALTCPU:
170 case JTAG430_RELEASECPU:
171 case JTAG430_SETINSTRFETCH:
172 case JTAG430_WRITEMEM:
174 jtag430x2_writemem(cmddataword[0],
176 cmddataword[0]=jtag430x2_readmem(cmddataword[0]);
179 case JTAG430_WRITEFLASH:
180 case JTAG430_ERASEFLASH:
183 jtaghandle(app,verb,len);