static int jtag_nsrst_assert_width = 0; /* width of assertion */
static int jtag_ntrst_assert_width = 0; /* width of assertion */
-typedef struct jtag_event_callback_s
-{
- jtag_event_handler_t callback;
- void* priv;
- struct jtag_event_callback_s* next;
-} jtag_event_callback_t;
+/**
+ * Contains a single callback along with a pointer that will be passed
+ * when an event occurs.
+ */
+struct jtag_event_callback {
+ /// a event callback
+ jtag_event_handler_t callback;
+ /// the private data to pass to the callback
+ void* priv;
+ /// the next callback
+ struct jtag_event_callback* next;
+};
/* callbacks to inform high-level handlers about JTAG state changes */
-static jtag_event_callback_t *jtag_event_callbacks;
+static struct jtag_event_callback *jtag_event_callbacks;
/* speed in kHz*/
static int speed_khz = 0;
static enum {CLOCK_MODE_SPEED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
static int jtag_speed = 0;
-static struct jtag_interface_s *jtag = NULL;
+static struct jtag_interface *jtag = NULL;
/* configuration */
-jtag_interface_t *jtag_interface = NULL;
+struct jtag_interface *jtag_interface = NULL;
void jtag_set_error(int error)
{
return t;
}
-struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
-{
- const char *cp = Jim_GetString(o, NULL);
- struct jtag_tap *t = cp ? jtag_tap_by_string(cp) : NULL;
- if (NULL == cp)
- cp = "(unknown)";
- if (NULL == t)
- Jim_SetResult_sprintf(interp, "Tap '%s' could not be found", cp);
- return t;
-}
-
struct jtag_tap* jtag_tap_next_enabled(struct jtag_tap* p)
{
p = p ? p->next_tap : jtag_all_taps();
int jtag_register_event_callback(jtag_event_handler_t callback, void *priv)
{
- jtag_event_callback_t **callbacks_p = &jtag_event_callbacks;
+ struct jtag_event_callback **callbacks_p = &jtag_event_callbacks;
if (callback == NULL)
{
callbacks_p = &((*callbacks_p)->next);
}
- (*callbacks_p) = malloc(sizeof(jtag_event_callback_t));
+ (*callbacks_p) = malloc(sizeof(struct jtag_event_callback));
(*callbacks_p)->callback = callback;
(*callbacks_p)->priv = priv;
(*callbacks_p)->next = NULL;
int jtag_unregister_event_callback(jtag_event_handler_t callback, void *priv)
{
- jtag_event_callback_t **callbacks_p;
- jtag_event_callback_t **next;
+ struct jtag_event_callback **callbacks_p;
+ struct jtag_event_callback **next;
if (callback == NULL)
{
int jtag_call_event_callbacks(enum jtag_event event)
{
- jtag_event_callback_t *callback = jtag_event_callbacks;
+ struct jtag_event_callback *callback = jtag_event_callbacks;
LOG_DEBUG("jtag event: %s", jtag_event_strings[event]);
while (callback)
{
- jtag_event_callback_t *next;
+ struct jtag_event_callback *next;
/* callback may remove itself */
next = callback->next;
unsigned tms_bits = tap_get_tms_path(cur_state, goal_state);
unsigned tms_count = tap_get_tms_path_len(cur_state, goal_state);
tap_state_t moves[8];
- assert(tms_count < DIM(moves));
+ assert(tms_count < ARRAY_SIZE(moves));
for (unsigned i = 0; i < tms_count; i++, tms_bits >>= 1)
{
if ((idcode & 1) == 0)
{
/* Zero for LSB indicates a device in bypass */
- LOG_WARNING("TAP %s does not have IDCODE",
+ LOG_INFO("TAP %s does not have IDCODE",
tap->dotted_name);
idcode = 0;
tap->hasidcode = false;
/* increase length to add 2 bit sentinel after scan */
total_ir_length += 2;
- ir_test = malloc(CEIL(total_ir_length, 8));
+ ir_test = malloc(DIV_ROUND_UP(total_ir_length, 8));
if (ir_test == NULL)
return ERROR_FAIL;
/* If we're autoprobing, guess IR lengths. They must be at
* least two bits. Guessing will fail if (a) any TAP does
* not conform to the JTAG spec; or (b) when the upper bits
- * captured from some conforming TAP are nonzero.
+ * captured from some conforming TAP are nonzero. Or if
+ * (c) an IR length is longer than 32 bits -- which is only
+ * an implementation limit, which could someday be raised.
+ *
+ * REVISIT optimization: if there's a *single* TAP we can
+ * lift restrictions (a) and (b) by scanning a recognizable
+ * pattern before the all-ones BYPASS. Check for where the
+ * pattern starts in the result, instead of an 0...01 value.
*
* REVISIT alternative approach: escape to some tcl code
* which could provide more knowledge, based on IDCODE; and
if (tap->ir_length == 0) {
tap->ir_length = 2;
while ((val = buf_get_u32(ir_test, chain_pos,
- tap->ir_length + 1)) == 1) {
+ tap->ir_length + 1)) == 1
+ && tap->ir_length <= 32) {
tap->ir_length++;
}
LOG_WARNING("AUTO %s - use \"... -irlen %d\"",
/* if we're autoprobing, cope with potentially huge ir_length */
ir_len_bits = tap->ir_length ? : JTAG_IRLEN_MAX;
- ir_len_bytes = CEIL(ir_len_bits, 8);
+ ir_len_bytes = DIV_ROUND_UP(ir_len_bits, 8);
tap->expected = calloc(1, ir_len_bytes);
tap->expected_mask = calloc(1, ir_len_bytes);
free(tap);
}
-int jtag_interface_init(struct command_context_s *cmd_ctx)
+int jtag_interface_init(struct command_context *cmd_ctx)
{
if (jtag)
return ERROR_OK;
return ERROR_OK;
}
-int jtag_init_inner(struct command_context_s *cmd_ctx)
+int jtag_init_inner(struct command_context *cmd_ctx)
{
struct jtag_tap *tap;
int retval;
}
-int jtag_init_reset(struct command_context_s *cmd_ctx)
+int jtag_init_reset(struct command_context *cmd_ctx)
{
int retval;
return jtag_init_inner(cmd_ctx);
}
-int jtag_init(struct command_context_s *cmd_ctx)
+int jtag_init(struct command_context *cmd_ctx)
{
int retval;
if ((retval = jtag_execute_queue()) != ERROR_OK)
return retval;
- if (Jim_Eval_Named(interp, "jtag_init", __FILE__, __LINE__) != JIM_OK)
+ if (Jim_Eval_Named(cmd_ctx->interp, "jtag_init", __FILE__, __LINE__) != JIM_OK)
return ERROR_FAIL;
return ERROR_OK;