jtag: only if an in_value storage is provided will the captured IR value be checked
[fw/openocd] / src / jtag / jtag.h
index 7e5dc102b794cb2d48f3549f1f5c44b616bbc4df..f4b89a7ffeaf1845ba00cacb088e214ece886851 100644 (file)
@@ -2,7 +2,7 @@
 *   Copyright (C) 2005 by Dominic Rath                                    *
 *   Dominic.Rath@gmx.de                                                   *
 *                                                                         *
-*   Copyright (C) 2007,2008 Øyvind Harboe                                 *
+*   Copyright (C) 2007-2010 Øyvind Harboe                                 *
 *   oyvind.harboe@zylin.com                                               *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
@@ -105,17 +105,12 @@ extern tap_state_t cmd_queue_cur_state;
  *
  * In addition, this structure includes a value and mask that is used by
  * jtag_add_dr_scan_check() to validate the value that was scanned out.
- *
- * 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
-       uint8_t* out_value;
+       const uint8_t* out_value;
        /// A pointer to a 32-bit memory location for data scanned out
        uint8_t* in_value;
 
@@ -123,13 +118,6 @@ struct scan_field {
        uint8_t* check_value;
        /// The mask to go with check_value
        uint8_t* check_mask;
-
-       /// in_value has been allocated for the queue
-       int allocated;
-       /// Indicates we modified the in_value.
-       int modified;
-       /// temporary storage for performing value checks synchronously
-       uint8_t intmp[4];
 };
 
 struct jtag_tap {
@@ -167,6 +155,8 @@ struct jtag_tap {
        struct jtag_tap_event_action *event_action;
 
        struct jtag_tap* next_tap;
+       /* dap instance if some null if no instance , initialized to 0 by calloc*/
+       struct adiv5_dap *dap; 
 };
 
 void jtag_tap_init(struct jtag_tap *tap);
@@ -176,6 +166,7 @@ struct jtag_tap* jtag_all_taps(void);
 const char *jtag_tap_name(const struct jtag_tap *tap);
 struct jtag_tap* jtag_tap_by_string(const char* dotted_name);
 struct jtag_tap* jtag_tap_by_jim_obj(Jim_Interp* interp, Jim_Obj* obj);
+struct jtag_tap* jtag_tap_by_position(unsigned abs_position);
 struct jtag_tap* jtag_tap_next_enabled(struct jtag_tap* p);
 unsigned jtag_tap_count_enabled(void);
 unsigned jtag_tap_count(void);
@@ -242,7 +233,7 @@ int jtag_call_event_callbacks(enum jtag_event event);
 
 
 /// @returns The current JTAG speed setting.
-int jtag_get_speed(void);
+int jtag_get_speed(int *speed);
 
 /**
  * Given a @a speed setting, use the interface @c speed_div callback to
@@ -308,14 +299,15 @@ 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 debug adapter upon program exit.
+int  adapter_quit(void);
 
-/// Shutdown the JTAG interface upon program exit.
-int  jtag_interface_quit(void);
+/// Set ms to sleep after jtag_execute_queue() flushes queue. Debug
+/// purposes.
+void jtag_set_flush_queue_sleep(int ms);
 
 /**
  * Initialize JTAG chain using only a RESET reset. If init fails,
@@ -353,33 +345,22 @@ 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.
- */
-void jtag_add_plain_ir_scan(int num_fields,
-               const struct scan_field* fields, tap_state_t endstate);
-
-
-/**
- * Set in_value to point to 32 bits of memory to scan into. This
- * function is a way to handle the case of synchronous and asynchronous
- * JTAG queues.
+ * Scan out the bits in ir scan mode.
  *
- * In the event of an asynchronous queue execution the queue buffer
- * allocation method is used, for the synchronous case the temporary 32
- * bits come from the input field itself.
+ * If in_bits == NULL, discard incoming bits.
  */
-void jtag_alloc_in_value32(struct scan_field *field);
+void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits,
+               tap_state_t endstate);
+
 
 /**
  * Generate a DR SCAN using the fields passed to the function.
@@ -387,18 +368,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.
@@ -556,23 +537,6 @@ void jtag_add_runtest(int num_cycles, tap_state_t endstate);
  */
 void jtag_add_reset(int req_tlr_or_trst, int srst);
 
-
-/**
- * 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);
-
-/**
- * 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);
@@ -684,8 +648,6 @@ void jtag_sleep(uint32_t us);
  * called with a non-zero error code.
  */
 void jtag_set_error(int error);
-/// @returns The current value of jtag_error
-int jtag_get_error(void);
 /**
  * Resets jtag_error to ERROR_OK, returning its previous value.
  * @returns The previous value of @c jtag_error.
@@ -714,4 +676,8 @@ void jtag_poll_set_enabled(bool value);
  * level APIs that are used in inner loops. */
 #include <jtag/minidriver.h>
 
+bool transport_is_jtag(void);
+
+int jim_jtag_newtap(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
+
 #endif /* JTAG_H */