X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Foocd_trace.c;h=2533c40d96d6386f09b2e010826f8c59cade7b5b;hp=6011b68297b2f67ce8d8b767953ad2857973ecfc;hb=28f8e9dfb7bfaf87957c95790c3ffe5d9fbd8834;hpb=d0c19e0a9d51211953a363026c662d290542fe85 diff --git a/src/target/oocd_trace.c b/src/target/oocd_trace.c index 6011b68297..2533c40d96 100644 --- a/src/target/oocd_trace.c +++ b/src/target/oocd_trace.c @@ -21,7 +21,8 @@ #include "config.h" #endif -#include "armv4_5.h" +#include "arm.h" +#include "etm.h" #include "oocd_trace.h" /* @@ -30,8 +31,6 @@ */ -static int oocd_trace_register_commands(struct command_context_s *cmd_ctx); - static int oocd_trace_read_reg(struct oocd_trace *oocd_trace, int reg, uint32_t *value) { size_t bytes_written, bytes_read, bytes_to_read; @@ -239,21 +238,21 @@ static int oocd_trace_start_capture(struct etm_context *etm_ctx) uint32_t control = 0x1; /* 0x1: enabled */ uint32_t trigger_count; - if (((etm_ctx->portmode & ETM_PORT_MODE_MASK) != ETM_PORT_NORMAL) - || ((etm_ctx->portmode & ETM_PORT_WIDTH_MASK) != ETM_PORT_4BIT)) + if (((etm_ctx->control & ETM_PORT_MODE_MASK) != ETM_PORT_NORMAL) + || ((etm_ctx->control & ETM_PORT_WIDTH_MASK) != ETM_PORT_4BIT)) { LOG_DEBUG("OpenOCD + trace only supports normal 4-bit ETM mode"); return ERROR_ETM_PORTMODE_NOT_SUPPORTED; } - if ((etm_ctx->portmode & ETM_PORT_CLOCK_MASK) == ETM_PORT_HALF_CLOCK) + if ((etm_ctx->control & ETM_PORT_CLOCK_MASK) == ETM_PORT_HALF_CLOCK) { control |= 0x2; /* half rate clock, capture at twice the clock rate */ } /* OpenOCD + trace holds up to 16 million samples, * but trigger counts is set in multiples of 16 */ - trigger_count = (1048576 * etm_ctx->trigger_percent) / 100; + trigger_count = (1048576 * /* trigger_percent */ 50) / 100; /* capturing always starts at address zero */ oocd_trace_write_reg(oocd_trace, OOCD_TRACE_ADDRESS, 0x0); @@ -278,33 +277,22 @@ static int oocd_trace_stop_capture(struct etm_context *etm_ctx) return ERROR_OK; } -struct etm_capture_driver oocd_trace_capture_driver = -{ - .name = "oocd_trace", - .register_commands = oocd_trace_register_commands, - .init = oocd_trace_init, - .status = oocd_trace_status, - .start_capture = oocd_trace_start_capture, - .stop_capture = oocd_trace_stop_capture, - .read_trace = oocd_trace_read_trace, -}; - COMMAND_HANDLER(handle_oocd_trace_config_command) { - target_t *target; + struct target *target; struct arm *arm; - if (argc != 2) + if (CMD_ARGC != 2) { LOG_ERROR("incomplete 'oocd_trace config ' command"); return ERROR_FAIL; } - target = get_current_target(cmd_ctx); + target = get_current_target(CMD_CTX); arm = target_to_arm(target); if (!is_arm(arm)) { - command_print(cmd_ctx, "current target isn't an ARM"); + command_print(CMD_CTX, "current target isn't an ARM"); return ERROR_FAIL; } @@ -316,7 +304,7 @@ COMMAND_HANDLER(handle_oocd_trace_config_command) oocd_trace->etm_ctx = arm->etm; /* copy name of TTY device used to communicate with OpenOCD + trace */ - oocd_trace->tty = strndup(args[1], 256); + oocd_trace->tty = strndup(CMD_ARGV[1], 256); } else { @@ -328,29 +316,29 @@ COMMAND_HANDLER(handle_oocd_trace_config_command) COMMAND_HANDLER(handle_oocd_trace_status_command) { - target_t *target; + struct target *target; struct arm *arm; struct oocd_trace *oocd_trace; uint32_t status; - target = get_current_target(cmd_ctx); + target = get_current_target(CMD_CTX); arm = target_to_arm(target); if (!is_arm(arm)) { - command_print(cmd_ctx, "current target isn't an ARM"); + command_print(CMD_CTX, "current target isn't an ARM"); return ERROR_FAIL; } if (!arm->etm) { - command_print(cmd_ctx, "current target doesn't have an ETM configured"); + command_print(CMD_CTX, "current target doesn't have an ETM configured"); return ERROR_FAIL; } if (strcmp(arm->etm->capture_driver->name, "oocd_trace") != 0) { - command_print(cmd_ctx, "current target's ETM capture driver isn't 'oocd_trace'"); + command_print(CMD_CTX, "current target's ETM capture driver isn't 'oocd_trace'"); return ERROR_FAIL; } @@ -359,39 +347,39 @@ COMMAND_HANDLER(handle_oocd_trace_status_command) oocd_trace_read_reg(oocd_trace, OOCD_TRACE_STATUS, &status); if (status & 0x8) - command_print(cmd_ctx, "trace clock locked"); + command_print(CMD_CTX, "trace clock locked"); else - command_print(cmd_ctx, "no trace clock"); + command_print(CMD_CTX, "no trace clock"); return ERROR_OK; } COMMAND_HANDLER(handle_oocd_trace_resync_command) { - target_t *target; + struct target *target; struct arm *arm; struct oocd_trace *oocd_trace; size_t bytes_written; uint8_t cmd_array[1]; - target = get_current_target(cmd_ctx); + target = get_current_target(CMD_CTX); arm = target_to_arm(target); if (!is_arm(arm)) { - command_print(cmd_ctx, "current target isn't an ARM"); + command_print(CMD_CTX, "current target isn't an ARM"); return ERROR_FAIL; } if (!arm->etm) { - command_print(cmd_ctx, "current target doesn't have an ETM configured"); + command_print(CMD_CTX, "current target doesn't have an ETM configured"); return ERROR_FAIL; } if (strcmp(arm->etm->capture_driver->name, "oocd_trace") != 0) { - command_print(cmd_ctx, "current target's ETM capture driver isn't 'oocd_trace'"); + command_print(CMD_CTX, "current target's ETM capture driver isn't 'oocd_trace'"); return ERROR_FAIL; } @@ -401,22 +389,52 @@ COMMAND_HANDLER(handle_oocd_trace_resync_command) bytes_written = write(oocd_trace->tty_fd, cmd_array, 1); - command_print(cmd_ctx, "requesting traceclock resync"); + command_print(CMD_CTX, "requesting traceclock resync"); LOG_DEBUG("resyncing traceclk pll"); return ERROR_OK; } -int oocd_trace_register_commands(struct command_context_s *cmd_ctx) -{ - command_t *oocd_trace_cmd; - - oocd_trace_cmd = register_command(cmd_ctx, NULL, "oocd_trace", NULL, COMMAND_ANY, "OpenOCD + trace"); +static const struct command_registration oocd_trace_all_command_handlers[] = { + { + .name = "config", + .handler = &handle_oocd_trace_config_command, + .mode = COMMAND_CONFIG, + .usage = "", + }, + { + .name = "status", + .handler = &handle_oocd_trace_status_command, + .mode = COMMAND_EXEC, + .help = "display OpenOCD + trace status", + }, + { + .name = "resync", + .handler = handle_oocd_trace_resync_command, + .mode = COMMAND_EXEC, + .help = "resync OpenOCD + trace capture clock", + }, + COMMAND_REGISTRATION_DONE +}; +static const struct command_registration oocd_trace_command_handlers[] = { + { + .name = "oocd_trace", + .mode = COMMAND_ANY, + .help = "OpenOCD trace capture driver command group", + .chain = oocd_trace_all_command_handlers, + }, + COMMAND_REGISTRATION_DONE +}; - register_command(cmd_ctx, oocd_trace_cmd, "config", handle_oocd_trace_config_command, COMMAND_CONFIG, NULL); +struct etm_capture_driver oocd_trace_capture_driver = +{ + .name = "oocd_trace", + .commands = oocd_trace_command_handlers, + .init = oocd_trace_init, + .status = oocd_trace_status, + .start_capture = oocd_trace_start_capture, + .stop_capture = oocd_trace_stop_capture, + .read_trace = oocd_trace_read_trace, +}; - register_command(cmd_ctx, oocd_trace_cmd, "status", handle_oocd_trace_status_command, COMMAND_EXEC, "display OpenOCD + trace status"); - register_command(cmd_ctx, oocd_trace_cmd, "resync", handle_oocd_trace_resync_command, COMMAND_EXEC, "resync OpenOCD + trace capture clock"); - return ERROR_OK; -}