diff options
author | David Brownell <dbrownell@users.sourceforge.net> | 2009-11-16 16:36:03 -0800 |
---|---|---|
committer | David Brownell <dbrownell@users.sourceforge.net> | 2009-11-16 16:36:03 -0800 |
commit | 7c393679c0cd8f7609a0d6b2329a1877de0f3d31 (patch) | |
tree | ae3dadb9a5601621b5a77b4c4389ef19b456b3db /src | |
parent | 51862bb98c26e9b3f03d46ae0f8ceb434f0743d0 (diff) | |
download | openocd_libswd-7c393679c0cd8f7609a0d6b2329a1877de0f3d31.tar.gz openocd_libswd-7c393679c0cd8f7609a0d6b2329a1877de0f3d31.tar.bz2 openocd_libswd-7c393679c0cd8f7609a0d6b2329a1877de0f3d31.tar.xz openocd_libswd-7c393679c0cd8f7609a0d6b2329a1877de0f3d31.zip |
JTAG: fix autoprobe failure.
Fix bug noted by Øyvind: terminate the IR length autoscan when
the IR is too long, or otherwise broken.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Diffstat (limited to 'src')
-rw-r--r-- | src/jtag/core.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/jtag/core.c b/src/jtag/core.c index da745d09..211b9d5a 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -1224,7 +1224,14 @@ static int jtag_validate_ircapture(void) /* 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 @@ -1233,7 +1240,8 @@ static int jtag_validate_ircapture(void) 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\"", |