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:
parent
745b40d99a
commit
b5a24386e4
|
@ -3131,6 +3131,26 @@ Specifies the serial number of the adapter.
|
|||
@deffn {Config Command} {st-link vid_pid} [vid pid]+
|
||||
Pairs of vendor IDs and product IDs of the device.
|
||||
@end deffn
|
||||
|
||||
@deffn {Command} {st-link cmd} rx_n (tx_byte)+
|
||||
Sends an arbitrary command composed by the sequence of bytes @var{tx_byte}
|
||||
and receives @var{rx_n} bytes.
|
||||
|
||||
For example, the command to read the target's supply voltage is one byte 0xf7 followed
|
||||
by 15 bytes zero. It returns 8 bytes, where the first 4 bytes represent the ADC sampling
|
||||
of the reference voltage 1.2V and the last 4 bytes represent the ADC sampling of half
|
||||
the target's supply voltage.
|
||||
@example
|
||||
> st-link cmd 8 0xf7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||
0xf1 0x05 0x00 0x00 0x0b 0x08 0x00 0x00
|
||||
@end example
|
||||
The result can be converted to Volts (ignoring the most significant bytes, always zero)
|
||||
@example
|
||||
> set a [st-link cmd 8 0xf7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
|
||||
> echo [expr 2*1.2*([lindex $a 4]+256*[lindex $a 5])/([lindex $a 0]+256*[lindex $a 1])]
|
||||
3.24891518738
|
||||
@end example
|
||||
@end deffn
|
||||
@end deffn
|
||||
|
||||
@deffn {Interface Driver} {opendous}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue