jtag: cut down on usage of unintended modification of global end state
[openocd.git] / src / jtag / jtag.h
index fece65210c3ec0b03ddd62a6e4c3e821b99a3bff..a92c986d1107ef40b37efdbfb020f5f0aace7cc0 100644 (file)
@@ -109,9 +109,6 @@ extern tap_state_t cmd_queue_cur_state;
  * The allocated, modified, and intmp fields are internal work space.
  */
 struct scan_field {
-       /// A pointer to the tap structure to which this field refers.
-       struct jtag_tap* tap;
-
        /// The number of bits this field specifies (up to 32)
        int num_bits;
        /// A pointer to value to be scanned into the device
@@ -156,6 +153,9 @@ struct jtag_tap {
        /// Number of expected identification codes
        uint8_t expected_ids_cnt;
 
+       /// Flag saying whether to ignore version field in expected_ids[]
+       bool ignore_version;
+
        /// current instruction
        uint8_t* cur_instr;
        /// Bypass register selected
@@ -305,14 +305,11 @@ void jtag_set_verify_capture_ir(bool enable);
 /// @returns True if IR scan verification will be performed.
 bool jtag_will_verify_capture_ir(void);
 
-/**
- * Initialize interface upon startup.  Return a successful no-op upon
- * subsequent invocations.
- */
-int  jtag_interface_init(struct command_context* cmd_ctx);
+/** Initialize debug adapter upon startup.  */
+int  adapter_init(struct command_context* cmd_ctx);
 
-/// Shutdown the JTAG interface upon program exit.
-int  jtag_interface_quit(void);
+/// Shutdown the debug adapter upon program exit.
+int  adapter_quit(void);
 
 /**
  * Initialize JTAG chain using only a RESET reset. If init fails,
@@ -350,21 +347,21 @@ int jtag_init_inner(struct command_context *cmd_ctx);
  * subsequent DR SCANs.
  *
  */
-void jtag_add_ir_scan(int num_fields,
+void jtag_add_ir_scan(struct jtag_tap* tap,
                struct scan_field* fields, tap_state_t endstate);
 /**
  * The same as jtag_add_ir_scan except no verification is performed out
  * the output values.
  */
-void jtag_add_ir_scan_noverify(int num_fields,
+void jtag_add_ir_scan_noverify(struct jtag_tap* tap,
                const struct scan_field *fields, tap_state_t state);
 /**
- * Duplicate the scan fields passed into the function into an IR SCAN
- * command.  This function assumes that the caller handles extra fields
- * for bypassed TAPs.
+ * Scan out the bits in ir scan mode.
+ *
+ * If in_bits == NULL, discard incoming bits.
  */
-void jtag_add_plain_ir_scan(int num_fields,
-               const struct scan_field* fields, tap_state_t endstate);
+void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits,
+               tap_state_t endstate);
 
 
 /**
@@ -384,18 +381,18 @@ void jtag_alloc_in_value32(struct scan_field *field);
  * specified there.  For bypassed TAPs, the function generates a dummy
  * 1-bit field.  The bypass status of TAPs is set by jtag_add_ir_scan().
  */
-void jtag_add_dr_scan(int num_fields,
+void jtag_add_dr_scan(struct jtag_tap* tap, int num_fields,
                const struct scan_field* fields, tap_state_t endstate);
 /// A version of jtag_add_dr_scan() that uses the check_value/mask fields
-void jtag_add_dr_scan_check(int num_fields,
+void jtag_add_dr_scan_check(struct jtag_tap* tap, int num_fields,
                struct scan_field* fields, tap_state_t endstate);
 /**
- * Duplicate the scan fields passed into the function into a DR SCAN
- * command.  Unlike jtag_add_dr_scan(), this function assumes that the
- * caller handles extra fields for bypassed TAPs.
+ * Scan out the bits in ir scan mode.
+ *
+ * If in_bits == NULL, discard incoming bits.
  */
-void jtag_add_plain_dr_scan(int num_fields,
-               const struct scan_field* fields, tap_state_t endstate);
+void jtag_add_plain_dr_scan(int num_bits,
+               const uint8_t *out_bits, uint8_t *in_bits, tap_state_t endstate);
 
 /**
  * Defines the type of data passed to the jtag_callback_t interface.
@@ -417,24 +414,9 @@ typedef void (*jtag_callback1_t)(jtag_callback_data_t data0);
 void jtag_add_callback(jtag_callback1_t, jtag_callback_data_t data0);
 
 
-
 /**
- * Defines the interface of the JTAG callback mechanism.
- *
- * @param in the pointer to the data clocked in
- * @param data1 An integer big enough to use as an @c int or a pointer.
- * @param data2 An integer big enough to use as an @c int or a pointer.
- * @param data3 An integer big enough to use as an @c int or a pointer.
- * @returns an error code
- */
-typedef int (*jtag_callback_t)(jtag_callback_data_t data0,
-                               jtag_callback_data_t data1,
-                               jtag_callback_data_t data2,
-                               jtag_callback_data_t data3);
-
-
-/**
- * This callback can be executed immediately the queue has been flushed.
+ * Defines the interface of the JTAG callback mechanism.  Such
+ * callbacks can be executed once the queue has been flushed.
  *
  * The JTAG queue can be executed synchronously or asynchronously.
  * Typically for USB, the queue is executed asynchronously.  For
@@ -448,19 +430,21 @@ typedef int (*jtag_callback_t)(jtag_callback_data_t data0,
  *
  * If the execution of the queue fails before the callbacks, then --
  * depending on driver implementation -- the callbacks may or may not be
- * invoked.  @todo Can we make this behavior consistent?
+ * invoked.
  *
- * The strange name is due to C's lack of overloading using function
- * arguments.
+ * @todo Make that behavior consistent.
  *
- * @param f The callback function to add.
  * @param data0 Typically used to point to the data to operate on.
  * Frequently this will be the data clocked in during a shift operation.
  * @param data1 An integer big enough to use as an @c int or a pointer.
  * @param data2 An integer big enough to use as an @c int or a pointer.
  * @param data3 An integer big enough to use as an @c int or a pointer.
- *
+ * @returns an error code
  */
+typedef int (*jtag_callback_t)(jtag_callback_data_t data0,
+                               jtag_callback_data_t data1,
+                               jtag_callback_data_t data2,
+                               jtag_callback_data_t data3);
 
 /**
  * Run a TAP_RESET reset where the end state is TAP_RESET,
@@ -535,8 +519,8 @@ int jtag_add_statemove(tap_state_t goal_state);
  * to @a endstate (unless it is also TAP_IDLE).
  *
  * @param num_cycles Number of cycles in TAP_IDLE state.  This argument
- *     may be 0, in which case this routine will navigate to @a endstate
- *     via TAP_IDLE.
+ *     may be 0, in which case this routine will navigate to @a endstate
+ *     via TAP_IDLE.
  * @param endstate The final state.
  */
 void jtag_add_runtest(int num_cycles, tap_state_t endstate);
@@ -568,28 +552,32 @@ void jtag_add_reset(int req_tlr_or_trst, int srst);
 
 
 /**
+ * DEPRECATED! store such global state outside JTAG layer
+ *
  * Function jtag_set_end_state
  *
  * Set a global variable to \a state if \a state != TAP_INVALID.
  *
- * Return the value of the global variable.
- *
- **/
-tap_state_t jtag_set_end_state(tap_state_t state);
+ */
+void jtag_set_end_state(tap_state_t state);
+
 /**
+ * DEPRECATED! store such global state outside JTAG layer
+ * 
  * Function jtag_get_end_state
  *
  * Return the value of the global variable for end state
- *
- **/
+ */
 tap_state_t jtag_get_end_state(void);
+
 void jtag_add_sleep(uint32_t us);
 
+int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state t);
 
 /**
- * Function jtag_add_stable_clocks
+ * Function jtag_add_clocks
  * first checks that the state in which the clocks are to be issued is
- * stable, then queues up clock_count clocks for transmission.
+ * stable, then queues up num_cycles clocks for transmission.
  */
 void jtag_add_clocks(int num_cycles);
 
@@ -704,7 +692,7 @@ int jtag_error_clear(void);
 /**
  * Return true if it's safe for a background polling task to access the
  * JTAG scan chain.  Polling may be explicitly disallowed, and is also
- * unsafe while nTRST is active or the JTAG clock is gated off.,
+ * unsafe while nTRST is active or the JTAG clock is gated off.
  */
 bool is_jtag_poll_safe(void);
 

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)