adi_v5_dapdirect: add support for adapter drivers that provide DAP API
[openocd.git] / src / jtag / core.c
index 97caeb18aaaf4e3c6896b431f774c2153bfe23fa..111b122d95ef70f9cb94ca5c0e6754ef23110d5c 100644 (file)
@@ -35,8 +35,6 @@
 #include "interface.h"
 #include <transport/transport.h>
 #include <helper/jep106.h>
-#include <jtag/hla/hla_transport.h>
-#include <jtag/hla/hla_interface.h>
 
 #ifdef HAVE_STRINGS_H
 #include <strings.h>
@@ -128,10 +126,10 @@ static int rclk_fallback_speed_khz;
 static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
 static int jtag_speed;
 
-static struct jtag_interface *jtag;
+/* FIXME: change name to this variable, it is not anymore JTAG only */
+static struct adapter_driver *jtag;
 
-/* configuration */
-struct jtag_interface *jtag_interface;
+extern struct adapter_driver *adapter_driver;
 
 void jtag_set_flush_queue_sleep(int ms)
 {
@@ -505,7 +503,7 @@ int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state state)
 {
        int retval;
 
-       if (!(jtag->supported & DEBUG_CAP_TMS_SEQ))
+       if (!(jtag->jtag_ops->supported & DEBUG_CAP_TMS_SEQ))
                return ERROR_JTAG_NOT_IMPLEMENTED;
 
        jtag_checks();
@@ -939,7 +937,20 @@ int default_interface_jtag_execute_queue(void)
                return ERROR_FAIL;
        }
 
-       int result = jtag->execute_queue();
+       if (!transport_is_jtag()) {
+               /*
+                * FIXME: This should not happen!
+                * There could be old code that queues jtag commands with non jtag interfaces so, for
+                * the moment simply highlight it by log an error and return on empty execute_queue.
+                * We should fix it quitting with assert(0) because it is an internal error.
+                * The fix can be applied immediately after next release (v0.11.0 ?)
+                */
+               LOG_ERROR("JTAG API jtag_execute_queue() called on non JTAG interface");
+               if (!jtag->jtag_ops || !jtag->jtag_ops->execute_queue)
+                       return ERROR_OK;
+       }
+
+       int result = jtag->jtag_ops->execute_queue();
 
 #if !BUILD_ZY1000
        /* Only build this if we use a regular driver with a command queue.
@@ -1507,7 +1518,7 @@ int adapter_init(struct command_context *cmd_ctx)
        if (jtag)
                return ERROR_OK;
 
-       if (!jtag_interface) {
+       if (!adapter_driver) {
                /* nothing was previously specified by "interface" command */
                LOG_ERROR("Debug Adapter has to be specified, "
                        "see \"interface\" command");
@@ -1515,10 +1526,10 @@ int adapter_init(struct command_context *cmd_ctx)
        }
 
        int retval;
-       retval = jtag_interface->init();
+       retval = adapter_driver->init();
        if (retval != ERROR_OK)
                return retval;
-       jtag = jtag_interface;
+       jtag = adapter_driver;
 
        if (jtag->speed == NULL) {
                LOG_INFO("This adapter doesn't support configurable speed");
@@ -2009,19 +2020,7 @@ int adapter_resets(int trst, int srst)
                /* 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;
-               }
-               adapter_system_reset(srst);
-               return ERROR_OK;
-       } else if (transport_is_hla()) {
+       } else if (transport_is_swd() || transport_is_hla()) {
                if (trst == TRST_ASSERT) {
                        LOG_ERROR("transport %s has no trst signal",
                                get_current_transport()->name);
@@ -2032,7 +2031,8 @@ int adapter_resets(int trst, int srst)
                        LOG_ERROR("adapter has no srst signal");
                        return ERROR_FAIL;
                }
-               return hl_interface_reset(srst);
+               adapter_system_reset(srst);
+               return ERROR_OK;
        }
 
        if (trst == TRST_DEASSERT && srst == SRST_DEASSERT)
@@ -2044,33 +2044,39 @@ int adapter_resets(int trst, int srst)
        return ERROR_FAIL;
 }
 
-void adapter_assert_reset(void)
+int 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())
-               adapter_system_reset(1);
+               return ERROR_OK;
+       } else if (transport_is_swd() || transport_is_hla() ||
+                          transport_is_dapdirect_jtag() || transport_is_dapdirect_swd())
+               return adapter_system_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");
+       return ERROR_FAIL;
 }
 
-void adapter_deassert_reset(void)
+int adapter_deassert_reset(void)
 {
-       if (transport_is_jtag())
+       if (transport_is_jtag()) {
                jtag_add_reset(0, 0);
-       else if (transport_is_swd())
-               adapter_system_reset(0);
+               return ERROR_OK;
+       } else if (transport_is_swd() || transport_is_hla() ||
+                        transport_is_dapdirect_jtag() || transport_is_dapdirect_swd())
+               return adapter_system_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");
+       return ERROR_FAIL;
 }
 
 int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)