This is an automated email from Gerrit.

"Tomas Vanek <van...@fbl.cz>" just uploaded a new patch set to Gerrit, which 
you can find at https://review.openocd.org/c/openocd/+/8285

-- gerrit

commit f2c30d128044a76fc44631eb45aaa83a4d723907
Author: Tomas Vanek <van...@fbl.cz>
Date:   Fri May 17 21:27:24 2024 +0200

    target/cortex_m: allow poll quickly get out of TARGET_RESET state
    
    cortex_m_poll_one() detects reset testing S_RESET_ST sticky bit.
    If the signal comes unexpectedly, poll must return TARGET_RESET state.
    
    On the contrary in case of polling inside of an OpenOCD reset command,
    TARGET_RESET has been has already been set and we need to get out of
    it as quickly as possible.
    
    The original code needs 2 polls: the first clears S_RESET_ST
    and keeps TARGET_RESET state, the current TARGET_RUNNING or TARGET_HALTED
    is reflected as late as the second poll is done.
    
    Change the logic to keep in TARGET_RESET only when necessary.
    
    See also [1]
    
    Link: [1] 8284: tcl/target: ti_cc3220sf: Use halt for CC3320SF targets | 
https://review.openocd.org/c/openocd/+/8284
    Fixes: https://sourceforge.net/p/openocd/tickets/360/
    Signed-off-by: Tomas Vanek <van...@fbl.cz>
    Change-Id: I759461e5f89ca48a6e16e4b4101570260421dba1

diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c
index c225b1aa9d..7f62a6de2d 100644
--- a/src/target/cortex_m.c
+++ b/src/target/cortex_m.c
@@ -931,8 +931,12 @@ static int cortex_m_poll_one(struct target *target)
                if (target->state != TARGET_RESET) {
                        target->state = TARGET_RESET;
                        LOG_TARGET_INFO(target, "external reset detected");
+                       /* In case of an unexpected S_RESET_ST set TARGET_RESET 
state
+                        * and keep it until the next poll to allow its 
detection */
+                       return ERROR_OK;
                }
-               return ERROR_OK;
+               /* S_RESET_ST was expected (in a reset command). Continue 
processing
+                * to quickly get out of TARGET_RESET state */
        }
 
        if (target->state == TARGET_RESET) {

-- 

Reply via email to