// define the jtag430 app's app_t
app_t const jtag430_app = {
-
- /* app number */
- JTAG430,
-
- /* handle fn */
- jtag430_handle_fn,
-
- /* name */
- "JTAG430",
-
- /* desc */
- "\tThe JTAG430 app adds to the basic JTAG app\n"
- "\tsupport for JTAG'ing MSP430 devices.\n"
+ /* app number */
+ JTAG430,
+
+ /* handle fn */
+ jtag430_handle_fn,
+
+ /* name */
+ "JTAG430",
+
+ /* desc */
+ "\tThe JTAG430 app adds to the basic JTAG app\n"
+ "\tsupport for JTAG'ing MSP430 devices.\n"
};
unsigned int jtag430mode=MSP430X2MODE;
+unsigned int drwidth=16;
+
+//! Shift an address width of data
+uint32_t jtag430_shift_addr( uint32_t addr )
+{
+ if (!in_run_test_idle())
+ {
+ debugstr("Not in run-test-idle state");
+ return 0;
+ }
+
+ // get intot the right state
+ jtag_capture_dr();
+ jtag_shift_register();
+
+ // shift DR, then idle
+ return jtag_trans_n(addr, drwidth, MSB);
+}
+
//! Set a register.
void jtag430_setr(u8 reg, u16 val){
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x3401);// release low byte
- jtag_ir_shift8(IR_DATA_16BIT);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x3401);// release low byte
+ jtag_ir_shift_8(IR_DATA_16BIT);
//0x4030 is "MOV #foo, r0"
//Right-most field is register, so 0x4035 loads r5
- jtag_dr_shift16(0x4030+reg);
+ jtag_dr_shift_16(0x4030+reg);
CLRTCLK;
SETTCLK;
- jtag_dr_shift16(val);// Value for the register
+ jtag_dr_shift_16(val);// Value for the register
CLRTCLK;
- jtag_ir_shift8(IR_ADDR_CAPTURE);
+ jtag_ir_shift_8(IR_ADDR_CAPTURE);
SETTCLK;
CLRTCLK ;// Now reg is set to new value.
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2401);// low byte controlled by JTAG
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2401);// low byte controlled by JTAG
}
//! Set the program counter.
void jtag430_haltcpu(){
//jtag430_setinstrfetch();
- jtag_ir_shift8(IR_DATA_16BIT);
- jtag_dr_shift16(0x3FFF);//JMP $+0
+ jtag_ir_shift_8(IR_DATA_16BIT);
+ jtag_dr_shift_16(0x3FFF);//JMP $+0
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2409);//set JTAG_HALT bit
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2409);//set JTAG_HALT bit
SETTCLK;
}
//debugstr("Releasing target MSP430.");
/*
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2C01); //Apply reset.
- jtag_dr_shift16(0x2401); //Release reset.
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2C01); //Apply reset.
+ jtag_dr_shift_16(0x2401); //Release reset.
*/
- jtag_ir_shift8(IR_CNTRL_SIG_RELEASE);
+ jtag_ir_shift_8(IR_CNTRL_SIG_RELEASE);
SETTCLK;
}
jtag430_haltcpu();
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
if(adr>0xFF)
- jtag_dr_shift16(0x2409);//word read
+ jtag_dr_shift_16(0x2409);//word read
else
- jtag_dr_shift16(0x2419);//byte read
- jtag_ir_shift8(IR_ADDR_16BIT);
- jtag_dr_shiftadr(adr);//address
- jtag_ir_shift8(IR_DATA_TO_ADDR);
+ jtag_dr_shift_16(0x2419);//byte read
+ jtag_ir_shift_8(IR_ADDR_16BIT);
+ jtag430_shift_addr(adr);//address
+ jtag_ir_shift_8(IR_DATA_TO_ADDR);
SETTCLK;
CLRTCLK;
- toret=jtag_dr_shift16(0x0000);//16 bit return
+ toret=jtag_dr_shift_16(0x0000);//16 bit return
return toret;
}
//! Write data to address.
void jtag430_writemem(unsigned int adr, unsigned int data){
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
if(adr>0xFF)
- jtag_dr_shift16(0x2408);//word write
+ jtag_dr_shift_16(0x2408);//word write
else
- jtag_dr_shift16(0x2418);//byte write
- jtag_ir_shift8(IR_ADDR_16BIT);
- jtag_dr_shiftadr(adr);
- jtag_ir_shift8(IR_DATA_TO_ADDR);
- jtag_dr_shift16(data);
+ jtag_dr_shift_16(0x2418);//byte write
+ jtag_ir_shift_8(IR_ADDR_16BIT);
+ jtag430_shift_addr(adr);
+ jtag_ir_shift_8(IR_DATA_TO_ADDR);
+ jtag_dr_shift_16(data);
SETTCLK;
}
void jtag430_writeflashword(unsigned int adr, unsigned int data){
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2408);//word write
- jtag_ir_shift8(IR_ADDR_16BIT);
- jtag_dr_shiftadr(adr);
- jtag_ir_shift8(IR_DATA_TO_ADDR);
- jtag_dr_shift16(data);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2408);//word write
+ jtag_ir_shift_8(IR_ADDR_16BIT);
+ jtag430_shift_addr(adr);
+ jtag_ir_shift_8(IR_DATA_TO_ADDR);
+ jtag_dr_shift_16(data);
SETTCLK;
//Return to read mode.
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2409);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2409);
/*
jtag430_writemem(adr,data);
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2409);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2409);
*/
//Pulse TCLK
//! Power-On Reset
void jtag430_por(){
- unsigned int jtagid;
-
// Perform Reset
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2C01); // apply
- jtag_dr_shift16(0x2401); // remove
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2C01); // apply
+ jtag_dr_shift_16(0x2401); // remove
CLRTCLK;
SETTCLK;
CLRTCLK;
SETTCLK;
CLRTCLK;
- jtagid = jtag_ir_shift8(IR_ADDR_CAPTURE); // get JTAG identifier
+ jtagid = jtag_ir_shift_8(IR_ADDR_CAPTURE); // get JTAG identifier
SETTCLK;
jtag430_writemem(0x0120, 0x5A80); // Diabled Watchdog
jtag430_writemem(adr, 0x55AA);
//Return to read mode.
CLRTCLK;
- jtag_ir_shift8(IR_CNTRL_SIG_16BIT);
- jtag_dr_shift16(0x2409);
+ jtag_ir_shift_8(IR_CNTRL_SIG_16BIT);
+ jtag_dr_shift_16(0x2409);
//Send the pulses.
jtag430_tclk_flashpulses(count);
SETTDI; //430X2
SETTMS;
//SETTDI; //classic
- TCKTOCK;
+ jtag_tcktock();
// Navigate to reset state.
// Should be at least six.
for(i=0;i<4;i++){
- TCKTOCK;
+ jtag_tcktock();
}
// test-logic-reset
CLRTMS;
- TCKTOCK;
+ jtag_tcktock();
SETTMS;
// idle
}
-unsigned char jtagid;
//! Get the JTAG ID
unsigned char jtag430x2_jtagid(){
jtag430_resettap();
- jtagid=jtag_ir_shift8(IR_BYPASS);
+ jtagid = jtag_ir_shift_8(IR_BYPASS);
if(jtagid!=0x89 && jtagid!=0x91){
debugstr("Unknown JTAG ID");
debughex(jtagid);
}
//! Start JTAG, take pins
unsigned char jtag430x2_start(){
- jtagsetup();
+ jtag_setup();
//Known-good starting position.
//Might be unnecessary.
//! Start JTAG, take pins
void jtag430_start(){
- jtagsetup();
+ jtag_setup();
//Known-good starting position.
//Might be unnecessary.
//! Stop JTAG.
void jtag430_stop(){
debugstr("Exiting JTAG.");
- jtagsetup();
+ jtag_setup();
//Known-good starting position.
//Might be unnecessary.
//! Set CPU to Instruction Fetch
void jtag430_setinstrfetch(){
- jtag_ir_shift8(IR_CNTRL_SIG_CAPTURE);
+ jtag_ir_shift_8(IR_CNTRL_SIG_CAPTURE);
// Wait until instruction fetch state.
while(1){
- if (jtag_dr_shift16(0x0000) & 0x0080)
+ if (jtag_dr_shift_16(0x0000) & 0x0080)
return;
CLRTCLK;
SETTCLK;
}
}
-//! Grab the core ID.
-unsigned int jtag430_coreid(){
- jtag_ir_shift8(IR_COREIP_ID);
- return jtag_dr_shift16(0);
-}
-
-//! Grab the device ID.
-unsigned long jtag430_deviceid(){
- jtag_ir_shift8(IR_DEVICE_ID);
- return jtag_dr_shift20(0);
-}
//! Handles classic MSP430 JTAG commands. Forwards others to JTAG.
void jtag430_handle_fn(uint8_t const app,
- uint8_t const verb,
- uint32_t const len)
+ uint8_t const verb,
+ uint32_t const len)
{
unsigned long at, l;
unsigned int i, val;
while((i=jtag430_readmem(0xff0))==0xFFFF){
debugstr("Reconnecting to target MSP430.");
jtag430x2_start();
- PLEDOUT^=PLEDPIN;
+ led_toggle();
}
- PLEDOUT&=~PLEDPIN;
+ led_off();
switch(verb){
case START:
- /* old method, classic MSP430.
- //Enter JTAG mode.
- jtag430x2_start();
- //TAP setup, fuse check
- jtag430_resettap();
+ debugstr("Using JTAG430 (instead of JTAG430X2)!");
- cmddata[0]=jtag_ir_shift8(IR_BYPASS);
- txdata(app,verb,1);
- */
jtag430x2_start();
cmddata[0]=jtagid;
jtag430_resettap();
txdata(app,verb,1);
+
break;
case STOP:
jtag430_stop();
cmddataword[0]=jtag430_readmem(cmddataword[0]);
txdata(app,verb,2);
break;
- /*
- case JTAG430_WRITEFLASH:
-
- //debugstr("Poking flash memory.");
- jtag430_writeflash(cmddataword[0],cmddataword[2]);
-
- //Try again if failure.
- //if(cmddataword[2]!=jtag430_readmem(cmddataword[0]))
- // jtag430_writeflash(cmddataword[0],cmddataword[2]);
-
- //Return result.
- cmddataword[0]=jtag430_readmem(cmddataword[0]);
-
- txdata(app,verb,2);
- break; */
case JTAG430_WRITEFLASH:
at=cmddataword[0];
txdata(app,verb,2);
break;
case JTAG430_COREIP_ID:
- cmddataword[0]=jtag430_coreid();
+ //cmddataword[0]=jtag430_coreid();
+ cmddataword[0]=0xdead;
txdata(app,verb,2);
break;
case JTAG430_DEVICE_ID:
- cmddatalong[0]=jtag430_deviceid();
+ //cmddatalong[0]=jtag430_deviceid();
+ cmddataword[0]=0xdead;
+ cmddataword[1]=0xbeef;
txdata(app,verb,4);
break;
default: