hla: add a way to pass arbitrary commands from user to layout and use for ICDI
TI's ICDI adapter supports some additional commands which a user might want to run for debugging or other purposes, the most useful of them being "debug unlock" that fully mass-erases the device and unprotects the flash. Change-Id: I26990e736094367f92106fa891e9bb8fb0382efb Signed-off-by: Paul Fertser <fercerpav@gmail.com> Reviewed-on: http://openocd.zylin.com/2263 Tested-by: jenkins Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
This commit is contained in:
parent
44394c2a77
commit
1f6a66ab7f
|
@ -3100,6 +3100,11 @@ Specifies the adapter layout to use.
|
||||||
The vendor ID and product ID of the device.
|
The vendor ID and product ID of the device.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn {Command} {hla_command} command
|
||||||
|
Execute a custom adapter-specific command. The @var{command} string is
|
||||||
|
passed as is to the underlying adapter layout handler.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn {Config Command} {trace} source_clock_hz [output_file_path]
|
@deffn {Config Command} {trace} source_clock_hz [output_file_path]
|
||||||
Enable SWO tracing (if supported). The source clock rate for the
|
Enable SWO tracing (if supported). The source clock rate for the
|
||||||
trace port must be specified, this is typically the CPU clock rate. If
|
trace port must be specified, this is typically the CPU clock rate. If
|
||||||
|
|
|
@ -777,4 +777,5 @@ struct hl_layout_api_s icdi_usb_layout_api = {
|
||||||
.write_mem = icdi_usb_write_mem,
|
.write_mem = icdi_usb_write_mem,
|
||||||
.write_debug_reg = icdi_usb_write_debug_reg,
|
.write_debug_reg = icdi_usb_write_debug_reg,
|
||||||
.override_target = icdi_usb_override_target,
|
.override_target = icdi_usb_override_target,
|
||||||
|
.custom_command = icdi_send_remote_cmd,
|
||||||
};
|
};
|
||||||
|
|
|
@ -268,6 +268,21 @@ COMMAND_HANDLER(interface_handle_trace_command)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
COMMAND_HANDLER(interface_handle_hla_command)
|
||||||
|
{
|
||||||
|
if (CMD_ARGC != 1)
|
||||||
|
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||||
|
|
||||||
|
if (!hl_if.layout->api->custom_command) {
|
||||||
|
LOG_ERROR("The selected adapter doesn't support custom commands");
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hl_if.layout->api->custom_command(hl_if.handle, CMD_ARGV[0]);
|
||||||
|
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct command_registration hl_interface_command_handlers[] = {
|
static const struct command_registration hl_interface_command_handlers[] = {
|
||||||
{
|
{
|
||||||
.name = "hla_device_desc",
|
.name = "hla_device_desc",
|
||||||
|
@ -304,6 +319,13 @@ static const struct command_registration hl_interface_command_handlers[] = {
|
||||||
.help = "configure trace reception",
|
.help = "configure trace reception",
|
||||||
.usage = "source_lock_hz [destination_path]",
|
.usage = "source_lock_hz [destination_path]",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "hla_command",
|
||||||
|
.handler = &interface_handle_hla_command,
|
||||||
|
.mode = COMMAND_EXEC,
|
||||||
|
.help = "execute a custom adapter-specific command",
|
||||||
|
.usage = "hla_command <command>",
|
||||||
|
},
|
||||||
COMMAND_REGISTRATION_DONE
|
COMMAND_REGISTRATION_DONE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -76,6 +76,8 @@ struct hl_layout_api_s {
|
||||||
/** */
|
/** */
|
||||||
int (*override_target) (const char *targetname);
|
int (*override_target) (const char *targetname);
|
||||||
/** */
|
/** */
|
||||||
|
int (*custom_command) (void *handle, const char *command);
|
||||||
|
/** */
|
||||||
enum target_state (*state) (void *fd);
|
enum target_state (*state) (void *fd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue