jtag: jtag_add_ir_scan() now takes a single field
authorØyvind Harboe <oyvind.harboe@zylin.com>
Thu, 4 Mar 2010 13:38:19 +0000 (14:38 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 8 Mar 2010 07:12:25 +0000 (08:12 +0100)
In the code a single field was all that was ever used. Makes
jtag_add_ir_scan() simpler and leaves more complicated stuff
to jtag_add_plain_ir_scan().

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
15 files changed:
src/flash/nor/str9xpec.c
src/jtag/core.c
src/jtag/drivers/driver.c
src/jtag/jtag.h
src/jtag/minidriver.h
src/jtag/minidummy/minidummy.c
src/jtag/tcl.c
src/jtag/zy1000/zy1000.c
src/pld/virtex2.c
src/target/arm11_dbgtap.c
src/target/arm_jtag.c
src/target/etb.c
src/target/mips_ejtag.c
src/target/xscale.c
src/xsvf/xsvf.c

index 3796a4b19060976c289cfbcfdb74f51a82bfda35..b6d24f58cb9757165fd2590cf8a3843693afb5b1 100644 (file)
@@ -48,7 +48,7 @@ int str9xpec_set_instr(struct jtag_tap *tap, uint32_t new_instr, tap_state_t end
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
-               jtag_add_ir_scan(tap, 1, &field, end_state);
+               jtag_add_ir_scan(tap, &field, end_state);
 
                free(field.out_value);
        }
 
                free(field.out_value);
        }
index 2e09cb6d58bcb5e026af80cc2a50f2ef539fad25..bce332fc844cdb4411cd7b343081bd4acb949451 100644 (file)
@@ -42,7 +42,8 @@
 /// The number of JTAG queue flushes (for profiling and debugging purposes).
 static int jtag_flush_queue_count;
 
 /// The number of JTAG queue flushes (for profiling and debugging purposes).
 static int jtag_flush_queue_count;
 
-static void jtag_add_scan_check(struct jtag_tap *active, void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
+static void jtag_add_scan_check(struct jtag_tap *active,
+               void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
                int in_num_fields, struct scan_field *in_fields, tap_state_t state);
 
 /**
                int in_num_fields, struct scan_field *in_fields, tap_state_t state);
 
 /**
@@ -352,17 +353,22 @@ void jtag_alloc_in_value32(struct scan_field *field)
        interface_jtag_alloc_in_value32(field);
 }
 
        interface_jtag_alloc_in_value32(field);
 }
 
-void jtag_add_ir_scan_noverify(struct jtag_tap *active, int in_count, const struct scan_field *in_fields,
+void jtag_add_ir_scan_noverify(struct jtag_tap *active, const struct scan_field *in_fields,
                tap_state_t state)
 {
        jtag_prelude(state);
 
                tap_state_t state)
 {
        jtag_prelude(state);
 
-       int retval = interface_jtag_add_ir_scan(active, in_count, in_fields, state);
+       int retval = interface_jtag_add_ir_scan(active, in_fields, state);
        jtag_set_error(retval);
 }
 
        jtag_set_error(retval);
 }
 
+static void jtag_add_ir_scan_noverify_callback(struct jtag_tap *active, int dummy, const struct scan_field *in_fields,
+               tap_state_t state)
+{
+       jtag_add_ir_scan_noverify(active, in_fields, state);
+}
 
 
-void jtag_add_ir_scan(struct jtag_tap *active, int in_num_fields, struct scan_field *in_fields, tap_state_t state)
+void jtag_add_ir_scan(struct jtag_tap *active, struct scan_field *in_fields, tap_state_t state)
 {
        assert(state != TAP_RESET);
 
 {
        assert(state != TAP_RESET);
 
@@ -370,18 +376,15 @@ void jtag_add_ir_scan(struct jtag_tap *active, int in_num_fields, struct scan_fi
        {
                /* 8 x 32 bit id's is enough for all invocations */
 
        {
                /* 8 x 32 bit id's is enough for all invocations */
 
-               for (int j = 0; j < in_num_fields; j++)
-               {
-                       /* if we are to run a verification of the ir scan, we need to get the input back.
-                        * We may have to allocate space if the caller didn't ask for the input back.
-                        */
-                       in_fields[j].check_value = active->expected;
-                       in_fields[j].check_mask = active->expected_mask;
-               }
-               jtag_add_scan_check(active, jtag_add_ir_scan_noverify, in_num_fields, in_fields, state);
+               /* if we are to run a verification of the ir scan, we need to get the input back.
+                * We may have to allocate space if the caller didn't ask for the input back.
+                */
+               in_fields->check_value = active->expected;
+               in_fields->check_mask = active->expected_mask;
+               jtag_add_scan_check(active, jtag_add_ir_scan_noverify_callback, 1, in_fields, state);
        } else
        {
        } else
        {
-               jtag_add_ir_scan_noverify(active, in_num_fields, in_fields, state);
+               jtag_add_ir_scan_noverify(active, in_fields, state);
        }
 }
 
        }
 }
 
