};
-unsigned char jtagid;
-
-//! Get the JTAG ID
-unsigned char jtag430x2_jtagid(){
- jtag430_resettap();
- return jtagid=jtag_ir_shift8(IR_BYPASS);
-}
-//! Start JTAG, take pins
-unsigned char jtag430x2_start(){
- jtagsetup();
-
- //Known-good starting position.
- //Might be unnecessary.
- SETTST;
- SETRST;
-
- delay(0xFFFF);
-
- //Entry sequence from Page 67 of SLAU265A for 4-wire MSP430 JTAG
- CLRRST;
- delay(20);//10
- CLRTST;
-
- delay(10);//5
- SETTST;
- msdelay(10);//5
- SETRST;
- P5DIR&=~RST;
-
- delay(0xFFFF);
-
- //Perform a reset and disable watchdog.
- return jtag430x2_jtagid();
-}
-
//! Grab the core ID.
unsigned int jtag430_coreid(){
jtag_ir_shift8(IR_COREIP_ID);
//MSP430 or MSP430X
if(jtagid==MSP430JTAGID){
- jtag430mode=MSP430MODE;
-
- /* So the way this works is that a width of 20 does some
- backward-compatibility finagling, causing the correct value
- to be exchanged for addresses on 16-bit chips as well as the
- new MSP430X chips. (This has only been verified on the
- MSP430F2xx family. TODO verify for others.)
- */
-
- drwidth=20;
-
- //Perform a reset and disable watchdog.
- jtag430_por();
- jtag430_writemem(0x120,0x5a80);//disable watchdog
-
- jtag430_haltcpu();
-
- jtag430_resettap();
- txdata(app,verb,1);
+ debugstr("ERROR, using JTAG430X2 instead of JTAG430!");
return;
}else if(jtagid==MSP430X2JTAGID){
jtag430mode=MSP430X2MODE;
break;
case JTAG430_READMEM:
case PEEK:
- blocks=(len>4?cmddata[4]:1);
at=cmddatalong[0];
- l=0x80;
- txhead(app,verb,l);
+ //Fetch large blocks for bulk fetches,
+ //small blocks for individual peeks.
+ if(len>5)
+ l=(cmddataword[2]);//always even.
+ else
+ l=2;
+ l&=~1;//clear lsbit
+
+ if(l<2) l=2;
- while(blocks--){
- for(i=0;i<l;i+=2){
- jtag430_resettap();
- delay(10);
-
- val=jtag430x2_readmem(at);
-
- at+=2;
- serial_tx(val&0xFF);
- serial_tx((val&0xFF00)>>8);
- }
+ txhead(app,verb,l);
+ for(i=0;i<l;i+=2){
+ //jtag430_resettap();
+ //delay(10);
+
+ val=jtag430x2_readmem(at);
+
+ at+=2;
+ serial_tx(val&0xFF);
+ serial_tx((val&0xFF00)>>8);
}
break;
break;
//unimplemented functions
- case JTAG430_HALTCPU:
+ case JTAG430_HALTCPU:
+ //jtag430x2_haltcpu();
+ debugstr("Warning, not trying to halt for lack of code.");
+ txdata(app,verb,0);
+ break;
case JTAG430_RELEASECPU:
case JTAG430_SETINSTRFETCH: