Consolidate target selection code into single get_target() that handles both names and numbers. Provided by David Brownell <david-b@pacbell.net>

git-svn-id: svn://svn.berlios.de/openocd/trunk@1804 b42882b7-edfa-0310-969c-e2dbd0fdcd60
__archive__
kc8apf 2009-05-18 04:44:28 +00:00
parent cafad4969c
commit c977616cda
15 changed files with 89 additions and 77 deletions

View File

@ -881,6 +881,8 @@ If the chip has 2 targets, use the names @b{_TARGETNAME0},
At no time should the name ``target0'' (the default target name if 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 none was specified) be used. The name ``target0'' is a hard coded name
- the next target on the board will be some other number. - 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: The user (or board file) should reasonably be able to:
@ -1702,7 +1704,8 @@ tap which then connects to the TDI pin.
@item @b{Note: Deprecated} - Index Numbers @item @b{Note: Deprecated} - Index Numbers
@* Prior to 28/nov/2008, JTAG taps where numbered from 0..N this @* Prior to 28/nov/2008, JTAG taps where numbered from 0..N this
feature is still present, however its use is highly discouraged and 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} @item @b{Multiple chips}
@* If your board has multiple chips, you should be @* If your board has multiple chips, you should be
able to @b{source} two configuration files, in the proper order, and able to @b{source} two configuration files, in the proper order, and
@ -2045,8 +2048,8 @@ jtag configure DOTTED.NAME -event tap-disable @{
@itemize @bullet @itemize @bullet
@item @b{NAME} @item @b{NAME}
@* Is the name of the debug target. By convention it should be the tap @* 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 DOTTED.NAME. This name is also used to create the target object
command. command, and in other places the target needs to be identified.
@item @b{TYPE} @item @b{TYPE}
@* Specifies the target type, i.e.: ARM7TDMI, or Cortex-M3. Currently supported targets are: @* Specifies the target type, i.e.: ARM7TDMI, or Cortex-M3. Currently supported targets are:
@comment START types @comment START types
@ -2254,7 +2257,7 @@ The @b{flash bank} command is used to configure one or more flash chips (or bank
@example @example
@b{flash bank} <@var{driver}> <@var{base}> <@var{size}> <@var{chip_width}> @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 @end example
@cindex flash bank @cindex flash bank
@*Configures a flash bank at <@var{base}> of <@var{size}> bytes and <@var{chip_width}> @*Configures a flash bank at <@var{base}> of <@var{size}> bytes and <@var{chip_width}>
@ -2274,8 +2277,9 @@ perhaps configure a GPIO pin that controls the ``write protect'' pin
on the flash chip. on the flash chip.
@b{flash bank cfi} <@var{base}> <@var{size}> <@var{chip_width}> <@var{bus_width}> @b{flash bank cfi} <@var{base}> <@var{size}> <@var{chip_width}> <@var{bus_width}>
<@var{target#}> [@var{jedec_probe}|@var{x16_as_x8}] <@var{target}> [@var{jedec_probe}|@var{x16_as_x8}]
@*CFI flashes require the number of the target they're connected to as an additional @*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) argument. The CFI driver makes use of a working area (specified for the target)
to significantly speed up operation. to significantly speed up operation.
@ -2289,12 +2293,13 @@ The @var{jedec_probe} option is used to detect certain non-CFI flash ROMs, like
@subsubsection lpc2000 options @subsubsection lpc2000 options
@cindex 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}] <@var{clock}> [@var{calc_checksum}]
@*LPC flashes don't require the chip and bus width to be specified. Additional @*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) 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 or @var{lpc2000_v2} (LPC213x, LPC214x, LPC210[123], LPC23xx and LPC24xx),
of the target this flash belongs to (first is 0), the frequency at which the core 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 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 @var{calc_checksum}, telling the driver to calculate a valid checksum for the exception
vector table. vector table.
@ -2303,20 +2308,20 @@ vector table.
@subsubsection at91sam7 options @subsubsection at91sam7 options
@cindex at91sam7 options @cindex at91sam7 options
@b{flash bank at91sam7} 0 0 0 0 <@var{target#}> @b{flash bank at91sam7} 0 0 0 0 <@var{target}>
@*AT91SAM7 flashes only require the @var{target#}, all other values are looked up after @*AT91SAM7 flashes only require the @var{target}, all other values are looked up after
reading the chip-id and type. reading the chip-id and type.
@subsubsection str7 options @subsubsection str7 options
@cindex 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. @*variant can be either STR71x, STR73x or STR75x.
@subsubsection str9 options @subsubsection str9 options
@cindex 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. @*The str9 needs the flash controller to be configured prior to Flash programming, e.g.
@example @example
str9x flash_config 0 4 2 0 0x80000 str9x flash_config 0 4 2 0 0x80000
@ -2325,7 +2330,7 @@ This will setup the BBSR, NBBSR, BBADR and NBBADR registers respectively.
@subsubsection str9 options (str9xpec driver) @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 @*Before using the flash commands the turbo mode must be enabled using str9xpec
@option{enable_turbo} <@var{num>.} @option{enable_turbo} <@var{num>.}
@ -2335,25 +2340,25 @@ Use the standard str9 driver for programming. @xref{STR9 specific commands}.
@subsubsection Stellaris (LM3Sxxx) options @subsubsection Stellaris (LM3Sxxx) options
@cindex Stellaris (LM3Sxxx) options @cindex Stellaris (LM3Sxxx) options
@b{flash bank stellaris} <@var{base}> <@var{size}> 0 0 <@var{target#}> @b{flash bank stellaris} <@var{base}> <@var{size}> 0 0 <@var{target}>
@*Stellaris flash plugin only require the @var{target#}. @*Stellaris flash plugin only require the @var{target}.
@subsubsection stm32x options @subsubsection stm32x options
@cindex stm32x options @cindex stm32x options
@b{flash bank stm32x} <@var{base}> <@var{size}> 0 0 <@var{target#}> @b{flash bank stm32x} <@var{base}> <@var{size}> 0 0 <@var{target}>
@*stm32x flash plugin only require the @var{target#}. @*stm32x flash plugin only require the @var{target}.
@subsubsection aduc702x options @subsubsection aduc702x options
@cindex aduc702x options @cindex aduc702x options
@b{flash bank aduc702x} 0 0 0 0 <@var{target#}> @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). @*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 @subsection mFlash Configuration
@cindex mFlash Configuration @cindex mFlash Configuration
@b{mflash bank} <@var{soc}> <@var{base}> <@var{chip_width}> <@var{bus_width}> @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 @cindex mflash bank
@*Configures a mflash for <@var{soc}> host bank at @*Configures a mflash for <@var{soc}> host bank at
<@var{base}>. <@var{chip_width}> and <@var{bus_width}> are bytes <@var{base}>. <@var{chip_width}> and <@var{bus_width}> are bytes

View File

@ -164,10 +164,10 @@ static int ecosflash_flash_bank_command(struct command_context_s *cmd_ctx, char
bank->sectors[i].is_protected = 0; 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) 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_FAIL;
} }
return ERROR_OK; return ERROR_OK;

View File

@ -261,9 +261,9 @@ static int handle_flash_bank_command(struct command_context_s *cmd_ctx, char *cm
return ERROR_COMMAND_SYNTAX_ERROR; 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; return ERROR_FAIL;
} }

View File

@ -71,10 +71,10 @@ static int lpc3180_nand_device_command(struct command_context_s *cmd_ctx, char *
lpc3180_info = malloc(sizeof(lpc3180_nand_controller_t)); lpc3180_info = malloc(sizeof(lpc3180_nand_controller_t));
device->controller_priv = lpc3180_info; 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) 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; return ERROR_NAND_DEVICE_INVALID;
} }

View File

@ -795,9 +795,9 @@ static int mflash_bank_command(struct command_context_s *cmd_ctx, char *cmd, cha
return ERROR_COMMAND_SYNTAX_ERROR; 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; return ERROR_FAIL;
} }

View File

@ -210,9 +210,9 @@ int orion_nand_device_command(struct command_context_s *cmd_ctx, char *cmd,
} }
device->controller_priv = hw; device->controller_priv = hw;
hw->target = get_target_by_num(strtoul(args[1], NULL, 0)); hw->target = get_target(args[1]);
if (!hw->target) { if (!hw->target) {
LOG_ERROR("no target '%s' configured", args[1]); LOG_ERROR("target '%s' not defined", args[1]);
free(hw); free(hw);
return ERROR_NAND_DEVICE_INVALID; return ERROR_NAND_DEVICE_INVALID;
} }

View File

@ -46,9 +46,9 @@ s3c24xx_nand_device_command(struct command_context_s *cmd_ctx, char *cmd,
device->controller_priv = s3c24xx_info; 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) { if (s3c24xx_info->target == NULL) {
LOG_ERROR("no target '%s' configured", args[1]); LOG_ERROR("target '%s' not defined", args[1]);
return NULL; return NULL;
} }

View File

@ -372,11 +372,11 @@ static int handle_etb_config_command(struct command_context_s *cmd_ctx, char *cm
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
} }
target = get_target_by_num(strtoul(args[0], NULL, 0)); target = get_target(args[0]);
if (!target) if (!target)
{ {
LOG_ERROR("target number '%s' not defined", args[0]); LOG_ERROR("target '%s' not defined", args[0]);
return ERROR_FAIL; return ERROR_FAIL;
} }

