/* speed to fallback to when RCLK is requested but not supported */
static int rclk_fallback_speed_khz;
static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
-static int jtag_speed;
-
-/* FIXME: change name to this variable, it is not anymore JTAG only */
-static struct adapter_driver *jtag;
extern struct adapter_driver *adapter_driver;
+static bool adapter_initialized;
+
+static bool is_adapter_initialized(void)
+{
+ return adapter_initialized;
+}
+
void jtag_set_flush_queue_sleep(int ms)
{
jtag_flush_queue_sleep = ms;
struct jtag_tap *t = jtag_all_taps();
while (t) {
- if (0 == strcmp(t->dotted_name, s))
+ if (strcmp(t->dotted_name, s) == 0)
return t;
t = t->next_tap;
}
{
int retval;
- if (!(jtag->jtag_ops->supported & DEBUG_CAP_TMS_SEQ))
+ if (!(adapter_driver->jtag_ops->supported & DEBUG_CAP_TMS_SEQ))
return ERROR_JTAG_NOT_IMPLEMENTED;
jtag_checks();
/* Maybe change SRST signal state */
if (jtag_srst != req_srst) {
- retval = jtag->reset(0, req_srst);
+ retval = adapter_driver->reset(0, req_srst);
if (retval != ERROR_OK) {
LOG_ERROR("SRST error");
return ERROR_FAIL;
int new_srst = 0;
int new_trst = 0;
- if (!jtag->reset) {
+ if (!adapter_driver->reset) {
legacy_jtag_add_reset(req_tlr_or_trst, req_srst);
return;
}
/* guarantee jtag queue empty before changing reset status */
jtag_execute_queue();
- retval = jtag->reset(new_trst, new_srst);
+ retval = adapter_driver->reset(new_trst, new_srst);
if (retval != ERROR_OK) {
jtag_set_error(retval);
LOG_ERROR("TRST/SRST error");
int default_interface_jtag_execute_queue(void)
{
- if (!jtag) {
+ if (!is_adapter_initialized()) {
LOG_ERROR("No JTAG interface configured yet. "
"Issue 'init' command in startup scripts "
"before communicating with targets.");
* The fix can be applied immediately after next release (v0.11.0 ?)
*/
LOG_ERROR("JTAG API jtag_execute_queue() called on non JTAG interface");
- if (!jtag->jtag_ops || !jtag->jtag_ops->execute_queue)
+ if (!adapter_driver->jtag_ops || !adapter_driver->jtag_ops->execute_queue)
return ERROR_OK;
}
- int result = jtag->jtag_ops->execute_queue();
+ int result = adapter_driver->jtag_ops->execute_queue();
struct jtag_command *cmd = jtag_command_queue;
while (debug_level >= LOG_LVL_DEBUG_IO && cmd) {
#define JTAG_MAX_AUTO_TAPS 20
-#define EXTRACT_JEP106_BANK(X) (((X) & 0xf00) >> 8)
-#define EXTRACT_JEP106_ID(X) (((X) & 0xfe) >> 1)
#define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
#define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
#define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
name, msg,
(unsigned int)idcode,
(unsigned int)EXTRACT_MFG(idcode),
- jep106_manufacturer(EXTRACT_JEP106_BANK(idcode), EXTRACT_JEP106_ID(idcode)),
+ jep106_manufacturer(EXTRACT_MFG(idcode)),
(unsigned int)EXTRACT_PART(idcode),
(unsigned int)EXTRACT_VER(idcode));
}
return true;
/* treat "-expected-id 0" as a "don't-warn" wildcard */
- if (0 == tap->expected_ids[ii])
+ if (tap->expected_ids[ii] == 0)
return true;
}
struct jtag_tap *tap;
uint8_t *ir_test = NULL;
struct scan_field field;
- uint64_t val;
int chain_pos = 0;
int retval;
*/
if (tap->ir_length == 0) {
tap->ir_length = 2;
- while ((val = buf_get_u64(ir_test, chain_pos, tap->ir_length + 1)) == 1
+ while (buf_get_u64(ir_test, chain_pos, tap->ir_length + 1) == 1
&& tap->ir_length < JTAG_IRLEN_MAX) {
tap->ir_length++;
}
* this part of the JTAG spec, so their capture mask/value
* attributes might disable this test.
*/
- val = buf_get_u64(ir_test, chain_pos, tap->ir_length);
+ uint64_t val = buf_get_u64(ir_test, chain_pos, tap->ir_length);
if ((val & tap->ir_capture_mask) != tap->ir_capture_value) {
LOG_ERROR("%s: IR capture error; saw 0x%0*" PRIx64 " not 0x%0*" PRIx32,
jtag_tap_name(tap),
}
/* verify the '11' sentinel we wrote is returned at the end */
- val = buf_get_u64(ir_test, chain_pos, 2);
+ uint64_t val = buf_get_u64(ir_test, chain_pos, 2);
if (val != 0x3) {
char *cbuf = buf_to_hex_str(ir_test, total_ir_length);
*/
int adapter_init(struct command_context *cmd_ctx)
{
- if (jtag)
+ if (is_adapter_initialized())
return ERROR_OK;
if (!adapter_driver) {
retval = adapter_driver->init();
if (retval != ERROR_OK)
return retval;
- jtag = adapter_driver;
+ adapter_initialized = true;
- if (!jtag->speed) {
+ if (!adapter_driver->speed) {
LOG_INFO("This adapter doesn't support configurable speed");
return ERROR_OK;
}
retval = jtag_get_speed(&jtag_speed_var);
if (retval != ERROR_OK)
return retval;
- retval = jtag->speed(jtag_speed_var);
+ retval = adapter_driver->speed(jtag_speed_var);
if (retval != ERROR_OK)
return retval;
retval = jtag_get_speed_readable(&actual_khz);
int adapter_quit(void)
{
- if (jtag && jtag->quit) {
+ if (is_adapter_initialized() && adapter_driver->quit) {
/* close the JTAG interface */
- int result = jtag->quit();
+ int result = adapter_driver->quit();
if (result != ERROR_OK)
LOG_ERROR("failed: %d", result);
}
{
LOG_DEBUG("convert khz to interface specific speed value");
speed_khz = khz;
- if (!jtag)
+ if (!is_adapter_initialized())
return ERROR_OK;
LOG_DEBUG("have interface set up");
- if (!jtag->khz) {
+ if (!adapter_driver->khz) {
LOG_ERROR("Translation from khz to jtag_speed not implemented");
return ERROR_FAIL;
}
int speed_div1;
- int retval = jtag->khz(jtag_get_speed_khz(), &speed_div1);
+ int retval = adapter_driver->khz(jtag_get_speed_khz(), &speed_div1);
if (retval != ERROR_OK)
return retval;
*speed = speed_div1;
static int jtag_set_speed(int speed)
{
- jtag_speed = speed;
/* this command can be called during CONFIG,
* in which case jtag isn't initialized */
- return jtag ? jtag->speed(speed) : ERROR_OK;
+ return is_adapter_initialized() ? adapter_driver->speed(speed) : ERROR_OK;
}
int jtag_config_khz(unsigned khz)
int retval = jtag_get_speed(&jtag_speed_var);
if (retval != ERROR_OK)
return retval;
- if (!jtag)
+ if (!is_adapter_initialized())
return ERROR_OK;
- if (!jtag->speed_div) {
+ if (!adapter_driver->speed_div) {
LOG_ERROR("Translation from jtag_speed to khz not implemented");
return ERROR_FAIL;
}
- return jtag->speed_div(jtag_speed_var, khz);
+ return adapter_driver->speed_div(jtag_speed_var, khz);
}
void jtag_set_verify(bool enable)
int jtag_power_dropout(int *dropout)
{
- if (!jtag) {
+ if (!is_adapter_initialized()) {
/* TODO: as the jtag interface is not valid all
* we can do at the moment is exit OpenOCD */
LOG_ERROR("No Valid JTAG Interface Configured.");
exit(-1);
}
- if (jtag->power_dropout)
- return jtag->power_dropout(dropout);
+ if (adapter_driver->power_dropout)
+ return adapter_driver->power_dropout(dropout);
*dropout = 0; /* by default we can't detect power dropout */
return ERROR_OK;
int jtag_srst_asserted(int *srst_asserted)
{
- if (jtag->srst_asserted)
- return jtag->srst_asserted(srst_asserted);
+ if (adapter_driver->srst_asserted)
+ return adapter_driver->srst_asserted(srst_asserted);
*srst_asserted = 0; /* by default we can't detect srst asserted */
return ERROR_OK;
uint32_t port_size, unsigned int *trace_freq,
unsigned int traceclkin_freq, uint16_t *prescaler)
{
- if (jtag->config_trace) {
- return jtag->config_trace(enabled, pin_protocol, port_size, trace_freq,
+ if (adapter_driver->config_trace) {
+ return adapter_driver->config_trace(enabled, pin_protocol, port_size, trace_freq,
traceclkin_freq, prescaler);
} else if (enabled) {
LOG_ERROR("The selected interface does not support tracing");
int adapter_poll_trace(uint8_t *buf, size_t *size)
{
- if (jtag->poll_trace)
- return jtag->poll_trace(buf, size);
+ if (adapter_driver->poll_trace)
+ return adapter_driver->poll_trace(buf, size);
return ERROR_FAIL;
}