From: David Brownell Date: Tue, 17 Nov 2009 00:36:03 +0000 (-0800) Subject: JTAG: fix autoprobe failure. X-Git-Tag: v0.4.0-rc1~552 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=7c393679c0cd8f7609a0d6b2329a1877de0f3d31;p=openocd 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 --- 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\"",