X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Fcore.c;h=27866502aeaa08256a01b2dc10e89e9127d666ae;hp=85b2a32e98241746d0ec320a84a42cf144f5377d;hb=e8febc22551f1afe3cfa556f7afb16fd8996b6c8;hpb=f9596e96c9835101343603b7ad9c02682b3e7485 diff --git a/src/jtag/core.c b/src/jtag/core.c index 85b2a32e98..27866502ae 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -58,18 +58,11 @@ static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const s */ static int jtag_error = ERROR_OK; -char* jtag_event_strings[] = +static char* jtag_event_strings[] = { "JTAG controller reset (RESET or TRST)" }; -const Jim_Nvp nvp_jtag_tap_event[] = { - { .value = JTAG_TAP_EVENT_ENABLE, .name = "tap-enable" }, - { .value = JTAG_TAP_EVENT_DISABLE, .name = "tap-disable" }, - - { .name = NULL, .value = -1 } -}; - static int jtag_trst = 0; static int jtag_srst = 0; @@ -83,30 +76,37 @@ static jtag_tap_t *__jtag_all_taps = NULL; */ static unsigned jtag_num_taps = 0; -enum reset_types jtag_reset_config = RESET_NONE; -tap_state_t cmd_queue_end_state = TAP_RESET; +static enum reset_types jtag_reset_config = RESET_NONE; +static tap_state_t cmd_queue_end_state = TAP_RESET; tap_state_t cmd_queue_cur_state = TAP_RESET; -int jtag_verify_capture_ir = 1; -int jtag_verify = 1; +static bool jtag_verify_capture_ir = true; +static int jtag_verify = 1; /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */ static int jtag_nsrst_delay = 0; /* default to no nSRST delay */ static int jtag_ntrst_delay = 0; /* default to no nTRST delay */ +typedef struct jtag_event_callback_s +{ + jtag_event_handler_t callback; + void* priv; + struct jtag_event_callback_s* next; +} jtag_event_callback_t; + /* callbacks to inform high-level handlers about JTAG state changes */ static jtag_event_callback_t *jtag_event_callbacks; /* speed in kHz*/ static int speed_khz = 0; /* flag if the kHz speed was defined */ -bool hasKHz = false; +static bool hasKHz = false; +static int jtag_speed = 0; -struct jtag_interface_s *jtag = NULL; +static struct jtag_interface_s *jtag = NULL; /* configuration */ jtag_interface_t *jtag_interface = NULL; -int jtag_speed = 0; void jtag_set_error(int error) { @@ -208,7 +208,7 @@ const char *jtag_tap_name(const jtag_tap_t *tap) } -int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *priv), void *priv) +int jtag_register_event_callback(jtag_event_handler_t callback, void *priv) { jtag_event_callback_t **callbacks_p = &jtag_event_callbacks; @@ -232,7 +232,7 @@ int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *pr return ERROR_OK; } -int jtag_unregister_event_callback(int (*callback)(enum jtag_event event, void *priv)) +int jtag_unregister_event_callback(jtag_event_handler_t callback) { jtag_event_callback_t **callbacks_p = &jtag_event_callbacks; @@ -1178,6 +1178,27 @@ unsigned jtag_get_speed_khz(void) { return speed_khz; } +int jtag_config_khz(unsigned khz) +{ + LOG_DEBUG("handle jtag khz"); + jtag_set_speed_khz(khz); + + int cur_speed = 0; + if (jtag != NULL) + { + LOG_DEBUG("have interface set up"); + int speed_div1; + int retval = jtag->khz(jtag_get_speed_khz(), &speed_div1); + if (ERROR_OK != retval) + { + jtag_set_speed_khz(0); + return retval; + } + cur_speed = speed_div1; + } + return jtag_set_speed(cur_speed); +} + int jtag_get_speed(void) { return jtag_speed; @@ -1188,9 +1209,16 @@ int jtag_set_speed(int speed) jtag_speed = speed; /* this command can be called during CONFIG, * in which case jtag isn't initialized */ + hasKHz = !jtag; return jtag ? jtag->speed(speed) : ERROR_OK; } +int jtag_get_speed_readable(int *speed) +{ + return jtag ? jtag->speed_div(jtag_get_speed(), speed) : ERROR_OK; +} + + void jtag_set_verify(bool enable) { jtag_verify = enable; @@ -1201,6 +1229,15 @@ bool jtag_will_verify() return jtag_verify; } +void jtag_set_verify_capture_ir(bool enable) +{ + jtag_verify_capture_ir = enable; +} + +bool jtag_will_verify_capture_ir() +{ + return jtag_verify_capture_ir; +} int jtag_power_dropout(int *dropout) { @@ -1212,37 +1249,6 @@ int jtag_srst_asserted(int *srst_asserted) return jtag->srst_asserted(srst_asserted); } -void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e) -{ - jtag_tap_event_action_t * jteap; - int done; - - jteap = tap->event_action; - - done = 0; - while (jteap) { - if (jteap->event == e) { - done = 1; - LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n", - tap->dotted_name, - e, - Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name, - Jim_GetString(jteap->body, NULL) ); - if (Jim_EvalObj(interp, jteap->body) != JIM_OK) { - Jim_PrintErrorMessage(interp); - } - } - - jteap = jteap->next; - } - - if (!done) { - LOG_DEBUG( "event %d %s - no action", - e, - Jim_Nvp_value2name_simple( nvp_jtag_tap_event, e)->name); - } -} - int jtag_add_statemove(tap_state_t goal_state) { tap_state_t cur_state = cmd_queue_cur_state;