Allow -expected-id to be specified multiple times when creating a jtag tap
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 12 Dec 2008 00:21:07 +0000 (00:21 +0000)
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Fri, 12 Dec 2008 00:21:07 +0000 (00:21 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1229 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/jtag.c
src/jtag/jtag.h

index 663518a3355f82d21cf060d807149c143434c9be..555d140947eb5a04c04caf9065192c0882459dce 100644 (file)
@@ -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;
        }
 
index bf04e41c2b61b1e74affac2a9ba91a3b5ab4f470..5e1733e950f0d7b6459bad0aaa207d59a03f4c29 100644 (file)
@@ -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;