* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
- * Copyright (C) 2007,2008 Øyvind Harboe *
+ * Copyright (C) 2007,2008 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
+ * Copyright (C) 2008, Duane Ellis *
+ * openocd@duaneeellis.com *
+ * *
+ * Copyright (C) 2008 by Spencer Oliver *
+ * spen@spen-soft.co.uk *
+ * *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
}
const Jim_Nvp nvp_target_event[] = {
- { .value = TARGET_EVENT_OLD_pre_reset , .name = "old-pre_reset" },
{ .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
- { .value = TARGET_EVENT_OLD_post_reset , .name = "old-post_reset" },
{ .value = TARGET_EVENT_OLD_pre_resume , .name = "old-pre_resume" },
-
+
+ { .value = TARGET_EVENT_EARLY_HALTED, .name = "early-halted" },
{ .value = TARGET_EVENT_HALTED, .name = "halted" },
{ .value = TARGET_EVENT_RESUMED, .name = "resumed" },
{ .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
{ .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
{ .value = TARGET_EVENT_EXAMINE_START, .name = "examine-end" },
-
+
{ .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
{ .value = TARGET_EVENT_DEBUG_RESUMED, .name = "debug-resumed" },
while (target){
if( target->target_number == num ){
return target;
- }
+ }
target = target->next;
}
return retval;
}
-// Next patch - this turns into TCL...
+
int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
{
- int retval = ERROR_OK;
- target_t *target;
-
- target = all_targets;
-
- target_all_handle_event( TARGET_EVENT_OLD_pre_reset );
-
- if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
- return retval;
-
- keep_alive(); /* we might be running on a very slow JTAG clk */
-
- /* First time this is executed after launching OpenOCD, it will read out
- * the type of CPU, etc. and init Embedded ICE registers in host
- * memory.
- *
- * It will also set up ICE registers in the target.
- *
- * However, if we assert TRST later, we need to set up the registers again.
- *
- * For the "reset halt/init" case we must only set up the registers here.
- */
- if ((retval = target_examine()) != ERROR_OK)
- return retval;
-
- keep_alive(); /* we might be running on a very slow JTAG clk */
-
- target = all_targets;
- while (target)
- {
- /* we have no idea what state the target is in, so we
- * have to drop working areas
- */
- target_free_all_working_areas_restore(target, 0);
- target->reset_halt=((reset_mode==RESET_HALT)||(reset_mode==RESET_INIT));
- if ((retval = target->type->assert_reset(target))!=ERROR_OK)
- return retval;
- target = target->next;
- }
-
- target = all_targets;
- while (target)
- {
- if ((retval = target->type->deassert_reset(target))!=ERROR_OK)
- return retval;
- target = target->next;
- }
-
- target = all_targets;
- while (target)
- {
- /* We can fail to bring the target into the halted state, try after reset has been deasserted */
- if (target->reset_halt)
- {
- /* wait up to 1 second for halt. */
- target_wait_state(target, TARGET_HALTED, 1000);
- if (target->state != TARGET_HALTED)
- {
- LOG_WARNING("Failed to reset target into halted mode - issuing halt");
- if ((retval = target->type->halt(target))!=ERROR_OK)
- return retval;
- }
- }
-
- target = target->next;
+ char buf[100];
+ int retval;
+ Jim_Nvp *n;
+ n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode );
+ if( n->name == NULL ){
+ LOG_ERROR("invalid reset mode");
+ return ERROR_FAIL;
}
+ sprintf( buf, "ocd_process_reset %s", n->name );
+ retval = Jim_Eval( interp, buf );
- LOG_DEBUG("Waiting for halted stated as appropriate");
-
- if ((reset_mode == RESET_HALT) || (reset_mode == RESET_INIT))
- {
- target = all_targets;
- while (target)
- {
- /* Wait for reset to complete, maximum 5 seconds. */
- if (((retval=target_wait_state(target, TARGET_HALTED, 5000)))==ERROR_OK)
- {
- if (reset_mode == RESET_INIT){
- target_handle_event( target, TARGET_EVENT_OLD_post_reset );
- }
-
- }
- target = target->next;
- }
+ if(retval != JIM_OK) {
+ Jim_PrintErrorMessage(interp);
+ return ERROR_FAIL;
}
/* We want any events to be processed before the prompt */
- target_call_timer_callbacks_now();
+ retval = target_call_timer_callbacks_now();
return retval;
}
+
static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical)
{
*physical = virtual;
int target_init(struct command_context_s *cmd_ctx)
{
target_t *target = all_targets;
+ int retval;
while (target)
{
target->type->examine = default_examine;
}
- if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
+ if ((retval = target->type->init_target(cmd_ctx, target)) != ERROR_OK)
{
LOG_ERROR("target '%s' init failed", target->type->name);
- exit(-1);
+ return retval;
}
/* Set up default functions if none are provided by target */
if (all_targets)
{
- target_register_user_commands(cmd_ctx);
- target_register_timer_callback(handle_target, 100, 1, NULL);
+ if((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
+ return retval;
+ if((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
+ return retval;
}
return ERROR_OK;
target_event_callback_t *callback = target_event_callbacks;
target_event_callback_t *next_callback;
- LOG_DEBUG("target event %i (%s)",
- event,
+ if (event == TARGET_EVENT_HALTED)
+ {
+ /* execute early halted first */
+ target_call_event_callbacks(target, TARGET_EVENT_EARLY_HALTED);
+ }
+
+
+ LOG_DEBUG("target event %i (%s)",
+ event,
Jim_Nvp_value2name_simple( nvp_target_event, event )->name );
target_handle_event( target, event );
}
}
else
- target_unregister_timer_callback(callback->callback, callback->priv);
+ {
+ int retval;
+ if((retval = target_unregister_timer_callback(callback->callback, callback->priv)) != ERROR_OK)
+ return retval;
+ }
}
}
/* invoke periodic callbacks immediately */
int target_call_timer_callbacks_now(void)
{
- return target_call_timer_callbacks();
+ return target_call_timer_callbacks_check_time(0);
}
int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area)
if (target->backup_working_area)
{
+ int retval;
new_wa->backup = malloc(new_wa->size);
- target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup);
+ if((retval = target->type->read_memory(target, new_wa->address, 4, new_wa->size / 4, new_wa->backup)) != ERROR_OK)
+ {
+ free(new_wa->backup);
+ free(new_wa);
+ return retval;
+ }
}
else
{
return ERROR_OK;
if (restore&&target->backup_working_area)
- target->type->write_memory(target, area->address, 4, area->size / 4, area->backup);
+ {
+ int retval;
+ if((retval = target->type->write_memory(target, area->address, 4, area->size / 4, area->backup)) != ERROR_OK)
+ return retval;
+ }
area->free = 1;
return target_free_working_area_restore(target, area, 1);
}
-int target_free_all_working_areas_restore(struct target_s *target, int restore)
+/* free resources and restore memory, if restoring memory fails,
+ * free up resources anyway
+ */
+void target_free_all_working_areas_restore(struct target_s *target, int restore)
{
working_area_t *c = target->working_areas;
}
target->working_areas = NULL;
-
- return ERROR_OK;
}
-int target_free_all_working_areas(struct target_s *target)
+void target_free_all_working_areas(struct target_s *target)
{
- return target_free_all_working_areas_restore(target, 1);
+ target_free_all_working_areas_restore(target, 1);
}
int target_register_commands(struct command_context_s *cmd_ctx)
{
- register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
- register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
- register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "virt2phys <virtual address>");
- register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "PRELIMINARY! - profile <seconds> <gmon.out>");
+ register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, "change the current command line target (one parameter) or lists targets (with no parameter)");
+ register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "set a new working space");
+ register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "translate a virtual address into a physical address");
+ register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "profiling samples the CPU PC");
register_jim(cmd_ctx, "target", jim_target, "configure target" );
return ERROR_OK;
}
- LOG_USER("target state: %s",
+ LOG_USER("target state: %s",
Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name);
if (target->state!=TARGET_HALTED)
}
if ((retval = target->type->checksum_memory(target, address,
- size, &checksum)) == ERROR_TARGET_RESOURCE_NOT_AVAILABLE)
+ size, &checksum)) != ERROR_OK)
{
buffer = malloc(size);
if (buffer == NULL)
LOG_DEBUG("address: 0x%8.8x, value: 0x%2.2x", address, value);
- if ((retval = target->type->read_memory(target, address, 1, 1, &value)) != ERROR_OK)
+ if ((retval = target->type->write_memory(target, address, 1, 1, &value)) != ERROR_OK)
{
LOG_DEBUG("failed: %i", retval);
}
int target_register_user_commands(struct command_context_s *cmd_ctx)
{
- register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, NULL);
+ int retval = ERROR_OK;
+ register_command(cmd_ctx, NULL, "reg", handle_reg_command, COMMAND_EXEC, "display or set a register");
register_command(cmd_ctx, NULL, "poll", handle_poll_command, COMMAND_EXEC, "poll target state");
register_command(cmd_ctx, NULL, "wait_halt", handle_wait_halt_command, COMMAND_EXEC, "wait for target halt [time (s)]");
register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target");
register_command(cmd_ctx, NULL, "dump_image", handle_dump_image_command, COMMAND_EXEC, "dump_image <file> <address> <size>");
register_command(cmd_ctx, NULL, "verify_image", handle_verify_image_command, COMMAND_EXEC, "verify_image <file> [offset] [type]");
- target_request_register_commands(cmd_ctx);
- trace_register_commands(cmd_ctx);
+ if((retval = target_request_register_commands(cmd_ctx)) != ERROR_OK)
+ return retval;
+ if((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
+ return retval;
+
- return ERROR_OK;
+ return retval;
}
int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
if( 0 == strcmp( args[0], target->cmd_name ) ){
/* MATCH */
goto Match;
- }
+ }
}
}
/* no match, try as number */
-
+
int num = strtoul(args[0], &cp, 0 );
if( *cp != 0 ){
/* then it was not a number */
command_print( cmd_ctx, "Target: %s unknown, try one of:\n", args[0] );
goto DumpTargets;
}
-
+
target = get_target_by_num( num );
if( target == NULL ){
command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
while (target)
{
/* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
- command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %8d %s",
+ command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %8d %s",
target->target_number,
target->cmd_name,
- target->type->name,
- Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
+ target->type->name,
+ Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
target->chain_position,
Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
target = target->next;
int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
+ int retval = ERROR_OK;
target_t *target = NULL;
if ((argc < 4) || (argc > 5))
return ERROR_COMMAND_SYNTAX_ERROR;
}
- return ERROR_OK;
+ return retval;
}
/* process target state changes */
int handle_target(void *priv)
{
+ int retval = ERROR_OK;
target_t *target = all_targets;
while (target)
if (target_continous_poll)
{
/* polling may fail silently until the target has been examined */
- target_poll(target);
+ if((retval = target_poll(target)) != ERROR_OK)
+ return retval;
}
target = target->next;
}
- return ERROR_OK;
+ return retval;
}
int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
if (reg->valid == 0)
{
reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
- if (arch_type == NULL)
- {
- LOG_ERROR("BUG: encountered unregistered arch type");
- return ERROR_OK;
- }
arch_type->get(reg);
}
value = buf_to_str(reg->value, reg->size, 16);
str_to_buf(args[1], strlen(args[1]), buf, reg->size, 0);
reg_arch_type_t *arch_type = register_get_arch_type(reg->arch_type);
- if (arch_type == NULL)
- {
- LOG_ERROR("BUG: encountered unregistered arch type");
- return ERROR_OK;
- }
-
arch_type->set(reg, buf);
value = buf_to_str(reg->value, reg->size, 16);
int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
+ int retval = ERROR_OK;
target_t *target = get_current_target(cmd_ctx);
if (argc == 0)
{
- target_poll(target);
- target_arch_state(target);
+ if((retval = target_poll(target)) != ERROR_OK)
+ return retval;
+ if((retval = target_arch_state(target)) != ERROR_OK)
+ return retval;
+
}
- else
+ else if (argc==1)
{
if (strcmp(args[0], "on") == 0)
{
{
command_print(cmd_ctx, "arg is \"on\" or \"off\"");
}
+ } else
+ {
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
- return ERROR_OK;
+ return retval;
}
int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
if (once)
{
once=0;
- LOG_DEBUG("waiting for target %s...",
+ LOG_DEBUG("waiting for target %s...",
Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
}
gettimeofday(&now, NULL);
if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
{
- LOG_ERROR("timed out while waiting for target %s",
+ LOG_ERROR("timed out while waiting for target %s",
Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
return ERROR_FAIL;
}
return target_process_reset(cmd_ctx, reset_mode);
}
+
int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{
int retval;
default:
return ERROR_OK;
}
+ keep_alive();
+
if (retval!=ERROR_OK)
{
return retval;
u32 min_address=0;
u32 max_address=0xffffffff;
int i;
- int retval;
+ int retval, retvaltemp;
image_t image;
free(buffer);
}
- duration_stop_measure(&duration, &duration_text);
+ if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+ {
+ image_close(&image);
+ return retvaltemp;
+ }
+
if (retval==ERROR_OK)
{
command_print(cmd_ctx, "downloaded %u byte in %s", image_size, duration_text);
u32 address;
u32 size;
u8 buffer[560];
- int retval=ERROR_OK;
+ int retval=ERROR_OK, retvaltemp;
duration_t duration;
char *duration_text;
address += this_run_size;
}
- fileio_close(&fileio);
+ if((retvaltemp = fileio_close(&fileio)) != ERROR_OK)
+ return retvaltemp;
+
+ if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+ return retvaltemp;
- duration_stop_measure(&duration, &duration_text);
if (retval==ERROR_OK)
{
command_print(cmd_ctx, "dumped %"PRIi64" byte in %s", fileio.size, duration_text);
u32 buf_cnt;
u32 image_size;
int i;
- int retval;
+ int retval, retvaltemp;
u32 checksum = 0;
u32 mem_checksum = 0;
retval=ERROR_FAIL;
goto done;
}
+ if ((t%16384)==0)
+ {
+ keep_alive();
+ }
}
}
image_size += buf_cnt;
}
done:
- duration_stop_measure(&duration, &duration_text);
+
+ if((retvaltemp = duration_stop_measure(&duration, &duration_text)) != ERROR_OK)
+ {
+ image_close(&image);
+ return retvaltemp;
+ }
+
if (retval==ERROR_OK)
{
command_print(cmd_ctx, "verified %u bytes in %s", image_size, duration_text);
} else if (target->state == TARGET_RUNNING)
{
// We want to quickly sample the PC.
- target_halt(target);
+ if((retval = target_halt(target)) != ERROR_OK)
+ {
+ free(samples);
+ return retval;
+ }
} else
{
command_print(cmd_ctx, "Target not halted or running");
if ((numSamples>=maxSample) || ((now.tv_sec >= timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
{
command_print(cmd_ctx, "Profiling completed. %d samples.", numSamples);
- target_poll(target);
+ if((retval = target_poll(target)) != ERROR_OK)
+ {
+ free(samples);
+ return retval;
+ }
if (target->state == TARGET_HALTED)
{
target_resume(target, 1, 0, 0, 0); /* current pc, addr = 0, do not handle breakpoints, not debugging */
}
- target_poll(target);
+ if((retval = target_poll(target)) != ERROR_OK)
+ {
+ free(samples);
+ return retval;
+ }
writeGmon(samples, numSamples, args[1]);
command_print(cmd_ctx, "Wrote %s", args[1]);
break;
{
command_context_t *context;
target_t *target;
-
+
context = Jim_GetAssocData(interp, "context");
if (context == NULL){
LOG_ERROR("array2mem: no command context");
LOG_ERROR("array2mem: no current target");
return JIM_ERR;
}
-
+
return target_array2mem( interp,target, argc, argv );
}
-
+
static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
{
target_t *target;
- LOG_DEBUG( "**all*targets: event: %d, %s",
+ LOG_DEBUG( "**all*targets: event: %d, %s",
e,
Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
e,
Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
Jim_GetString( teap->body, NULL ) );
- Jim_EvalObj( interp, teap->body );
+ if (Jim_EvalObj( interp, teap->body )!=JIM_OK)
+ {
+ Jim_PrintErrorMessage(interp);
+ }
}
teap = teap->next;
}
if( !done ){
- LOG_DEBUG( "event: %d %s - no action",
+ LOG_DEBUG( "event: %d %s - no action",
e,
Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
}
enum target_cfg_param {
TCFG_TYPE,
- TCFG_EVENT,
- TCFG_RESET,
+ TCFG_EVENT,
TCFG_WORK_AREA_VIRT,
TCFG_WORK_AREA_PHYS,
TCFG_WORK_AREA_SIZE,
static Jim_Nvp nvp_config_opts[] = {
{ .name = "-type", .value = TCFG_TYPE },
{ .name = "-event", .value = TCFG_EVENT },
- { .name = "-reset", .value = TCFG_RESET },
{ .name = "-work-area-virt", .value = TCFG_WORK_AREA_VIRT },
{ .name = "-work-area-phys", .value = TCFG_WORK_AREA_PHYS },
{ .name = "-work-area-size", .value = TCFG_WORK_AREA_SIZE },
{ .name = "-endian" , .value = TCFG_ENDIAN },
{ .name = "-variant", .value = TCFG_VARIANT },
{ .name = "-chain-position", .value = TCFG_CHAIN_POSITION },
-
+
{ .name = NULL, .value = -1 }
};
-
+
static int
target_configure( Jim_GetOptInfo *goi,
/* parse config or cget options ... */
- while( goi->argc ){
+ while( goi->argc > 0 ){
Jim_SetEmptyResult( goi->interp );
//Jim_GetOpt_Debug( goi );
}
if( goi->isconfigure ){
- if( goi->argc == 0 ){
+ if( goi->argc != 1 ){
Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
return JIM_ERR;
- }
+ }
} else {
if( goi->argc != 0 ){
Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
}
}
-
- {
+
+ {
target_event_action_t *teap;
-
+
teap = target->event_action;
/* replace existing? */
while( teap ){
}
teap = teap->next;
}
-
+
if( goi->isconfigure ){
if( teap == NULL ){
/* create new */
}
teap->body = Jim_DuplicateObj( goi->interp, o );
/*
- * FIXME:
+ * FIXME:
* Tcl/TK - "tk events" have a nice feature.
* See the "BIND" command.
* We should support that here.
/* loop for more */
break;
- case TCFG_RESET:
- if( goi->isconfigure ){
- e = Jim_GetOpt_Nvp( goi, nvp_reset_modes, &n );
- if( e != JIM_OK ){
- Jim_GetOpt_NvpUnknown( goi, nvp_reset_modes, 1 );
- return e;
- }
- if( n->value == RESET_UNKNOWN ){
- Jim_SetResultString( interp, "'unknown' is not a valid selection",-1);
- return JIM_ERR;
- }
- target->reset_mode = n->value;
- } else {
- if( goi->argc != 0 ){
- goto no_params;
- }
- }
- n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
- if( n->name == NULL ){
- target->reset_mode = RESET_HALT;
- n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
- }
- Jim_SetResultString( goi->interp, n->name, -1 );
- /* loop for more */
- break;
-
case TCFG_WORK_AREA_VIRT:
if( goi->isconfigure ){
target_free_all_working_areas(target);
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
/* loop for more */
break;
-
+
case TCFG_WORK_AREA_PHYS:
if( goi->isconfigure ){
target_free_all_working_areas(target);
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
/* loop for more */
break;
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
/* loop for more */
break;
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
/* loop for more e*/
break;
if( n->name == NULL ){
target->endianness = TARGET_LITTLE_ENDIAN;
n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
- }
+ }
Jim_SetResultString( goi->interp, n->name, -1 );
/* loop for more */
break;
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResultString( goi->interp, target->variant,-1 );
/* loop for more */
break;
if( goi->argc != 0 ){
goto no_params;
}
- }
+ }
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->chain_position ) );
/* loop for more e*/
break;
}
- }
- /* done - we return */
+ } /* while( goi->argc ) */
+ /* done - we return */
return JIM_OK;
}
/** this is the 'tcl' handler for the target specific command */
static int
tcl_target_func( Jim_Interp *interp,
- int argc,
+ int argc,
Jim_Obj *const *argv )
{
Jim_GetOptInfo goi;
enum {
TS_CMD_CONFIGURE,
TS_CMD_CGET,
-
+
TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
- TS_CMD_EXAMINE,
+ TS_CMD_EXAMINE,
TS_CMD_POLL,
TS_CMD_RESET,
TS_CMD_HALT,
TS_CMD_WAITSTATE,
TS_CMD_EVENTLIST,
TS_CMD_CURSTATE,
+ TS_CMD_INVOKE_EVENT,
};
-
+
static const Jim_Nvp target_options[] = {
{ .name = "configure", .value = TS_CMD_CONFIGURE },
{ .name = "cget", .value = TS_CMD_CGET },
{ .name = "arp_reset", .value = TS_CMD_RESET },
{ .name = "arp_halt", .value = TS_CMD_HALT },
{ .name = "arp_waitstate", .value = TS_CMD_WAITSTATE },
+ { .name = "invoke-event", .value = TS_CMD_INVOKE_EVENT },
{ .name = NULL, .value = -1 },
};
* argv[2] = data
* argv[3] = optional count.
*/
-
+
if( (goi.argc == 3) || (goi.argc == 4) ){
/* all is well */
} else {
Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
return JIM_ERR;
}
-
+
e = Jim_GetOpt_Wide( &goi, &a );
if( e != JIM_OK ){
goto mwx_error;
} else {
c = 1;
}
-
+
switch( n->value ){
case TS_CMD_MWW:
target_buffer_set_u32( target, target_buf, b );
Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
return JIM_ERR;
}
-
+
Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
switch( b ){
case 4:
}
/* ascii-ify the bytes */
for( x = 0 ; x < y ; x++ ){
- if( (target_buf[x] >= 0x20) &&
+ if( (target_buf[x] >= 0x20) &&
(target_buf[x] <= 0x7e) ){
/* good */
} else {
break;
case TS_CMD_EXAMINE:
if( goi.argc ){
- Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+ Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
return JIM_ERR;
}
e = target->type->examine( target );
return JIM_OK;
case TS_CMD_POLL:
if( goi.argc ){
- Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+ Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]");
return JIM_ERR;
}
if( !(target->type->examined) ){
}
break;
case TS_CMD_RESET:
- if( goi.argc != 1 ){
- Jim_WrongNumArgs( interp, 1, argv, "reset t|f|assert|deassert");
+ if( goi.argc != 2 ){
+ Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL");
return JIM_ERR;
}
e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
return e;
}
+ // the halt or not param
+ e = Jim_GetOpt_Wide( &goi, &a);
+ if( e != JIM_OK ){
+ return e;
+ }
+ // determine if we should halt or not.
+ target->reset_halt = !!a;
// When this happens - all workareas are invalid.
target_free_all_working_areas_restore(target, 0);
target->type->halt( target );
return JIM_OK;
case TS_CMD_WAITSTATE:
- // params: <name> statename timeoutmsecs
+ // params: <name> statename timeoutmsecs
if( goi.argc != 2 ){
Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
return JIM_ERR;
return e;
}
e = target_wait_state( target, n->value, a );
- if( e == ERROR_OK ){
+ if( e != ERROR_OK ){
Jim_SetResult_sprintf( goi.interp,
- "target: %s wait %s fails %d",
+ "target: %s wait %s fails (%d) %s",
target->cmd_name,
n->name,
- target_strerror_safe(e) );
+ e, target_strerror_safe(e) );
return JIM_ERR;
} else {
return JIM_OK;
target_event_action_t *teap;
teap = target->event_action;
command_print( cmd_ctx, "Event actions for target (%d) %s\n",
- target->target_number,
+ target->target_number,
target->cmd_name );
command_print( cmd_ctx, "%-25s | Body", "Event");
command_print( cmd_ctx, "------------------------- | ----------------------------------------");
while( teap ){
- command_print( cmd_ctx,
+ command_print( cmd_ctx,
"%-25s | %s",
Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
Jim_GetString( teap->body, NULL ) );
Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
return JIM_ERR;
}
- Jim_SetResultString( goi.interp,
+ Jim_SetResultString( goi.interp,
Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
return JIM_OK;
+ case TS_CMD_INVOKE_EVENT:
+ if( goi.argc != 1 ){
+ Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->name);
+ return JIM_ERR;
+ }
+ e = Jim_GetOpt_Nvp( &goi, nvp_target_event, &n );
+ if( e != JIM_OK ){
+ Jim_GetOpt_NvpUnknown( &goi, nvp_target_event, 1 );
+ return e;
+ }
+ target_handle_event( target, n->value );
+ return JIM_OK;
}
return JIM_ERR;
}
static int
target_create( Jim_GetOptInfo *goi )
-{
-
+{
+
Jim_Obj *new_cmd;
Jim_Cmd *cmd;
const char *cp;
Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
return JIM_ERR;
}
-
+
/* TYPE */
e = Jim_GetOpt_String( goi, &cp2, NULL );
cp = cp2;
Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
for( x = 0 ; target_types[x] ; x++ ){
if( target_types[x+1] ){
- Jim_AppendStrings( goi->interp,
+ Jim_AppendStrings( goi->interp,
Jim_GetResult(goi->interp),
target_types[x]->name,
", ", NULL);
} else {
- Jim_AppendStrings( goi->interp,
+ Jim_AppendStrings( goi->interp,
Jim_GetResult(goi->interp),
" or ",
target_types[x]->name,NULL );
return JIM_ERR;
}
-
+
/* Create it */
target = calloc(1,sizeof(target_t));
/* set target number */
target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
memcpy( target->type, target_types[x], sizeof(target_type_t));
-
+
/* will be set by "-endian" */
target->endianness = TARGET_ENDIAN_UNKNOWN;
target->working_area_size = 0x0;
target->working_areas = NULL;
target->backup_working_area = 0;
-
+
target->state = TARGET_UNKNOWN;
target->debug_reason = DBG_REASON_UNDEFINED;
target->reg_cache = NULL;
target->watchpoints = NULL;
target->next = NULL;
target->arch_info = NULL;
-
+
/* initialize trace information */
target->trace_info = malloc(sizeof(trace_t));
target->trace_info->num_trace_points = 0;
target->trace_info->trace_history = NULL;
target->trace_info->trace_history_pos = 0;
target->trace_info->trace_history_overflowed = 0;
-
+
target->dbgmsg = NULL;
target->dbg_msg_enabled = 0;
TG_CMD_COUNT,
};
const char *target_cmds[] = {
- "create", "types", "names", "current", "number",
+ "create", "types", "names", "current", "number",
"count",
- NULL // terminate
+ NULL // terminate
};
LOG_DEBUG("Target command params:");
/* YES IT IS OLD SYNTAX */
Jim_Obj *new_argv[10];
int new_argc;
-
- /* target_old_syntax
- *
+
+ /* target_old_syntax
+ *
* argv[0] typename (above)
* argv[1] endian
* argv[2] reset method, deprecated/ignored
* argv[8] = -variant
* argv[9] = "somestring"
*/
-
+
/* don't let these be released */
for( x = 0 ; x < new_argc ; x++ ){
Jim_IncrRefCount( new_argv[x]);
}
/* call our self */
LOG_DEBUG("Target OLD SYNTAX - converted to new syntax");
-
+
r = jim_target( goi.interp, new_argc, new_argv );
/* release? these items */
Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
target = target->next;
}
- return JIM_OK;
+ return JIM_OK;
case TG_CMD_CREATE:
if( goi.argc < 3 ){
Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name ... config options ...");
Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
return JIM_ERR;
}
- Jim_SetResult( goi.interp,
+ Jim_SetResult( goi.interp,
Jim_NewIntObj( goi.interp, max_target_number()));
return JIM_OK;
}
-}
-
-
-/*
- * Local Variables: ***
- * c-basic-offset: 4 ***
- * tab-width: 4 ***
- * End: ***
- */
+ return JIM_ERR;
+}