index 673d191e56ece38cae8f18d43165eff840d054f5..57bc28d1601673956339ece10d2b69e0942bce4f 100644 (file)
@@ -74,7 +74,7 @@ static void cmd_queue_scan_field_clone(struct scan_field * dst, const struct sca
  * see jtag_add_ir_scan()
  *
  */
  * see jtag_add_ir_scan()
  *
  */
-int interface_jtag_add_ir_scan(struct jtag_tap* active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state)
+int interface_jtag_add_ir_scan(struct jtag_tap* active, const struct scan_field *in_fields, tap_state_t state)
 {
        size_t num_taps = jtag_tap_count_enabled();
 
 {
        size_t num_taps = jtag_tap_count_enabled();
 
@@ -106,8 +106,7 @@ int interface_jtag_add_ir_scan(struct jtag_tap* active, int in_num_fields, const
                        /* if TAP is listed in input fields, copy the value */
                        tap->bypass = 0;
 
                        /* if TAP is listed in input fields, copy the value */
                        tap->bypass = 0;
 
-                       for (int j = 0; j < in_num_fields; j++)
-                               cmd_queue_scan_field_clone(field, in_fields + j);
+                       cmd_queue_scan_field_clone(field, in_fields);
                } else
                {
                        /* if a TAP isn't listed in input fields, set it to BYPASS */
                } else
                {
                        /* if a TAP isn't listed in input fields, set it to BYPASS */
index 6e21024e37285a1397e928fe649a6cdf95914a55..fe57db108b2729d7f21ebb49c2cb899473e5e6ec 100644 (file)
@@ -350,13 +350,13 @@ int jtag_init_inner(struct command_context *cmd_ctx);
  * subsequent DR SCANs.
  *
  */
  * subsequent DR SCANs.
  *
  */
-void jtag_add_ir_scan(struct jtag_tap* tap, int num_fields,
+void jtag_add_ir_scan(struct jtag_tap* tap,
                struct scan_field* fields, tap_state_t endstate);
 /**
  * The same as jtag_add_ir_scan except no verification is performed out
  * the output values.
  */
                struct scan_field* fields, tap_state_t endstate);
 /**
  * The same as jtag_add_ir_scan except no verification is performed out
  * the output values.
  */
-void jtag_add_ir_scan_noverify(struct jtag_tap* tap, int num_fields,
+void jtag_add_ir_scan_noverify(struct jtag_tap* tap,
                const struct scan_field *fields, tap_state_t state);
 /**
  * Duplicate the scan fields passed into the function into an IR SCAN
                const struct scan_field *fields, tap_state_t state);
 /**
  * Duplicate the scan fields passed into the function into an IR SCAN
index a4172169fbaadc8e814836e20ec958ebb79deca0..4631593f418405a83351031147f570f5d1c8ee35 100644 (file)
@@ -50,7 +50,7 @@
 #include <jtag/minidriver_imp.h>
 
 int interface_jtag_add_ir_scan(struct jtag_tap* active,
 #include <jtag/minidriver_imp.h>
 
 int interface_jtag_add_ir_scan(struct jtag_tap* active,
-               int num_fields, const struct scan_field* fields,
+               const struct scan_field* fields,
                tap_state_t endstate);
 int interface_jtag_add_plain_ir_scan(
                int num_fields, const struct scan_field* fields,
                tap_state_t endstate);
 int interface_jtag_add_plain_ir_scan(
                int num_fields, const struct scan_field* fields,
index 98b449f9fe4e89dd21faf50f5753eefe28b45821..1eef08795c769ca0e441e49c9da08e3e6a60d14c 100644 (file)
@@ -46,7 +46,7 @@ int interface_jtag_execute_queue(void)
        return ERROR_OK;
 }
 
        return ERROR_OK;
 }
 
-int interface_jtag_add_ir_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state)
+int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field *fields, tap_state_t state)
 {
        /* synchronously do the operation here */
 
 {
        /* synchronously do the operation here */
 
index da01f8125c719dab8fbdd37d08b3ecdf223a6558..1073abc024887bc4ffb9420058efa4cd8070adf0 100644 (file)
@@ -1490,6 +1490,15 @@ COMMAND_HANDLER(handle_irscan_command)
        }
 
        int num_fields = CMD_ARGC / 2;
        }
 
        int num_fields = CMD_ARGC / 2;
+       if (num_fields > 1)
+       {
+               /* we really should be looking at plain_ir_scan if we want
+                * anything more fancy.
+                */
+               LOG_ERROR("Specify a single value for tap");
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       }
+
        size_t fields_len = sizeof(struct scan_field) * num_fields;
        fields = malloc(fields_len);
        memset(fields, 0, fields_len);
        size_t fields_len = sizeof(struct scan_field) * num_fields;
        fields = malloc(fields_len);
        memset(fields, 0, fields_len);
@@ -1521,7 +1530,7 @@ COMMAND_HANDLER(handle_irscan_command)
        }
 
        /* did we have an endstate? */
        }
 
        /* did we have an endstate? */
-       jtag_add_ir_scan(tap, num_fields, fields, endstate);
+       jtag_add_ir_scan(tap, fields, endstate);
 
        retval = jtag_execute_queue();
 
 
        retval = jtag_execute_queue();
 
index 0b112589d5c82b1bc50cbe12ea6c3fbada4bb8f8..391d8f2076201d9383aee80dec7a3a1f3c2c7249 100644 (file)
@@ -574,13 +574,11 @@ static __inline void scanFields(int num_fields, const struct scan_field *fields,
        }
 }
 
        }
 }
 
