David Brownell <david-b@pacbell.net>:

Tighten error handling on TAP enable/disable paths a bit:

 - Don't enable/disable unless it's necessary.  Those event
   handlers could have nasty side effects...

 - Don't *succeed* enables/disables if there was no code which
   could have implemented that action.  This prevents bugs like
   wrongly acting as if the scan chain changed.

 - Minor whitespace cleanup in enable/disable command code.

The big problem is still the lack of code to verify scan chains
were actually updated as requested; this adds a comment on that.
I suspect the best we can do near term will be to verify IDCODE.


git-svn-id: svn://svn.berlios.de/openocd/trunk@2250 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
zwelch 2009-06-16 12:17:12 +00:00
parent 0de478618a
commit 491083a248
1 changed files with 33 additions and 12 deletions

View File

@ -478,6 +478,12 @@ static void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
Jim_GetString(jteap->body, NULL) ); Jim_GetString(jteap->body, NULL) );
if (Jim_EvalObj(interp, jteap->body) != JIM_OK) { if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
Jim_PrintErrorMessage(interp); 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);
} }
} }
@ -569,26 +575,41 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
{ {
jtag_tap_t *t; 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; return JIM_ERR;
}
switch( n->value ){ switch (n->value) {
case JTAG_CMD_TAPISENABLED: case JTAG_CMD_TAPISENABLED:
e = t->enabled;
break; break;
case JTAG_CMD_TAPENABLE: case JTAG_CMD_TAPENABLE:
jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE); if (t->enabled)
e = 1; break;
t->enabled = e; 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
*/
break; break;
case JTAG_CMD_TAPDISABLE: case JTAG_CMD_TAPDISABLE:
jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE); if (!t->enabled)
e = 0; break;
t->enabled = e; 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
*/
break; 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; return JIM_OK;
} }
break; break;