aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-24 06:07:55 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-24 06:07:55 +0000
commit06d501a192e36986ba0f81c7ddff9298dd0a389e (patch)
tree073f1ebd2d6d8f0957273ceaacd9e4c0ad4ea5bc
parent1c92ff6a04b27b0aee1058db0b605b73c0dc296c (diff)
wait 500ms for target to halt upon connect.
git-svn-id: svn://svn.berlios.de/openocd/trunk@865 b42882b7-edfa-0310-969c-e2dbd0fdcd60
-rw-r--r--src/server/gdb_server.c7
-rw-r--r--src/target/target.c9
-rw-r--r--src/target/target.h1
3 files changed, 12 insertions, 5 deletions
diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index cea5ad0d..bbcff58c 100644
--- a/src/server/gdb_server.c
+++ b/src/server/gdb_server.c
@@ -509,6 +509,7 @@ int gdb_get_packet_inner(connection_t *connection, char *buffer, int *len)
my_checksum += character & 0xff;
buffer[count++] = character & 0xff;
}
+
}
*len = count;
@@ -678,6 +679,12 @@ int gdb_new_connection(connection_t *connection)
* connect.
*/
target_halt(gdb_service->target);
+ /* FIX!!!! could extended-remote work better here?
+ *
+ * wait a tiny bit for halted state or we just continue. The
+ * GDB register packet will then contain garbage
+ */
+ target_wait_state(gdb_service->target, TARGET_HALTED, 500);
/* remove the initial ACK from the incoming buffer */
if ((retval = gdb_get_char(connection, &initial_ack)) != ERROR_OK)
diff --git a/src/target/target.c b/src/target/target.c
index 506a5d78..e1341a0a 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -1683,7 +1683,6 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args
return ERROR_OK;
}
-static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms);
int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
@@ -1729,11 +1728,12 @@ int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char
return ERROR_OK;
}
}
+ target_t *target = get_current_target(cmd_ctx);
- return wait_state(cmd_ctx, cmd, TARGET_HALTED, ms);
+ return target_wait_state(target, TARGET_HALTED, ms);
}
-static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms)
+int target_wait_state(target_t *target, enum target_state state, int ms)
{
int retval;
struct timeval timeout, now;
@@ -1741,7 +1741,6 @@ static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_
gettimeofday(&timeout, NULL);
timeval_add_time(&timeout, 0, ms * 1000);
- target_t *target = get_current_target(cmd_ctx);
for (;;)
{
if ((retval=target_poll(target))!=ERROR_OK)
@@ -1754,7 +1753,7 @@ static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_
if (once)
{
once=0;
- command_print(cmd_ctx, "waiting for target %s...", target_state_strings[state]);
+ LOG_USER("waiting for target %s...", target_state_strings[state]);
}
gettimeofday(&now, NULL);
diff --git a/src/target/target.h b/src/target/target.h
index f1c61e3b..05dbbb91 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -280,6 +280,7 @@ extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u
extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);
extern int target_checksum_memory(struct target_s *target, u32 address, u32 size, u32* crc);
extern int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank);
+extern int target_wait_state(target_t *target, enum target_state state, int ms);
/* DANGER!!!!!
*