+
+
+void jtag_set_nsrst_assert_width(unsigned delay)
+{
+ adapter_nsrst_assert_width = delay;
+}
+unsigned jtag_get_nsrst_assert_width(void)
+{
+ return adapter_nsrst_assert_width;
+}
+void jtag_set_ntrst_assert_width(unsigned delay)
+{
+ jtag_ntrst_assert_width = delay;
+}
+unsigned jtag_get_ntrst_assert_width(void)
+{
+ return jtag_ntrst_assert_width;
+}
+
+static int jtag_select(struct command_context *ctx)
+{
+ int retval;
+
+ /* NOTE: interface init must already have been done.
+ * That works with only C code ... no Tcl glue required.
+ */
+
+ retval = jtag_register_commands(ctx);
+
+ if (retval != ERROR_OK)
+ return retval;
+
+ retval = svf_register_commands(ctx);
+
+ if (retval != ERROR_OK)
+ return retval;
+
+ return xsvf_register_commands(ctx);
+}
+
+static struct transport jtag_transport = {
+ .name = "jtag",
+ .select = jtag_select,
+ .init = jtag_init,
+};
+
+static void jtag_constructor(void) __attribute__((constructor));
+static void jtag_constructor(void)
+{
+ transport_register(&jtag_transport);
+}
+
+/** Returns true if the current debug session
+ * is using JTAG as its transport.
+ */
+bool transport_is_jtag(void)
+{
+ return get_current_transport() == &jtag_transport;
+}
+
+void adapter_assert_reset(void)
+{
+ if (transport_is_jtag()) {
+ if (jtag_reset_config & RESET_SRST_PULLS_TRST)
+ jtag_add_reset(1, 1);
+ else
+ jtag_add_reset(0, 1);
+ } else if (transport_is_swd())
+ swd_add_reset(1);
+ else if (get_current_transport() != NULL)
+ LOG_ERROR("reset is not supported on %s",
+ get_current_transport()->name);
+ else
+ LOG_ERROR("transport is not selected");
+}
+
+void adapter_deassert_reset(void)
+{
+ if (transport_is_jtag())
+ jtag_add_reset(0, 0);
+ else if (transport_is_swd())
+ swd_add_reset(0);
+ else if (get_current_transport() != NULL)
+ LOG_ERROR("reset is not supported on %s",
+ get_current_transport()->name);
+ else
+ LOG_ERROR("transport is not selected");
+}