Allow -expected-id to be specified multiple times when creating a jtag tap
git-svn-id: svn://svn.berlios.de/openocd/trunk@1229 b42882b7-edfa-0310-969c-e2dbd0fdcd60__archive__
parent
83797fc516
commit
d44c70a4b0
|
@ -1574,20 +1574,36 @@ int jtag_examine_chain(void)
|
||||||
if (tap)
|
if (tap)
|
||||||
{
|
{
|
||||||
tap->idcode = idcode;
|
tap->idcode = idcode;
|
||||||
if( tap->expected_id ){
|
|
||||||
if( tap->idcode != tap->expected_id ){
|
if (tap->expected_ids_cnt > 0) {
|
||||||
LOG_ERROR("ERROR: Tap: %s - Expected id: 0x%08x, Got: 0x%08x",
|
/* 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->dotted_name,
|
||||||
tap->expected_id,
|
idcode,
|
||||||
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",
|
|
||||||
EXTRACT_MFG( tap->idcode ),
|
EXTRACT_MFG( tap->idcode ),
|
||||||
EXTRACT_PART( tap->idcode ),
|
EXTRACT_PART( tap->idcode ),
|
||||||
EXTRACT_VER( 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 {
|
} else {
|
||||||
LOG_INFO("JTAG Tap/device matched");
|
LOG_INFO("JTAG Tap/device matched");
|
||||||
}
|
}
|
||||||
|
@ -1767,9 +1783,30 @@ jim_newtap_cmd( Jim_GetOptInfo *goi )
|
||||||
pTap->enabled = 0;
|
pTap->enabled = 0;
|
||||||
break;
|
break;
|
||||||
case NTAP_OPT_EXPECTED_ID:
|
case NTAP_OPT_EXPECTED_ID:
|
||||||
|
{
|
||||||
|
u32 *new_expected_ids;
|
||||||
|
|
||||||
e = Jim_GetOpt_Wide( goi, &w );
|
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;
|
break;
|
||||||
|
}
|
||||||
case NTAP_OPT_IRLEN:
|
case NTAP_OPT_IRLEN:
|
||||||
case NTAP_OPT_IRMASK:
|
case NTAP_OPT_IRMASK:
|
||||||
case NTAP_OPT_IRCAPTURE:
|
case NTAP_OPT_IRCAPTURE:
|
||||||
|
@ -1809,6 +1846,7 @@ jim_newtap_cmd( Jim_GetOptInfo *goi )
|
||||||
pTap->dotted_name);
|
pTap->dotted_name);
|
||||||
// fixme: Tell user what is missing :-(
|
// fixme: Tell user what is missing :-(
|
||||||
// no memory leaks pelase
|
// no memory leaks pelase
|
||||||
|
free(((void *)(pTap->expected_ids)));
|
||||||
free(((void *)(pTap->chip)));
|
free(((void *)(pTap->chip)));
|
||||||
free(((void *)(pTap->tapname)));
|
free(((void *)(pTap->tapname)));
|
||||||
free(((void *)(pTap->dotted_name)));
|
free(((void *)(pTap->dotted_name)));
|
||||||
|
@ -2270,21 +2308,28 @@ int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char
|
||||||
command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
|
command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
|
||||||
|
|
||||||
while( tap ){
|
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 = buf_get_u32(tap->expected, 0, tap->ir_length);
|
||||||
expected_mask = buf_get_u32(tap->expected_mask, 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);
|
cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
|
||||||
|
|
||||||
command_print(cmd_ctx,
|
command_print(cmd_ctx,
|
||||||
"%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
|
"%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
|
||||||
tap->abs_chain_position,
|
tap->abs_chain_position,
|
||||||
tap->dotted_name,
|
tap->dotted_name,
|
||||||
tap->enabled ? 'Y' : 'n',
|
tap->enabled ? 'Y' : 'n',
|
||||||
tap->idcode,
|
tap->idcode,
|
||||||
tap->expected_id,
|
(tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
|
||||||
tap->ir_length,
|
tap->ir_length,
|
||||||
expected,
|
expected,
|
||||||
expected_mask,
|
expected_mask,
|
||||||
cur_instr);
|
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;
|
tap = tap->next_tap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -179,7 +179,8 @@ struct jtag_tap_s
|
||||||
u32 ir_capture_mask;
|
u32 ir_capture_mask;
|
||||||
u8 *expected_mask; /* Capture-IR expected mask */
|
u8 *expected_mask; /* Capture-IR expected mask */
|
||||||
u32 idcode; /* device identification code */
|
u32 idcode; /* device identification code */
|
||||||
u32 expected_id;
|
u32 *expected_ids; /* Array of expected identification codes */
|
||||||
|
u8 expected_ids_cnt;/* Number of expected identification codes */
|
||||||
u8 *cur_instr; /* current instruction */
|
u8 *cur_instr; /* current instruction */
|
||||||
int bypass; /* bypass register selected */
|
int bypass; /* bypass register selected */
|
||||||
jtag_tap_t *next_tap;
|
jtag_tap_t *next_tap;
|
||||||
|
|
Loading…
Reference in New Issue