Skip to content

Commit

Permalink
Better fix for TAPs violating the JTAG spec for IR-Capture.
Browse files Browse the repository at this point in the history
Instead of just assuming all IDCODE-deprived TAPs violate the
JTAG spec (they don't!), just require TAPs with such problems
to be declared with proper ircapture/irmask values.  Example,
with mask and value of zero.


git-svn-id: svn://svn.berlios.de/openocd/trunk@2823 b42882b7-edfa-0310-969c-e2dbd0fdcd60
  • Loading branch information
dbrownell committed Oct 7, 2009
1 parent 7035b37 commit 246ff4f
Showing 1 changed file with 18 additions and 16 deletions.
34 changes: 18 additions & 16 deletions src/jtag/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1108,22 +1108,24 @@ static int jtag_validate_ircapture(void)
break;
}

if (tap->hasidcode)
{
/* Validate the two LSBs, which must be 01 per JTAG spec.
* REVISIT we might be able to verify some MSBs too, using
* ircapture/irmask attributes.
*/
val = buf_get_u32(ir_test, chain_pos, tap->ir_length);
if ((val & 0x3) != 1) {
LOG_ERROR("%s: IR capture error; saw 0x%0*x not 0x..1",
jtag_tap_name(tap),
(tap->ir_length + 7) / tap->ir_length,
val);

retval = ERROR_JTAG_INIT_FAILED;
goto done;
}
/* Validate the two LSBs, which must be 01 per JTAG spec.
*
* Or ... more bits could be provided by TAP declaration.
* Plus, some taps (notably in i.MX series chips) violate
* this part of the JTAG spec, so their capture mask/value
* attributes might disable this test.
*/
val = buf_get_u32(ir_test, chain_pos, tap->ir_length);
if ((val & tap->ir_capture_mask) != tap->ir_capture_value) {
LOG_ERROR("%s: IR capture error; saw 0x%0*x not 0x%0*x",
jtag_tap_name(tap),
(tap->ir_length + 7) / tap->ir_length,
val,
(tap->ir_length + 7) / tap->ir_length,
tap->ir_capture_value);

retval = ERROR_JTAG_INIT_FAILED;
goto done;
}
LOG_DEBUG("%s: IR capture 0x%0*x", jtag_tap_name(tap),
(tap->ir_length + 7) / tap->ir_length, val);
Expand Down

0 comments on commit 246ff4f

Please sign in to comment.