diff options
author | Paul Fertser <fercerpav@gmail.com> | 2015-02-10 13:32:07 +0300 |
---|---|---|
committer | Spencer Oliver <spen@spen-soft.co.uk> | 2015-03-25 20:46:59 +0000 |
commit | 6819468a78ce9f0835a9063d93bc839f3d55eb84 (patch) | |
tree | 0de346fa09390061c006b4497eccdd487f1e8bfd /src/jtag/hla | |
parent | a09a75653dbe7ad99da6349285ab6622b80fdc15 (diff) |
armv7m_trace, stlink: provide APIs to capture trace with an adapter
Change-Id: I9d193dd5af382912e4fe838bd4f612cffd11b295
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2540
Tested-by: jenkins
Diffstat (limited to 'src/jtag/hla')
-rw-r--r-- | src/jtag/hla/hla_interface.c | 64 | ||||
-rw-r--r-- | src/jtag/hla/hla_interface.h | 4 | ||||
-rw-r--r-- | src/jtag/hla/hla_layout.h | 27 |
3 files changed, 52 insertions, 43 deletions
diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c index 85f083ce..a208e9fd 100644 --- a/src/jtag/hla/hla_interface.c +++ b/src/jtag/hla/hla_interface.c @@ -37,7 +37,7 @@ #include <target/target.h> -static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, false, NULL, 0, -1}, 0, 0 }; +static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, false, -1}, 0, 0 }; int hl_interface_open(enum hl_transports tr) { @@ -118,12 +118,6 @@ static int hl_interface_quit(void) { LOG_DEBUG("hl_interface_quit"); - if (hl_if.param.trace_f) { - fclose(hl_if.param.trace_f); - hl_if.param.trace_f = NULL; - } - hl_if.param.trace_source_hz = 0; - if (hl_if.layout->api->close) hl_if.layout->api->close(hl_if.handle); @@ -194,6 +188,28 @@ int hl_interface_override_target(const char **targetname) return ERROR_FAIL; } +int hl_interface_config_trace(bool enabled, enum tpio_pin_protocol pin_protocol, + uint32_t port_size, unsigned int *trace_freq) +{ + if (hl_if.layout->api->config_trace) + return hl_if.layout->api->config_trace(hl_if.handle, enabled, pin_protocol, + port_size, trace_freq); + else if (enabled) { + LOG_ERROR("The selected interface does not support tracing"); + return ERROR_FAIL; + } + + return ERROR_OK; +} + +int hl_interface_poll_trace(uint8_t *buf, size_t *size) +{ + if (hl_if.layout->api->poll_trace) + return hl_if.layout->api->poll_trace(hl_if.handle, buf, size); + + return ERROR_FAIL; +} + COMMAND_HANDLER(hl_interface_handle_device_desc_command) { LOG_DEBUG("hl_interface_handle_device_desc_command"); @@ -263,31 +279,6 @@ COMMAND_HANDLER(hl_interface_handle_vid_pid_command) return ERROR_OK; } -COMMAND_HANDLER(interface_handle_trace_command) -{ - FILE *f = NULL; - unsigned source_hz; - - if ((CMD_ARGC < 1) || (CMD_ARGC > 2)) - return ERROR_COMMAND_SYNTAX_ERROR; - - COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], source_hz); - if (source_hz == 0) { - return ERROR_COMMAND_SYNTAX_ERROR; - } - - if (CMD_ARGC == 2) { - f = fopen(CMD_ARGV[1], "a"); - if (!f) - return ERROR_COMMAND_SYNTAX_ERROR; - } - - hl_if.param.trace_f = f; - hl_if.param.trace_source_hz = source_hz; - - return ERROR_OK; -} - COMMAND_HANDLER(interface_handle_hla_command) { if (CMD_ARGC != 1) @@ -333,13 +324,6 @@ static const struct command_registration hl_interface_command_handlers[] = { .usage = "(vid pid)* ", }, { - .name = "trace", - .handler = &interface_handle_trace_command, - .mode = COMMAND_CONFIG, - .help = "configure trace reception", - .usage = "source_lock_hz [destination_path]", - }, - { .name = "hla_command", .handler = &interface_handle_hla_command, .mode = COMMAND_EXEC, @@ -360,4 +344,6 @@ struct jtag_interface hl_interface = { .speed = &hl_interface_speed, .khz = &hl_interface_khz, .speed_div = &hl_interface_speed_div, + .config_trace = &hl_interface_config_trace, + .poll_trace = &hl_interface_poll_trace, }; diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h index aac1be30..a1559257 100644 --- a/src/jtag/hla/hla_interface.h +++ b/src/jtag/hla/hla_interface.h @@ -46,10 +46,6 @@ struct hl_interface_param_s { enum hl_transports transport; /** */ bool connect_under_reset; - /** Output file for trace data (if any) */ - FILE *trace_f; - /** Trace module source clock rate */ - uint32_t trace_source_hz; /** Initial interface clock clock speed */ int initial_interface_speed; }; diff --git a/src/jtag/hla/hla_layout.h b/src/jtag/hla/hla_layout.h index e989f665..8833d6c8 100644 --- a/src/jtag/hla/hla_layout.h +++ b/src/jtag/hla/hla_layout.h @@ -24,6 +24,8 @@ #ifndef _HL_LAYOUT_H #define _HL_LAYOUT_H +#include <target/armv7m_trace.h> + /** */ struct hl_interface_s; struct hl_interface_param_s; @@ -79,6 +81,31 @@ struct hl_layout_api_s { int (*custom_command) (void *handle, const char *command); /** */ int (*speed)(void *handle, int khz, bool query); + /** + * Configure trace parameters for the adapter + * + * @param handle A handle to adapter + * @param enabled Whether to enable trace + * @param pin_protocol Configured pin protocol + * @param port_size Trace port width for sync mode + * @param trace_freq A pointer to the configured trace + * frequency; if it points to 0, the adapter driver must write + * its maximum supported rate there + * @returns ERROR_OK on success, an error code on failure. + */ + int (*config_trace)(void *handle, bool enabled, enum tpio_pin_protocol pin_protocol, + uint32_t port_size, unsigned int *trace_freq); + /** + * Poll for new trace data + * + * @param handle A handle to adapter + * @param buf A pointer to buffer to store received data + * @param size A pointer to buffer size; must be filled with + * the actual amount of bytes written + * + * @returns ERROR_OK on success, an error code on failure. + */ + int (*poll_trace)(void *handle, uint8_t *buf, size_t *size); /** */ enum target_state (*state) (void *fd); }; |