-int interface_jtag_add_ir_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state)
+int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field *fields, tap_state_t state)
 {
        int scan_size = 0;
        struct jtag_tap *tap, *nextTap;
 
 {
        int scan_size = 0;
        struct jtag_tap *tap, *nextTap;
 
-       assert(num_fields == 1);
-
        for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
        {
                nextTap = jtag_tap_next_enabled(tap);
        for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
        {
                nextTap = jtag_tap_next_enabled(tap);
@@ -590,7 +588,7 @@ int interface_jtag_add_ir_scan(struct jtag_tap *active, int num_fields, const st
                /* search the list */
                if (tap == active)
                {
                /* search the list */
                if (tap == active)
                {
-                       scanFields(num_fields, fields, TAP_IRSHIFT, pause);
+                       scanFields(1, fields, TAP_IRSHIFT, pause);
                        /* update device information */
                        buf_cpy(fields[0].out_value, tap->cur_instr, scan_size);
 
                        /* update device information */
                        buf_cpy(fields[0].out_value, tap->cur_instr, scan_size);
 
index 15685e61b675c1e7fd17b4bf489388e72dbfef2b..976535b4cd14c2f647350faf666b5fb18b0e66e3 100644 (file)
@@ -40,7 +40,7 @@ static int virtex2_set_instr(struct jtag_tap *tap, uint32_t new_instr)
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
-               jtag_add_ir_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE));
+               jtag_add_ir_scan(tap, &field, jtag_set_end_state(TAP_IDLE));
 
                free(field.out_value);
        }
 
                free(field.out_value);
        }
index f0490596edcc5db54e7f24a059c0525806c014d4..2b7b4e42d6a56c132113c3910938cc484e991ef7 100644 (file)
@@ -49,13 +49,13 @@ static const tap_state_t arm11_move_pi_to_si_via_ci[] =
 
 
 /* REVISIT no error handling here! */
 
 
 /* REVISIT no error handling here! */
-static void arm11_add_ir_scan_vc(struct jtag_tap *tap, int num_fields, struct scan_field *fields,
+static void arm11_add_ir_scan_vc(struct jtag_tap *tap, struct scan_field *fields,
                tap_state_t state)
 {
        if (cmd_queue_cur_state == TAP_IRPAUSE)
                jtag_add_pathmove(ARRAY_SIZE(arm11_move_pi_to_si_via_ci), arm11_move_pi_to_si_via_ci);
 
                tap_state_t state)
 {
        if (cmd_queue_cur_state == TAP_IRPAUSE)
                jtag_add_pathmove(ARRAY_SIZE(arm11_move_pi_to_si_via_ci), arm11_move_pi_to_si_via_ci);
 
-       jtag_add_ir_scan(tap, num_fields, fields, state);
+       jtag_add_ir_scan(tap, fields, state);
 }
 
 static const tap_state_t arm11_move_pd_to_sd_via_cd[] =
 }
 
 static const tap_state_t arm11_move_pd_to_sd_via_cd[] =
@@ -149,7 +149,7 @@ void arm11_add_IR(struct arm11_common * arm11, uint8_t instr, tap_state_t state)
 
        arm11_setup_field(arm11, 5, &instr, NULL, &field);
 
 
        arm11_setup_field(arm11, 5, &instr, NULL, &field);
 
-       arm11_add_ir_scan_vc(arm11->arm.target->tap, 1, &field, state == ARM11_TAP_DEFAULT ? TAP_IRPAUSE : state);
+       arm11_add_ir_scan_vc(arm11->arm.target->tap, &field, state == ARM11_TAP_DEFAULT ? TAP_IRPAUSE : state);
 }
 
 /** Verify data shifted out from Scan Chain Register (SCREG). */
 }
 
 /** Verify data shifted out from Scan Chain Register (SCREG). */
index 3e27b7638aa1c3085497755545809457298567bc..5ed104cf11d0273a09b9c98d981e617a6b567078 100644 (file)
@@ -45,13 +45,13 @@ int arm_jtag_set_instr_inner(struct arm_jtag *jtag_info, uint32_t new_instr,  vo
 
        if (no_verify_capture == NULL)
        {
 
        if (no_verify_capture == NULL)
        {
-               jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state());
+               jtag_add_ir_scan(tap, &field, jtag_get_end_state());
        } else
        {
                /* FIX!!!! this is a kludge!!! arm926ejs.c should reimplement this arm_jtag_set_instr to
                 * have special verification code.
                 */
        } else
        {
                /* FIX!!!! this is a kludge!!! arm926ejs.c should reimplement this arm_jtag_set_instr to
                 * have special verification code.
                 */
-               jtag_add_ir_scan_noverify(tap, 1, &field, jtag_get_end_state());
+               jtag_add_ir_scan_noverify(tap, &field, jtag_get_end_state());
        }
 
        return ERROR_OK;
        }
 
        return ERROR_OK;
index 1f73ff5ef243f438597abb65a2b4355571bdb8d4..2c4e3ebe90037e5c4330857fd3a34677057a6895 100644 (file)
@@ -60,7 +60,7 @@ static int etb_set_instr(struct etb *etb, uint32_t new_instr)
 
                field.in_value = NULL;
 
 
                field.in_value = NULL;
 
-               jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state());
+               jtag_add_ir_scan(tap, &field, jtag_get_end_state());
 
                free(field.out_value);
        }
 
                free(field.out_value);
        }
