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 <vanekt@fbl.cz> Change-Id: I759461e5f89ca48a6e16e4b4101570260421dba1 Reviewed-on: https://review.openocd.org/c/openocd/+/8285 Tested-by: jenkins Reviewed-by: Dhruva Gole <d-gole@ti.com>
This commit is contained in:
parent
bf4be566a7
commit
4892e32294
|
@ -931,9 +931,13 @@ 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;
|
||||
}
|
||||
/* S_RESET_ST was expected (in a reset command). Continue processing
|
||||
* to quickly get out of TARGET_RESET state */
|
||||
}
|
||||
|
||||
if (target->state == TARGET_RESET) {
|
||||
/* Cannot switch context while running so endreset is
|
||||
|
|
Loading…
Reference in New Issue