diff options
author | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-08-25 19:59:55 +0000 |
---|---|---|
committer | oharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-08-25 19:59:55 +0000 |
commit | 24f011ebb49dea93110c0fbafc882990f9f05cc7 (patch) | |
tree | 15302ac288063d2d64e2063363e6d7139bc8ffdc /src | |
parent | 86b49612a674ec39cd2c5b1cbdfd87eef62d15e8 (diff) | |
download | openocd+libswd-24f011ebb49dea93110c0fbafc882990f9f05cc7.tar.gz openocd+libswd-24f011ebb49dea93110c0fbafc882990f9f05cc7.tar.bz2 openocd+libswd-24f011ebb49dea93110c0fbafc882990f9f05cc7.tar.xz openocd+libswd-24f011ebb49dea93110c0fbafc882990f9f05cc7.zip |
David Brownell <david-b@pacbell.net> More jtag_add_reset() cleanup:
Unify the handling of the req_srst parameter, and rip out a
large NOP branch and its associated FIXME. (There didn't seem
to be anything that needs fixing; but that was unclear since
the constraints were scattered all over the place not unified.)
git-svn-id: svn://svn.berlios.de/openocd/trunk@2623 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/core.c | 59 |
1 files changed, 23 insertions, 36 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c index 611ea7d6..d278c96b 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -585,9 +585,31 @@ void jtag_add_clocks(int num_cycles) void jtag_add_reset(int req_tlr_or_trst, int req_srst) { int trst_with_tlr = 0; - int new_srst; + int new_srst = 0; int new_trst = 0; + /* Without SRST, we must use target-specific JTAG operations + * on each target; callers should not be requesting SRST when + * that signal doesn't exist. + * + * RESET_SRST_PULLS_TRST is a board or chip level quirk, which + * can kick in even if the JTAG adapter can't drive TRST. + */ + if (req_srst) { + if (!(jtag_reset_config & RESET_HAS_SRST)) { + LOG_ERROR("BUG: can't assert SRST"); + jtag_set_error(ERROR_FAIL); + return; + } + if ((jtag_reset_config & RESET_SRST_PULLS_TRST) != 0 + && !req_tlr_or_trst) { + LOG_ERROR("BUG: can't assert only SRST"); + jtag_set_error(ERROR_FAIL); + return; + } + new_srst = 1; + } + /* 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. @@ -605,41 +627,6 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst) new_trst = 1; } - /* FIX!!! there are *many* different cases here. A better - * approach is needed for legal combinations of transitions... - */ - if ((jtag_reset_config & RESET_HAS_SRST)&& - (jtag_reset_config & RESET_HAS_TRST)&& - ((jtag_reset_config & RESET_SRST_PULLS_TRST) == 0)) - { - if (((req_tlr_or_trst&&!jtag_trst)|| - (!req_tlr_or_trst && jtag_trst))&& - ((req_srst&&!jtag_srst)|| - (!req_srst && jtag_srst))) - { - /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */ - //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined"); - } - } - - /* Make sure that jtag_reset_config allows the requested reset */ - /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */ - if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst)) - { - LOG_ERROR("BUG: requested reset would assert trst"); - jtag_set_error(ERROR_FAIL); - return; - } - - if (req_srst && !(jtag_reset_config & RESET_HAS_SRST)) - { - LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this"); - jtag_set_error(ERROR_FAIL); - return; - } - - new_srst = req_srst; - /* Maybe change TRST and/or SRST signal state */ if (jtag_srst != new_srst || jtag_trst != new_trst) { int retval; |