From 86b49612a674ec39cd2c5b1cbdfd87eef62d15e8 Mon Sep 17 00:00:00 2001 From: oharboe Date: Tue, 25 Aug 2009 19:58:06 +0000 Subject: [PATCH] David Brownell More jtag_add_reset() cleanup: Unify the handling of the req_tlr_or_trst parameter. Basically, JTAG TMS+TCK ops ("TLR") is always used ... unless TRST is a safe option in this system configuration. git-svn-id: svn://svn.berlios.de/openocd/trunk@2622 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/jtag/core.c | 35 ++++++++++++++++++----------------- 1 file 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; } -- 2.39.5