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:
Paul Fertser 2014-08-19 21:16:20 +04:00 committed by Spencer Oliver
parent 44394c2a77
commit 1f6a66ab7f
4 changed files with 30 additions and 0 deletions

View File

@ -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

View File

@ -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,
}; };

View File

@ -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
}; };

View File

@ -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);
}; };