*/
static int jtag_error = ERROR_OK;
-static char* jtag_event_strings[] =
+static const char *jtag_event_strings[] =
{
- "JTAG controller reset (RESET or TRST)"
+ [JTAG_TRST_ASSERTED] = "JTAG controller reset (RESET or TRST)",
};
static int jtag_trst = 0;
}
/* no tap found by name, so try to parse the name as a number */
- char *cp;
- unsigned n = strtoul(s, &cp, 0);
- if ((s == cp) || (*cp != 0))
+ unsigned n;
+ if (parse_uint(s, &n) != ERROR_OK)
return NULL;
return jtag_tap_by_position(n);
return t;
}
+jtag_tap_t* jtag_tap_next_enabled(jtag_tap_t* p)
+{
+ p = p ? p->next_tap : jtag_all_taps();
+ while (p)
+ {
+ if (p->enabled)
+ return p;
+ p = p->next_tap;
+ }
+ return NULL;
+}
+
const char *jtag_tap_name(const jtag_tap_t *tap)
{
return (tap == NULL) ? "(unknown)" : tap->dotted_name;
return ERROR_OK;
}
-int jtag_unregister_event_callback(jtag_event_handler_t callback)
+int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
{
- jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
+ jtag_event_callback_t **callbacks_p;
+ jtag_event_callback_t **next;
if (callback == NULL)
{
return ERROR_INVALID_ARGUMENTS;
}
- while (*callbacks_p)
+ for (callbacks_p = &jtag_event_callbacks;
+ *callbacks_p != NULL;
+ callbacks_p = next)
{
- jtag_event_callback_t **next = &((*callbacks_p)->next);
+ next = &((*callbacks_p)->next);
+
+ if ((*callbacks_p)->priv != priv)
+ continue;
+
if ((*callbacks_p)->callback == callback)
{
free(*callbacks_p);
*callbacks_p = *next;
}
- callbacks_p = next;
}
return ERROR_OK;
if (event == JTAG_TRST_ASSERTED)
{
+ tap->enabled = !tap->disabled_after_reset;
+
buf_set_ones(tap->cur_instr, tap->ir_length);
tap->bypass = 1;
}
tap->expected_mask = malloc(tap->ir_length);
tap->cur_instr = malloc(tap->ir_length);
+ /// @todo cope sanely with ir_length bigger than 32 bits
buf_set_u32(tap->expected, 0, tap->ir_length, tap->ir_capture_value);
buf_set_u32(tap->expected_mask, 0, tap->ir_length, tap->ir_capture_mask);
buf_set_ones(tap->cur_instr, tap->ir_length);
void jtag_tap_free(jtag_tap_t *tap)
{
+ jtag_unregister_event_callback(&jtag_reset_callback, tap);
+
/// @todo is anything missing? no memory leaks please
free((void *)tap->expected_ids);
free((void *)tap->chip);