David Brownell <david-b@pacbell.net> More jtag_add_reset() cleanup:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 25 Aug 2009 19:58:06 +0000 (19:58 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 25 Aug 2009 19:58:06 +0000 (19:58 +0000)
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

index 06e015c4aa03bdea3f412aa6ecdd3e3b35108494..611ea7d6596de74fb62bbee5c1478c63ecfa6034 100644 (file)
@@ -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;
        }