X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fcore.c;h=871b4d2bd07b83fe6010c3d63d5a787747ee945c;hp=a498a8cf48f25e0334824e526e569ad9cd8e6264;hb=refs%2Fchanges%2F77%2F5277%2F5;hpb=deff24afa13fe5188c207258d6d1935bc3dd0870 diff --git a/src/jtag/core.c b/src/jtag/core.c index a498a8cf48..871b4d2bd0 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -35,6 +35,8 @@ #include "interface.h" #include #include +#include +#include #ifdef HAVE_STRINGS_H #include @@ -1888,6 +1890,57 @@ bool transport_is_jtag(void) return get_current_transport() == &jtag_transport; } +int adapter_resets(int trst, int srst) +{ + if (get_current_transport() == NULL) { + LOG_ERROR("transport is not selected"); + return ERROR_FAIL; + } + + if (transport_is_jtag()) { + if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) { + LOG_ERROR("adapter has no srst signal"); + return ERROR_FAIL; + } + + /* adapters without trst signal will eventually use tlr sequence */ + jtag_add_reset(trst, srst); + return ERROR_OK; + } else if (transport_is_swd()) { + if (trst == TRST_ASSERT) { + LOG_ERROR("transport swd has no trst signal"); + return ERROR_FAIL; + } + + if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) { + LOG_ERROR("adapter has no srst signal"); + return ERROR_FAIL; + } + swd_add_reset(srst); + return ERROR_OK; + } else if (transport_is_hla()) { + if (trst == TRST_ASSERT) { + LOG_ERROR("transport %s has no trst signal", + get_current_transport()->name); + return ERROR_FAIL; + } + + if (srst == SRST_ASSERT && !(jtag_reset_config & RESET_HAS_SRST)) { + LOG_ERROR("adapter has no srst signal"); + return ERROR_FAIL; + } + return hl_interface_reset(srst); + } + + if (trst == TRST_DEASSERT && srst == SRST_DEASSERT) + return ERROR_OK; + + LOG_ERROR("reset is not supported on transport %s", + get_current_transport()->name); + + return ERROR_FAIL; +} + void adapter_assert_reset(void) { if (transport_is_jtag()) {