aboutsummaryrefslogtreecommitdiff
path: root/src/target/arm_cti.c
diff options
context:
space:
mode:
authorTarek BOCHKATI <tarek.bouchkati@gmail.com>2019-12-16 16:05:17 +0100
committerTomas Vanek <vanekt@fbl.cz>2020-01-02 21:19:27 +0000
commit0750a7c085b0fb8b195b210a6835c93ea88a19f3 (patch)
treee5e3369fd2379a2a9276ea426b40fceddbae044e /src/target/arm_cti.c
parentbc0667c2371b7b142356aaab7f125c30f76168fd (diff)
downloadriscv-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
Diffstat (limited to 'src/target/arm_cti.c')
-rw-r--r--src/target/arm_cti.c68
1 files changed, 68 insertions, 0 deletions
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
};