Replace get_target_by_num() with get_target():

 - Allows target names, not just numbers ... numbers are awkward
   for config scripts, given for example a system with several
   CPUs or flash chips.

 - Slightly shrinks most call sites by removing strtoul() calls.
 
 - Use the same error message everywhere get_target() failure is
   being reported ... helps eventual I18N and messaging docs, and
   enables some text shrinkage.

Update docs to match.
 
NOTE:  to encourage migration, get_target() should eventually
emit a warning when it sees a numeric target ID.

Replace get_target_by_num() with get_target():

 - Allows target names, not just numbers ... numbers are awkward
   for config scripts, given for example a system with several
   CPUs or flash chips.

 - Slightly shrinks most call sites by removing strtoul() calls.

 - Use the same error message everywhere get_target() failure is
   being reported ... helps eventual I18N and messaging docs, and
   enables some text shrinkage.

Update docs to match.

NOTE:  to encourage migration, get_target() should eventually
emit a warning when it sees a numeric target ID.

---
 doc/openocd.texi                    |   47 ++++++++++++++++-------------
 src/flash/ecos.c                    |    4 +-
 src/flash/flash.c                   |    4 +-
 src/flash/lpc3180_nand_controller.c |    4 +-
 src/flash/mflash.c                  |    4 +-
 src/flash/orion_nand.c              |    4 +-
 src/flash/s3c24xx_nand.c            |    6 +--
 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 +++--
 15 files changed, 89 insertions(+), 77 deletions(-)

--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -881,6 +881,8 @@ If the chip has 2 targets, use the names
 At no time should the name ``target0'' (the default target name if
 none was specified) be used. The name ``target0'' is a hard coded name
 - the next target on the board will be some other number.
+In the same way, avoid using target numbers even when they are
+permitted; use the right target name(s) for your board.
 
 The user (or board file) should reasonably be able to:
 
@@ -1679,7 +1681,8 @@ tap which then connects to the TDI pin.
 @item @b{Note: Deprecated} - Index Numbers
 @* Prior to 28/nov/2008, JTAG taps where numbered from 0..N this
 feature is still present, however its use is highly discouraged and
-should not be counted upon.
+should not be counted upon.  Update all of your scripts to use
+TAP names rather than numbers.
 @item @b{Multiple chips}
 @* If your board has multiple chips, you should be
 able to @b{source} two configuration files, in the proper order, and
@@ -2022,8 +2025,8 @@ jtag configure DOTTED.NAME -event tap-di
 @itemize @bullet
 @item @b{NAME}
 @* Is the name of the debug target. By convention it should be the tap
-DOTTED.NAME, this name is also used to create the target object
-command.
+DOTTED.NAME.  This name is also used to create the target object
+command, and in other places the target needs to be identified.
 @item @b{TYPE}
 @* Specifies the target type, i.e.: ARM7TDMI, or Cortex-M3. Currently supported targets are:
 @comment START types
@@ -2231,7 +2234,7 @@ The @b{flash bank} command is used to co
 
 @example
 @b{flash bank} <@var{driver}> <@var{base}> <@var{size}> <@var{chip_width}>
