+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
/***************************************************************************
* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
* Copyright (C) 2007-2010 Øyvind Harboe *
* oyvind.harboe@zylin.com *
-* *
-* This program is free software; you can redistribute it and/or modify *
-* it under the terms of the GNU General Public License as published by *
-* the Free Software Foundation; either version 2 of the License, or *
-* (at your option) any later version. *
-* *
-* This program is distributed in the hope that it will be useful, *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of *
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
-* GNU General Public License for more details. *
-* *
-* You should have received a copy of the GNU General Public License *
-* along with this program; if not, write to the *
-* Free Software Foundation, Inc., *
-* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
***************************************************************************/
-#ifndef JTAG_H
-#define JTAG_H
+#ifndef OPENOCD_JTAG_JTAG_H
+#define OPENOCD_JTAG_JTAG_H
#include <helper/binarybuffer.h>
+#include <helper/command.h>
#include <helper/log.h>
-
-#ifdef _DEBUG_JTAG_IO_
-#define DEBUG_JTAG_IO(expr ...) \
- do { if (1) LOG_DEBUG(expr); } while (0)
-#else
-#define DEBUG_JTAG_IO(expr ...) \
- do { if (0) LOG_DEBUG(expr); } while (0)
-#endif
+#include <helper/replacements.h>
#ifndef DEBUG_JTAG_IOZ
#define DEBUG_JTAG_IOZ 64
typedef enum tap_state {
TAP_INVALID = -1,
-#if BUILD_ZY1000
- /* These are the old numbers. Leave as-is for now... */
- TAP_RESET = 0, TAP_IDLE = 8,
- TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4,
- TAP_DRPAUSE = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7,
- TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12,
- TAP_IRPAUSE = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15,
-
-#else
/* Proper ARM recommended numbers */
TAP_DREXIT2 = 0x0,
TAP_DREXIT1 = 0x1,
TAP_IRUPDATE = 0xd,
TAP_IRCAPTURE = 0xe,
TAP_RESET = 0x0f,
-
-#endif
} tap_state_t;
+/**
+ * Defines arguments for reset functions
+ */
+#define SRST_DEASSERT 0
+#define SRST_ASSERT 1
+#define TRST_DEASSERT 0
+#define TRST_ASSERT 1
+
/**
* Function tap_state_name
* Returns a string suitable for display representing the JTAG tap_state
* jtag_add_dr_scan_check() to validate the value that was scanned out.
*/
struct scan_field {
- /** The number of bits this field specifies (up to 32) */
+ /** The number of bits this field specifies */
int num_bits;
/** A pointer to value to be scanned into the device */
const uint8_t *out_value;
uint32_t idcode; /**< device identification code */
/** not all devices have idcode,
* we'll discover this during chain examination */
- bool hasidcode;
+ bool has_idcode;
/** Array of expected identification codes */
uint32_t *expected_ids;
/** Flag saying whether to ignore version field in expected_ids[] */
bool ignore_version;
+ /** Flag saying whether to ignore the bypass bit in the code */
+ bool ignore_bypass;
+
/** current instruction */
uint8_t *cur_instr;
/** Bypass register selected */
- int bypass;
+ bool bypass;
+
+ /** Bypass instruction value */
+ uint64_t ir_bypass_value;
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;
/* private pointer to support none-jtag specific functions */
void *priv;
};
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_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);
};
/**
- * Defines the function signature requide for JTAG event callback
+ * Defines the function signature required for JTAG event callback
* functions, which are added with jtag_register_event_callback()
* and removed jtag_unregister_event_callback().
* @param event The event to handle.
- * @param prive A pointer to data that was passed to
+ * @param priv A pointer to data that was passed to
* jtag_register_event_callback().
* @returns Must return ERROR_OK on success, or an error code on failure.
*
int jtag_call_event_callbacks(enum jtag_event event);
-
-/** @returns The current JTAG speed setting. */
-int jtag_get_speed(int *speed);
-
-/**
- * Given a @a speed setting, use the interface @c speed_div callback to
- * adjust the setting.
- * @param speed The speed setting to convert back to readable KHz.
- * @returns ERROR_OK if the interface has not been initialized or on success;
- * otherwise, the error code produced by the @c speed_div callback.
- */
-int jtag_get_speed_readable(int *speed);
-
-/** Attempt to configure the interface for the specified KHz. */
-int jtag_config_khz(unsigned khz);
-
-/**
- * Attempt to enable RTCK/RCLK. If that fails, fallback to the
- * specified frequency.
- */
-int jtag_config_rclk(unsigned fallback_speed_khz);
-
-/** Retreives the clock speed of the JTAG interface in KHz. */
-unsigned jtag_get_speed_khz(void);
-
enum reset_types {
RESET_NONE = 0x0,
RESET_HAS_TRST = 0x1,
/** @returns True if IR scan verification will be performed. */
bool jtag_will_verify_capture_ir(void);
-/** Initialize debug adapter upon startup. */
-int adapter_init(struct command_context *cmd_ctx);
-
-/** Shutdown the debug adapter upon program exit. */
-int adapter_quit(void);
-
/** Set ms to sleep after jtag_execute_queue() flushes queue. Debug purposes. */
void jtag_set_flush_queue_sleep(int ms);
typedef void (*jtag_callback1_t)(jtag_callback_data_t data0);
/** A simpler version of jtag_add_callback4(). */
-void jtag_add_callback(jtag_callback1_t, jtag_callback_data_t data0);
+void jtag_add_callback(jtag_callback1_t f, jtag_callback_data_t data0);
/**
* assumptions about what the callback does or what its arguments are.
* These callbacks are typically executed *after* the *entire* JTAG
* queue has been executed for e.g. USB interfaces, and they are
- * guaranteeed to be invoked in the order that they were queued.
+ * guaranteed to be invoked in the order that they were queued.
*
* If the execution of the queue fails before the callbacks, then --
* depending on driver implementation -- the callbacks may or may not be
* path when transitioning to/from end
* state.
*
- * A list of unambigious single clock state transitions, not
+ * A list of unambiguous single clock state transitions, not
* all drivers can support this, but it is required for e.g.
* XScale and Xilinx support
*
* @param field Pointer to scan field.
* @param value Pointer to scan value.
* @param mask Pointer to scan mask; may be NULL.
- * @returns Nothing, but calls jtag_set_error() on any error.
+ *
+ * returns Nothing, but calls jtag_set_error() on any error.
*/
void jtag_check_value_mask(struct scan_field *field, uint8_t *value, uint8_t *mask);
*/
void jtag_poll_set_enabled(bool value);
+/**
+ * Mask (disable) polling and return the current mask status that should be
+ * feed to jtag_poll_unmask() to restore it.
+ * Multiple nested calls to jtag_poll_mask() are allowed, each balanced with
+ * its call to jtag_poll_unmask().
+ */
+bool jtag_poll_mask(void);
+
+/**
+ * Restore saved mask for polling.
+ */
+void jtag_poll_unmask(bool saved);
-/* The minidriver may have inline versions of some of the low
- * 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);
+__COMMAND_HANDLER(handle_jtag_newtap);
-#endif /* JTAG_H */
+#endif /* OPENOCD_JTAG_JTAG_H */