*/
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;
*/
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)
{
}
-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;
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;
{
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;
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;
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)
{
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;