#include "platform.h"
#include "command.h"
+#include "jtag.h"
#include "jtagarm7.h"
+//! Handles ARM7TDMI JTAG commands. Forwards others to JTAG.
+void jtagarm7_handle_fn( uint8_t const app,
+ uint8_t const verb,
+ uint32_t const len);
+
+// define the jtagarm7 app's app_t
+app_t const jtagarm7_app = {
+
+ /* app number */
+ JTAGARM7,
+
+ /* handle fn */
+ jtagarm7_handle_fn,
+
+ /* name */
+ "JTAGARM7",
+
+ /* desc */
+ "\tThe JTAGARM7 app extends the basic JTAG app with support\n"
+ "\tfor JTAG'ing ARM7TDMI based devices.\n"
+};
+
+unsigned long last_instr = -1;
+unsigned char last_sysstate = 0;
+unsigned char last_ir = -1;
+unsigned char last_scanchain = -1;
+unsigned char tapstate = 15;
+unsigned char current_dbgstate = -1;
+//unsigned char last_halt_debug_state = -1;
+//unsigned long last_halt_pc = -1;
/**** 20-pin Connection Information (pin1 is on top-right for both connectors)****
GoodFET -> 7TDMI 20-pin connector (HE-10 connector)
// ! Start JTAG, setup pins, reset TAP and return IDCODE
void jtagarm7tdmi_start() {
- jtagsetup();
+ jtag_setup();
SETTST;
- jtag_resettap();
+ jtag_reset_tap();
}
u8 jtagarm_shift_ir(u8 ir, u8 flags){
u8 retval = 0;
if (last_ir != ir){
- jtag_goto_shift_ir();
- retval = jtagtransn(ir, 4, LSB|flags);
+ jtag_capture_ir();
+ jtag_shift_register();
+ retval = jtag_trans_n(ir, 4, LSB|flags);
tapstate = RunTest_Idle;
last_ir = ir;
}
if (last_scanchain != chain){
jtagarm_shift_ir(ARM7TDMI_IR_SCAN_N, NORETIDLE);
last_scanchain = chain;
- jtag_goto_shift_dr();
- retval = jtagtransn(chain, 4, LSB | NORETIDLE);
+ jtag_capture_dr();
+ jtag_shift_register();
+ retval = jtag_trans_n(chain, 4, LSB | NORETIDLE);
tapstate = Update_DR;
}
jtagarm_shift_ir(testmode, NORETIDLE);
unsigned long eice_write(unsigned char reg, unsigned long data){
unsigned long retval, temp;
jtagarm7tdmi_scan(2, ARM7TDMI_IR_INTEST);
- jtag_goto_shift_dr();
- retval = jtagtransn(data, 32, LSB| NOEND| NORETIDLE); // send in the data - 32-bits lsb
- temp = jtagtransn(reg, 5, LSB| NOEND| NORETIDLE); // send in the register address - 5 bits lsb
- jtagtransn(1, 1, LSB); // send in the WRITE bit
+ jtag_capture_dr();
+ jtag_shift_register();
+ retval = jtag_trans_n(data, 32, LSB| NOEND| NORETIDLE); // send in the data - 32-bits lsb
+ temp = jtag_trans_n(reg, 5, LSB| NOEND| NORETIDLE); // send in the register address - 5 bits lsb
+ jtag_trans_n(1, 1, LSB); // send in the WRITE bit
tapstate = RunTest_Idle;
return(retval);
}
unsigned long eice_read(unsigned char reg){ // PROVEN
unsigned long temp, retval;
jtagarm7tdmi_scan(2, ARM7TDMI_IR_INTEST);
- jtag_goto_shift_dr(); // send in the register address - 5 bits LSB
- temp = jtagtransn(reg, 5, LSB| NOEND| NORETIDLE);
- jtagtransn(0L, 1, LSB); // clear TDI to select "read only"
- jtag_goto_shift_dr(); // Now shift out the 32 bits
- retval = jtagtransn(0L, 32, LSB); // atmel arm jtag docs pp.10-11: LSB first
+ jtag_capture_dr();
+ jtag_shift_register(); // send in the register address - 5 bits LSB
+ temp = jtag_trans_n(reg, 5, LSB| NOEND| NORETIDLE);
+ jtag_trans_n(0L, 1, LSB); // clear TDI to select "read only"
+ jtag_capture_dr();
+ jtag_shift_register(); // Now shift out the 32 bits
+ retval = jtag_trans_n(0L, 32, LSB); // atmel arm jtag docs pp.10-11: LSB first
tapstate = RunTest_Idle;
return(retval);
//debughex32(instr);
if (last_instr != instr && last_sysstate != breakpt){
- jtag_goto_shift_dr();
+ jtag_capture_dr();
+ jtag_shift_register();
// if the next instruction is to run using MCLK (master clock), set TDI
if (breakpt)
{
jtag_tcktock();
// Now shift in the 32 bits
- retval = jtagtransn(instr, 32, 0); // Must return to RUN-TEST/IDLE state for instruction to enter pipeline, and causes debug clock.
+ retval = jtag_trans_n(instr, 32, 0); // Must return to RUN-TEST/IDLE state for instruction to enter pipeline, and causes debug clock.
tapstate = RunTest_Idle;
last_instr = instr;
last_sysstate = breakpt;
///////////////////////////////////////////////////////////////////////////////////////////////////
//! Handles ARM7TDMI JTAG commands. Forwards others to JTAG.
-void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len){
+void jtagarm7_handle_fn( uint8_t const app,
+ uint8_t const verb,
+ uint32_t const len)
+{
unsigned int val;
switch(verb){
txdata(app,verb,1);
break;
case JTAG_DR_SHIFT:
- jtag_goto_shift_dr();
- cmddatalong[0] = jtagtransn(cmddatalong[1],cmddata[0],cmddata[1]);
+ jtag_capture_dr();
+ jtag_shift_register();
+ cmddatalong[0] = jtag_trans_n(cmddatalong[1],cmddata[0],cmddata[1]);
tapstate = (cmddata[1]&NORETIDLE)>0?Update_DR:RunTest_Idle;
txdata(app,verb,4);
break;
case JTAGARM7_CHAIN0:
jtagarm7tdmi_scan(0, ARM7TDMI_IR_INTEST);
- jtag_goto_shift_dr();
+ jtag_capture_dr();
+ jtag_shift_register();
//debughex32(cmddatalong[0]);
//debughex(cmddataword[4]);
//debughex32(cmddatalong[1]);
//debughex32(cmddatalong[3]);
- cmddatalong[0] = jtagtransn(cmddatalong[0], 32, LSB| NOEND| NORETIDLE);
- cmddatalong[2] = jtagtransn(cmddataword[4], 9, MSB| NOEND| NORETIDLE);
- cmddatalong[1] = jtagtransn(cmddatalong[1], 32, MSB| NOEND| NORETIDLE);
- cmddatalong[3] = jtagtransn(cmddatalong[3], 32, MSB);
+ cmddatalong[0] = jtag_trans_n(cmddatalong[0], 32, LSB| NOEND| NORETIDLE);
+ cmddatalong[2] = jtag_trans_n(cmddataword[4], 9, MSB| NOEND| NORETIDLE);
+ cmddatalong[1] = jtag_trans_n(cmddatalong[1], 32, MSB| NOEND| NORETIDLE);
+ cmddatalong[3] = jtag_trans_n(cmddatalong[3], 32, MSB);
tapstate = RunTest_Idle;
txdata(app,verb,16);
break;
jtagarm7tdmi_set_register(cmddatalong[1], cmddatalong[0]);
txdata(app,verb,4);
break;
- case JTAG_RESETTARGET:
+ case JTAG_RESET_TARGET:
//FIXME: BORKEN
debugstr("RESET TARGET");
CLRTST;
case JTAGARM7_CHIP_ERASE:
*/
default:
- jtaghandle(app,verb,len);
+ (*(jtag_app.handle))(app,verb,len);
}
}