diff options
author | zwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-06-16 12:17:12 +0000 |
---|---|---|
committer | zwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60> | 2009-06-16 12:17:12 +0000 |
commit | 491083a248a24c4b7d246e8f2c73b8ba1542d233 (patch) | |
tree | d4939150b5ada95212fcd44187a60905c3535fad /src | |
parent | 0de478618a048dc5abd0d54f878721d7e2901eac (diff) | |
download | openocd+libswd-491083a248a24c4b7d246e8f2c73b8ba1542d233.tar.gz openocd+libswd-491083a248a24c4b7d246e8f2c73b8ba1542d233.tar.bz2 openocd+libswd-491083a248a24c4b7d246e8f2c73b8ba1542d233.tar.xz openocd+libswd-491083a248a24c4b7d246e8f2c73b8ba1542d233.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/tcl.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index 0457bc70..aa55809f 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -478,6 +478,12 @@ static void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e) 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); } } @@ -569,26 +575,41 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv { 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 + */ 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 + */ 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; |