/***************************************************************************
+* Copyright (C) 2009 by Øyvind Harboe *
+* Øyvind Harboe <oyvind.harboe@zylin.com> *
+* *
+* Copyright (C) 2009 by SoftPLC Corporation. http://softplc.com *
+* Dick Hollenbeck <dick@softplc.com> *
+* *
* Copyright (C) 2004, 2006 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
* Copyright (C) 2008 by Spencer Oliver *
* spen@spen-soft.co.uk *
* *
-* Copyright (C) 2009 by SoftPLC Corporation. http://softplc.com *
-* Dick Hollenbeck <dick@softplc.com> *
-* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
assert(tms_count > 0);
-#if 0
- LOG_DEBUG("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d", mpsse_cmd, tms_bits, tms_count);
-#endif
+ DEBUG_JTAG_IO("mpsse cmd=%02x, tms_bits = 0x%08x, bit_count=%d",
+ mpsse_cmd, tms_bits, tms_count);
for (tms_byte = tms_ndx = i = 0; i < tms_count; ++i, tms_bits>>=1)
{
assert((unsigned) num_states <= 32u); /* tms_bits only holds 32 bits */
+ DEBUG_JTAG_IO("-");
+
/* this loop verifies that the path is legal and logs each state in the path */
while (num_states)
{
- unsigned char tms_byte = 0; /* zero this on each MPSSE batch */
-
- int bit_count = 0;
-
- int num_states_batch = num_states > 7 ? 7 : num_states;
+ unsigned char tms_byte = 0; /* zero this on each MPSSE batch */
+ int bit_count = 0;
+ int num_states_batch = num_states > 7 ? 7 : num_states;
/* command "Clock Data to TMS/CS Pin (no Read)" */
buffer_write(0x4b);
/* number of states remaining */
buffer_write(num_states_batch - 1);
- while (num_states_batch--)
- {
- if (tap_state_transition(tap_get_state(), false) == path[state_count])
+ while (num_states_batch--) {
+ /* either TMS=0 or TMS=1 must work ... */
+ if (tap_state_transition(tap_get_state(), false)
+ == path[state_count])
buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
- else if (tap_state_transition(tap_get_state(), true) == path[state_count])
+ else if (tap_state_transition(tap_get_state(), true)
+ == path[state_count])
buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
- else
- {
- LOG_ERROR( "BUG: %s -> %s isn't a valid TAP transition", tap_state_name(
- tap_get_state() ), tap_state_name(path[state_count]) );
+
+ /* ... or else the caller goofed BADLY */
+ else {
+ LOG_ERROR("BUG: %s -> %s isn't a valid "
+ "TAP state transition",
+ tap_state_name(tap_get_state()),
+ tap_state_name(path[state_count]));
exit(-1);
}
- tap_set_state(path[state_count]);
+ tap_set_state(path[state_count]);
state_count++;
num_states--;
}
buffer_write(tms_byte);
- }
+ }
tap_set_end_state(tap_get_state());
}
tms_count = 2;
/* Clock Data to TMS/CS Pin with Read */
mpsse_cmd = 0x6b;
- /* LOG_DEBUG("added TMS scan (read)"); */
}
else
{
tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
/* Clock Data to TMS/CS Pin (no Read) */
mpsse_cmd = 0x4b;
- /* LOG_DEBUG("added TMS scan (no read)"); */
}
+ DEBUG_JTAG_IO("finish %s", (type == SCAN_OUT) ? "without read" : "via PAUSE");
clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
}
/* LOG_DEBUG("added TMS scan (no read)"); */
}
+ DEBUG_JTAG_IO("finish, %s", (type == SCAN_OUT) ? "no read" : "read");
clock_tms(mpsse_cmd, tms_bits, tms_count, last_bit);
}
}
require_send = 1;
-#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("runtest: %i, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(tap_get_end_state()));
-#endif
-
+ DEBUG_JTAG_IO("runtest: %i, end in %s",
+ cmd->cmd.runtest->num_cycles,
+ tap_state_name(tap_get_end_state()));
return retval;
}
int predicted_size = 0;
int retval = ERROR_OK;
- DEBUG_JTAG_IO("statemove end in %i", cmd->cmd.statemove->end_state);
+ DEBUG_JTAG_IO("statemove end in %s",
+ tap_state_name(cmd->cmd.statemove->end_state));
/* only send the maximum buffer size that FT2232C can handle */
predicted_size = 3;
}
ft2232_end_state(cmd->cmd.statemove->end_state);
- /* move to end state */
- if (tap_get_state() != tap_get_end_state())
+ /* For TAP_RESET, ignore the current recorded state. It's often
+ * wrong at server startup, and this transation is critical whenever
+ * it's requested.
+ */
+ if (tap_get_end_state() == TAP_RESET) {
+ clock_tms(0x4b, 0xff, 5, 0);
+ require_send = 1;
+
+ /* shortest-path move to desired end state */
+ } else if (tap_get_state() != tap_get_end_state())
{
move_to_state(tap_get_end_state());
require_send = 1;
require_send = 1;
if (buffer)
free(buffer);
-#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("%s scan, %i bits, end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
+ DEBUG_JTAG_IO("%s scan, %i bits, end in %s",
+ (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
tap_state_name(tap_get_end_state()));
-#endif
return retval;
}
first_unsent = cmd;
}
+ if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
+ {
+ tap_set_state(TAP_RESET);
+ }
+
layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
require_send = 1;
-#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
-#endif
+ DEBUG_JTAG_IO("trst: %i, srst: %i",
+ cmd->cmd.reset->trst, cmd->cmd.reset->srst);
return retval;
}
retval = ERROR_JTAG_QUEUE_FAILED;
first_unsent = cmd->next;
jtag_sleep(cmd->cmd.sleep->us);
-#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("sleep %i usec while in %s", cmd->cmd.sleep->us, tap_state_name(tap_get_state()));
-#endif
-
+ DEBUG_JTAG_IO("sleep %i usec while in %s",
+ cmd->cmd.sleep->us,
+ tap_state_name(tap_get_state()));
return retval;
}
*/
if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
retval = ERROR_JTAG_QUEUE_FAILED;
-#ifdef _DEBUG_JTAG_IO_
- LOG_DEBUG("clocks %i while in %s", cmd->cmd.stableclocks->num_cycles, tap_state_name(tap_get_state()));
-#endif
-
+ DEBUG_JTAG_IO("clocks %i while in %s",
+ cmd->cmd.stableclocks->num_cycles,
+ tap_state_name(tap_get_state()));
return retval;
}