From c977616cdad17ad74742ede8703f54e370c3947d Mon Sep 17 00:00:00 2001 From: kc8apf Date: Mon, 18 May 2009 04:44:28 +0000 Subject: Consolidate target selection code into single get_target() that handles both names and numbers. Provided by David Brownell git-svn-id: svn://svn.berlios.de/openocd/trunk@1804 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- src/target/etb.c | 4 +-- src/target/etm.c | 5 ++-- src/target/etm_dummy.c | 4 +-- src/target/image.c | 7 +++--- src/target/target.c | 55 ++++++++++++++++++++++++------------------ src/target/target.h | 2 +- src/target/target/ti_dm355.cfg | 7 ++---- src/target/xscale.c | 9 ++++--- 8 files changed, 50 insertions(+), 43 deletions(-) (limited to 'src/target') diff --git a/src/target/etb.c b/src/target/etb.c index 5f6e648e..9a265ad5 100644 --- a/src/target/etb.c +++ b/src/target/etb.c @@ -372,11 +372,11 @@ static int handle_etb_config_command(struct command_context_s *cmd_ctx, char *cm return ERROR_COMMAND_SYNTAX_ERROR; } - target = get_target_by_num(strtoul(args[0], NULL, 0)); + target = get_target(args[0]); if (!target) { - LOG_ERROR("target number '%s' not defined", args[0]); + LOG_ERROR("target '%s' not defined", args[0]); return ERROR_FAIL; } diff --git a/src/target/etm.c b/src/target/etm.c index c54087a0..5b83db89 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -1205,11 +1205,10 @@ static int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cm return ERROR_COMMAND_SYNTAX_ERROR; } - target = get_target_by_num(strtoul(args[0], NULL, 0)); - + target = get_target(args[0]); if (!target) { - LOG_ERROR("target number '%s' not defined", args[0]); + LOG_ERROR("target '%s' not defined", args[0]); return ERROR_FAIL; } diff --git a/src/target/etm_dummy.c b/src/target/etm_dummy.c index ee4c3e69..4b84fd32 100644 --- a/src/target/etm_dummy.c +++ b/src/target/etm_dummy.c @@ -31,11 +31,11 @@ static int handle_etm_dummy_config_command(struct command_context_s *cmd_ctx, ch armv4_5_common_t *armv4_5; arm7_9_common_t *arm7_9; - target = get_target_by_num(strtoul(args[0], NULL, 0)); + target = get_target(args[0]); if (!target) { - LOG_ERROR("target number '%s' not defined", args[0]); + LOG_ERROR("target '%s' not defined", args[0]); return ERROR_FAIL; } diff --git a/src/target/image.c b/src/target/image.c index 71939e79..d72680d1 100644 --- a/src/target/image.c +++ b/src/target/image.c @@ -711,10 +711,11 @@ int image_open(image_t *image, char *url, char *type_string) } else if (image->type == IMAGE_MEMORY) { - target_t *target = get_target_by_num(strtoul(url, NULL, 0)); - if (target==NULL) + target_t *target = get_target(url); + + if (target == NULL) { - LOG_ERROR("Target '%s' does not exist", url); + LOG_ERROR("target '%s' not defined", url); return ERROR_FAIL; } diff --git a/src/target/target.c b/src/target/target.c index 3ec28284..7571e4e3 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -320,8 +320,36 @@ void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value) *buffer = value; } +/* return a pointer to a configured target; id is name or number */ +target_t *get_target(const char *id) +{ + target_t *target; + char *endptr; + int num; + + /* try as tcltarget name */ + for (target = all_targets; target; target = target->next) { + if (target->cmd_name == NULL) + continue; + if (strcmp(id, target->cmd_name) == 0) + return target; + } + + /* no match, try as number */ + num = strtoul(id, &endptr, 0); + if (*endptr != 0) + return NULL; + + for (target = all_targets; target; target = target->next) { + if (target->target_number == num) + return target; + } + + return NULL; +} + /* returns a pointer to the n-th configured target */ -target_t* get_target_by_num(int num) +static target_t *get_target_by_num(int num) { target_t *target = all_targets; @@ -1333,35 +1361,16 @@ int target_register_user_commands(struct command_context_s *cmd_ctx) static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { - char *cp; target_t *target = all_targets; if (argc == 1) { - /* try as tcltarget name */ - for( target = all_targets ; target ; target = target->next ){ - if( target->cmd_name ){ - 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 ){ + target = get_target(args[0]); + if (target == NULL) { command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] ); goto DumpTargets; } - Match: + cmd_ctx->current_target = target->target_number; return ERROR_OK; } diff --git a/src/target/target.h b/src/target/target.h index 4a6dde1a..1c1e10ef 100644 --- a/src/target/target.h +++ b/src/target/target.h @@ -371,7 +371,7 @@ extern int target_call_timer_callbacks_now(void); extern target_t* get_current_target(struct command_context_s *cmd_ctx); extern int get_num_by_target(target_t *query_target); -extern target_t* get_target_by_num(int num); +extern target_t *get_target(const char *id); extern int target_write_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer); extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer); diff --git a/src/target/target/ti_dm355.cfg b/src/target/target/ti_dm355.cfg index acf4b304..e4de1a58 100644 --- a/src/target/target/ti_dm355.cfg +++ b/src/target/target/ti_dm355.cfg @@ -56,8 +56,5 @@ arm7_9 fast_memory_access enable arm7_9 dcc_downloads enable # trace setup -# FIXME we ought to be able to say "... config $_TARGETNAME ..." -# (not "config 0") facilitating additional targets (e.g. other chips) -etm config 0 16 normal full etb -etb config 0 $_CHIPNAME.etb - +etm config $_TARGETNAME 16 normal full etb +etb config $_TARGETNAME $_CHIPNAME.etb diff --git a/src/target/xscale.c b/src/target/xscale.c index abdbe866..3947da0b 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -3147,9 +3147,9 @@ int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char return ERROR_OK; } - if ((target = get_target_by_num(strtoul(args[0], NULL, 0))) == NULL) + if ((target = get_target(args[0])) == NULL) { - LOG_ERROR("no target '%s' configured", args[0]); + LOG_ERROR("target '%s' not defined", args[0]); return ERROR_FAIL; } @@ -3187,9 +3187,10 @@ int xscale_handle_cache_clean_address_command(struct command_context_s *cmd_ctx, return ERROR_COMMAND_SYNTAX_ERROR; } - if ((target = get_target_by_num(strtoul(args[0], NULL, 0))) == NULL) + target = get_target(args[0]); + if (target == NULL) { - LOG_ERROR("no target '%s' configured", args[0]); + LOG_ERROR("target '%s' not defined", args[0]); return ERROR_FAIL; } -- cgit v1.2.3