diff options
author | Tarek BOCHKATI <tarek.bouchkati@gmail.com> | 2019-12-16 16:05:17 +0100 |
---|---|---|
committer | Tomas Vanek <vanekt@fbl.cz> | 2020-01-02 21:19:27 +0000 |
commit | 0750a7c085b0fb8b195b210a6835c93ea88a19f3 (patch) | |
tree | e5e3369fd2379a2a9276ea426b40fceddbae044e | |
parent | bc0667c2371b7b142356aaab7f125c30f76168fd (diff) | |
download | riscv-openocd-0750a7c085b0fb8b195b210a6835c93ea88a19f3.zip riscv-openocd-0750a7c085b0fb8b195b210a6835c93ea88a19f3.tar.gz riscv-openocd-0750a7c085b0fb8b195b210a6835c93ea88a19f3.tar.bz2 |
target/arm_cti: add new 'ack' and 'channel' commands
these commands have been introduced to ease the manipulation of CTI trough
script files, these commands are:
- $cti_name ack $event : to acknowledge a CTI event
- $cti_name channel $channel_number $operation: to perform an operation
on a specific channel, the possible operations are:
gate, ungate, set, clear and pulse
Change-Id: I35463867a3c85072f3776c3aeb1e5788953ec435
Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Reviewed-on: http://openocd.zylin.com/5315
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Tested-by: jenkins
-rw-r--r-- | doc/openocd.texi | 9 | ||||
-rw-r--r-- | src/target/arm_cti.c | 68 |
2 files changed, 77 insertions, 0 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi index de7fe0a..349998b 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -8436,6 +8436,15 @@ Write @var{value} to the CTI register with the symbolic name @var{reg_name}. Print the value read from the CTI register with the symbolic name @var{reg_name}. @end deffn +@deffn Command {$cti_name ack} @var{event} +Acknowledge a CTI @var{event}. +@end deffn + +@deffn Command {$cti_name channel} @var{channel_number} @var{operation} +Perform a specific channel operation, the possible operations are: +gate, ungate, set, clear and pulse +@end deffn + @deffn Command {$cti_name testmode} @option{on|off} Enable (@option{on}) or disable (@option{off}) the integration test mode of the CTI. diff --git a/src/target/arm_cti.c b/src/target/arm_cti.c index 3f063b8..d415eb3 100644 --- a/src/target/arm_cti.c +++ b/src/target/arm_cti.c @@ -341,6 +341,59 @@ COMMAND_HANDLER(handle_cti_read) return ERROR_OK; } +COMMAND_HANDLER(handle_cti_ack) +{ + struct arm_cti_object *obj = CMD_DATA; + struct arm_cti *cti = &obj->cti; + uint32_t event; + + if (CMD_ARGC != 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], event); + + int retval = arm_cti_ack_events(cti, 1 << event); + + + if (retval != ERROR_OK) + return retval; + + return ERROR_OK; +} + +COMMAND_HANDLER(handle_cti_channel) +{ + struct arm_cti_object *obj = CMD_DATA; + struct arm_cti *cti = &obj->cti; + int retval = ERROR_OK; + uint32_t ch_num; + + if (CMD_ARGC != 2) + return ERROR_COMMAND_SYNTAX_ERROR; + + COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], ch_num); + + if (!strcmp(CMD_ARGV[1], "gate")) + retval = arm_cti_gate_channel(cti, ch_num); + else if (!strcmp(CMD_ARGV[1], "ungate")) + retval = arm_cti_ungate_channel(cti, ch_num); + else if (!strcmp(CMD_ARGV[1], "pulse")) + retval = arm_cti_pulse_channel(cti, ch_num); + else if (!strcmp(CMD_ARGV[1], "set")) + retval = arm_cti_set_channel(cti, ch_num); + else if (!strcmp(CMD_ARGV[1], "clear")) + retval = arm_cti_clear_channel(cti, ch_num); + else { + command_print(CMD, "Possible channel operations: gate|ungate|set|clear|pulse"); + return ERROR_COMMAND_ARGUMENT_INVALID; + } + + if (retval != ERROR_OK) + return retval; + + return ERROR_OK; +} + static const struct command_registration cti_instance_command_handlers[] = { { .name = "dump", @@ -377,6 +430,21 @@ static const struct command_registration cti_instance_command_handlers[] = { .help = "read a CTI register", .usage = "register_name", }, + { + .name = "ack", + .mode = COMMAND_EXEC, + .handler = handle_cti_ack, + .help = "acknowledge a CTI event", + .usage = "event", + }, + { + .name = "channel", + .mode = COMMAND_EXEC, + .handler = handle_cti_channel, + .help = "do an operation on one CTI channel, possible operations: " + "gate, ungate, set, clear and pulse", + .usage = "channel_number operation", + }, COMMAND_REGISTRATION_DONE }; |