if (tap)
{
tap->idcode = idcode;
- if( tap->expected_id ){
- if( tap->idcode != tap->expected_id ){
- LOG_ERROR("ERROR: Tap: %s - Expected id: 0x%08x, Got: 0x%08x",
+
+ if (tap->expected_ids_cnt > 0) {
+ /* Loop over the expected identification codes and test for a match */
+ u8 ii;
+ for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
+ if( tap->idcode == tap->expected_ids[ii] ){
+ break;
+ }
+ }
+
+ /* If none of the expected ids matched, log an error */
+ if (ii == tap->expected_ids_cnt) {
+ LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
tap->dotted_name,
- tap->expected_id,
- idcode );
- LOG_ERROR("ERROR: expected: mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x",
- EXTRACT_MFG( tap->expected_id ),
- EXTRACT_PART( tap->expected_id ),
- EXTRACT_VER( tap->expected_id ) );
- LOG_ERROR("ERROR: got: mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x",
+ idcode,
EXTRACT_MFG( tap->idcode ),
EXTRACT_PART( tap->idcode ),
EXTRACT_VER( tap->idcode ) );
+ for (ii = 0; ii < tap->expected_ids_cnt; ii++) {
+ LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
+ tap->dotted_name,
+ ii + 1,
+ tap->expected_ids_cnt,
+ tap->expected_ids[ii],
+ EXTRACT_MFG( tap->expected_ids[ii] ),
+ EXTRACT_PART( tap->expected_ids[ii] ),
+ EXTRACT_VER( tap->expected_ids[ii] ) );
+ }
+
+ return ERROR_JTAG_INIT_FAILED;
} else {
LOG_INFO("JTAG Tap/device matched");
}
pTap->enabled = 0;
break;
case NTAP_OPT_EXPECTED_ID:
+ {
+ u32 *new_expected_ids;
+
e = Jim_GetOpt_Wide( goi, &w );
- pTap->expected_id = w;
+ if( e != JIM_OK) {
+ Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+ return e;
+ }
+
+ new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
+ if (new_expected_ids == NULL) {
+ Jim_SetResult_sprintf( goi->interp, "no memory");
+ return JIM_ERR;
+ }
+
+ memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
+
+ new_expected_ids[pTap->expected_ids_cnt] = w;
+
+ free(pTap->expected_ids);
+ pTap->expected_ids = new_expected_ids;
+ pTap->expected_ids_cnt++;
break;
+ }
case NTAP_OPT_IRLEN:
case NTAP_OPT_IRMASK:
case NTAP_OPT_IRCAPTURE:
pTap->dotted_name);
// fixme: Tell user what is missing :-(
// no memory leaks pelase
+ free(((void *)(pTap->expected_ids)));
free(((void *)(pTap->chip)));
free(((void *)(pTap->tapname)));
free(((void *)(pTap->dotted_name)));
command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
while( tap ){
- u32 expected, expected_mask, cur_instr;
+ u32 expected, expected_mask, cur_instr, ii;
expected = buf_get_u32(tap->expected, 0, tap->ir_length);
expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
+
command_print(cmd_ctx,
"%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
tap->abs_chain_position,
tap->dotted_name,
tap->enabled ? 'Y' : 'n',
tap->idcode,
- tap->expected_id,
+ (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
tap->ir_length,
expected,
expected_mask,
cur_instr);
+
+ for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
+ command_print(cmd_ctx, " | | | | 0x%08x | | | | ",
+ tap->expected_ids[ii]);
+ }
+
tap = tap->next_tap;
}