index 79160fc4c2b2b7e92019a592daabf759c38d957a..e0550a81a442b136f9f4b16b26d95ab69e7173ef 100644 (file)
@@ -46,7 +46,7 @@ int mips_ejtag_set_instr(struct mips_ejtag *ejtag_info, int new_instr, void *del
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
                field.in_value = NULL;
 
-               jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state());
+               jtag_add_ir_scan(tap, &field, jtag_get_end_state());
        }
 
        return ERROR_OK;
        }
 
        return ERROR_OK;
index 497389818a803e5e452558a01e55b27423d411b7..602034eb323ee02da20921803d8290a1ada0abbe 100644 (file)
@@ -173,7 +173,7 @@ static int xscale_jtag_set_instr(struct jtag_tap *tap, uint32_t new_instr)
                field.out_value = scratch;
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
 
                field.out_value = scratch;
                buf_set_u32(field.out_value, 0, field.num_bits, new_instr);
 
-               jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state());
+               jtag_add_ir_scan(tap, &field, jtag_get_end_state());
        }
 
        return ERROR_OK;
        }
 
        return ERROR_OK;
index faa55421638e70e7c8f1d971287e0d8bc19e9232..14bed8efb44996f4aaa7fdd2921d08cfd7a6ed69 100644 (file)
@@ -704,7 +704,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        if (tap == NULL)
                                                jtag_add_plain_ir_scan(1, &field, my_end_state);
                                        else
                                        if (tap == NULL)
                                                jtag_add_plain_ir_scan(1, &field, my_end_state);
                                        else
-                                               jtag_add_ir_scan(tap, 1, &field, my_end_state);
+                                               jtag_add_ir_scan(tap, &field, my_end_state);
 
                                        if (xruntest)
                                        {
 
                                        if (xruntest)
                                        {

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)