From 497ea50ca56392dcdc67b93a70c95710142ca1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Sat, 23 May 2026 12:07:10 +0200 Subject: [PATCH] script: open probe by sequential index, hex id still accepted jtag_get_probes_list now prints a flat [N] index; jtag_open_probe takes that index (decimal) or, if 0x-prefixed, the raw probe id. Avoids the trap of typing "1" and hitting a non-existent (drv 0, probe 1). --- modules/script/script.c | 54 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/modules/script/script.c b/modules/script/script.c index 9a2d6ed..18cb653 100644 --- a/modules/script/script.c +++ b/modules/script/script.c @@ -1733,16 +1733,38 @@ const char *cmd_print_probes_list_help[] = { "Displays the list of detected probes.", // Explanations "" }; +/* Map the flat index shown by jtag_get_probes_list (0, 1, 2, ...) to the + * encoded (drv << 8 | probe) id, walking drivers/probes in the same order + * the list prints them. Returns -1 if the index is out of range. */ +static int resolve_flat_probe_index(jtag_core *jc, int flat) +{ + int nb_of_drivers = jtagcore_get_number_of_probes_drv(jc); + int j, i, n = 0; + + for (j = 0; j < nb_of_drivers; j++) + { + int nb_of_probes = jtagcore_get_number_of_probes(jc, j); + for (i = 0; i < nb_of_probes; i++) + { + if (n == flat) + return PROBE_ID(j, i); + n++; + } + } + return -1; +} + static int cmd_print_probes_list(script_ctx *ctx, char *line) { jtag_core *jc; - int i, j; + int i, j, flat; char probe_list[64]; int nb_of_drivers, nb_of_probes; jc = (jtag_core *)ctx->app_ctx; nb_of_drivers = jtagcore_get_number_of_probes_drv(jc); + flat = 0; j = 0; while (j < nb_of_drivers) { @@ -1751,7 +1773,10 @@ static int cmd_print_probes_list(script_ctx *ctx, char *line) while (i < nb_of_probes) { jtagcore_get_probe_name(jc, PROBE_ID(j, i), probe_list); - ctx->script_printf(ctx, MSG_INFO_0, "ID 0x%.8X [drv %d, probe %d] %s\n", PROBE_ID(j, i), j, i, probe_list); + // [flat index] is what to pass to jtag_open_probe; the + // 0x id after it is the raw form, also accepted. + ctx->script_printf(ctx, MSG_INFO_0, " [%d] 0x%.8X %s\n", flat, PROBE_ID(j, i), probe_list); + flat++; i++; } j++; @@ -1761,13 +1786,15 @@ static int cmd_print_probes_list(script_ctx *ctx, char *line) } const char *cmd_open_probe_help[] = { - "(int)", // Arguments "1(type) ..." - "The probe id as given in the 'jtag_probe_list' function.", + "(int)", // Arguments "1(type) ..." + "Open a probe by its index from jtag_get_probes_list (0, 1, 2, ...).", + "A raw 0x-prefixed probe id (as printed after the index) also works.", "" }; static int cmd_open_probe(script_ctx *ctx, char *line) { int ret; + int id; char probe_id[64]; jtag_core *jc; @@ -1775,7 +1802,24 @@ static int cmd_open_probe(script_ctx *ctx, char *line) if (get_param(ctx, line, 1, probe_id) > 0) { - ret = jtagcore_select_and_open_probe(jc, strtoul(probe_id, NULL, 16)); + if (probe_id[0] == '0' && (probe_id[1] == 'x' || probe_id[1] == 'X')) + { + // Raw encoded id (drv << 8 | probe). + id = (int)strtoul(probe_id, NULL, 16); + } + else + { + // Sequential index from jtag_get_probes_list. + id = resolve_flat_probe_index(jc, (int)strtoul(probe_id, NULL, 10)); + if (id < 0) + { + ctx->script_printf(ctx, MSG_ERROR, + "No probe at index %s. Run jtag_get_probes_list first.\n", probe_id); + return JTAG_CORE_BAD_PARAMETER; + } + } + + ret = jtagcore_select_and_open_probe(jc, id); if (ret != JTAG_CORE_NO_ERROR) { ctx->script_printf(ctx, MSG_ERROR, "Code %d !\n", ret);