This is an automated email from Gerrit.

Tomas Vanek ([email protected]) just uploaded a new patch set to Gerrit, which you 
can find at http://openocd.zylin.com/5730

-- gerrit

commit 52fbbdcf46566919af48110aa13c2043970b03f4
Author: Tomas Vanek <[email protected]>
Date:   Fri Mar 1 21:44:27 2019 +0100

    adi_v5_swd: wait for readable DPIDR, ABORT if staled
    
    Reading of DPIDR is the very first operation after JTAG to SWD sequence.
    Without this change if DPIDR read fails then swd connect fails.
    
    Keep trying JTAG to SWD sequence and DPIDR read until success
    or timeout 0.5 sec. It makes setting of adapter srst delay on SWD transport
    mostly unnecessary.
    
    Also test for ERROR_WAIT and if bus is kept stalled then issue abort
    to make connect possible.
    
    Change-Id: Id8fe6618605bbeb4fed5061e987ed55de90a35f2
    Signed-off-by: Tomas Vanek <[email protected]>

diff --git a/src/target/adi_v5_swd.c b/src/target/adi_v5_swd.c
index ee30ff7..858f87a 100644
--- a/src/target/adi_v5_swd.c
+++ b/src/target/adi_v5_swd.c
@@ -118,26 +118,62 @@ static int swd_connect(struct adiv5_dap *dap)
                }
        }
 
-       /* Note, debugport_init() does setup too */
-       swd->switch_seq(JTAG_TO_SWD);
 
-       /* Clear link state, including the SELECT cache. */
-       dap->do_reconnect = false;
-       dap_invalidate_cache(dap);
+       int64_t timeout = timeval_ms() + 500;
 
-       swd_queue_dp_read(dap, DP_DPIDR, &dpidr);
+       do {
+               /* Note, debugport_init() does setup too */
+               swd->switch_seq(JTAG_TO_SWD);
 
-       /* force clear all sticky faults */
-       swd_clear_sticky_errors(dap);
+               /* Clear link state, including the SELECT cache. */
+               dap->do_reconnect = false;
+               dap_invalidate_cache(dap);
+
+               status = swd_queue_dp_read(dap, DP_DPIDR, &dpidr);
+               if (status == ERROR_OK) {
+                       status = swd_run_inner(dap);
+                       if (status == ERROR_OK)
+                               break;
+               }
+
+               alive_sleep(1);
+
+       } while (timeval_ms() < timeout);
 
-       status = swd_run_inner(dap);
+       if (status != ERROR_OK) {
+               LOG_ERROR("Error connecting DP: cannot read IDR");
+               return status;
+       }
+
+       LOG_INFO("SWD DPIDR %#8.8" PRIx32, dpidr);
 
-       if (status == ERROR_OK) {
-               LOG_INFO("SWD DPIDR %#8.8" PRIx32, dpidr);
+       do {
                dap->do_reconnect = false;
+
+               /* force clear all sticky faults */
+               swd_clear_sticky_errors(dap);
+
+               status = swd_run_inner(dap);
+               if (status != ERROR_WAIT) {
+                       break;
+               }
+
+               alive_sleep(10);
+
+       } while (timeval_ms() < timeout);
+
+       if (status == ERROR_WAIT) {
+               LOG_WARNING("Connecting DP: staled AP operation, issuing 
ABORT");
+
+               dap->do_reconnect = false;
+
+               swd->write_reg(swd_cmd(false,  false, DP_ABORT),
+                       DAPABORT | STKCMPCLR | STKERRCLR | WDERRCLR | 
ORUNERRCLR, 0);
+               status = swd_run_inner(dap);
+       }
+
+       if (status == ERROR_OK)
                status = dap_dp_init(dap);
-       } else
-               dap->do_reconnect = true;
 
        return status;
 }

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to