#endif
static const Jim_Nvp nvp_jtag_tap_event[] = {
+ { .value = JTAG_TAP_EVENT_POST_RESET, .name = "post-reset" },
{ .value = JTAG_TAP_EVENT_ENABLE, .name = "tap-enable" },
{ .value = JTAG_TAP_EVENT_DISABLE, .name = "tap-disable" },
static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-extern int jtag_examine_chain(void);
-extern int jtag_validate_chain(void);
enum jtag_tap_cfg_param {
JCFG_EVENT
}
if (goi->isconfigure) {
+ bool replace = true;
if (jteap == NULL) {
/* create new */
jteap = calloc(1, sizeof (*jteap));
+ replace = false;
}
jteap->event = n->value;
Jim_GetOpt_Obj(goi, &o);
jteap->body = Jim_DuplicateObj(goi->interp, o);
Jim_IncrRefCount(jteap->body);
- /* add to head of event list */
- jteap->next = tap->event_action;
- tap->event_action = jteap;
+ if (!replace)
+ {
+ /* add to head of event list */
+ jteap->next = tap->event_action;
+ tap->event_action = jteap;
+ }
Jim_SetEmptyResult(goi->interp);
} else {
/* get */
* */
if (goi->argc < 3) {
Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
+ free(pTap);
return JIM_ERR;
}
Jim_GetOpt_String(goi, &cp, NULL);
LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
- /* deal with options */
-#define NTREQ_IRLEN 1
-#define NTREQ_IRCAPTURE 2
-#define NTREQ_IRMASK 4
+ /* IEEE specifies that the two LSBs of an IR scan are 01, so make
+ * that the default. The "-irlen" and "-irmask" options are only
+ * needed to cope with nonstandard TAPs, or to specify more bits.
+ */
+ pTap->ir_capture_mask = 0x03;
+ pTap->ir_capture_value = 0x01;
- /* clear them as we find them */
- reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
+ /* clear flags for "required options" them as we find them */
+ reqbits = 1;
while (goi->argc) {
e = Jim_GetOpt_Nvp(goi, opts, &n);
if (e != JIM_OK) {
Jim_GetOpt_NvpUnknown(goi, opts, 0);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
LOG_DEBUG("Processing option: %s", n->name);
e = Jim_GetOpt_Wide(goi, &w);
if (e != JIM_OK) {
Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
new_expected_ids = malloc(sizeof(uint32_t) * (pTap->expected_ids_cnt + 1));
if (new_expected_ids == NULL) {
Jim_SetResult_sprintf(goi->interp, "no memory");
+ free((void *)pTap->dotted_name);
+ free(pTap);
return JIM_ERR;
}
e = Jim_GetOpt_Wide(goi, &w);
if (e != JIM_OK) {
Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
switch (n->value) {
case NTAP_OPT_IRLEN:
if (w > (jim_wide) (8 * sizeof(pTap->ir_capture_value)))
- LOG_WARNING("huge IR length %d", (int) w);
+ LOG_WARNING("%s: huge IR length %d",
+ pTap->dotted_name,
+ (int) w);
pTap->ir_length = w;
- reqbits &= (~(NTREQ_IRLEN));
+ reqbits = 0;
break;
case NTAP_OPT_IRMASK:
if (is_bad_irval(pTap->ir_length, w)) {
- LOG_ERROR("IR mask %x too big",
+ LOG_ERROR("%s: IR mask %x too big",
+ pTap->dotted_name,
(int) w);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return ERROR_FAIL;
}
+ if ((w & 3) != 3)
+ LOG_WARNING("%s: nonstandard IR mask",
+ pTap->dotted_name);
pTap->ir_capture_mask = w;
- reqbits &= (~(NTREQ_IRMASK));
break;
case NTAP_OPT_IRCAPTURE:
if (is_bad_irval(pTap->ir_length, w)) {
- LOG_ERROR("IR capture %x too big",
+ LOG_ERROR("%s: IR capture %x too big",
+ pTap->dotted_name,
(int) w);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return ERROR_FAIL;
}
+ if ((w & 3) != 1)
+ LOG_WARNING("%s: nonstandard IR value",
+ pTap->dotted_name);
pTap->ir_capture_value = w;
- reqbits &= (~(NTREQ_IRCAPTURE));
break;
}
} /* switch (n->value) */
static void jtag_tap_handle_event(jtag_tap_t *tap, enum jtag_event e)
{
jtag_tap_event_action_t * jteap;
- int done;
- jteap = tap->event_action;
-
- done = 0;
- while (jteap) {
+ for (jteap = tap->event_action; jteap != NULL; jteap = jteap->next) {
if (jteap->event == e) {
- done = 1;
LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
tap->dotted_name,
e,
Jim_GetString(jteap->body, NULL));
if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
Jim_PrintErrorMessage(interp);
- } else {
+ } else switch (e) {
+ case JTAG_TAP_EVENT_ENABLE:
+ case JTAG_TAP_EVENT_DISABLE:
/* NOTE: we currently assume the handlers
* can't fail. That presumes later code
* will be verifying the scan chains ...
*/
tap->enabled = (e == JTAG_TAP_EVENT_ENABLE);
+ break;
+ default:
+ break;
}
}
-
- jteap = jteap->next;
- }
-
- if (!done) {
- LOG_DEBUG("event %d %s - no action",
- e,
- Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name);
}
}
return JIM_ERR;
}
+
+void jtag_notify_reset(void)
+{
+ jtag_tap_t *tap;
+ for (tap = jtag_all_taps(); tap; tap = tap->next_tap)
+ {
+ jtag_tap_handle_event(tap, JTAG_TAP_EVENT_POST_RESET);
+ }
+}
+
+
int jtag_register_commands(struct command_context_s *cmd_ctx)
{
register_jim(cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
int tmp = 0;
int m;
+ m = RESET_SRST_GATES_JTAG;
+ tmp = 0;
+ if (strcmp(*args, "srst_gates_jtag") == 0)
+ {
+ tmp = RESET_SRST_GATES_JTAG;
+ goto next;
+ }
+
/* signals */
m = RESET_HAS_TRST | RESET_HAS_SRST;
if (strcmp(*args, "none") == 0)
tap = jtag_tap_by_string(args[i*2]);
if (tap == NULL)
{
+ int j;
+ for (j = 0; j < i; j++)
+ free(fields[j].out_value);
+ free(fields);
command_print(cmd_ctx, "Tap: %s unknown", args[i*2]);
+
return ERROR_FAIL;
}
int field_size = tap->ir_length;