diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-08-25 19:58:06 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-08-25 19:58:06 +0000 |
commit | 86b49612a674ec39cd2c5b1cbdfd87eef62d15e8 (patch) | |
tree | 5861c442df90ceb9790b977de11c6d0af3f7f0e1 /src/jtag | |
parent | 6f359fba686f30fef7ef51b2996600738b66b563 (diff) |
David Brownell <david-b@pacbell.net> 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
Diffstat (limited to 'src/jtag')
-rw-r--r-- | src/jtag/core.c | 35 |
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; } |