cortexm: Allow to set timeout to wait for halt.
This allows to gain access to devices spending long time in WFI without the need for a reset, at the expense of possible long waiting times. Using Reset means loosing the device runtime context.
This commit is contained in:
parent
9e365a58f7
commit
17b817f37b
|
@ -57,6 +57,7 @@ static bool cmd_swdp_scan(void);
|
||||||
static bool cmd_targets(void);
|
static bool cmd_targets(void);
|
||||||
static bool cmd_morse(void);
|
static bool cmd_morse(void);
|
||||||
static bool cmd_assert_srst(target *t, int argc, const char **argv);
|
static bool cmd_assert_srst(target *t, int argc, const char **argv);
|
||||||
|
static bool cmd_halt_timeout(target *t, int argc, const char **argv);
|
||||||
static bool cmd_hard_srst(void);
|
static bool cmd_hard_srst(void);
|
||||||
#ifdef PLATFORM_HAS_POWER_SWITCH
|
#ifdef PLATFORM_HAS_POWER_SWITCH
|
||||||
static bool cmd_target_power(target *t, int argc, const char **argv);
|
static bool cmd_target_power(target *t, int argc, const char **argv);
|
||||||
|
@ -76,6 +77,7 @@ const struct command_s cmd_list[] = {
|
||||||
{"targets", (cmd_handler)cmd_targets, "Display list of available targets" },
|
{"targets", (cmd_handler)cmd_targets, "Display list of available targets" },
|
||||||
{"morse", (cmd_handler)cmd_morse, "Display morse error message" },
|
{"morse", (cmd_handler)cmd_morse, "Display morse error message" },
|
||||||
{"assert_srst", (cmd_handler)cmd_assert_srst, "Assert SRST until:(never(default)| scan | attach)" },
|
{"assert_srst", (cmd_handler)cmd_assert_srst, "Assert SRST until:(never(default)| scan | attach)" },
|
||||||
|
{"halt_timeout", (cmd_handler)cmd_halt_timeout, "Timeout (ms) to wait until Cortex-M is halted: (Default 2000)" },
|
||||||
{"hard_srst", (cmd_handler)cmd_hard_srst, "Force a pulse on the hard SRST line - disconnects target" },
|
{"hard_srst", (cmd_handler)cmd_hard_srst, "Force a pulse on the hard SRST line - disconnects target" },
|
||||||
#ifdef PLATFORM_HAS_POWER_SWITCH
|
#ifdef PLATFORM_HAS_POWER_SWITCH
|
||||||
{"tpwr", (cmd_handler)cmd_target_power, "Supplies power to the target: (enable|disable)"},
|
{"tpwr", (cmd_handler)cmd_target_power, "Supplies power to the target: (enable|disable)"},
|
||||||
|
@ -93,6 +95,7 @@ static enum assert_srst_t assert_srst;
|
||||||
#ifdef PLATFORM_HAS_DEBUG
|
#ifdef PLATFORM_HAS_DEBUG
|
||||||
bool debug_bmp;
|
bool debug_bmp;
|
||||||
#endif
|
#endif
|
||||||
|
long cortexm_wait_timeout = 2000; /* Timeout to wait for Cortex to react on halt command. */
|
||||||
|
|
||||||
int command_process(target *t, char *cmd)
|
int command_process(target *t, char *cmd)
|
||||||
{
|
{
|
||||||
|
@ -271,6 +274,16 @@ static bool cmd_assert_srst(target *t, int argc, const char **argv)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool cmd_halt_timeout(target *t, int argc, const char **argv)
|
||||||
|
{
|
||||||
|
(void)t;
|
||||||
|
if (argc > 1)
|
||||||
|
cortexm_wait_timeout = atol(argv[1]);
|
||||||
|
gdb_outf("Cortex-M timeout to wait for device haltes: %d\n",
|
||||||
|
cortexm_wait_timeout);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool cmd_hard_srst(void)
|
static bool cmd_hard_srst(void)
|
||||||
{
|
{
|
||||||
target_list_free();
|
target_list_free();
|
||||||
|
|
|
@ -252,7 +252,7 @@ static bool cortexm_forced_halt(target *t)
|
||||||
start_time = platform_time_ms();
|
start_time = platform_time_ms();
|
||||||
/* Try hard to halt the target. STM32F7 in WFI
|
/* Try hard to halt the target. STM32F7 in WFI
|
||||||
needs multiple writes!*/
|
needs multiple writes!*/
|
||||||
while (platform_time_ms() < start_time + 2000) {
|
while (platform_time_ms() < start_time + cortexm_wait_timeout) {
|
||||||
dhcsr = target_mem_read32(t, CORTEXM_DHCSR);
|
dhcsr = target_mem_read32(t, CORTEXM_DHCSR);
|
||||||
if (dhcsr == (CORTEXM_DHCSR_S_HALT | CORTEXM_DHCSR_S_REGRDY |
|
if (dhcsr == (CORTEXM_DHCSR_S_HALT | CORTEXM_DHCSR_S_REGRDY |
|
||||||
CORTEXM_DHCSR_C_HALT | CORTEXM_DHCSR_C_DEBUGEN))
|
CORTEXM_DHCSR_C_HALT | CORTEXM_DHCSR_C_DEBUGEN))
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include "adiv5.h"
|
#include "adiv5.h"
|
||||||
|
|
||||||
|
extern long cortexm_wait_timeout;
|
||||||
/* Private peripheral bus base address */
|
/* Private peripheral bus base address */
|
||||||
#define CORTEXM_PPB_BASE 0xE0000000
|
#define CORTEXM_PPB_BASE 0xE0000000
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue