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!");
203 }else if(jtagid==MSP430X2JTAGID){
204 jtag430mode=MSP430X2MODE;
207 debugstr("JTAG version unknown.");
212 jtag430x2_fusecheck();
220 case JTAG430_READMEM:
224 //Fetch large blocks for bulk fetches,
225 //small blocks for individual peeks.
227 l=(cmddataword[2]);//always even.
236 //jtag430_resettap();
239 val=jtag430x2_readmem(at);
243 serial_tx((val&0xFF00)>>8);
247 case JTAG430_COREIP_ID:
248 cmddataword[0]=jtag430_coreid();
251 case JTAG430_DEVICE_ID:
252 cmddatalong[0]=jtag430_deviceid();
255 case JTAG430_WRITEFLASH:
256 case JTAG430_WRITEMEM:
258 jtag430x2_writemem(cmddatalong[0],
260 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
264 //unimplemented functions
265 case JTAG430_HALTCPU:
266 //jtag430x2_haltcpu();
267 debugstr("Warning, not trying to halt for lack of code.");
270 case JTAG430_RELEASECPU:
271 case JTAG430_SETINSTRFETCH:
273 case JTAG430_ERASEFLASH:
275 debugstr("This function is not yet implemented for MSP430X2.");
280 (*(jtag_app.handle))(app,verb,len);