X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Ftcl.c;h=f81b68296686e648973546af36bdead73f7b0d61;hp=dda529618eb37b58753570250bced9193469ac6e;hb=983f5a1ae932d40109031cfec8162f820cfc6f39;hpb=0894ae214a0bb7ab17e772abdc4d512e8991be31 diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index dda529618e..f81b682966 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007,2008 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * Copyright (C) 2009 SoftPLC Corporation * @@ -55,6 +55,7 @@ static int handle_interface_list_command(struct command_context_s *cmd_ctx, static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -140,9 +141,11 @@ static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, jtag_tap_t * tap) } if (goi->isconfigure) { + bool replace = true; if (jteap == NULL) { /* create new */ jteap = calloc(1, sizeof (*jteap)); + replace = false; } jteap->event = n->value; Jim_GetOpt_Obj(goi, &o); @@ -152,9 +155,12 @@ static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, jtag_tap_t * tap) jteap->body = Jim_DuplicateObj(goi->interp, o); Jim_IncrRefCount(jteap->body); - /* add to head of event list */ - jteap->next = tap->event_action; - tap->event_action = jteap; + if (!replace) + { + /* add to head of event list */ + jteap->next = tap->event_action; + tap->event_action = jteap; + } Jim_SetEmptyResult(goi->interp); } else { /* get */ @@ -219,6 +225,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) * */ if (goi->argc < 3) { Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ...."); + free(pTap); return JIM_ERR; } Jim_GetOpt_String(goi, &cp, NULL); @@ -248,6 +255,8 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) e = Jim_GetOpt_Nvp(goi, opts, &n); if (e != JIM_OK) { Jim_GetOpt_NvpUnknown(goi, opts, 0); + free((void *)pTap->dotted_name); + free(pTap); return e; } LOG_DEBUG("Processing option: %s", n->name); @@ -265,12 +274,16 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) e = Jim_GetOpt_Wide(goi, &w); if (e != JIM_OK) { Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name); + free((void *)pTap->dotted_name); + free(pTap); return e; } new_expected_ids = malloc(sizeof(uint32_t) * (pTap->expected_ids_cnt + 1)); if (new_expected_ids == NULL) { Jim_SetResult_sprintf(goi->interp, "no memory"); + free((void *)pTap->dotted_name); + free(pTap); return JIM_ERR; } @@ -289,6 +302,8 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) e = Jim_GetOpt_Wide(goi, &w); if (e != JIM_OK) { Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name); + free((void *)pTap->dotted_name); + free(pTap); return e; } switch (n->value) { @@ -302,6 +317,8 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) if (is_bad_irval(pTap->ir_length, w)) { LOG_ERROR("IR mask %x too big", (int) w); + free((void *)pTap->dotted_name); + free(pTap); return ERROR_FAIL; } pTap->ir_capture_mask = w; @@ -311,6 +328,8 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) if (is_bad_irval(pTap->ir_length, w)) { LOG_ERROR("IR capture %x too big", (int) w); + free((void *)pTap->dotted_name); + free(pTap); return ERROR_FAIL; } pTap->ir_capture_value = w; @@ -360,7 +379,8 @@ static void jtag_tap_handle_event(jtag_tap_t *tap, enum jtag_event e) * can't fail. That presumes later code * will be verifying the scan chains ... */ - tap->enabled = (e == JTAG_TAP_EVENT_ENABLE); + if (e == JTAG_TAP_EVENT_ENABLE) + tap->enabled = true; } } @@ -577,6 +597,8 @@ int jtag_register_commands(struct command_context_s *cmd_ctx) register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command, COMMAND_ANY, "set maximum jtag speed (if supported); " "parameter is maximum khz, or 0 for adaptive clocking (RTCK)."); + register_command(cmd_ctx, NULL, "jtag_rclk", handle_jtag_rclk_command, + COMMAND_ANY, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed"); register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command, COMMAND_CONFIG, "(DEPRECATED) jtag_device "); register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command, @@ -942,6 +964,9 @@ static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cm { int retval = ERROR_OK; + command_print(cmd_ctx, "OLD SYNTAX: DEPRECATED - " + "use jtag_khz, not jtag_speed"); + if (argc > 1) return ERROR_COMMAND_SYNTAX_ERROR; if (argc == 1) @@ -952,7 +977,7 @@ static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cm int retval = parse_uint(args[0], &cur_speed); if (ERROR_OK != retval) return retval; - retval = jtag_set_speed(cur_speed); + retval = jtag_config_speed(cur_speed); } command_print(cmd_ctx, "jtag_speed: %d", jtag_get_speed()); @@ -990,6 +1015,36 @@ static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, return retval; } +static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + if (argc > 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + int retval = ERROR_OK; + if (argc == 1) + { + unsigned khz = 0; + int retval = parse_uint(args[0], &khz); + if (ERROR_OK != retval) + return retval; + retval = jtag_config_rclk(khz); + if (ERROR_OK != retval) + return retval; + } + + int cur_khz = jtag_get_speed_khz(); + retval = jtag_get_speed_readable(&cur_khz); + if (ERROR_OK != retval) + return retval; + + if (cur_khz) + command_print(cmd_ctx, "RCLK not supported - fallback to %d kHz", cur_khz); + else + command_print(cmd_ctx, "RCLK - adaptive"); + + return retval; +} + static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { @@ -1016,9 +1071,7 @@ static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, return ERROR_JTAG_INIT_FAILED; jtag_add_reset(trst, srst); - jtag_execute_queue(); - - return ERROR_OK; + return jtag_execute_queue(); } static int handle_runtest_command(struct command_context_s *cmd_ctx, @@ -1033,9 +1086,7 @@ static int handle_runtest_command(struct command_context_s *cmd_ctx, return retval; jtag_add_runtest(num_clocks, TAP_IDLE); - jtag_execute_queue(); - - return ERROR_OK; + return jtag_execute_queue(); } /* @@ -1112,7 +1163,12 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c tap = jtag_tap_by_string(args[i*2]); if (tap == NULL) { + int j; + for (j = 0; j < i; j++) + free(fields[j].out_value); + free(fields); command_print(cmd_ctx, "Tap: %s unknown", args[i*2]); + return ERROR_FAIL; } int field_size = tap->ir_length;