target/arm_cti: fix regression from Tcl_return_values series
[fw/openocd] / src / target / arm_cti.c
index dcaf21e50a7550dce8e90a09a66c2c3d1806bab3..1662c7e16abe788726187c37f41c707d7442a260 100644 (file)
@@ -173,7 +173,7 @@ int arm_cti_clear_channel(struct arm_cti *self, uint32_t channel)
        return arm_cti_write_reg(self, CTI_APPCLEAR, CTI_CHNL(channel));
 }
 
-static uint32_t cti_regs[26];
+static uint32_t cti_regs[28];
 
 static const struct {
        uint32_t offset;
@@ -206,6 +206,8 @@ static const struct {
        { CTI_CHOU_STATUS,      "CHOUT", &cti_regs[23] },
        { CTI_APPSET,   "APPSET",       &cti_regs[24] },
        { CTI_APPCLEAR, "APPCLR",       &cti_regs[25] },
+       { CTI_APPPULSE, "APPPULSE",     &cti_regs[26] },
+       { CTI_INACK,    "INACK",        &cti_regs[27] },
 };
 
 static int cti_find_reg_offset(const char *name)
@@ -216,6 +218,8 @@ static int cti_find_reg_offset(const char *name)
                if (!strcmp(name, cti_names[i].label))
                        return cti_names[i].offset;
        }
+
+       LOG_ERROR("unknown CTI register %s", name);
        return -1;
 }
 
@@ -248,7 +252,7 @@ COMMAND_HANDLER(handle_cti_dump)
                return JIM_ERR;
 
        for (int i = 0; i < (int)ARRAY_SIZE(cti_names); i++)
-               command_print(CMD_CTX, "%8.8s (0x%04"PRIx32") 0x%08"PRIx32,
+               command_print(CMD, "%8.8s (0x%04"PRIx32") 0x%08"PRIx32,
                                cti_names[i].label, cti_names[i].offset, *cti_names[i].p_val);
 
        return JIM_OK;
@@ -257,14 +261,11 @@ COMMAND_HANDLER(handle_cti_dump)
 COMMAND_HANDLER(handle_cti_enable)
 {
        struct arm_cti_object *obj = CMD_DATA;
-       Jim_Interp *interp = CMD_CTX->interp;
        struct arm_cti *cti = &obj->cti;
        bool on_off;
 
-       if (CMD_ARGC != 1) {
-               Jim_SetResultString(interp, "wrong number of args", -1);
-               return ERROR_FAIL;
-       }
+       if (CMD_ARGC != 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        COMMAND_PARSE_ON_OFF(CMD_ARGV[0], on_off);
 
@@ -274,14 +275,11 @@ COMMAND_HANDLER(handle_cti_enable)
 COMMAND_HANDLER(handle_cti_testmode)
 {
        struct arm_cti_object *obj = CMD_DATA;
-       Jim_Interp *interp = CMD_CTX->interp;
        struct arm_cti *cti = &obj->cti;
        bool on_off;
 
-       if (CMD_ARGC != 1) {
-               Jim_SetResultString(interp, "wrong number of args", -1);
-               return ERROR_FAIL;
-       }
+       if (CMD_ARGC != 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        COMMAND_PARSE_ON_OFF(CMD_ARGV[0], on_off);
 
@@ -291,15 +289,12 @@ COMMAND_HANDLER(handle_cti_testmode)
 COMMAND_HANDLER(handle_cti_write)
 {
        struct arm_cti_object *obj = CMD_DATA;
-       Jim_Interp *interp = CMD_CTX->interp;
        struct arm_cti *cti = &obj->cti;
        int offset;
        uint32_t value;
 
-       if (CMD_ARGC != 2) {
-               Jim_SetResultString(interp, "Wrong numer of args", -1);
-               return ERROR_FAIL;
-       }
+       if (CMD_ARGC != 2)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        offset = cti_find_reg_offset(CMD_ARGV[0]);
        if (offset < 0)
@@ -313,16 +308,13 @@ COMMAND_HANDLER(handle_cti_write)
 COMMAND_HANDLER(handle_cti_read)
 {
        struct arm_cti_object *obj = CMD_DATA;
-       Jim_Interp *interp = CMD_CTX->interp;
        struct arm_cti *cti = &obj->cti;
        int offset;
        int retval;
        uint32_t value;
 
-       if (CMD_ARGC != 1) {
-               Jim_SetResultString(interp, "Wrong numer of args", -1);
-               return ERROR_FAIL;
-       }
+       if (CMD_ARGC != 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
        offset = cti_find_reg_offset(CMD_ARGV[0]);
        if (offset < 0)
@@ -332,7 +324,60 @@ COMMAND_HANDLER(handle_cti_read)
        if (retval != ERROR_OK)
                return retval;
 
-       command_print(CMD_CTX, "0x%08"PRIx32, value);
+       command_print(CMD, "0x%08"PRIx32, value);
+
+       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;
 }
@@ -373,6 +418,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
 };
 
@@ -572,6 +632,7 @@ static const struct command_registration cti_command_handlers[] = {
                .mode = COMMAND_CONFIG,
                .help = "CTI commands",
                .chain = cti_subcommand_handlers,
+               .usage = "",
        },
        COMMAND_REGISTRATION_DONE
 };