]> git.sur5r.net Git - openocd/blobdiff - src/jtag/jtag.h
jtag: clean up TAP state name handling
[openocd] / src / jtag / jtag.h
index 786b2b839fc0873fbddef4d6c536c08b1715f436..ca09f923e1f1fb79bea514b877e2d8aa90d67489 100644 (file)
 
 
 #ifdef _DEBUG_JTAG_IO_
-#define DEBUG_JTAG_IO(expr ...)                LOG_DEBUG(expr)
+#define DEBUG_JTAG_IO(expr ...) \
+       do { if (1) LOG_DEBUG(expr); } while (0)
 #else
-#define DEBUG_JTAG_IO(expr ...)
+#define DEBUG_JTAG_IO(expr ...) \
+       do { if (0) LOG_DEBUG(expr); } while (0)
 #endif
 
 #ifndef DEBUG_JTAG_IOZ
  *
  * These definitions were gleaned from the ARM7TDMI-S Technical
  * Reference Manual and validated against several other ARM core
- * technical manuals.  tap_get_tms_path() is sensitive to this numbering
- * and ordering of the TAP states; furthermore, some interfaces require
- * specific numbers be used, as they are handed-off directly to their
- * hardware implementations.
+ * technical manuals.
+ *
+ * FIXME some interfaces require specific numbers be used, as they
+ * are handed-off directly to their hardware implementations.
+ * Fix those drivers to map as appropriate ... then pick some
+ * sane set of numbers here (where 0/uninitialized == INVALID).
  */
 typedef enum tap_state
 {
+       TAP_INVALID = -1,
+
 #if BUILD_ZY1000
        /* These are the old numbers. Leave as-is for now... */
        TAP_RESET    = 0, TAP_IDLE = 8,
@@ -70,7 +76,6 @@ typedef enum tap_state
        TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12,
        TAP_IRPAUSE  = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15,
 
-       TAP_NUM_STATES = 16, TAP_INVALID = -1,
 #else
        /* Proper ARM recommended numbers */
        TAP_DREXIT2 = 0x0,
@@ -90,9 +95,6 @@ typedef enum tap_state
        TAP_IRCAPTURE = 0xe,
        TAP_RESET = 0x0f,
 
-       TAP_NUM_STATES = 0x10,
-
-       TAP_INVALID = -1,
 #endif
 } tap_state_t;
 
@@ -100,7 +102,10 @@ typedef enum tap_state
  * Function tap_state_name
  * Returns a string suitable for display representing the JTAG tap_state
  */
-const char* tap_state_name(tap_state_t state);
+const char *tap_state_name(tap_state_t state);
+
+/// Provides user-friendly name lookup of TAP states.
+tap_state_t tap_state_by_name(const char *name);
 
 /// The current TAP state of the pending JTAG command queue.
 extern tap_state_t cmd_queue_cur_state;
@@ -286,7 +291,7 @@ enum reset_types {
        RESET_TRST_PULLS_SRST = 0x8,
        RESET_TRST_OPEN_DRAIN = 0x10,
        RESET_SRST_PUSH_PULL  = 0x20,
-       RESET_SRST_GATES_JTAG = 0x40,
+       RESET_SRST_NO_GATING  = 0x40,
 };
 
 enum reset_types jtag_get_reset_config(void);
@@ -534,29 +539,7 @@ extern void jtag_add_pathmove(int num_states, const tap_state_t* path);
  * @return ERROR_OK on success, or an error code on failure.
  *
  * Moves from the current state to the goal \a state.
- *
- * This needs to be handled according to the xsvf spec, see the XSTATE
- * command description.  From the XSVF spec, pertaining to XSTATE:
- *
- * For special states known as stable states (Test-Logic-Reset,
- * Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows
- * predefined TAP state paths when the starting state is a stable state
- * and when the XSTATE specifies a new stable state.  See the STATE
- * command in the [Ref 5] for the TAP state paths between stable
- * states.
- *
- * For non-stable states, XSTATE should specify a state that is only one
- * TAP state transition distance from the current TAP state to avoid
- * undefined TAP state paths. A sequence of multiple XSTATE commands can
- * be issued to transition the TAP through a specific state path.
- *
- * @note Unless @c tms_bits holds a path that agrees with [Ref 5] in the
- * above spec, then this code is not fully conformant to the xsvf spec.
- * This puts a burden on tap_get_tms_path() function from the xsvf spec.
- * If in doubt, you should confirm that that burden is being met.
- *
- * Otherwise, @a goal_state must be immediately reachable in one clock
- * cycle, and does not need to be a stable state.
+ * Both states must be stable.
  */
 extern int jtag_add_statemove(tap_state_t goal_state);
 
@@ -687,6 +670,7 @@ extern void jtag_sleep(uint32_t us);
 #define ERROR_JTAG_DEVICE_ERROR      (-107)
 #define ERROR_JTAG_STATE_INVALID     (-108)
 #define ERROR_JTAG_TRANSITION_INVALID (-109)
+#define ERROR_JTAG_INIT_SOFT_FAIL    (-110)
 
 /**
  * jtag_add_dr_out() is a version of jtag_add_dr_scan() which
@@ -734,4 +718,21 @@ int jtag_get_error(void);
  */
 int jtag_error_clear(void);
 
+/**
+ * Return true if it's safe for a background polling task to access the
+ * JTAG scan chain.  Polling may be explicitly disallowed, and is also
+ * unsafe while nTRST is active or the JTAG clock is gated off.,
+ */
+bool is_jtag_poll_safe(void);
+
+/**
+ * Return flag reporting whether JTAG polling is disallowed.
+ */
+bool jtag_poll_get_enabled(void);
+
+/**
+ * Assign flag reporting whether JTAG polling is disallowed.
+ */
+void jtag_poll_set_enabled(bool value);
+
 #endif /* JTAG_H */