From: Paul Fertser Date: Tue, 19 Aug 2014 17:16:20 +0000 (+0400) Subject: hla: add a way to pass arbitrary commands from user to layout and use for ICDI X-Git-Tag: v0.9.0-rc1~251 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=1f6a66ab7fca983a3cffd4070c42ae965d0fc6cb;hp=44394c2a77f68785e2ec87e2245d0f1624086682 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 Reviewed-on: http://openocd.zylin.com/2263 Tested-by: jenkins Reviewed-by: Spencer Oliver --- diff --git a/doc/openocd.texi b/doc/openocd.texi index 2db8bdd060..925eebed2d 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -3100,6 +3100,11 @@ Specifies the adapter layout to use. The vendor ID and product ID of the device. @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] Enable SWO tracing (if supported). The source clock rate for the trace port must be specified, this is typically the CPU clock rate. If diff --git a/src/jtag/drivers/ti_icdi_usb.c b/src/jtag/drivers/ti_icdi_usb.c index 2f4af7a42b..53abbfb430 100644 --- a/src/jtag/drivers/ti_icdi_usb.c +++ b/src/jtag/drivers/ti_icdi_usb.c @@ -777,4 +777,5 @@ struct hl_layout_api_s icdi_usb_layout_api = { .write_mem = icdi_usb_write_mem, .write_debug_reg = icdi_usb_write_debug_reg, .override_target = icdi_usb_override_target, + .custom_command = icdi_send_remote_cmd, }; diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c index 964b074423..ce914ea0c5 100644 --- a/src/jtag/hla/hla_interface.c +++ b/src/jtag/hla/hla_interface.c @@ -268,6 +268,21 @@ COMMAND_HANDLER(interface_handle_trace_command) 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[] = { { .name = "hla_device_desc", @@ -304,6 +319,13 @@ static const struct command_registration hl_interface_command_handlers[] = { .help = "configure trace reception", .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_REGISTRATION_DONE }; diff --git a/src/jtag/hla/hla_layout.h b/src/jtag/hla/hla_layout.h index 6d79d58102..df93cb69da 100644 --- a/src/jtag/hla/hla_layout.h +++ b/src/jtag/hla/hla_layout.h @@ -76,6 +76,8 @@ struct hl_layout_api_s { /** */ int (*override_target) (const char *targetname); /** */ + int (*custom_command) (void *handle, const char *command); + /** */ enum target_state (*state) (void *fd); };