- jtag_khz/speed are now single parameter only. These are used

from pre/post_reset event scripts. Adding the second parameter was
a mistake seen in retrospect. this gives precise control in post_reset
for *when* the post reset speed is set. The pre_reset event was
added *after* the second parameter to jtag_khz/speed
- the target implementations no longer gets involved in the reset mode
scheme. Either they reset a target into a halted mode or not.
target_process_reset()
detects if the reset halt failed or not.
- tcl target event names are now target_N_name.  Mainly internal
at this early stage, but best to get the naming right now.
- added hardcoded reset modes from gdb_server.c. I don't know precisely what
these defaults should be or if it should be made configurable. Perhaps some
hardcoded defaults will do for now and it can be made configurable later.
- bugfix in cortex_m3.c for reset_run_and_xxx?
- issue syntax error upon obsolete argument in target command instead of
printing message that will surely drown in the log

git-svn-id: svn://svn.berlios.de/openocd/trunk@849 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
oharboe
2008-07-21 15:59:41 +00:00
parent c1ee650a9a
commit dfbb9f3e89
18 changed files with 156 additions and 155 deletions

View File

@@ -284,14 +284,12 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_
return retval;
}
int target_process_reset(struct command_context_s *cmd_ctx)
int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
{
int retval = ERROR_OK;
target_t *target;
struct timeval timeout, now;
jtag->speed(jtag_speed);
target = targets;
while (target)
{
@@ -318,30 +316,7 @@ int target_process_reset(struct command_context_s *cmd_ctx)
return retval;
keep_alive(); /* we might be running on a very slow JTAG clk */
/* prepare reset_halt where necessary */
target = targets;
while (target)
{
if (jtag_reset_config & RESET_SRST_PULLS_TRST)
{
switch (target->reset_mode)
{
case RESET_HALT:
command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_halt\"");
target->reset_mode = RESET_RUN_AND_HALT;
break;
case RESET_INIT:
command_print(cmd_ctx, "nSRST pulls nTRST, falling back to \"reset run_and_init\"");
target->reset_mode = RESET_RUN_AND_INIT;
break;
default:
break;
}
}
target = target->next;
}
target = targets;
while (target)
{
@@ -349,6 +324,7 @@ int target_process_reset(struct command_context_s *cmd_ctx)
* have to drop working areas
*/
target_free_all_working_areas_restore(target, 0);
target->reset_halt=((reset_mode==RESET_HALT)||(reset_mode==RESET_INIT));
target->type->assert_reset(target);
target = target->next;
}
@@ -362,7 +338,7 @@ int target_process_reset(struct command_context_s *cmd_ctx)
target = targets;
while (target)
{
switch (target->reset_mode)
switch (reset_mode)
{
case RESET_RUN:
/* nothing to do if target just wants to be run */
@@ -377,10 +353,12 @@ int target_process_reset(struct command_context_s *cmd_ctx)
target_register_event_callback(target_init_handler, cmd_ctx);
break;
case RESET_HALT:
target_halt(target);
if ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)
target_halt(target);
break;
case RESET_INIT:
target_halt(target);
if ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)
target_halt(target);
target_register_event_callback(target_init_handler, cmd_ctx);
break;
default:
@@ -399,6 +377,14 @@ int target_process_reset(struct command_context_s *cmd_ctx)
while (target)
{
target->type->deassert_reset(target);
/* We can fail to bring the target into the halted state */
target_poll(target);
if (target->reset_halt&&((target->state != TARGET_HALTED)))
{
LOG_WARNING("Failed to reset target into halted mode - issuing halt");
target->type->halt(target);
}
target = target->next;
}
@@ -415,12 +401,6 @@ int target_process_reset(struct command_context_s *cmd_ctx)
return retval;
}
/* post reset scripts can be quite long, increase speed now. If post
* reset scripts needs a different speed, they can set the speed to
* whatever they need.
*/
jtag->speed(jtag_speed_post_reset);
LOG_DEBUG("Waiting for halted stated as approperiate");
/* Wait for reset to complete, maximum 5 seconds. */
@@ -437,10 +417,10 @@ int target_process_reset(struct command_context_s *cmd_ctx)
{
LOG_DEBUG("Polling target");
target_poll(target);
if ((target->reset_mode == RESET_RUN_AND_INIT) ||
(target->reset_mode == RESET_RUN_AND_HALT) ||
(target->reset_mode == RESET_HALT) ||
(target->reset_mode == RESET_INIT))
if ((reset_mode == RESET_RUN_AND_INIT) ||
(reset_mode == RESET_RUN_AND_HALT) ||
(reset_mode == RESET_HALT) ||
(reset_mode == RESET_INIT))
{
if (target->state != TARGET_HALTED)
{
@@ -477,7 +457,6 @@ int target_process_reset(struct command_context_s *cmd_ctx)
}
target_unregister_event_callback(target_init_handler, cmd_ctx);
return retval;
}
@@ -1420,23 +1399,28 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
if (strcmp(args[2], "reset_halt") == 0)
{
LOG_WARNING("reset_mode argument is deprecated. reset_mode = reset_run");
LOG_WARNING("reset_mode argument is obsolete.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
else if (strcmp(args[2], "reset_run") == 0)
{
LOG_WARNING("reset_mode argument is deprecated. reset_mode = reset_run");
LOG_WARNING("reset_mode argument is obsolete.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
else if (strcmp(args[2], "reset_init") == 0)
{
LOG_WARNING("reset_mode argument is deprecated. reset_mode = reset_run");
LOG_WARNING("reset_mode argument is obsolete.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
else if (strcmp(args[2], "run_and_halt") == 0)
{
LOG_WARNING("reset_mode argument is deprecated. reset_mode = reset_run");
LOG_WARNING("reset_mode argument is obsolete.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
else if (strcmp(args[2], "run_and_init") == 0)
{
LOG_WARNING("reset_mode argument is deprecated. reset_mode = reset_run");
LOG_WARNING("reset_mode argument is obsolete.");
return ERROR_COMMAND_SYNTAX_ERROR;
}
else
{
@@ -1492,9 +1476,9 @@ int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **a
int target_invoke_script(struct command_context_s *cmd_ctx, target_t *target, char *name)
{
return command_run_linef(cmd_ctx, " if {[catch {info body target_%s_%d} t]==0} {target_%s_%d}",
name, get_num_by_target(target),
name, get_num_by_target(target));
return command_run_linef(cmd_ctx, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
get_num_by_target(target), name,
get_num_by_target(target), name);
}
int handle_run_and_halt_time_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
@@ -1848,11 +1832,8 @@ int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **ar
}
}
/* temporarily modify mode of current reset target */
target->reset_mode = reset_mode;
/* reset *all* targets */
target_process_reset(cmd_ctx);
target_process_reset(cmd_ctx, reset_mode);
return ERROR_OK;
}