From: Øyvind Harboe Date: Mon, 12 Oct 2009 07:28:56 +0000 (+0200) Subject: Merge commit 'origin/master' X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=026559068d889660ad4545ee28b6561c82c39aea;hp=2d924a59db74f12d210e26abfab629cbcfbfc014;p=fw%2Fopenocd Merge commit 'origin/master' --- diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 00de5fc6f..ad09a0e70 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -2194,10 +2194,13 @@ int gdb_input_inner(connection_t *connection) retval = target_halt(target); if (retval != ERROR_OK) { - /* stop this debug session */ target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT); } gdb_con->ctrl_c = 0; + } else + { + LOG_INFO("The target is not running when halt was requested, stopping GDB."); + target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT); } } diff --git a/src/target/target.c b/src/target/target.c index ced09e900..8bb9371f9 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -378,24 +378,57 @@ target_t* get_current_target(command_context_t *cmd_ctx) int target_poll(struct target_s *target) { + int retval; + /* We can't poll until after examine */ if (!target_was_examined(target)) { /* Fail silently lest we pollute the log */ return ERROR_FAIL; } - return target->type->poll(target); + + retval = target->type->poll(target); + if (retval != ERROR_OK) + return retval; + + if (target->halt_issued) + { + if (target->state == TARGET_HALTED) + { + target->halt_issued = false; + } else + { + long long t = timeval_ms() - target->halt_issued_time; + if (t>1000) + { + target->halt_issued = false; + LOG_INFO("Halt timed out, wake up GDB."); + target_call_event_callbacks(target, TARGET_EVENT_GDB_HALT); + } + } + } + + return ERROR_OK; } int target_halt(struct target_s *target) { + int retval; /* We can't poll until after examine */ if (!target_was_examined(target)) { LOG_ERROR("Target not examined yet"); return ERROR_FAIL; } - return target->type->halt(target); + + retval = target->type->halt(target); + if (retval != ERROR_OK) + return retval; + + target->halt_issued = true; + target->halt_issued_time = timeval_ms(); + + return ERROR_OK; } int target_resume(struct target_s *target, int current, uint32_t address, int handle_breakpoints, int debug_execution) @@ -4236,6 +4269,8 @@ static int target_create(Jim_GetOptInfo *goi) target->display = 1; + target->halt_issued = false; + /* initialize trace information */ target->trace_info = malloc(sizeof(trace_t)); target->trace_info->num_trace_points = 0; diff --git a/src/target/target.h b/src/target/target.h index 6547d4d78..0f8be6f2c 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -148,6 +148,8 @@ typedef struct target_s int display; /* display async info in telnet session. Do not display * lots of halted/resumed info when stepping in debugger. */ + bool halt_issued; /* did we transition to halted state? */ + long long halt_issued_time; /* Note time when halt was issued */ } target_t; enum target_event diff --git a/tcl/target/imx31.cfg b/tcl/target/imx31.cfg index ad99975b3..f579d6e92 100644 --- a/tcl/target/imx31.cfg +++ b/tcl/target/imx31.cfg @@ -1,7 +1,7 @@ # imx31 config # -reset_config trst_and_srst +reset_config trst_and_srst srst_nogate if { [info exists CHIPNAME] } { set _CHIPNAME $CHIPNAME diff --git a/tcl/target/imx35.cfg b/tcl/target/imx35.cfg index 446eef62a..800e142db 100644 --- a/tcl/target/imx35.cfg +++ b/tcl/target/imx35.cfg @@ -1,6 +1,9 @@ # imx35 config # +reset_config trst_and_srst srst_nogate + + if { [info exists CHIPNAME] } { set _CHIPNAME $CHIPNAME } else {