X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Ftarget%2Fstm32_stlink.c;h=1c755084749e150cc597264c926981e4b49c570c;hb=7165e05cf64f5c24177239f9f9db577b45f1b52c;hp=b6d4ffa24e6a7826d68f4334b9b5e111cec4b0f6;hpb=b9085389982300529b43ce8abba505ed6ba833c6;p=fw%2Fopenocd diff --git a/src/target/stm32_stlink.c b/src/target/stm32_stlink.c index b6d4ffa24..1c7550847 100644 --- a/src/target/stm32_stlink.c +++ b/src/target/stm32_stlink.c @@ -325,6 +325,7 @@ static int stm32_stlink_load_context(struct target *target) static int stlink_debug_entry(struct target *target) { + struct stlink_interface_s *stlink_if = target_to_stlink(target); struct armv7m_common *armv7m = target_to_armv7m(target); struct arm *arm = &armv7m->arm; struct reg *r; @@ -337,6 +338,9 @@ static int stlink_debug_entry(struct target *target) stm32_stlink_load_context(target); + /* make sure we clear the vector catch bit */ + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, 0); + r = armv7m->core_cache->reg_list + ARMV7M_xPSR; xPSR = buf_get_u32(r->value, 0, 32); @@ -427,7 +431,12 @@ static int stm32_stlink_assert_reset(struct target *target) } stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DHCSR, DBGKEY|C_DEBUGEN); - stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, VC_CORERESET); + + /* only set vector catch if halt is requested */ + if (target->reset_halt) + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, VC_CORERESET); + else + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, 0); if (jtag_reset_config & RESET_HAS_SRST) { if (!srst_asserted) { @@ -443,7 +452,7 @@ static int stm32_stlink_assert_reset(struct target *target) } if (use_srst_fallback) { - /* stlink v1 api does support hardware srst, so we use a software reset fallback */ + /* stlink v1 api does not support hardware srst, so we use a software reset fallback */ stlink_if->layout->api->write_debug_reg(stlink_if->fd, NVIC_AIRCR, AIRCR_VECTKEY | AIRCR_SYSRESETREQ); } @@ -586,6 +595,7 @@ static int stm32_stlink_resume(struct target *target, int current, return res; target->state = TARGET_RUNNING; + target->debug_reason = DBG_REASON_NOTHALTED; target_call_event_callbacks(target, TARGET_EVENT_RESUMED); @@ -754,12 +764,20 @@ static int stm32_stlink_bulk_write_memory(struct target *target, return stm32_stlink_write_memory(target, address, 4, count, buffer); } +static const struct command_registration stm32_stlink_command_handlers[] = { + { + .chain = arm_command_handlers, + }, + COMMAND_REGISTRATION_DONE +}; + struct target_type stm32_stlink_target = { .name = "stm32_stlink", .init_target = stm32_stlink_init_target, .target_create = stm32_stlink_target_create, .examine = cortex_m3_examine, + .commands = stm32_stlink_command_handlers, .poll = stm32_stlink_poll, .arch_state = armv7m_arch_state,