jtag/kitprog: switch to command 'adapter serial'
[fw/openocd] / src / jtag / interface.h
index 275c49555d26e59ba6f5664a5118c808bfd036ec..58bfd02b0a4054c6eaea3dfe722f741c656714a0 100644 (file)
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 #ifndef OPENOCD_JTAG_INTERFACE_H
 #define OPENOCD_JTAG_INTERFACE_H
 
 #include <jtag/jtag.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
@@ -57,18 +57,11 @@ void tap_set_state_impl(tap_state_t new_state);
  * @param new_state The state we think the TAPs are currently in (or
  * are about to enter).
  */
-#if defined(_DEBUG_JTAG_IO_)
 #define tap_set_state(new_state) \
        do { \
-               LOG_DEBUG("tap_set_state(%s)", tap_state_name(new_state)); \
+               LOG_DEBUG_IO("tap_set_state(%s)", tap_state_name(new_state)); \
                tap_set_state_impl(new_state); \
        } while (0)
-#else
-static inline void tap_set_state(tap_state_t new_state)
-{
-       tap_set_state_impl(new_state);
-}
-#endif
 
 /**
  * This function gets the state of the "state follower" which tracks the
@@ -165,7 +158,7 @@ void tap_use_new_tms_table(bool use_new);
 /** @returns True if new TMS table is active; false otherwise. */
 bool tap_uses_new_tms_table(void);
 
-#ifdef _DEBUG_JTAG_IO_
+
 /**
  * @brief Prints verbose TAP state transitions for the given TMS/TDI buffers.
  * @param tms_buf must points to a buffer containing the TMS bitstream.
@@ -174,15 +167,18 @@ bool tap_uses_new_tms_table(void);
  * @param start_tap_state must specify the current TAP state.
  * @returns the final TAP state; pass as @a start_tap_state in following call.
  */
-tap_state_t jtag_debug_state_machine(const void *tms_buf, const void *tdi_buf,
-               unsigned tap_len, tap_state_t start_tap_state);
-#else
 static inline tap_state_t jtag_debug_state_machine(const void *tms_buf,
                const void *tdi_buf, unsigned tap_len, tap_state_t start_tap_state)
 {
-       return start_tap_state;
+       /* Private declaration */
+       tap_state_t jtag_debug_state_machine_(const void *tms_buf, const void *tdi_buf,
+                       unsigned tap_len, tap_state_t start_tap_state);
+
+       if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO))
+               return jtag_debug_state_machine_(tms_buf, tdi_buf, tap_len, start_tap_state);
+       else
+               return start_tap_state;
 }
-#endif /* _DEBUG_JTAG_IO_ */
 
 /**
  * Represents a driver for a debugging interface.
@@ -197,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. */
-       char *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
@@ -252,7 +250,30 @@ struct jtag_interface {
        int (*quit)(void);
 
        /**
-        * Returns JTAG maxium speed for KHz. 0 = RTCK. The function returns
+        * 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.
+        * Adapters that don't support one of the two reset should ignore the
+        * request to assert the missing signal and eventually log an error.
+        *
+        * @param srst 1 to assert SRST, 0 to deassert SRST.
+        * @param trst 1 to assert TRST, 0 to deassert TRST.
+        * @returns ERROR_OK on success, or an error code on failure.
+        */
+       int (*reset)(int srst, int trst);
+
+       /**
+        * 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
@@ -298,11 +319,60 @@ struct jtag_interface {
         * @returns ERROR_OK on success, or an error code on failure.
         */
        int (*srst_asserted)(int *srst_asserted);
+
+       /**
+        * Configure trace parameters for the adapter
+        *
+        * @param enabled Whether to enable trace
+        * @param pin_protocol Configured pin protocol
+        * @param port_size Trace port width for sync mode
+        * @param trace_freq A pointer to the configured trace
+        * frequency; if it points to 0, the adapter driver must write
+        * its maximum supported rate there
+        * @param traceclkin_freq TRACECLKIN frequency provided to the TPIU in Hz
+        * @param prescaler Pointer to the SWO prescaler calculated by the
+        * adapter
+        * @returns ERROR_OK on success, an error code on failure.
+        */
+       int (*config_trace)(bool enabled, enum tpiu_pin_protocol pin_protocol,
+               uint32_t port_size, unsigned int *trace_freq,
+               unsigned int traceclkin_freq, uint16_t *prescaler);
+
+       /**
+        * Poll for new trace data
+        *
+        * @param buf A pointer to buffer to store received data
+        * @param size A pointer to buffer size; must be filled with
+        * the actual amount of bytes written
+        *
+        * @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[];
 
-void adapter_assert_reset(void);
-void adapter_deassert_reset(void);
+int adapter_resets(int assert_trst, int assert_srst);
+int adapter_assert_reset(void);
+int adapter_deassert_reset(void);
+int adapter_config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,
+               uint32_t port_size, unsigned int *trace_freq,
+               unsigned int traceclkin_freq, uint16_t *prescaler);
+int adapter_poll_trace(uint8_t *buf, size_t *size);
 
 #endif /* OPENOCD_JTAG_INTERFACE_H */