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