diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c index 23d9065e2..94c75a1d4 100644 --- a/src/target/cortex_m.c +++ b/src/target/cortex_m.c @@ -1408,8 +1408,9 @@ static int cortex_m_assert_reset(struct target *target) struct armv7m_common *armv7m = &cortex_m->armv7m; enum cortex_m_soft_reset_config reset_config = cortex_m->soft_reset_config; - LOG_TARGET_DEBUG(target, "target->state: %s", - target_state_name(target)); + LOG_TARGET_DEBUG(target, "target->state: %s,%s examined", + target_state_name(target), + target_was_examined(target) ? "" : " not"); enum reset_types jtag_reset_config = jtag_get_reset_config(); @@ -1428,24 +1429,32 @@ static int cortex_m_assert_reset(struct target *target) bool srst_asserted = false; - if (!target_was_examined(target)) { - if (jtag_reset_config & RESET_HAS_SRST) { - adapter_assert_reset(); - if (target->reset_halt) - LOG_TARGET_ERROR(target, "Target not examined, will not halt after reset!"); - return ERROR_OK; - } else { - LOG_TARGET_ERROR(target, "Target not examined, reset NOT asserted!"); - return ERROR_FAIL; - } - } - if ((jtag_reset_config & RESET_HAS_SRST) && - (jtag_reset_config & RESET_SRST_NO_GATING)) { + ((jtag_reset_config & RESET_SRST_NO_GATING) || !armv7m->debug_ap)) { + /* If we have no debug_ap, asserting SRST is the only thing + * we can do now */ adapter_assert_reset(); srst_asserted = true; } + /* We need at least debug_ap to go further. + * Inform user and bail out if we don't have one. */ + if (!armv7m->debug_ap) { + if (srst_asserted) { + if (target->reset_halt) + LOG_TARGET_ERROR(target, "Debug AP not available, will not halt after reset!"); + + /* Do not propagate error: reset was asserted, proceed to deassert! */ + target->state = TARGET_RESET; + register_cache_invalidate(cortex_m->armv7m.arm.core_cache); + return ERROR_OK; + + } else { + LOG_TARGET_ERROR(target, "Debug AP not available, reset NOT asserted!"); + return ERROR_FAIL; + } + } + /* Enable debug requests */ int retval = cortex_m_read_dhcsr_atomic_sticky(target); @@ -1546,7 +1555,7 @@ static int cortex_m_assert_reset(struct target *target) if (retval != ERROR_OK) return retval; - if (target->reset_halt) { + if (target->reset_halt && target_was_examined(target)) { retval = target_halt(target); if (retval != ERROR_OK) return retval; @@ -1559,8 +1568,9 @@ static int cortex_m_deassert_reset(struct target *target) { struct armv7m_common *armv7m = &target_to_cm(target)->armv7m; - LOG_TARGET_DEBUG(target, "target->state: %s", - target_state_name(target)); + LOG_TARGET_DEBUG(target, "target->state: %s,%s examined", + target_state_name(target), + target_was_examined(target) ? "" : " not"); /* deassert reset lines */ adapter_deassert_reset(); @@ -1569,7 +1579,7 @@ static int cortex_m_deassert_reset(struct target *target) if ((jtag_reset_config & RESET_HAS_SRST) && !(jtag_reset_config & RESET_SRST_NO_GATING) && - target_was_examined(target)) { + armv7m->debug_ap) { int retval = dap_dp_init_or_reconnect(armv7m->debug_ap->dap); if (retval != ERROR_OK) {