]> git.sur5r.net Git - openocd/blobdiff - src/jtag/jtag.h
Change tap_state naming to be consistent with SVF documentation.
[openocd] / src / jtag / jtag.h
index 68f52dde7280c275b7226d0ee898601927b8b2b5..d58be2f7d9cedf84bf2f566c6289447180d0ee8f 100644 (file)
 #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
 {
-       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
 };
 
 typedef struct tap_transition_s
@@ -75,7 +70,7 @@ typedef int (*in_handler_t)(u8 *in_value, void *priv, struct scan_field_s *field
 
 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 */
@@ -163,20 +158,60 @@ typedef struct jtag_command_s
 
 extern jtag_command_t *jtag_command_queue;
 
-typedef struct jtag_device_s
+// 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;
+       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;
+}
+
+
 
-extern jtag_device_t *jtag_devices;
-extern int jtag_num_devices;
-extern int jtag_ir_scan_size;
 
 enum reset_line_mode
 {
@@ -285,7 +320,7 @@ extern int jtag_register_commands(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/SI as end states
  * can be emulated by using a larger scan.
  *
  * Code that is relatively insensitive to the path(as long
@@ -303,7 +338,7 @@ extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum ta
 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);
@@ -324,7 +359,7 @@ extern int interface_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.
@@ -340,12 +375,12 @@ extern int interface_jtag_add_tlr(void);
  */
 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);
@@ -420,7 +455,7 @@ 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);
@@ -448,7 +483,7 @@ extern int jtag_verify_capture_ir;
 #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.
  *
@@ -463,7 +498,7 @@ extern int jtag_verify_capture_ir;
  *
  * 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,
@@ -473,7 +508,7 @@ extern void interface_jtag_add_dr_out(int device,
 
 
 
-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,
@@ -482,7 +517,7 @@ static __inline__ void jtag_add_dr_out(int device,
        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);
 }