#define DEBUG_JTAG_IOZ 64
#endif
+/*-----<Macros>--------------------------------------------------*/
-/* 16 Tap States, from page 21 of ASSET InterTech, Inc.'s svf.pdf
+/** When given an array, compute its DIMension, i.e. number of elements in the array */
+#define DIM(x) (sizeof(x)/sizeof((x)[0]))
+
+/** Calculate the number of bytes required to hold @a n TAP scan bits */
+#define TAP_SCAN_BYTES(n) CEIL(n, 8)
+
+/*-----</Macros>-------------------------------------------------*/
+
+
+
+/*
+ * Tap states from ARM7TDMI-S Technical reference manual.
+ * Also, validated against several other ARM core technical manuals.
+ *
+ * N.B. tap_get_tms_path() was changed to reflect this corrected
+ * numbering and ordering of the TAP states.
+ *
+ * DANGER!!!! some interfaces care about the actual numbers used
+ * as they are handed off directly to hardware implementations.
*/
-enum tap_state {
+
+typedef enum tap_state
+{
+#if BUILD_ECOSBOARD
+/* These are the old numbers. Leave as-is for now... */
TAP_RESET = 0, TAP_IDLE = 8,
TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4,
TAP_DRPAUSE = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7,
TAP_IRPAUSE = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15,
TAP_NUM_STATES = 16, TAP_INVALID = -1,
-};
-
-typedef enum tap_state tap_state_t;
+#else
+ /* Proper ARM recommended numbers */
+ TAP_DREXIT2 = 0x0,
+ TAP_DREXIT1 = 0x1,
+ TAP_DRSHIFT = 0x2,
+ TAP_DRPAUSE = 0x3,
+ TAP_IRSELECT = 0x4,
+ TAP_DRUPDATE = 0x5,
+ TAP_DRCAPTURE = 0x6,
+ TAP_DRSELECT = 0x7,
+ TAP_IREXIT2 = 0x8,
+ TAP_IREXIT1 = 0x9,
+ TAP_IRSHIFT = 0xa,
+ TAP_IRPAUSE = 0xb,
+ TAP_IDLE = 0xc,
+ TAP_IRUPDATE = 0xd,
+ TAP_IRCAPTURE = 0xe,
+ TAP_RESET = 0x0f,
+
+ TAP_NUM_STATES = 0x10,
+
+ TAP_INVALID = -1,
+#endif
+} tap_state_t;
typedef struct tap_transition_s
{
*/
const char* tap_state_name(tap_state_t state);
+#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.
+ * @param tdi_buf must points to a buffer containing the TDI bitstream.
+ * @param tap_len must specify the length of the TMS/TDI bitstreams.
+ * @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;
+}
+#endif // _DEBUG_JTAG_IO_
+
/*-----</Cable Helper API>------------------------------------------*/