Commit 8551803e authored by zwelch's avatar zwelch
Browse files

David Brownell <>:

Partial fix to the "long IR length" problems.

 - Current code could handle up to 32 bit IR lengths with
   full functionality, if it didn't just reject may of them
   out of hand.  So only reject clear errors, where the IR
   mask (or capture instruction) needs more than IrLen bits.

 - Longer IR lengths can only be handled in BYPASS mode
   for now.  Example:  TI's DSPs use 38-bit IR lengths.
   So we can't issue their IDCODE instructions...

A more complete fix would be able to issue longer instructions;
or minimally, would fail cleanly for the non-BYPASS case.

Note that this *could* make some currently broken scripts fail,
since the previous code accepted garbage values so long as
they didn't use more than 16 bits.

git-svn-id: svn:// b42882b7-edfa-0310-969c-e2dbd0fdcd60
parent a92cc405
......@@ -1073,6 +1073,7 @@ void jtag_tap_init(jtag_tap_t *tap)
tap->expected_mask = malloc(tap->ir_length);
tap->cur_instr = malloc(tap->ir_length);
/// @todo cope sanely with ir_length bigger than 32 bits
buf_set_u32(tap->expected, 0, tap->ir_length, tap->ir_capture_value);
buf_set_u32(tap->expected_mask, 0, tap->ir_length, tap->ir_capture_mask);
buf_set_ones(tap->cur_instr, tap->ir_length);
......@@ -296,6 +296,15 @@ static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
return JIM_OK;
static int is_bad_irval(int ir_length, jim_wide w)
jim_wide v = 1;
v <<= ir_length;
v -= 1;
v = ~v;
return (w & v) != 0;
extern void jtag_tap_init(jtag_tap_t *tap);
extern void jtag_tap_free(jtag_tap_t *tap);
......@@ -411,22 +420,28 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
Jim_SetResult_sprintf( goi->interp, "option: %s bad parameter", n->name );
return e;
if( (w < 0) || (w > 0xffff) ){
/* wacky value */
Jim_SetResult_sprintf( goi->interp, "option: %s - wacky value: %d (0x%x)",
n->name, (int)(w), (int)(w));
return JIM_ERR;
if (w < (jim_wide) sizeof(pTap->ir_capture_value))
LOG_WARNING("huge IR length %d", (int) w);
pTap->ir_length = w;
reqbits &= (~(NTREQ_IRLEN));
if (is_bad_irval(pTap->ir_length, w)) {
LOG_ERROR("IR mask %x too big",
(int) w);
return ERROR_FAIL;
pTap->ir_capture_mask = w;
reqbits &= (~(NTREQ_IRMASK));
if (is_bad_irval(pTap->ir_length, w)) {
LOG_ERROR("IR capture %x too big",
(int) w);
return ERROR_FAIL;
pTap->ir_capture_value = w;
reqbits &= (~(NTREQ_IRCAPTURE));
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment