#include "command.h"
+
#if 0
#define _DEBUG_JTAG_IO_
#endif
-/* Tap States
- * TLR - Test-Logic-Reset, RTI - Run-Test/Idle,
- * SDS - Select-DR-Scan, CD - Capture-DR, SD - Shift-DR, E1D - Exit1-DR,
- * PD - Pause-DR, E2D - Exit2-DR, UD - Update-DR,
- * SIS - Select-IR-Scan, CI - Capture-IR, SI - Shift-IR, E1I - Exit1-IR,
- * PI - Pause-IR, E2I - Exit2-IR, UI - Update-IR
+/* 16 Tap States, from page 21 of ASSET InterTech, Inc.'s svf.pdf
*/
-enum tap_state
+typedef enum tap_state
{
- TAP_TLR = 0x0, TAP_RTI = 0x8,
- TAP_SDS = 0x1, TAP_CD = 0x2, TAP_SD = 0x3, TAP_E1D = 0x4,
- TAP_PD = 0x5, TAP_E2D = 0x6, TAP_UD = 0x7,
- TAP_SIS = 0x9, TAP_CI = 0xa, TAP_SI = 0xb, TAP_E1I = 0xc,
- TAP_PI = 0xd, TAP_E2I = 0xe, TAP_UI = 0xf
-};
+ TAP_RESET = 0x0, TAP_IDLE = 0x8,
+ TAP_DRSELECT = 0x1, TAP_DRCAPTURE = 0x2, TAP_DRSHIFT = 0x3, TAP_DREXIT1 = 0x4,
+ TAP_DRPAUSE = 0x5, TAP_DREXIT2 = 0x6, TAP_DRUPDATE = 0x7,
+ TAP_IRSELECT = 0x9, TAP_IRCAPTURE = 0xa, TAP_IRSHIFT = 0xb, TAP_IREXIT1 = 0xc,
+ TAP_IRPAUSE = 0xd, TAP_IREXIT2 = 0xe, TAP_IRUPDATE = 0xf
+} tap_state_t;
typedef struct tap_transition_s
{
enum tap_state low;
} tap_transition_t;
-extern char* tap_state_strings[16];
extern int tap_move_map[16]; /* map 16 TAP states to 6 stable states */
extern u8 tap_move[6][6]; /* value scanned to TMS to move from one of six stable states to another */
extern tap_transition_t tap_transitions[16]; /* describe the TAP state diagram */
typedef struct scan_field_s
{
- int device; /* ordinal device number this instruction refers to */
+ jtag_tap_t *tap; /* tap pointer this instruction refers to */
int num_bits; /* number of bits this field specifies (up to 32) */
u8 *out_value; /* value to be scanned into the device */
u8 *out_mask; /* only masked bits care */
/* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage */
u8 *in_check_value; /* used to validate scan results */
u8 *in_check_mask; /* check specified bits against check_value */
- in_handler_t in_handler; /* process received buffer using this handler */
+ in_handler_t in_handler;/* process received buffer using this handler */
void *in_handler_priv; /* additional information for the in_handler */
} scan_field_t;
-
enum scan_type
{
/* IN: from device to host, OUT: from host to device */
enum tap_state end_state; /* TAP state in which JTAG commands should finish */
} runtest_command_t;
+
+typedef struct stableclocks_command_s
+{
+ int num_cycles; /* number of clock cycles that should be sent */
+} stableclocks_command_t;
+
+
typedef struct reset_command_s
{
int trst; /* trst/srst 0: deassert, 1: assert, -1: don't change */
statemove_command_t *statemove;
pathmove_command_t *pathmove;
runtest_command_t *runtest;
+ stableclocks_command_t *stableclocks;
reset_command_t *reset;
end_state_command_t *end_state;
sleep_command_t *sleep;
JTAG_SCAN = 1,
JTAG_STATEMOVE = 2, JTAG_RUNTEST = 3,
JTAG_RESET = 4, JTAG_END_STATE = 5,
- JTAG_PATHMOVE = 6, JTAG_SLEEP = 7
+ JTAG_PATHMOVE = 6, JTAG_SLEEP = 7,
+ JTAG_STABLECLOCKS = 8
};
typedef struct jtag_command_s
extern jtag_command_t *jtag_command_queue;
-typedef struct jtag_device_s
+/* forward declaration */
+typedef struct jtag_tap_event_action_s jtag_tap_event_action_t;
+
+/* this is really: typedef jtag_tap_t */
+/* But - the typedef is done in "types.h" */
+/* due to "forward decloration reasons" */
+struct jtag_tap_s
{
+ const char *chip;
+ const char *tapname;
+ const char *dotted_name;
+ int abs_chain_position;
+ int enabled;
int ir_length; /* size of instruction register */
+ u32 ir_capture_value;
u8 *expected; /* Capture-IR expected value */
+ u32 ir_capture_mask;
u8 *expected_mask; /* Capture-IR expected mask */
u32 idcode; /* device identification code */
+ u32 *expected_ids; /* Array of expected identification codes */
+ u8 expected_ids_cnt;/* Number of expected identification codes */
u8 *cur_instr; /* current instruction */
int bypass; /* bypass register selected */
- struct jtag_device_s *next;
-} jtag_device_t;
-extern jtag_device_t *jtag_devices;
-extern int jtag_num_devices;
-extern int jtag_ir_scan_size;
+ jtag_tap_event_action_t *event_action;
+
+ jtag_tap_t *next_tap;
+};
+extern jtag_tap_t *jtag_AllTaps(void);
+extern jtag_tap_t *jtag_TapByPosition(int n);
+extern jtag_tap_t *jtag_TapByPosition(int n);
+extern jtag_tap_t *jtag_TapByString(const char *dotted_name);
+extern jtag_tap_t *jtag_TapByJimObj(Jim_Interp *interp, Jim_Obj *obj);
+extern jtag_tap_t *jtag_TapByAbsPosition(int abs_position);
+extern int jtag_NumEnabledTaps(void);
+extern int jtag_NumTotalTaps(void);
+
+static __inline__ jtag_tap_t *
+jtag_NextEnabledTap( jtag_tap_t *p )
+{
+ if( p == NULL ){
+ /* start at the head of list */
+ p = jtag_AllTaps();
+ } else {
+ /* start *after* this one */
+ p = p->next_tap;
+ }
+ while( p ){
+ if( p->enabled ){
+ break;
+ } else {
+ p = p->next_tap;
+ }
+ }
+ return p;
+}
enum reset_line_mode
{
JTAG_TRST_ASSERTED
};
-extern char* jtag_event_strings[];
+extern char * jtag_event_strings[];
+
+enum jtag_tap_event
+{
+ JTAG_TAP_EVENT_ENABLE,
+ JTAG_TAP_EVENT_DISABLE
+};
+
+extern const Jim_Nvp nvp_jtag_tap_event[];
+
+struct jtag_tap_event_action_s {
+ enum jtag_tap_event event;
+ Jim_Obj *body;
+ jtag_tap_event_action_t *next;
+};
extern int jtag_trst;
extern int jtag_srst;
* upon subsequent invocations
*/
extern int jtag_interface_init(struct command_context_s *cmd_ctx);
-/* initialize JTAG chain using only a TLR reset. If init fails,
+/* initialize JTAG chain using only a RESET reset. If init fails,
* try reset + init.
*/
extern int jtag_init(struct command_context_s *cmd_ctx);
/* JTAG interface, can be implemented with a software or hardware fifo
*
- * TAP_SD and TAP_SI are illegal end states. TAP_SD/SI as end states
+ * TAP_DRSHIFT and TAP_IRSHIFT are illegal end states. TAP_DRSHIFT/IRSHIFT as end states
* can be emulated by using a larger scan.
*
* Code that is relatively insensitive to the path(as long
extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-/* run a TAP_TLR reset. End state is TAP_TLR, regardless
+/* run a TAP_RESET reset. End state is TAP_RESET, regardless
* of start state.
*/
extern void jtag_add_tlr(void);
* all drivers can support this, but it is required for e.g.
* XScale and Xilinx support
*
- * Note! TAP_TLR must not be used in the path!
+ * Note! TAP_RESET must not be used in the path!
*
* Note that the first on the list must be reachable
* via a single transition from the current state.
*/
extern void jtag_add_pathmove(int num_states, enum tap_state *path);
extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
-/* go to TAP_RTI, if we're not already there and cycle
- * precisely num_cycles in the TAP_RTI after which move
- * to the end state, if it is != TAP_RTI
+/* go to TAP_IDLE, if we're not already there and cycle
+ * precisely num_cycles in the TAP_IDLE after which move
+ * to the end state, if it is != TAP_IDLE
*
* nb! num_cycles can be 0, in which case the fn will navigate
- * to endstate via TAP_RTI
+ * to endstate via TAP_IDLE
*/
extern void jtag_add_runtest(int num_cycles, enum tap_state endstate);
extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
extern int interface_jtag_add_sleep(u32 us);
+/**
+ * Function jtag_add_stable_clocks
+ * first checks that the state in which the clocks are to be issued is
+ * stable, then queues up clock_count clocks for transmission.
+ */
+void jtag_add_clocks( int num_cycles );
+int interface_jtag_add_clocks( int num_cycles );
+
/*
* For software FIFO implementations, the queued commands can be executed
extern int jtag_power_dropout(int *dropout);
extern int jtag_srst_asserted(int *srst_asserted);
-
/* JTAG support functions */
extern void jtag_set_check_value(scan_field_t *field, u8 *value, u8 *mask, error_handler_t *in_error_handler);
extern enum scan_type jtag_scan_type(scan_command_t *cmd);
extern int jtag_scan_size(scan_command_t *cmd);
extern int jtag_read_buffer(u8 *buffer, scan_command_t *cmd);
extern int jtag_build_buffer(scan_command_t *cmd, u8 **buffer);
-extern jtag_device_t* jtag_get_device(int num);
+
extern void jtag_sleep(u32 us);
extern int jtag_call_event_callbacks(enum jtag_event event);
extern int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *priv), void *priv);
extern int jtag_verify_capture_ir;
+void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e);
+
/* error codes
* JTAG subsystem uses codes between -100 and -199 */
#define ERROR_JTAG_QUEUE_FAILED (-104)
#define ERROR_JTAG_DEVICE_ERROR (-107)
-
-
/* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
#ifdef HAVE_JTAG_MINIDRIVER_H
/* Here a #define MINIDRIVER() and an inline version of hw fifo interface_jtag_add_dr_out can be defined */
#define MINIDRIVER(a) a
/* jtag_add_dr_out() is a faster version of jtag_add_dr_scan()
*
- * Current or end_state can not be TAP_TLR. end_state can be -1
+ * Current or end_state can not be TAP_RESET. end_state can be -1
*
* num_bits[i] is the number of bits to clock out from value[i] LSB first.
*
*
* Note that this jtag_add_dr_out can be defined as an inline function.
*/
-extern void interface_jtag_add_dr_out(int device,
+extern void interface_jtag_add_dr_out(jtag_tap_t *tap,
int num_fields,
const int *num_bits,
const u32 *value,
enum tap_state end_state);
#endif
-
-
-
-static __inline__ void jtag_add_dr_out(int device,
+static __inline__ void jtag_add_dr_out(jtag_tap_t *tap,
int num_fields,
const int *num_bits,
const u32 *value,
if (end_state != -1)
cmd_queue_end_state=end_state;
cmd_queue_cur_state=cmd_queue_end_state;
- interface_jtag_add_dr_out(device, num_fields, num_bits, value, cmd_queue_end_state);
+ interface_jtag_add_dr_out(tap, num_fields, num_bits, value, cmd_queue_end_state);
}
+/**
+ * Function jtag_state_name
+ * Returns a string suitable for display representing the JTAG tap_state
+ */
+const char* jtag_state_name(enum tap_state state);
+
#endif /* JTAG_H */