int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
-
int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
if (event == TARGET_EVENT_HALTED)
{
target_unregister_event_callback(target_init_handler, priv);
-
- target_invoke_script(cmd_ctx, target, "reset");
-
+ target_invoke_script(cmd_ctx, target, "post_reset");
jtag_execute_queue();
}
int target_resume(struct target_s *target, int current, u32 address, int handle_breakpoints, int debug_execution)
{
+ int retval;
+ int timeout_ms = 5000;
+
/* We can't poll until after examine */
if (!target->type->examined)
{
LOG_ERROR("Target not examined yet");
return ERROR_FAIL;
}
- return target->type->resume(target, current, address, handle_breakpoints, debug_execution);
+
+ if ((retval = target->type->resume(target, current, address, handle_breakpoints, debug_execution)) != ERROR_OK)
+ return retval;
+
+ /* only check for resume event if normal resume */
+ if (!debug_execution)
+ {
+ /* wait for target to exit halted mode - not debug resume*/
+ target_poll(target);
+
+ while (target->state != TARGET_RUNNING)
+ {
+ usleep(10000);
+ target_poll(target);
+ if ((timeout_ms -= 10) <= 0)
+ {
+ LOG_ERROR("timeout waiting for target resume");
+ return ERROR_TARGET_TIMEOUT;
+ }
+ }
+ }
+
+ return retval;
}
-
int target_process_reset(struct command_context_s *cmd_ctx)
{
int retval = ERROR_OK;
target = target->next;
}
target_unregister_event_callback(target_init_handler, cmd_ctx);
-
jtag->speed(jtag_speed_post_reset);
return target_call_timer_callbacks(0);
}
-
int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
{
working_area_t *c = target->working_areas;
name, get_num_by_target(target));
}
-
int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
target_t *target = NULL;
return ERROR_COMMAND_SYNTAX_ERROR;
}
+ const char *event=args[1];
+ if (strcmp("reset", event)==0)
+ {
+ /* synonymous */
+ event="post_reset";
+ }
+
/* Define a tcl procedure which we'll invoke upon some event */
command_run_linef(cmd_ctx,
"proc target_%s_%d {} {"
- "openocd {script %s}"
+ "openocd {script %s} ; return \"\""
"}",
- args[1],
+ event,
get_num_by_target(target),
args[2]);
return wait_state(cmd_ctx, cmd, TARGET_HALTED, ms);
}
-static void target_process_events(struct command_context_s *cmd_ctx)
-{
- target_t *target = get_current_target(cmd_ctx);
- target_poll(target);
- target_call_timer_callbacks_now();
-}
-
static int wait_state(struct command_context_s *cmd_ctx, char *cmd, enum target_state state, int ms)
{
int retval;
return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
}
-
int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
target_t *target = get_current_target(cmd_ctx);
int retval;
target_t *target = get_current_target(cmd_ctx);
+ target_invoke_script(cmd_ctx, target, "pre_resume");
+
if (argc == 0)
retval = target_resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
else if (argc == 1)
{
return ERROR_COMMAND_SYNTAX_ERROR;
}
-
- target_process_events(cmd_ctx);
return retval;
}
value = strtoul(args[1], NULL, 0);
if (argc == 3)
count = strtoul(args[2], NULL, 0);
-
-
+
switch (cmd[2])
{
case 'w':