X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fcore.c;h=a0feed1dc0cdf1cc98a0fea0b1c4665c5dc12012;hp=d7e1ccec764e50b93f80727185b08be73af44280;hb=4668bd264cfe64c3e3ddd0f75cb5bf2e5e85f717;hpb=5b1efd0176c2e32a5f6766175e518ccfc45239a6 diff --git a/src/jtag/core.c b/src/jtag/core.c index d7e1ccec76..a0feed1dc0 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -33,7 +33,7 @@ #include "jtag.h" #include "interface.h" -#include "transport.h" +#include #ifdef HAVE_STRINGS_H #include @@ -124,7 +124,7 @@ static struct jtag_event_callback *jtag_event_callbacks; static int speed_khz = 0; /* speed to fallback to when RCLK is requested but not supported */ static int rclk_fallback_speed_khz = 0; -static enum {CLOCK_MODE_SPEED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode; +static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode; static int jtag_speed = 0; static struct jtag_interface *jtag = NULL; @@ -279,7 +279,7 @@ int jtag_register_event_callback(jtag_event_handler_t callback, void *priv) if (callback == NULL) { - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } if (*callbacks_p) @@ -303,7 +303,7 @@ int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv) if (callback == NULL) { - return ERROR_INVALID_ARGUMENTS; + return ERROR_COMMAND_SYNTAX_ERROR; } while (*p) @@ -355,11 +355,6 @@ static void jtag_prelude(tap_state_t state) cmd_queue_cur_state = state; } -void jtag_alloc_in_value32(struct scan_field *field) -{ - interface_jtag_alloc_in_value32(field); -} - void jtag_add_ir_scan_noverify(struct jtag_tap *active, const struct scan_field *in_fields, tap_state_t state) { @@ -375,6 +370,7 @@ static void jtag_add_ir_scan_noverify_callback(struct jtag_tap *active, int dumm jtag_add_ir_scan_noverify(active, in_fields, state); } +/* If fields->in_value is filled out, then the captured IR value will be checked */ void jtag_add_ir_scan(struct jtag_tap *active, struct scan_field *in_fields, tap_state_t state) { assert(state != TAP_RESET); @@ -419,17 +415,6 @@ static int jtag_check_value_mask_callback(jtag_callback_data_t data0, jtag_callb static void jtag_add_scan_check(struct jtag_tap *active, void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state), int in_num_fields, struct scan_field *in_fields, tap_state_t state) { - for (int i = 0; i < in_num_fields; i++) - { - struct scan_field *field = &in_fields[i]; - field->allocated = 0; - field->modified = 0; - if (field->check_value || field->in_value) - continue; - interface_jtag_add_scan_check_alloc(field); - field->modified = 1; - } - jtag_add_scan(active, in_num_fields, in_fields, state); for (int i = 0; i < in_num_fields; i++) @@ -442,14 +427,6 @@ static void jtag_add_scan_check(struct jtag_tap *active, void (*jtag_add_scan)(s (jtag_callback_data_t)in_fields[i].check_mask, (jtag_callback_data_t)in_fields[i].num_bits); } - if (in_fields[i].allocated) - { - free(in_fields[i].in_value); - } - if (in_fields[i].modified) - { - in_fields[i].in_value = NULL; - } } } @@ -871,9 +848,16 @@ static int jtag_reset_callback(enum jtag_event event, void *priv) return ERROR_OK; } +/* sleep at least us microseconds. When we sleep more than 1000ms we + * do an alive sleep, i.e. keep GDB alive. Note that we could starve + * GDB if we slept for <1000ms many times. + */ void jtag_sleep(uint32_t us) { - alive_sleep(us/1000); + if (us < 1000) + usleep(us); + else + alive_sleep((us+999)/1000); } /* Maximum number of enabled JTAG devices we expect in the scan chain, @@ -1361,12 +1345,13 @@ int adapter_init(struct command_context *cmd_ctx) return ERROR_JTAG_INVALID_INTERFACE; } - jtag = jtag_interface; - if (jtag_interface->init() != ERROR_OK) + int retval; + retval = jtag_interface->init(); + if (retval != ERROR_OK) { - jtag = NULL; - return ERROR_JTAG_INIT_FAILED; + return retval; } + jtag = jtag_interface; /* LEGACY SUPPORT ... adapter drivers must declare what * transports they allow. Until they all do so, assume @@ -1376,15 +1361,25 @@ int adapter_init(struct command_context *cmd_ctx) LOG_ERROR("Adapter driver '%s' did not declare " "which transports it allows; assuming " "JTAG-only", jtag->name); - int retval = allow_transports(cmd_ctx, jtag_only); + retval = allow_transports(cmd_ctx, jtag_only); if (retval != ERROR_OK) return retval; } + if (CLOCK_MODE_UNSELECTED == clock_mode) + { + LOG_ERROR("An adapter speed is not selected in the init script." + " Insert a call to adapter_khz or jtag_rclk to proceed."); + return ERROR_JTAG_INIT_FAILED; + } + int requested_khz = jtag_get_speed_khz(); int actual_khz = requested_khz; - int jtag_speed_var; - int retval = jtag_get_speed(&jtag_speed_var); + int jtag_speed_var = 0; + retval = jtag_get_speed(&jtag_speed_var); + if (retval != ERROR_OK) + return retval; + retval = jtag->speed(jtag_speed_var); if (retval != ERROR_OK) return retval; retval = jtag_get_speed_readable(&actual_khz); @@ -1639,9 +1634,6 @@ int jtag_get_speed(int *speed) { switch(clock_mode) { - case CLOCK_MODE_SPEED: - *speed = jtag_speed; - break; case CLOCK_MODE_KHZ: adapter_khz_to_speed(jtag_get_speed_khz(), speed); break; @@ -1657,7 +1649,7 @@ int jtag_get_speed(int *speed) int jtag_get_speed_readable(int *khz) { - int jtag_speed_var; + int jtag_speed_var = 0; int retval = jtag_get_speed(&jtag_speed_var); if (retval != ERROR_OK) return retval;