/* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
*/
-#if BUILD_ECOSBOARD == 1
+#if BUILD_ZY1000 == 1
extern jtag_interface_t zy1000_interface;
#elif defined(BUILD_MINIDRIVER_DUMMY)
extern jtag_interface_t minidummy_interface;
* or some number of standard driver interfaces, never both.
*/
jtag_interface_t *jtag_interfaces[] = {
-#if BUILD_ECOSBOARD == 1
+#if BUILD_ZY1000 == 1
&zy1000_interface,
#elif defined(BUILD_MINIDRIVER_DUMMY)
&minidummy_interface,
jteap = tap->event_action;
/* replace existing? */
while (jteap) {
- if (jteap->event == (enum jtag_tap_event)n->value) {
+ if (jteap->event == (enum jtag_event)n->value) {
break;
}
jteap = jteap->next;
return (w & v) != 0;
}
-extern void jtag_tap_init(jtag_tap_t *tap);
-extern void jtag_tap_free(jtag_tap_t *tap);
-
static int jim_newtap_cmd( Jim_GetOptInfo *goi )
{
jtag_tap_t *pTap;
{ .name = NULL , .value = -1 },
};
- pTap = malloc( sizeof(jtag_tap_t) );
- memset( pTap, 0, sizeof(*pTap) );
- if( !pTap ){
- Jim_SetResult_sprintf( goi->interp, "no memory");
+ pTap = calloc(1, sizeof(jtag_tap_t));
+ if (!pTap) {
+ Jim_SetResult_sprintf(goi->interp, "no memory");
return JIM_ERR;
}
+
/*
* we expect CHIP + TAP + OPTIONS
* */
LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
- /* default is enabled */
- pTap->enabled = 1;
-
/* deal with options */
#define NTREQ_IRLEN 1
#define NTREQ_IRCAPTURE 2
LOG_DEBUG("Processing option: %s", n->name );
switch( n->value ){
case NTAP_OPT_ENABLED:
- pTap->enabled = 1;
+ pTap->disabled_after_reset = false;
break;
case NTAP_OPT_DISABLED:
- pTap->enabled = 0;
+ pTap->disabled_after_reset = true;
break;
case NTAP_OPT_EXPECTED_ID:
{
}
switch(n->value){
case NTAP_OPT_IRLEN:
- if (w < (jim_wide) sizeof(pTap->ir_capture_value))
+ if (w > (jim_wide) (8 * sizeof(pTap->ir_capture_value)))
LOG_WARNING("huge IR length %d", (int) w);
pTap->ir_length = w;
reqbits &= (~(NTREQ_IRLEN));
} /* switch(n->value) */
} /* while( goi->argc ) */
+ /* default is enabled-after-reset */
+ pTap->enabled = !pTap->disabled_after_reset;
+
/* Did all the required option bits get cleared? */
if (0 == reqbits)
{
return JIM_ERR;
}
-static void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
+static void jtag_tap_handle_event(jtag_tap_t *tap, enum jtag_event e)
{
jtag_tap_event_action_t * jteap;
int done;
Jim_GetString(jteap->body, NULL) );
if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
Jim_PrintErrorMessage(interp);
+ } else {
+ /* 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);
}
}
{
jtag_tap_t *t;
- t = jtag_tap_by_jim_obj( goi.interp, goi.argv[0] );
- if( t == NULL ){
+
+ t = jtag_tap_by_jim_obj(goi.interp, goi.argv[0]);
+ if (t == NULL)
return JIM_ERR;
- }
- switch( n->value ){
+
+ switch (n->value) {
case JTAG_CMD_TAPISENABLED:
- e = t->enabled;
break;
case JTAG_CMD_TAPENABLE:
- jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
- e = 1;
- t->enabled = e;
+ if (t->enabled)
+ break;
+ jtag_tap_handle_event(t, JTAG_TAP_EVENT_ENABLE);
+ if (!t->enabled)
+ break;
+
+ /* FIXME add JTAG sanity checks, w/o TLR
+ * - scan chain length grew by one (this)
+ * - IDs and IR lengths are as expected
+ */
+
+ jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE);
break;
case JTAG_CMD_TAPDISABLE:
- jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE);
- e = 0;
- t->enabled = e;
+ if (!t->enabled)
+ break;
+ jtag_tap_handle_event(t, JTAG_TAP_EVENT_DISABLE);
+ if (t->enabled)
+ break;
+
+ /* FIXME add JTAG sanity checks, w/o TLR
+ * - scan chain length shrank by one (this)
+ * - IDs and IR lengths are as expected
+ */
+
+ jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE);
break;
}
- Jim_SetResult( goi.interp, Jim_NewIntObj( goi.interp, e ) );
+ e = t->enabled;
+ Jim_SetResult(goi.interp, Jim_NewIntObj(goi.interp, e));
return JIM_OK;
}
break;
if (ERROR_OK != retval)
return retval;
- jtag_add_runtest(num_clocks, jtag_get_end_state());
+ jtag_add_runtest(num_clocks, TAP_IDLE);
jtag_execute_queue();
return ERROR_OK;