X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fxsvf%2Fxsvf.c;h=e574c6f0e42599769a2c1cc0412e652ae1889587;hb=HEAD;hp=137dd63ac0bb45c175f0aa64dde8dacef4a0b441;hpb=f7772ccb490c3f26a17a0fd15a251ffc5f49e262;p=openocd.git diff --git a/src/xsvf/xsvf.c b/src/xsvf/xsvf.c index 137dd63ac0..0266c2120c 100644 --- a/src/xsvf/xsvf.c +++ b/src/xsvf/xsvf.c @@ -1,3 +1,5 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + /*************************************************************************** * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * @@ -10,30 +12,15 @@ * * * Copyright (C) 2009 SoftPLC Corporation. http://softplc.com * * Dick Hollenbeck * - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ /* The specification for SVF is available here: * http://www.asset-intertech.com/support/svf.pdf - * Below, this document is refered to as the "SVF spec". + * Below, this document is referred to as the "SVF spec". * * The specification for XSVF is available here: * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf - * Below, this document is refered to as the "XSVF spec". + * Below, this document is referred to as the "XSVF spec". */ #ifdef HAVE_CONFIG_H @@ -41,6 +28,7 @@ #endif #include "xsvf.h" +#include "helper/system.h" #include #include @@ -232,7 +220,7 @@ COMMAND_HANDLER(handle_xsvf_command) unsigned pathlen = 0; /* a flag telling whether to clock TCK during waits, - * or simply sleep, controled by virt2 + * or simply sleep, controlled by virt2 */ int runtest_requires_tck = 0; @@ -251,14 +239,14 @@ COMMAND_HANDLER(handle_xsvf_command) if (strcmp(CMD_ARGV[0], "plain") != 0) { tap = jtag_tap_by_string(CMD_ARGV[0]); if (!tap) { - command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[0]); + command_print(CMD, "Tap: %s unknown", CMD_ARGV[0]); return ERROR_FAIL; } } xsvf_fd = open(filename, O_RDONLY); if (xsvf_fd < 0) { - command_print(CMD_CTX, "file \"%s\" not found", filename); + command_print(CMD, "file \"%s\" not found", filename); return ERROR_FAIL; } @@ -273,6 +261,7 @@ COMMAND_HANDLER(handle_xsvf_command) if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "quiet") == 0)) verbose = 0; + LOG_WARNING("XSVF support in OpenOCD is limited. Consider using SVF instead"); LOG_USER("xsvf processing file: \"%s\"", filename); while (read(xsvf_fd, &opcode, 1) > 0) { @@ -412,12 +401,9 @@ COMMAND_HANDLER(handle_xsvf_command) xsdrsize = be_to_h_u32(xsdrsize_buf); LOG_DEBUG("XSDRSIZE %d", xsdrsize); - if (dr_out_buf) - free(dr_out_buf); - if (dr_in_buf) - free(dr_in_buf); - if (dr_in_mask) - free(dr_in_mask); + free(dr_out_buf); + free(dr_in_buf); + free(dr_in_mask); dr_out_buf = malloc((xsdrsize + 7) / 8); dr_in_buf = malloc((xsdrsize + 7) / 8); @@ -457,7 +443,7 @@ COMMAND_HANDLER(handle_xsvf_command) if (attempt > 0) { /* perform the XC9500 exception handling sequence shown in xapp067.pdf and - * illustrated in psuedo code at end of this file. We start from state + * illustrated in pseudo code at end of this file. We start from state * DRPAUSE: * go to Exit2-DR * go to Shift-DR @@ -490,7 +476,7 @@ COMMAND_HANDLER(handle_xsvf_command) field.out_value = dr_out_buf; field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); - if (tap == NULL) + if (!tap) jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, @@ -699,7 +685,7 @@ COMMAND_HANDLER(handle_xsvf_command) field.in_value = NULL; - if (tap == NULL) + if (!tap) jtag_add_plain_ir_scan(field.num_bits, field.out_value, field.in_value, my_end_state); else @@ -919,8 +905,10 @@ COMMAND_HANDLER(handle_xsvf_command) struct scan_field field; result = svf_add_statemove(loop_state); - if (result != ERROR_OK) + if (result != ERROR_OK) { + free(dr_in_mask); return result; + } jtag_add_clocks(loop_clocks); jtag_add_sleep(loop_usecs); @@ -931,7 +919,7 @@ COMMAND_HANDLER(handle_xsvf_command) if (attempt > 0 && verbose) LOG_USER("LSDR retry %d", attempt); - if (tap == NULL) + if (!tap) jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, @@ -1006,7 +994,7 @@ COMMAND_HANDLER(handle_xsvf_command) } if (tdo_mismatch) { - command_print(CMD_CTX, + command_print(CMD, "TDO mismatch, somewhere near offset %lu in xsvf file, aborting", file_offset); @@ -1015,29 +1003,24 @@ COMMAND_HANDLER(handle_xsvf_command) if (unsupported) { off_t offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1; - command_print(CMD_CTX, + command_print(CMD, "unsupported xsvf command (0x%02X) at offset %jd, aborting", uc, (intmax_t)offset); return ERROR_FAIL; } if (do_abort) { - command_print(CMD_CTX, "premature end of xsvf file detected, aborting"); + command_print(CMD, "premature end of xsvf file detected, aborting"); return ERROR_FAIL; } - if (dr_out_buf) - free(dr_out_buf); - - if (dr_in_buf) - free(dr_in_buf); - - if (dr_in_mask) - free(dr_in_mask); + free(dr_out_buf); + free(dr_in_buf); + free(dr_in_mask); close(xsvf_fd); - command_print(CMD_CTX, "XSVF file programmed successfully"); + command_print(CMD, "XSVF file programmed successfully"); return ERROR_OK; } @@ -1063,7 +1046,7 @@ int xsvf_register_commands(struct command_context *cmd_ctx) /* -PSUEDO-Code from Xilinx Appnote XAPP067.pdf : +PSEUDO-Code from Xilinx Appnote XAPP067.pdf : the following pseudo code clarifies the intent of the xrepeat support.The flow given is for the entire processing of an SVF file, not an XSVF file.