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"
35 unsigned int jtag430_coreid(){
36 jtag_ir_shift8(IR_COREIP_ID);
37 return jtag_dr_shift16(0);
40 //! Grab the device ID.
41 unsigned long jtag430_deviceid(){
42 jtag_ir_shift8(IR_DEVICE_ID);
43 return jtag_dr_shift20(0);
47 //! Write data to address
48 void jtag430x2_writemem(unsigned long adr,
50 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
51 if(jtag_dr_shift16(0) & 0x0301){
53 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
55 jtag_dr_shift16(0x0500);//word mode
57 jtag_dr_shift16(0x0510);//byte mode
58 jtag_ir_shift8(IR_ADDR_16BIT);
63 jtag_ir_shift8(IR_DATA_TO_ADDR);
64 jtag_dr_shift16(data);//16 word
67 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
68 jtag_dr_shift16(0x0501);
75 while(1) PLEDOUT^=PLEDPIN; //loop if locked up
79 //! Read data from address
80 unsigned int jtag430x2_readmem(unsigned long adr){
82 //unsigned int tries=5;
86 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
87 //}while(!(jtag_dr_shift16(0) & 0x0301));
89 if(jtag_dr_shift16(0) & 0x0301){
92 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
95 jtag_dr_shift16(0x0501);//word read
97 //jtag_dr_shift16(0x0511);//byte read
100 jtag_ir_shift8(IR_ADDR_16BIT);
101 jtag_dr_shift20(adr); //20
103 jtag_ir_shift8(IR_DATA_TO_ADDR);
106 toret = jtag_dr_shift16(0x0000);
120 unsigned int jtag430x2_syncpor(){
121 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
122 jtag_dr_shift16(0x1501); //JTAG mode
123 while(!(jtag_dr_shift16(0) & 0x200));
124 return jtag430x2_por();
127 //! Executes an MSP430X2 POR
128 unsigned int jtag430x2_por(){
135 jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
136 jtag_dr_shift16(0x0C01);
137 jtag_dr_shift16(0x0401);
140 for (i = 0; i < 10; i++){
145 jtag_dr_shift16(0x0501);
153 jtag430x2_writemem(0x015C, 0x5A80);
156 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
157 if(jtag_dr_shift16(0) & 0x0301)
165 unsigned int jtag430x2_fusecheck(){
168 jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
169 if(jtag_dr_shift16(0xAAAA)==0x5555)
176 //! Handles MSP430X2 JTAG commands. Forwards others to JTAG.
177 void jtag430x2_handle_fn( uint8_t const app,
181 register char blocks;
186 //jtag430_resettap();
188 if(verb!=START && jtag430mode==MSP430MODE){
189 (*(jtag430_app.handle))(app,verb,len);
197 cmddata[0]=jtag430x2_start();
198 //while(cmddata[0]==00 || cmddata[0]==0xFF);
201 if(jtagid==MSP430JTAGID){
202 debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
204 }else if(jtagid==MSP430X2JTAGID){
205 jtag430mode=MSP430X2MODE;
208 debugstr("JTAG version unknown.");
213 jtag430x2_fusecheck();
221 case JTAG430_READMEM:
225 //Fetch large blocks for bulk fetches,
226 //small blocks for individual peeks.
228 l=(cmddataword[2]);//always even.
237 //jtag430_resettap();
240 val=jtag430x2_readmem(at);
244 serial_tx((val&0xFF00)>>8);
248 case JTAG430_COREIP_ID:
249 cmddataword[0]=jtag430_coreid();
252 case JTAG430_DEVICE_ID:
253 cmddatalong[0]=jtag430_deviceid();
256 case JTAG430_WRITEFLASH:
257 case JTAG430_WRITEMEM:
259 jtag430x2_writemem(cmddatalong[0],
261 cmddataword[0]=jtag430x2_readmem(cmddatalong[0]);
265 //unimplemented functions
266 case JTAG430_HALTCPU:
267 //jtag430x2_haltcpu();
268 debugstr("Warning, not trying to halt for lack of code.");
271 case JTAG430_RELEASECPU:
272 case JTAG430_SETINSTRFETCH:
274 case JTAG430_ERASEFLASH:
276 debugstr("This function is not yet implemented for MSP430X2.");
281 (*(jtag_app.handle))(app,verb,len);