#define DEBUG_JTAG_IOZ 64
#endif
+/*-----<Macros>--------------------------------------------------*/
+
+/** 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.
*/
int tap_get_tms_path(tap_state_t from, tap_state_t to);
+
+/**
+ * Function int tap_get_tms_path_len
+ * returns the total number of bits that represents a TMS path
+ * transition as given by the function tap_get_tms_path().
+ *
+ * For at least one interface (JLink) it's not OK to simply "pad" TMS sequences
+ * to fit a whole byte. (I suspect this is a general TAP problem within OOCD.)
+ * Padding TMS causes all manner of instability that's not easily
+ * discovered. Using this routine we can apply EXACTLY the state transitions
+ * required to make something work - no more - no less.
+ *
+ * @param from is the starting state
+ * @param to is the resultant or final state
+ * @return int - the total number of bits in a transition.
+ */
+int tap_get_tms_path_len(tap_state_t from, tap_state_t to);
+
+
/**
* Function tap_move_ndx
* when given a stable state, returns an index from 0-5. The index corresponds to a
*/
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>------------------------------------------*/
struct scan_field_s;
typedef int (*in_handler_t)(u8* in_value, void* priv, struct scan_field_s* field);
-/// @brief calculates number of bytes required to hold @a n TAP scan bits
-#define TAP_SCAN_BYTES(n) (((n) / 8) + !!((n) % 8))
-
typedef struct scan_field_s
{
jtag_tap_t* tap; /* tap pointer this instruction refers to */