summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-12-12 00:21:07 +0000
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-12-12 00:21:07 +0000
commitd44c70a4b0ba1cce57a0395b1a8ccc9cdfd27416 (patch)
tree2a3db6a14a1de3c6b55a4df276b568e4ebea64de
parent83797fc5166c872bcc941834f3d10249ec228348 (diff)
downloadopenocd_libswd-d44c70a4b0ba1cce57a0395b1a8ccc9cdfd27416.tar.gz
openocd_libswd-d44c70a4b0ba1cce57a0395b1a8ccc9cdfd27416.tar.bz2
openocd_libswd-d44c70a4b0ba1cce57a0395b1a8ccc9cdfd27416.tar.xz
openocd_libswd-d44c70a4b0ba1cce57a0395b1a8ccc9cdfd27416.zip
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
-rw-r--r--src/jtag/jtag.c71
-rw-r--r--src/jtag/jtag.h3
2 files changed, 60 insertions, 14 deletions
diff --git a/src/jtag/jtag.c b/src/jtag/jtag.c
index 663518a3..555d1409 100644
--- a/src/jtag/jtag.c
+++ b/src/jtag/jtag.c
@@ -1574,20 +1574,36 @@ int jtag_examine_chain(void)
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");
}
@@ -1767,9 +1783,30 @@ jim_newtap_cmd( Jim_GetOptInfo *goi )
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:
@@ -1809,6 +1846,7 @@ jim_newtap_cmd( Jim_GetOptInfo *goi )
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)));
@@ -2270,21 +2308,28 @@ int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char
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;
}
diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h
index bf04e41c..5e1733e9 100644
--- a/src/jtag/jtag.h
+++ b/src/jtag/jtag.h
@@ -179,7 +179,8 @@ struct jtag_tap_s
u32 ir_capture_mask;
u8 *expected_mask; /* Capture-IR expected mask */
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 */
int bypass; /* bypass register selected */
jtag_tap_t *next_tap;