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).
This commit is contained in:
2026-05-23 12:07:10 +02:00
parent 45929c732e
commit 497ea50ca5

View File

@@ -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[] = {
"<probe_id>(int)", // Arguments "1<arg>(type) ..."
"The probe id as given in the 'jtag_probe_list' function.",
"<probe>(int)", // Arguments "1<arg>(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);