diff --git a/doc/openocd.texi b/doc/openocd.texi index 35c1b0d31..e4609e40a 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -2309,19 +2309,9 @@ a JTAG TAP; that TAP should be named @code{sdma}. Every TAP requires at least the following @var{configparams}: @itemize @bullet -@item @code{-ircapture} @var{NUMBER} -@*The bit pattern loaded by the TAP into the JTAG shift register -on entry to the @sc{ircapture} state, such as 0x01. -JTAG requires the two LSBs of this value to be 01. -The value is used to verify that instruction scans work correctly. @item @code{-irlen} @var{NUMBER} @*The length in bits of the instruction register, such as 4 or 5 bits. -@item @code{-irmask} @var{NUMBER} -@*A mask for the IR register. -For some devices, there are bits in the IR that aren't used. -This lets OpenOCD mask them off when doing IDCODE comparisons. -In general, this should just be all ones for the size of the IR. @end itemize A TAP may also provide optional @var{configparams}: @@ -2340,6 +2330,18 @@ found when the JTAG chain is examined. These codes are not required by all JTAG devices. @emph{Repeat the option} as many times as required if more than one ID code could appear (for example, multiple versions). +@item @code{-ircapture} @var{NUMBER} +@*The bit pattern loaded by the TAP into the JTAG shift register +on entry to the @sc{ircapture} state, such as 0x01. +JTAG requires the two LSBs of this value to be 01. +By default, @code{-ircapture} and @code{-irmask} are set +up to verify that two-bit value; but you may provide +additional bits, if you know them. +@item @code{-irmask} @var{NUMBER} +@*A mask used with @code{-ircapture} +to verify that instruction scans work correctly. +Such scans are not used by OpenOCD except to verify that +there seems to be no problems with JTAG scan chain operations. @end itemize @end deffn diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index 0368c4f89..aa32085b0 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -242,13 +242,15 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params", pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc); - /* deal with options */ -#define NTREQ_IRLEN 1 -#define NTREQ_IRCAPTURE 2 -#define NTREQ_IRMASK 4 + /* IEEE specifies that the two LSBs of an IR scan are 01, so make + * that the default. The "-irlen" and "-irmask" options are only + * needed to cope with nonstandard TAPs, or to specify more bits. + */ + pTap->ir_capture_mask = 0x03; + pTap->ir_capture_value = 0x01; - /* clear them as we find them */ - reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK); + /* clear flags for "required options" them as we find them */ + reqbits = 1; while (goi->argc) { e = Jim_GetOpt_Nvp(goi, opts, &n); @@ -308,31 +310,39 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi) switch (n->value) { case NTAP_OPT_IRLEN: if (w > (jim_wide) (8 * sizeof(pTap->ir_capture_value))) - LOG_WARNING("huge IR length %d", (int) w); + LOG_WARNING("%s: huge IR length %d", + pTap->dotted_name, + (int) w); pTap->ir_length = w; - reqbits &= (~(NTREQ_IRLEN)); + reqbits = 0; break; case NTAP_OPT_IRMASK: if (is_bad_irval(pTap->ir_length, w)) { - LOG_ERROR("IR mask %x too big", + LOG_ERROR("%s: IR mask %x too big", + pTap->dotted_name, (int) w); free((void *)pTap->dotted_name); free(pTap); return ERROR_FAIL; } + if ((w & 3) != 3) + LOG_WARNING("%s: nonstandard IR mask", + pTap->dotted_name); pTap->ir_capture_mask = w; - reqbits &= (~(NTREQ_IRMASK)); break; case NTAP_OPT_IRCAPTURE: if (is_bad_irval(pTap->ir_length, w)) { - LOG_ERROR("IR capture %x too big", + LOG_ERROR("%s: IR capture %x too big", + pTap->dotted_name, (int) w); free((void *)pTap->dotted_name); free(pTap); return ERROR_FAIL; } + if ((w & 3) != 1) + LOG_WARNING("%s: nonstandard IR value", + pTap->dotted_name); pTap->ir_capture_value = w; - reqbits &= (~(NTREQ_IRCAPTURE)); break; } } /* switch (n->value) */