jtag: drivers: bcm2835gpio: don't allow GPIOs > 31
[fw/openocd] / src / jtag / interface.h
index c5579f5e06b535c5ecd22228026ed2da121b4ad1..58bfd02b0a4054c6eaea3dfe722f741c656714a0 100644 (file)
@@ -26,7 +26,8 @@
 #define OPENOCD_JTAG_INTERFACE_H
 
 #include <jtag/jtag.h>
-#include <target/armv7m_trace.h>
+#include <jtag/swim.h>
+#include <target/arm_tpiu_swo.h>
 
 /* @file
  * The "Cable Helper API" is what the cable drivers can use to help
@@ -192,32 +193,34 @@ static inline tap_state_t jtag_debug_state_machine(const void *tms_buf,
  * debugging interface.
  */
 struct jtag_interface {
-       /** The name of the JTAG interface driver. */
-       const char * const name;
-
        /**
         * Bit vector listing capabilities exposed by this driver.
         */
        unsigned supported;
 #define DEBUG_CAP_TMS_SEQ      (1 << 0)
 
-       /** transports supported in C code (NULL terminated vector) */
-       const char * const *transports;
-
-       const struct swd_driver *swd;
-
        /**
         * Execute queued commands.
         * @returns ERROR_OK on success, or an error code on failure.
         */
        int (*execute_queue)(void);
+};
 
-       /**
-        * Set the interface speed.
-        * @param speed The new interface speed setting.
-        * @returns ERROR_OK on success, or an error code on failure.
-        */
-       int (*speed)(int speed);
+/**
+ * Represents a driver for a debugging interface
+ *
+ * @todo We need a per-instance structure too, and changes to pass
+ * that structure to the driver.  Instances can for example be in
+ * either SWD or JTAG modes.  This will help remove globals, and
+ * eventually to cope with systems which have more than one such
+ * debugging interface.
+ */
+struct adapter_driver {
+       /** The name of the interface driver. */
+       const char * const name;
+
+       /** transports supported in C code (NULL terminated vector) */
+       const char * const *transports;
 
        /**
         * The interface driver may register additional commands to expose
@@ -248,6 +251,8 @@ struct jtag_interface {
 
        /**
         * Control (assert/deassert) the signals SRST and TRST on the interface.
+        * This function is synchronous and should be called after the adapter
+        * queue has been properly flushed.
         * This function is optional.
         * Adapters that don't support resets can either not define this function
         * or return an error code.
@@ -261,7 +266,14 @@ struct jtag_interface {
        int (*reset)(int srst, int trst);
 
        /**
-        * Returns JTAG maxium speed for KHz. 0 = RTCK. The function returns
+        * Set the interface speed.
+        * @param speed The new interface speed setting.
+        * @returns ERROR_OK on success, or an error code on failure.
+        */
+       int (*speed)(int speed);
+
+       /**
+        * Returns JTAG maximum speed for KHz. 0 = RTCK. The function returns
         *  a failure if it can't support the KHz/RTCK.
         *
         *  WARNING!!!! if RTCK is *slow* then think carefully about
@@ -336,6 +348,21 @@ struct jtag_interface {
         * @returns ERROR_OK on success, an error code on failure.
         */
        int (*poll_trace)(uint8_t *buf, size_t *size);
+
+       /** Low-level JTAG APIs */
+       struct jtag_interface *jtag_ops;
+
+       /** Low-level SWD APIs */
+       const struct swd_driver *swd_ops;
+
+       /* DAP APIs over JTAG transport */
+       const struct dap_ops *dap_jtag_ops;
+
+       /* DAP APIs over SWD transport */
+       const struct dap_ops *dap_swd_ops;
+
+       /* SWIM APIs */
+       const struct swim_driver *swim_ops;
 };
 
 extern const char * const jtag_only[];