diff options
Diffstat (limited to 'fpga/xilinx/programmer/dependencies/libxsvf/play.c')
-rw-r--r-- | fpga/xilinx/programmer/dependencies/libxsvf/play.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/fpga/xilinx/programmer/dependencies/libxsvf/play.c b/fpga/xilinx/programmer/dependencies/libxsvf/play.c new file mode 100644 index 0000000..e57c01e --- /dev/null +++ b/fpga/xilinx/programmer/dependencies/libxsvf/play.c @@ -0,0 +1,72 @@ +/* + * Lib(X)SVF - A library for implementing SVF and XSVF JTAG players + * + * Copyright (C) 2009 RIEGL Research ForschungsGmbH + * Copyright (C) 2009 Clifford Wolf <clifford@clifford.at> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#include "libxsvf.h" + +int libxsvf_play(struct libxsvf_host *h, enum libxsvf_mode mode) +{ + int rc = -1; + + h->tap_state = LIBXSVF_TAP_INIT; + if (LIBXSVF_HOST_SETUP() < 0) { + LIBXSVF_HOST_REPORT_ERROR("Setup of JTAG interface failed."); + return -1; + } + + if (mode == LIBXSVF_MODE_SVF) { +#ifdef LIBXSVF_WITHOUT_SVF + LIBXSVF_HOST_REPORT_ERROR("SVF support in libxsvf is disabled."); +#else + rc = libxsvf_svf(h); +#endif + } + + if (mode == LIBXSVF_MODE_XSVF) { +#ifdef LIBXSVF_WITHOUT_XSVF + LIBXSVF_HOST_REPORT_ERROR("XSVF support in libxsvf is disabled."); +#else + rc = libxsvf_xsvf(h); +#endif + } + + if (mode == LIBXSVF_MODE_SCAN) { +#ifdef LIBXSVF_WITHOUT_SCAN + LIBXSVF_HOST_REPORT_ERROR("SCAN support in libxsvf is disabled."); +#else + rc = libxsvf_scan(h); +#endif + } + + libxsvf_tap_walk(h, LIBXSVF_TAP_RESET); + if (LIBXSVF_HOST_SYNC() != 0 && rc >= 0 ) { + LIBXSVF_HOST_REPORT_ERROR("TDO mismatch in TAP reset. (this is not possible!)"); + rc = -1; + } + + int shutdown_rc = LIBXSVF_HOST_SHUTDOWN(); + + if (shutdown_rc < 0) { + LIBXSVF_HOST_REPORT_ERROR("Shutdown of JTAG interface failed."); + rc = rc < 0 ? rc : shutdown_rc; + } + + return rc; +} + |