X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Ftcl.c;h=3b2f83b5aef4b6a3c063cdf2ba82b1c6a9cd4d34;hb=194e3c5bc5e0fbb7d41cfcbe913c4264782cdd5b;hp=4df3ccb8c63f5686a824116de9f41449e4271b17;hpb=07e0bd46859439426084e2612d3fe1c3281564a9;p=openocd.git diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index 4df3ccb8c6..3b2f83b5ae 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -40,6 +40,8 @@ #include #endif +#include + /** * @file * Holds support for accessing JTAG-specific mechanisms from TCl scripts. @@ -63,7 +65,7 @@ struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o) if (NULL == cp) cp = "(unknown)"; if (NULL == t) - Jim_SetResult_sprintf(interp, "Tap '%s' could not be found", cp); + Jim_SetResultFormatted(interp, "Tap '%s' could not be found", cp); return t; } @@ -145,7 +147,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args endstate = tap_state_by_name(cp); if (endstate < 0) { /* update the error message */ - Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp); + Jim_SetResultFormatted(interp,"endstate: %s invalid", cp); } else { if (!scan_is_safe(endstate)) LOG_WARNING("drscan with unsafe " @@ -242,7 +244,7 @@ static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *ar if (states[i] < 0) { /* update the error message */ - Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp); + Jim_SetResultFormatted(interp,"endstate: %s invalid", cp); return JIM_ERR; } } @@ -419,7 +421,7 @@ static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, struct jtag_tap * tap) return e; break; default: - Jim_SetResult_sprintf(goi->interp, "unknown event: %s", n->name); + Jim_SetResultFormatted(goi->interp, "unknown event: %s", n->name); return JIM_ERR; } } @@ -443,7 +445,7 @@ static int jim_newtap_expected_id(Jim_Nvp *n, Jim_GetOptInfo *goi, jim_wide w; int e = Jim_GetOpt_Wide(goi, &w); if (e != JIM_OK) { - Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name); + Jim_SetResultFormatted(goi->interp, "option: %s bad parameter", n->name); return e; } @@ -451,7 +453,7 @@ static int jim_newtap_expected_id(Jim_Nvp *n, Jim_GetOptInfo *goi, uint32_t *new_expected_ids = malloc(expected_len + sizeof(uint32_t)); if (new_expected_ids == NULL) { - Jim_SetResult_sprintf(goi->interp, "no memory"); + Jim_SetResultFormatted(goi->interp, "no memory"); return JIM_ERR; } @@ -481,7 +483,7 @@ static int jim_newtap_ir_param(Jim_Nvp *n, Jim_GetOptInfo *goi, int e = Jim_GetOpt_Wide(goi, &w); if (e != JIM_OK) { - Jim_SetResult_sprintf(goi->interp, + Jim_SetResultFormatted(goi->interp, "option: %s bad parameter", n->name); free((void *)pTap->dotted_name); return e; @@ -545,7 +547,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) pTap = calloc(1, sizeof(struct jtag_tap)); if (!pTap) { - Jim_SetResult_sprintf(goi->interp, "no memory"); + Jim_SetResultFormatted(goi->interp, "no memory"); return JIM_ERR; } @@ -553,7 +555,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) * we expect CHIP + TAP + OPTIONS * */ if (goi->argc < 3) { - Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ...."); + Jim_SetResultFormatted(goi->interp, "Missing CHIP TAP OPTIONS ...."); free(pTap); return JIM_ERR; } @@ -631,7 +633,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) return JIM_OK; } - Jim_SetResult_sprintf(goi->interp, + Jim_SetResultFormatted(goi->interp, "newtap: %s missing IR length", pTap->dotted_name); jtag_tap_free(pTap); @@ -654,7 +656,8 @@ static void jtag_tap_handle_event(struct jtag_tap *tap, enum jtag_event e) if (Jim_EvalObj(jteap->interp, jteap->body) != JIM_OK) { - Jim_PrintErrorMessage(jteap->interp); + Jim_MakeErrorMessage(jteap->interp); + LOG_USER("%s", Jim_GetString(Jim_GetResult(jteap->interp), NULL)); continue; } @@ -687,7 +690,9 @@ static int jim_jtag_arp_init(Jim_Interp *interp, int argc, Jim_Obj *const *argv) struct command_context *context = current_command_context(interp); int e = jtag_init_inner(context); if (e != ERROR_OK) { - Jim_SetResult_sprintf(goi.interp, "error: %d", e); + Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e); + Jim_SetResultFormatted(goi.interp, "error: %#s", eObj); + Jim_FreeNewObj(goi.interp, eObj); return JIM_ERR; } return JIM_OK; @@ -704,13 +709,15 @@ static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const struct command_context *context = current_command_context(interp); int e = jtag_init_reset(context); if (e != ERROR_OK) { - Jim_SetResult_sprintf(goi.interp, "error: %d", e); + Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e); + Jim_SetResultFormatted(goi.interp, "error: %#s", eObj); + Jim_FreeNewObj(goi.interp, eObj); return JIM_ERR; } return JIM_OK; } -static int jim_jtag_newtap(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +int jim_jtag_newtap(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { Jim_GetOptInfo goi; Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1); @@ -754,7 +761,7 @@ static int jim_jtag_tap_enabler(Jim_Interp *interp, int argc, Jim_Obj *const *ar Jim_GetOptInfo goi; Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1); if (goi.argc != 1) { - Jim_SetResult_sprintf(goi.interp, "usage: %s ", cmd_name); + Jim_SetResultFormatted(goi.interp, "usage: %s ", cmd_name); return JIM_ERR; } @@ -767,11 +774,15 @@ static int jim_jtag_tap_enabler(Jim_Interp *interp, int argc, Jim_Obj *const *ar if (strcasecmp(cmd_name, "tapisenabled") == 0) { // do nothing, just return the value } else if (strcasecmp(cmd_name, "tapenable") == 0) { - if (!jtag_tap_enable(t)) + if (!jtag_tap_enable(t)){ LOG_WARNING("failed to enable tap %s", t->dotted_name); + return JIM_ERR; + } } else if (strcasecmp(cmd_name, "tapdisable") == 0) { - if (!jtag_tap_disable(t)) + if (!jtag_tap_disable(t)){ LOG_WARNING("failed to disable tap %s", t->dotted_name); + return JIM_ERR; + } } else { LOG_ERROR("command '%s' unknown", cmd_name); return JIM_ERR; @@ -1261,6 +1272,46 @@ COMMAND_HANDLER(handle_jtag_flush_queue_sleep) return ERROR_OK; } +COMMAND_HANDLER(handle_wait_srst_deassert) +{ + if (CMD_ARGC != 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + int timeout_ms; + COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], timeout_ms); + if ((timeout_ms <= 0) || (timeout_ms > 100000)) + { + LOG_ERROR("Timeout must be an integer between 0 and 100000"); + return ERROR_FAIL; + } + + LOG_USER("Waiting for srst assert + deassert for at most %dms", timeout_ms); + int asserted_yet; + long long then = timeval_ms(); + while (jtag_srst_asserted(&asserted_yet) == ERROR_OK) + { + if ((timeval_ms() - then) > timeout_ms) + { + LOG_ERROR("Timed out"); + return ERROR_FAIL; + } + if (asserted_yet) + break; + } + while (jtag_srst_asserted(&asserted_yet) == ERROR_OK) + { + if ((timeval_ms() - then) > timeout_ms) + { + LOG_ERROR("Timed out"); + return ERROR_FAIL; + } + if (!asserted_yet) + break; + } + + return ERROR_OK; +} + static const struct command_registration jtag_command_handlers[] = { @@ -1352,6 +1403,15 @@ static const struct command_registration jtag_command_handlers[] = { /* Specifically for working around DRIVER bugs... */ .usage = "['short'|'long']", }, + { + .name = "wait_srst_deassert", + .handler = handle_wait_srst_deassert, + .mode = COMMAND_ANY, + .help = "Wait for an SRST deassert. " + "Useful for cases where you need something to happen within ms " + "of an srst deassert. Timeout in ms ", + .usage = "ms", + }, { .name = "jtag", .mode = COMMAND_ANY,