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(){
// 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
//! 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;
while((i=jtag430_readmem(0xff0))==0xFFFF){
debugstr("Reconnecting to target MSP430.");
jtag430x2_start();
- PLEDOUT^=PLEDPIN;
+ led_toggle();
}
- PLEDOUT&=~PLEDPIN;
+ led_off();
switch(verb){
jtag430_resettap();
txdata(app,verb,1);
+
break;
case STOP:
jtag430_stop();