X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fjtag.h;h=e07614639b7e3c35c9f3d3c5b1000e3cc66c6bb2;hp=a14edb481bd331bba8eaa832a8925704ba716bfb;hb=abeee8b4c237914a87921f2e3aa733b9fc699908;hpb=447a615dc33f324d44c73b282174be44e876cf41 diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index a14edb481b..e07614639b 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -40,6 +40,17 @@ #define DEBUG_JTAG_IOZ 64 #endif +/*-------------------------------------------------------*/ + +/** 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) + +/*------------------------------------------------------*/ + + /* * Tap states from ARM7TDMI-S Technical reference manual. @@ -170,6 +181,25 @@ tap_state_t tap_get_end_state(void); */ 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 @@ -206,6 +236,25 @@ tap_state_t tap_state_transition(tap_state_t current_state, bool tms); */ 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_ + /*-----------------------------------------------*/ @@ -217,9 +266,6 @@ typedef void* error_handler_t; /* Later on we can delete error_handler_t, but k 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 */