summaryrefslogtreecommitdiff
path: root/src/jtag/core.c
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-25 19:59:55 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2009-08-25 19:59:55 +0000
commit24f011ebb49dea93110c0fbafc882990f9f05cc7 (patch)
tree15302ac288063d2d64e2063363e6d7139bc8ffdc /src/jtag/core.c
parent86b49612a674ec39cd2c5b1cbdfd87eef62d15e8 (diff)
downloadopenocd+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/jtag/core.c')
-rw-r--r--src/jtag/core.c59
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;