summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDavid Brownell <dbrownell@users.sourceforge.net>2009-11-16 16:36:03 -0800
committerDavid Brownell <dbrownell@users.sourceforge.net>2009-11-16 16:36:03 -0800
commit7c393679c0cd8f7609a0d6b2329a1877de0f3d31 (patch)
treeae3dadb9a5601621b5a77b4c4389ef19b456b3db /src
parent51862bb98c26e9b3f03d46ae0f8ceb434f0743d0 (diff)
downloadopenocd_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.c12
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\"",