summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jtag/core.c35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 06e015c4..611ea7d6 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -588,6 +588,23 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
int new_srst;
int new_trst = 0;
+ /* JTAG reset (entry to TAP_RESET state) can always be achieved
+ * using TCK and TMS; that may go through a TAP_{IR,DR}UPDATE
+ * state first. TRST accelerates it, and bypasses those states.
+ *
+ * RESET_TRST_PULLS_SRST is a board or chip level quirk, which
+ * can kick in even if the JTAG adapter can't drive SRST.
+ */
+ if (req_tlr_or_trst) {
+ if (!(jtag_reset_config & RESET_HAS_TRST))
+ trst_with_tlr = 1;
+ else if ((jtag_reset_config & RESET_TRST_PULLS_SRST) != 0
+ && !req_srst)
+ trst_with_tlr = 1;
+ else
+ new_trst = 1;
+ }
+
/* FIX!!! there are *many* different cases here. A better
* approach is needed for legal combinations of transitions...
*/
@@ -614,12 +631,6 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
return;
}
- /* if TRST pulls SRST, we reset with TAP T-L-R */
- if (((jtag_reset_config & RESET_TRST_PULLS_SRST) && (req_tlr_or_trst)) && (req_srst == 0))
- {
- trst_with_tlr = 1;
- }
-
if (req_srst && !(jtag_reset_config & RESET_HAS_SRST))
{
LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
@@ -627,17 +638,6 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
return;
}
- if (req_tlr_or_trst)
- {
- if (!trst_with_tlr && (jtag_reset_config & RESET_HAS_TRST))
- {
- new_trst = 1;
- } else
- {
- trst_with_tlr = 1;
- }
- }
-
new_srst = req_srst;
/* Maybe change TRST and/or SRST signal state */
@@ -831,6 +831,7 @@ static int jtag_reset_callback(enum jtag_event event, void *priv)
{
tap->enabled = !tap->disabled_after_reset;
+ /* current instruction is either BYPASS or IDCODE */
buf_set_ones(tap->cur_instr, tap->ir_length);
tap->bypass = 1;
}