View File

@ -1205,11 +1205,10 @@ static int handle_etm_config_command(struct command_context_s *cmd_ctx, char *cm
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
} }
target = get_target_by_num(strtoul(args[0], NULL, 0)); target = get_target(args[0]);
if (!target) if (!target)
{ {
LOG_ERROR("target number '%s' not defined", args[0]); LOG_ERROR("target '%s' not defined", args[0]);
return ERROR_FAIL; return ERROR_FAIL;
} }

View File

@ -31,11 +31,11 @@ static int handle_etm_dummy_config_command(struct command_context_s *cmd_ctx, ch
armv4_5_common_t *armv4_5; armv4_5_common_t *armv4_5;
arm7_9_common_t *arm7_9; arm7_9_common_t *arm7_9;
target = get_target_by_num(strtoul(args[0], NULL, 0)); target = get_target(args[0]);
if (!target) if (!target)
{ {
LOG_ERROR("target number '%s' not defined", args[0]); LOG_ERROR("target '%s' not defined", args[0]);
return ERROR_FAIL; return ERROR_FAIL;
} }

View File

@ -711,10 +711,11 @@ int image_open(image_t *image, char *url, char *type_string)
} }
else if (image->type == IMAGE_MEMORY) else if (image->type == IMAGE_MEMORY)
{ {
target_t *target = get_target_by_num(strtoul(url, NULL, 0)); target_t *target = get_target(url);
if (target==NULL)
if (target == NULL)
{ {
LOG_ERROR("Target '%s' does not exist", url); LOG_ERROR("target '%s' not defined", url);
return ERROR_FAIL; return ERROR_FAIL;
} }

View File

@ -320,8 +320,36 @@ void target_buffer_set_u8(target_t *target, u8 *buffer, u8 value)
*buffer = 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 */ /* 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; 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) static int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
{ {
char *cp;
target_t *target = all_targets; target_t *target = all_targets;
if (argc == 1) if (argc == 1)
{ {
/* try as tcltarget name */ target = get_target(args[0]);
for( target = all_targets ; target ; target = target->next ){ if (target == NULL) {
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 ){
command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] ); command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
goto DumpTargets; goto DumpTargets;
} }
Match:
cmd_ctx->current_target = target->target_number; cmd_ctx->current_target = target->target_number;
return ERROR_OK; return ERROR_OK;
} }

View File

@ -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 target_t* get_current_target(struct command_context_s *cmd_ctx);
extern int get_num_by_target(target_t *query_target); 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_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); extern int target_read_buffer(struct target_s *target, u32 address, u32 size, u8 *buffer);

View File

@ -56,8 +56,5 @@ arm7_9 fast_memory_access enable
arm7_9 dcc_downloads enable arm7_9 dcc_downloads enable
# trace setup # trace setup
# FIXME we ought to be able to say "... config $_TARGETNAME ..." etm config $_TARGETNAME 16 normal full etb
# (not "config 0") facilitating additional targets (e.g. other chips) etb config $_TARGETNAME $_CHIPNAME.etb
etm config 0 16 normal full etb
etb config 0 $_CHIPNAME.etb

View File

@ -3147,9 +3147,9 @@ int xscale_handle_debug_handler_command(struct command_context_s *cmd_ctx, char
return ERROR_OK; 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; 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; 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; return ERROR_FAIL;
} }