-<@var{bus_width}> <@var{target#}> [...@var{driver_options ...}]
+<@var{bus_width}> <@var{target}> [...@var{driver_options ...}]
 @end example
 @cindex flash bank
 @*Configures a flash bank at <@var{base}> of <@var{size}> bytes and <@var{chip_width}>
@@ -2251,8 +2254,9 @@ perhaps configure a GPIO pin that contro
 on the flash chip.
 
 @b{flash bank cfi} <@var{base}> <@var{size}> <@var{chip_width}> <@var{bus_width}>
-<@var{target#}> [...@var{jedec_probe}|@var{x16_as_x8}]
-...@*cfi flashes require the number of the target they're connected to as an additional
+<@var{target}> [...@var{jedec_probe}|@var{x16_as_x8}]
+...@*cfi flashes require the name or number of the target they're connected to
+as an additional
 argument. The CFI driver makes use of a working area (specified for the target)
 to significantly speed up operation. 
 
@@ -2266,12 +2270,13 @@ The @var{jedec_probe} option is used to 
 @subsubsection lpc2000 options
 @cindex lpc2000 options
 
-...@b{flash bank lpc2000} <@var{base}> <@var{size}> 0 0 <@var{target#}> <@var{variant}>
+...@b{flash bank lpc2000} <@var{base}> <@var{size}> 0 0 <@var{target}> <@var{variant}>
 <@var{clock}> [...@var{calc_checksum}]
 @*LPC flashes don't require the chip and bus width to be specified. Additional
 parameters are the <@var{variant}>, which may be @var{lpc2000_v1} (older LPC21xx and LPC22xx)
-or @var{lpc2000_v2} (LPC213x, LPC214x, LPC210[123], LPC23xx and LPC24xx), the number
-of the target this flash belongs to (first is 0), the frequency at which the core
+or @var{lpc2000_v2} (LPC213x, LPC214x, LPC210[123], LPC23xx and LPC24xx),
+the name or number of the target this flash belongs to (first is 0),
+the frequency at which the core
 is currently running (in kHz - must be an integral number), and the optional keyword
 @var{calc_checksum}, telling the driver to calculate a valid checksum for the exception
 vector table. 
@@ -2280,20 +2285,20 @@ vector table. 
 @subsubsection at91sam7 options
 @cindex at91sam7 options
 
-...@b{flash bank at91sam7} 0 0 0 0 <@var{target#}>
-...@*at91sam7 flashes only require the @var{target#}, all other values are looked up after
+...@b{flash bank at91sam7} 0 0 0 0 <@var{target}>
+...@*at91sam7 flashes only require the @var{target}, all other values are looked up after
 reading the chip-id and type. 
 
 @subsubsection str7 options
 @cindex str7 options
 
-...@b{flash bank str7x} <@var{base}> <@var{size}> 0 0 <@var{target#}> <@var{variant}>
+...@b{flash bank str7x} <@var{base}> <@var{size}> 0 0 <@var{target}> <@var{variant}>
 @*variant can be either STR71x, STR73x or STR75x. 
 
 @subsubsection str9 options
 @cindex str9 options
 
-...@b{flash bank str9x} <@var{base}> <@var{size}> 0 0 <@var{target#}>
+...@b{flash bank str9x} <@var{base}> <@var{size}> 0 0 <@var{target}>
 @*The str9 needs the flash controller to be configured prior to Flash programming, e.g.
 @example
 str9x flash_config 0 4 2 0 0x80000
@@ -2302,7 +2307,7 @@ This will setup the BBSR, NBBSR, BBADR a
 
 @subsubsection str9 options (str9xpec driver)
 
-...@b{flash bank str9xpec} <@var{base}> <@var{size}> 0 0 <@var{target#}>
+...@b{flash bank str9xpec} <@var{base}> <@var{size}> 0 0 <@var{target}>
 @*Before using the flash commands the turbo mode must be enabled using str9xpec
 @option{enable_turbo} <@var{num>.}
 
@@ -2312,25 +2317,25 @@ Use the standard str9 driver for program
 @subsubsection Stellaris (LM3Sxxx) options
 @cindex Stellaris (LM3Sxxx) options
 
-...@b{flash bank stellaris} <@var{base}> <@var{size}> 0 0 <@var{target#}>
-...@*stellaris flash plugin only require the @var{target#}. 
+...@b{flash bank stellaris} <@var{base}> <@var{size}> 0 0 <@var{target}>
+...@*stellaris flash plugin only require the @var{target}.
 
 @subsubsection stm32x options
 @cindex stm32x options
 
-...@b{flash bank stm32x} <@var{base}> <@var{size}> 0 0 <@var{target#}>
-...@*stm32x flash plugin only require the @var{target#}. 
+...@b{flash bank stm32x} <@var{base}> <@var{size}> 0 0 <@var{target}>
+...@*stm32x flash plugin only require the @var{target}.
 
 @subsubsection aduc702x options
 @cindex aduc702x options
 
-...@b{flash bank aduc702x} 0 0 0 0 <@var{target#}>
-...@*the aduc702x flash plugin works with Analog Devices model numbers ADUC7019 through ADUC7028.  The setup command only requires the @var{target#} argument (all devices in this family have the same memory layout).
+...@b{flash bank aduc702x} 0 0 0 0 <@var{target}>
+...@*the aduc702x flash plugin works with Analog Devices model numbers ADUC7019 through ADUC7028.  The setup command only requires the @var{target} argument (all devices in this family have the same memory layout).
 
 @subsection mFlash Configuration
 @cindex mFlash Configuration
 @b{mflash bank} <@var{soc}> <@var{base}> <@var{chip_width}> <@var{bus_width}>
-<@var{RST pin}> <@var{WP pin}> <@var{DPD pin}> <@var{target #}>
+<@var{RST pin}> <@var{WP pin}> <@var{DPD pin}> <@var{target}>
 @cindex mflash bank
 @*Configures a mflash for <@var{soc}> host bank at
 <@var{base}>. <@var{chip_width}> and <@var{bus_width}> are bytes
--- a/src/flash/ecos.c
+++ b/src/flash/ecos.c
@@ -164,10 +164,10 @@ static int ecosflash_flash_bank_command(
 		bank->sectors[i].is_protected = 0;
 	}
 
-	info->target = get_target_by_num(strtoul(args[5], NULL, 0));
+	info->target = get_target(args[5]);
 	if (info->target == NULL)
 	{
-		LOG_ERROR("no target '%i' configured", (int)strtoul(args[5], NULL, 0));
+		LOG_ERROR("target '%s' not defined", args[5]);
 		return ERROR_FAIL;
 	}
 	return ERROR_OK;
--- a/src/flash/flash.c
+++ b/src/flash/flash.c
@@ -261,9 +261,9 @@ static int handle_flash_bank_command(str
 		return ERROR_COMMAND_SYNTAX_ERROR;
 	}
 
-	if ((target = get_target_by_num(strtoul(args[5], NULL, 0))) == NULL)
+	if ((target = get_target(args[5])) == NULL)
 	{
-		LOG_ERROR("target %lu not defined", strtoul(args[5], NULL, 0));
+		LOG_ERROR("target '%s' not defined", args[5]);
 		return ERROR_FAIL;
 	}
 
--- a/src/flash/lpc3180_nand_controller.c
+++ b/src/flash/lpc3180_nand_controller.c
@@ -71,10 +71,10 @@ static int lpc3180_nand_device_command(s
 	lpc3180_info = malloc(sizeof(lpc3180_nand_controller_t));
 	device->controller_priv = lpc3180_info;
 
-	lpc3180_info->target = get_target_by_num(strtoul(args[1], NULL, 0));
+	lpc3180_info->target = get_target(args[1]);
 	if (!lpc3180_info->target)
 	{
-		LOG_ERROR("no target '%s' configured", args[1]);
+		LOG_ERROR("target '%s' not defined", args[1]);
 		return ERROR_NAND_DEVICE_INVALID;
 	}
 
--- a/src/flash/mflash.c
+++ b/src/flash/mflash.c
@@ -795,9 +795,9 @@ static int mflash_bank_command(struct co
 		return ERROR_COMMAND_SYNTAX_ERROR;
 	}
 
-	if ((target = get_target_by_num(strtoul(args[7], NULL, 0))) == NULL)
+	if ((target = get_target(args[7])) == NULL)
 	{
-		LOG_ERROR("target %lu not defined", strtoul(args[7], NULL, 0));
+		LOG_ERROR("target '%s' not defined", args[7]);
 		return ERROR_FAIL;
 	}
 
--- a/src/flash/orion_nand.c
+++ b/src/flash/orion_nand.c
@@ -210,9 +210,9 @@ int orion_nand_device_command(struct com
 	}
 
 	device->controller_priv = hw;
-	hw->target = get_target_by_num(strtoul(args[1], NULL, 0));
+	hw->target = get_target(args[1]);
 	if (!hw->target) {
-		LOG_ERROR("no target '%s' configured", args[1]);
+		LOG_ERROR("target '%s' not defined", args[1]);
 		free(hw);
 		return ERROR_NAND_DEVICE_INVALID;
 	}
--- a/src/flash/s3c24xx_nand.c
+++ b/src/flash/s3c24xx_nand.c
@@ -46,12 +46,12 @@ s3c24xx_nand_device_command(struct comma
 
 	device->controller_priv = s3c24xx_info;
 
-	s3c24xx_info->target = get_target_by_num(strtoul(args[1], NULL, 0));
+	s3c24xx_info->target = get_target(args[1]);
 	if (s3c24xx_info->target == NULL) {
-		LOG_ERROR("no target '%s' configured", args[1]);
+		LOG_ERROR("target '%s' not defined", args[1]);
 		return NULL;
 	}
-		
+
 	return s3c24xx_info;
 }
 
--- a/src/target/etb.c
+++ b/src/target/etb.c
@@ -372,11 +372,11 @@ static int handle_etb_config_command(str
 		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;
 	}
 
--- a/src/target/etm.c
+++ b/src/target/etm.c
@@ -1205,11 +1205,10 @@ static int handle_etm_config_command(str
 		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;
 	}
 
--- a/src/target/etm_dummy.c
+++ b/src/target/etm_dummy.c
@@ -31,11 +31,11 @@ static int handle_etm_dummy_config_comma
 	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;
 	}
 
--- a/src/target/image.c
+++ b/src/target/image.c
@@ -711,10 +711,11 @@ int image_open(image_t *image, char *url
 	}
 	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;
 		}
 
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -320,8 +320,36 @@ void target_buffer_set_u8(target_t *targ
 	*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
 
 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;
 	}
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -371,7 +371,7 @@ extern int target_call_timer_callbacks_n
 
 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);
--- 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
--- a/src/target/xscale.c
+++ b/src/target/xscale.c
@@ -3147,9 +3147,9 @@ int xscale_handle_debug_handler_command(
 		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_co
 		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;
 	}
 
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to