stlink-dap: add 'cmd' to send arbitrary commands

Either for testing new commands and to retrieve information that
don't fit in any specific place of OpenOCD, for example monitoring
the target's VDD power supply from a TCL script.

Change-Id: Id43ced92c799b115bb1da1c236090b0752329051
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/6564
Tested-by: jenkins
Reviewed-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
This commit is contained in:
Antonio Borneo
2021-03-17 00:02:16 +01:00
parent 745b40d99a
commit b5a24386e4
2 changed files with 64 additions and 0 deletions

View File

@@ -4222,6 +4222,43 @@ COMMAND_HANDLER(stlink_dap_backend_command)
return ERROR_OK;
}
#define BYTES_PER_LINE 16
COMMAND_HANDLER(stlink_dap_cmd_command)
{
unsigned int rx_n, tx_n;
struct stlink_usb_handle_s *h = stlink_dap_handle;
if (CMD_ARGC < 2)
return ERROR_COMMAND_SYNTAX_ERROR;
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], rx_n);
tx_n = CMD_ARGC - 1;
if (tx_n > STLINK_SG_SIZE || rx_n > STLINK_DATA_SIZE) {
LOG_ERROR("max %x byte sent and %d received", STLINK_SG_SIZE, STLINK_DATA_SIZE);
return ERROR_COMMAND_SYNTAX_ERROR;
}
stlink_usb_init_buffer(h, h->rx_ep, rx_n);
for (unsigned int i = 0; i < tx_n; i++) {
uint8_t byte;
COMMAND_PARSE_NUMBER(u8, CMD_ARGV[i + 1], byte);
h->cmdbuf[h->cmdidx++] = byte;
}
int retval = stlink_usb_xfer_noerrcheck(h, h->databuf, rx_n);
if (retval != ERROR_OK) {
LOG_ERROR("Error %d", retval);
return retval;
}
for (unsigned int i = 0; i < rx_n; i++)
command_print_sameline(CMD, "0x%02x%c", h->databuf[i],
((i == (rx_n - 1)) || ((i % BYTES_PER_LINE) == (BYTES_PER_LINE - 1))) ? '\n' : ' ');
return ERROR_OK;
}
/** */
static const struct command_registration stlink_dap_subcommand_handlers[] = {
{
@@ -4245,6 +4282,13 @@ static const struct command_registration stlink_dap_subcommand_handlers[] = {
.help = "select which ST-Link backend to use",
.usage = "usb | tcp [port]",
},
{
.name = "cmd",
.handler = stlink_dap_cmd_command,
.mode = COMMAND_EXEC,
.help = "send arbitrary command",
.usage = "rx_n (tx_byte)+",
},
COMMAND_REGISTRATION_DONE
};