From: Øyvind H. <go...@us...> - 2010-03-08 08:12:17
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Main OpenOCD repository". The branch, master has been updated via 50dc56a488c6e4d5acdfd73f12e3502e1586c51e (commit) via 57d7743639d5092770d79f7c4b12ae694c482750 (commit) via e018c7c1d29e8dabb9b4a90bb9eb3574eb1668bb (commit) from f7d1be714b91fcc12e56c8fa78c702e75a733019 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 50dc56a488c6e4d5acdfd73f12e3502e1586c51e Author: Ãyvind Harboe <oyv...@zy...> Date: Sat Mar 6 11:29:59 2010 +0100 jtag: simplify jtag_add_plain_ir/dr_scan These fn's now clearly just clock out/in bits. No mystical fields are involved. Signed-off-by: Ãyvind Harboe <oyv...@zy...> diff --git a/src/jtag/core.c b/src/jtag/core.c index bce332f..706f2f2 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -388,15 +388,16 @@ void jtag_add_ir_scan(struct jtag_tap *active, struct scan_field *in_fields, tap } } -void jtag_add_plain_ir_scan(int in_num_fields, const struct scan_field *in_fields, +void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { + assert(out_bits != NULL); assert(state != TAP_RESET); jtag_prelude(state); int retval = interface_jtag_add_plain_ir_scan( - in_num_fields, in_fields, state); + num_bits, out_bits, in_bits, state); jtag_set_error(retval); } @@ -469,15 +470,16 @@ void jtag_add_dr_scan(struct jtag_tap *active, int in_num_fields, const struct s jtag_set_error(retval); } -void jtag_add_plain_dr_scan(int in_num_fields, const struct scan_field *in_fields, +void jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { + assert(out_bits != NULL); assert(state != TAP_RESET); jtag_prelude(state); int retval; - retval = interface_jtag_add_plain_dr_scan(in_num_fields, in_fields, state); + retval = interface_jtag_add_plain_dr_scan(num_bits, out_bits, in_bits, state); jtag_set_error(retval); } @@ -906,7 +908,7 @@ static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned num_idcod for (unsigned i = 0; i < JTAG_MAX_CHAIN_SIZE; i++) buf_set_u32(idcode_buffer, i * 32, 32, END_OF_CHAIN_FLAG); - jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE); + jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, TAP_DRPAUSE); jtag_add_tlr(); return jtag_execute_queue(); } @@ -1207,7 +1209,7 @@ static int jtag_validate_ircapture(void) field.out_value = ir_test; field.in_value = ir_test; - jtag_add_plain_ir_scan(1, &field, TAP_IDLE); + jtag_add_plain_ir_scan(field.num_bits, field.out_value, field.in_value, TAP_IDLE); LOG_DEBUG("IR capture validation scan"); retval = jtag_execute_queue(); diff --git a/src/jtag/drivers/driver.c b/src/jtag/drivers/driver.c index 57bc28d..7f7f879 100644 --- a/src/jtag/drivers/driver.c +++ b/src/jtag/drivers/driver.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dom...@gm... * * * - * Copyright (C) 2007-2009 Ãyvind Harboe * + * Copyright (C) 2007-2010 Ãyvind Harboe * * oyv...@zy... * * * * Copyright (C) 2009 SoftPLC Corporation * @@ -130,35 +130,6 @@ int interface_jtag_add_ir_scan(struct jtag_tap* active, const struct scan_field } /** - * see jtag_add_plain_ir_scan() - * - */ -int interface_jtag_add_plain_ir_scan(int in_num_fields, const struct scan_field *in_fields, tap_state_t state) -{ - - struct jtag_command * cmd = cmd_queue_alloc(sizeof(struct jtag_command)); - struct scan_command * scan = cmd_queue_alloc(sizeof(struct scan_command)); - struct scan_field * out_fields = cmd_queue_alloc(in_num_fields * sizeof(struct scan_field)); - - jtag_queue_command(cmd); - - cmd->type = JTAG_SCAN; - cmd->cmd.scan = scan; - - scan->ir_scan = true; - scan->num_fields = in_num_fields; - scan->fields = out_fields; - scan->end_state = state; - - for (int i = 0; i < in_num_fields; i++) - cmd_queue_scan_field_clone(out_fields + i, in_fields + i); - - return ERROR_OK; -} - - - -/** * see jtag_add_dr_scan() * */ @@ -324,32 +295,40 @@ void interface_jtag_add_dr_out(struct jtag_tap *target_tap, assert(target_tap_match); /* target_tap should be enabled and not bypassed */ } -/** - * see jtag_add_plain_dr_scan() - * - */ -int interface_jtag_add_plain_dr_scan(int in_num_fields, const struct scan_field *in_fields, tap_state_t state) +static int jtag_add_plain_scan(int num_bits, const uint8_t *out_bits, + uint8_t *in_bits, tap_state_t state, bool ir_scan) { struct jtag_command * cmd = cmd_queue_alloc(sizeof(struct jtag_command)); struct scan_command * scan = cmd_queue_alloc(sizeof(struct scan_command)); - struct scan_field * out_fields = cmd_queue_alloc(in_num_fields * sizeof(struct scan_field)); + struct scan_field * out_fields = cmd_queue_alloc(sizeof(struct scan_field)); jtag_queue_command(cmd); cmd->type = JTAG_SCAN; cmd->cmd.scan = scan; - scan->ir_scan = false; - scan->num_fields = in_num_fields; + scan->ir_scan = ir_scan; + scan->num_fields = 1; scan->fields = out_fields; scan->end_state = state; - for (int i = 0; i < in_num_fields; i++) - cmd_queue_scan_field_clone(out_fields + i, in_fields + i); + out_fields->num_bits = num_bits; + out_fields->out_value = buf_cpy(out_bits, cmd_queue_alloc(DIV_ROUND_UP(num_bits, 8)), num_bits); + out_fields->in_value = in_bits; return ERROR_OK; } +int interface_jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) +{ + return jtag_add_plain_scan(num_bits, out_bits, in_bits, state, false); +} + +int interface_jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) +{ + return jtag_add_plain_scan(num_bits, out_bits, in_bits, state, true); +} + int interface_jtag_add_tlr(void) { tap_state_t state = TAP_RESET; diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index fe57db1..ae85961 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -359,12 +359,12 @@ void jtag_add_ir_scan(struct jtag_tap* tap, 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 - * command. This function assumes that the caller handles extra fields - * for bypassed TAPs. + * Scan out the bits in ir scan mode. + * + * If in_bits == NULL, discard incoming bits. */ -void jtag_add_plain_ir_scan(int num_fields, - const struct scan_field* fields, tap_state_t endstate); +void jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, + tap_state_t endstate); /** @@ -390,12 +390,12 @@ void jtag_add_dr_scan(struct jtag_tap* tap, int num_fields, void jtag_add_dr_scan_check(struct jtag_tap* tap, int num_fields, struct scan_field* fields, tap_state_t endstate); /** - * Duplicate the scan fields passed into the function into a DR SCAN - * command. Unlike jtag_add_dr_scan(), this function assumes that the - * caller handles extra fields for bypassed TAPs. + * Scan out the bits in ir scan mode. + * + * If in_bits == NULL, discard incoming bits. */ -void jtag_add_plain_dr_scan(int num_fields, - const struct scan_field* fields, tap_state_t endstate); +void jtag_add_plain_dr_scan(int num_bits, + const uint8_t *out_bits, uint8_t *in_bits, tap_state_t endstate); /** * Defines the type of data passed to the jtag_callback_t interface. diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h index 4631593..59b2a32 100644 --- a/src/jtag/minidriver.h +++ b/src/jtag/minidriver.h @@ -53,14 +53,14 @@ int interface_jtag_add_ir_scan(struct jtag_tap* active, const struct scan_field* fields, tap_state_t endstate); int interface_jtag_add_plain_ir_scan( - int num_fields, const struct scan_field* fields, + int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t endstate); int interface_jtag_add_dr_scan(struct jtag_tap* active, int num_fields, const struct scan_field* fields, tap_state_t endstate); int interface_jtag_add_plain_dr_scan( - int num_fields, const struct scan_field* fields, + int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t endstate); int interface_jtag_add_tlr(void); diff --git a/src/jtag/minidummy/minidummy.c b/src/jtag/minidummy/minidummy.c index 1eef087..46ec9c3 100644 --- a/src/jtag/minidummy/minidummy.c +++ b/src/jtag/minidummy/minidummy.c @@ -54,7 +54,7 @@ int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field } -int interface_jtag_add_plain_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { /* synchronously do the operation here */ @@ -68,7 +68,7 @@ int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const st return ERROR_OK; } -int interface_jtag_add_plain_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { /* synchronously do the operation here */ diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 391d8f2..65d8402 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -611,9 +611,14 @@ int interface_jtag_add_ir_scan(struct jtag_tap *active, const struct scan_field -int interface_jtag_add_plain_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_plain_ir_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { - scanFields(num_fields, fields, TAP_IRSHIFT, 1); + struct scan_field field; + field.num_bits = num_bits; + field.out_value = out_bits; + field.in_value = in_bits; + + scanFields(1, &field, TAP_IRSHIFT, 1); gotoEndState(state); return ERROR_OK; @@ -644,9 +649,14 @@ int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const st return ERROR_OK; } -int interface_jtag_add_plain_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_plain_dr_scan(int num_bits, const uint8_t *out_bits, uint8_t *in_bits, tap_state_t state) { - scanFields(num_fields, fields, TAP_DRSHIFT, 1); + struct scan_field field; + field.num_bits = num_bits; + field.out_value = out_bits; + field.in_value = in_bits; + + scanFields(1, &field, TAP_DRSHIFT, 1); gotoEndState(state); return ERROR_OK; } diff --git a/src/svf/svf.c b/src/svf/svf.c index 28595d5..fba499c 100644 --- a/src/svf/svf.c +++ b/src/svf/svf.c @@ -1084,7 +1084,7 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str) field.out_value = &svf_tdi_buffer[svf_buffer_index]; field.in_value = &svf_tdi_buffer[svf_buffer_index]; /* NOTE: doesn't use SVF-specified state paths */ - jtag_add_plain_dr_scan(1, &field, svf_para.dr_end_state); + jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, svf_para.dr_end_state); svf_buffer_index += (i + 7) >> 3; } @@ -1179,7 +1179,8 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str) field.out_value = &svf_tdi_buffer[svf_buffer_index]; field.in_value = &svf_tdi_buffer[svf_buffer_index]; /* NOTE: doesn't use SVF-specified state paths */ - jtag_add_plain_ir_scan(1, &field, svf_para.ir_end_state); + jtag_add_plain_ir_scan(field.num_bits, field.out_value, field.in_value, + svf_para.ir_end_state); svf_buffer_index += (i + 7) >> 3; } diff --git a/src/target/avrt.c b/src/target/avrt.c index 5d912da..720261e 100644 --- a/src/target/avrt.c +++ b/src/target/avrt.c @@ -190,12 +190,8 @@ int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, int ir_l } { - struct scan_field field[1]; - - field[0].num_bits = tap->ir_length; - field[0].out_value = ir_out; - field[0].in_value = ir_in; - jtag_add_plain_ir_scan(ARRAY_SIZE(field), field, jtag_set_end_state(TAP_IDLE)); + jtag_add_plain_ir_scan(tap->ir_length, ir_out, ir_in, + jtag_set_end_state(TAP_IDLE)); } return ERROR_OK; @@ -210,12 +206,7 @@ int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out, int dr_l } { - struct scan_field field[1]; - - field[0].num_bits = dr_len; - field[0].out_value = dr_out; - field[0].in_value = dr_in; - jtag_add_plain_dr_scan(ARRAY_SIZE(field), field, jtag_set_end_state(TAP_IDLE)); + jtag_add_plain_dr_scan(dr_len, dr_out, dr_in, jtag_set_end_state(TAP_IDLE)); } return ERROR_OK; diff --git a/src/target/dsp563xx.c b/src/target/dsp563xx.c index a379121..4be7f3b 100644 --- a/src/target/dsp563xx.c +++ b/src/target/dsp563xx.c @@ -863,12 +863,7 @@ int dsp563xx_write_ir(struct jtag_tap *tap, uint8_t * ir_in, uint8_t * ir_out, } { - struct scan_field field[1]; - - field[0].num_bits = tap->ir_length; - field[0].out_value = ir_out; - field[0].in_value = ir_in; - jtag_add_plain_ir_scan(ARRAY_SIZE(field), field, + jtag_add_plain_ir_scan(tap->ir_length, ir_out, ir_in, jtag_set_end_state(TAP_IDLE)); } @@ -885,12 +880,7 @@ int dsp563xx_write_dr(struct jtag_tap *tap, uint8_t * dr_in, uint8_t * dr_out, } { - struct scan_field field[1]; - - field[0].num_bits = dr_len; - field[0].out_value = dr_out; - field[0].in_value = dr_in; - jtag_add_plain_dr_scan(ARRAY_SIZE(field), field, + jtag_add_plain_dr_scan(dr_len, dr_out, dr_in, jtag_set_end_state(TAP_IDLE)); } diff --git a/src/xsvf/xsvf.c b/src/xsvf/xsvf.c index 14bed8e..f2c1a42 100644 --- a/src/xsvf/xsvf.c +++ b/src/xsvf/xsvf.c @@ -481,7 +481,8 @@ COMMAND_HANDLER(handle_xsvf_command) field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); if (tap == NULL) - jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE)); + jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, + jtag_set_end_state(TAP_DRPAUSE)); else jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_DRPAUSE)); @@ -702,7 +703,8 @@ COMMAND_HANDLER(handle_xsvf_command) if (tap == NULL) - jtag_add_plain_ir_scan(1, &field, my_end_state); + jtag_add_plain_ir_scan(field.num_bits, + field.out_value, field.in_value, my_end_state); else jtag_add_ir_scan(tap, &field, my_end_state); @@ -936,7 +938,8 @@ COMMAND_HANDLER(handle_xsvf_command) LOG_USER("LSDR retry %d", attempt); if (tap == NULL) - jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE)); + jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, + jtag_set_end_state(TAP_DRPAUSE)); else jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_DRPAUSE)); commit 57d7743639d5092770d79f7c4b12ae694c482750 Author: Ãyvind Harboe <oyv...@zy...> Date: Thu Mar 4 14:38:19 2010 +0100 jtag: jtag_add_ir_scan() now takes a single field 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 <oyv...@zy...> diff --git a/src/flash/nor/str9xpec.c b/src/flash/nor/str9xpec.c index 3796a4b..b6d24f5 100644 --- a/src/flash/nor/str9xpec.c +++ b/src/flash/nor/str9xpec.c @@ -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; - jtag_add_ir_scan(tap, 1, &field, end_state); + jtag_add_ir_scan(tap, &field, end_state); free(field.out_value); } diff --git a/src/jtag/core.c b/src/jtag/core.c index 2e09cb6..bce332f 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -42,7 +42,8 @@ /// 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); /** @@ -352,17 +353,22 @@ void jtag_alloc_in_value32(struct scan_field *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); - 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); } +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); @@ -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 */ - 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 { - jtag_add_ir_scan_noverify(active, in_num_fields, in_fields, state); + jtag_add_ir_scan_noverify(active, in_fields, state); } } diff --git a/src/jtag/drivers/driver.c b/src/jtag/drivers/driver.c index 673d191..57bc28d 100644 --- a/src/jtag/drivers/driver.c +++ b/src/jtag/drivers/driver.c @@ -74,7 +74,7 @@ static void cmd_queue_scan_field_clone(struct scan_field * dst, const struct sca * 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(); @@ -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; - 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 */ diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 6e21024..fe57db1 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -350,13 +350,13 @@ int jtag_init_inner(struct command_context *cmd_ctx); * 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. */ -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 diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h index a417216..4631593 100644 --- a/src/jtag/minidriver.h +++ b/src/jtag/minidriver.h @@ -50,7 +50,7 @@ #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, diff --git a/src/jtag/minidummy/minidummy.c b/src/jtag/minidummy/minidummy.c index 98b449f..1eef087 100644 --- a/src/jtag/minidummy/minidummy.c +++ b/src/jtag/minidummy/minidummy.c @@ -46,7 +46,7 @@ int interface_jtag_execute_queue(void) 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 */ diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index da01f81..1073abc 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -1490,6 +1490,15 @@ COMMAND_HANDLER(handle_irscan_command) } 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); @@ -1521,7 +1530,7 @@ COMMAND_HANDLER(handle_irscan_command) } /* 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(); diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 0b11258..391d8f2 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -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; - assert(num_fields == 1); - 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) { - 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); diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c index 15685e6..976535b 100644 --- a/src/pld/virtex2.c +++ b/src/pld/virtex2.c @@ -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; - 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); } diff --git a/src/target/arm11_dbgtap.c b/src/target/arm11_dbgtap.c index f049059..2b7b4e4 100644 --- a/src/target/arm11_dbgtap.c +++ b/src/target/arm11_dbgtap.c @@ -49,13 +49,13 @@ static const tap_state_t arm11_move_pi_to_si_via_ci[] = /* 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); - 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[] = @@ -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_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). */ diff --git a/src/target/arm_jtag.c b/src/target/arm_jtag.c index 3e27b76..5ed104c 100644 --- a/src/target/arm_jtag.c +++ b/src/target/arm_jtag.c @@ -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) { - 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. */ - 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; diff --git a/src/target/etb.c b/src/target/etb.c index 1f73ff5..2c4e3eb 100644 --- a/src/target/etb.c +++ b/src/target/etb.c @@ -60,7 +60,7 @@ static int etb_set_instr(struct etb *etb, uint32_t 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()); free(field.out_value); } diff --git a/src/target/mips_ejtag.c b/src/target/mips_ejtag.c index 79160fc..e0550a8 100644 --- a/src/target/mips_ejtag.c +++ b/src/target/mips_ejtag.c @@ -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; - jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state()); + jtag_add_ir_scan(tap, &field, jtag_get_end_state()); } return ERROR_OK; diff --git a/src/target/xscale.c b/src/target/xscale.c index 4973898..602034e 100644 --- a/src/target/xscale.c +++ b/src/target/xscale.c @@ -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); - jtag_add_ir_scan(tap, 1, &field, jtag_get_end_state()); + jtag_add_ir_scan(tap, &field, jtag_get_end_state()); } return ERROR_OK; diff --git a/src/xsvf/xsvf.c b/src/xsvf/xsvf.c index faa5542..14bed8e 100644 --- a/src/xsvf/xsvf.c +++ b/src/xsvf/xsvf.c @@ -704,7 +704,7 @@ COMMAND_HANDLER(handle_xsvf_command) 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) { commit e018c7c1d29e8dabb9b4a90bb9eb3574eb1668bb Author: Ãyvind Harboe <oyv...@zy...> Date: Mon Mar 1 20:00:59 2010 +0100 jtag: retire tap field jtag_add_dr/ir_scan() now takes the tap as the first argument, rather than for each of the fields passed in. The code never exercised the path where there was more than one tap being scanned, who knows if it even worked. This simplifies the implementation and reduces clutter in the calling code. use jtag_add_ir/dr_plain_scan() for more fancy situations. Signed-off-by: Ãyvind Harboe <oyv...@zy...> diff --git a/src/flash/nor/str9xpec.c b/src/flash/nor/str9xpec.c index 243336a..3796a4b 100644 --- a/src/flash/nor/str9xpec.c +++ b/src/flash/nor/str9xpec.c @@ -43,13 +43,12 @@ int str9xpec_set_instr(struct jtag_tap *tap, uint32_t new_instr, tap_state_t end { struct scan_field field; - field.tap = tap; field.num_bits = tap->ir_length; field.out_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); buf_set_u32(field.out_value, 0, field.num_bits, new_instr); field.in_value = NULL; - jtag_add_ir_scan(1, &field, end_state); + jtag_add_ir_scan(tap, 1, &field, end_state); free(field.out_value); } @@ -65,13 +64,12 @@ static uint8_t str9xpec_isc_status(struct jtag_tap *tap) if (str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE) != ERROR_OK) return ISC_STATUS_ERROR; - field.tap = tap; field.num_bits = 8; field.out_value = NULL; field.in_value = &status; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); jtag_execute_queue(); LOG_DEBUG("status: 0x%2.2x", status); @@ -153,13 +151,12 @@ static int str9xpec_read_config(struct flash_bank *bank) /* execute ISC_CONFIGURATION command */ str9xpec_set_instr(tap, ISC_CONFIGURATION, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = NULL; field.in_value = str9xpec_info->options; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); jtag_execute_queue(); status = str9xpec_isc_status(tap); @@ -301,21 +298,19 @@ static int str9xpec_blank_check(struct flash_bank *bank, int first, int last) /* execute ISC_BLANK_CHECK command */ str9xpec_set_instr(tap, ISC_BLANK_CHECK, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = buffer; field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); jtag_add_sleep(40000); /* read blank check result */ - field.tap = tap; field.num_bits = 64; field.out_value = NULL; field.in_value = buffer; - jtag_add_dr_scan(1, &field, TAP_IRPAUSE); + jtag_add_dr_scan(tap, 1, &field, TAP_IRPAUSE); jtag_execute_queue(); status = str9xpec_isc_status(tap); @@ -407,12 +402,11 @@ static int str9xpec_erase_area(struct flash_bank *bank, int first, int last) /* execute ISC_ERASE command */ str9xpec_set_instr(tap, ISC_ERASE, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = buffer; field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); jtag_execute_queue(); jtag_add_sleep(10); @@ -468,12 +462,11 @@ static int str9xpec_lock_device(struct flash_bank *bank) str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE); do { - field.tap = tap; field.num_bits = 8; field.out_value = NULL; field.in_value = &status; - jtag_add_dr_scan(1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); jtag_execute_queue(); } while (!(status & ISC_STATUS_BUSY)); @@ -549,12 +542,11 @@ static int str9xpec_set_address(struct flash_bank *bank, uint8_t sector) /* set flash controller address */ str9xpec_set_instr(tap, ISC_ADDRESS_SHIFT, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 8; field.out_value = §or; field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); return ERROR_OK; } @@ -633,12 +625,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, uint32_t off { str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = (buffer + bytes_written); field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); /* small delay before polling */ jtag_add_sleep(50); @@ -646,12 +637,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, uint32_t off str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE); do { - field.tap = tap; field.num_bits = 8; field.out_value = NULL; field.in_value = scanbuf; - jtag_add_dr_scan(1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); jtag_execute_queue(); status = buf_get_u32(scanbuf, 0, 8); @@ -683,12 +673,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, uint32_t off str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = last_dword; field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); /* small delay before polling */ jtag_add_sleep(50); @@ -696,12 +685,11 @@ static int str9xpec_write(struct flash_bank *bank, uint8_t *buffer, uint32_t off str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE); do { - field.tap = tap; field.num_bits = 8; field.out_value = NULL; field.in_value = scanbuf; - jtag_add_dr_scan(1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); jtag_execute_queue(); status = buf_get_u32(scanbuf, 0, 8); @@ -750,12 +738,11 @@ COMMAND_HANDLER(str9xpec_handle_part_id_command) str9xpec_set_instr(tap, ISC_IDCODE, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 32; field.out_value = NULL; field.in_value = buffer; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); jtag_execute_queue(); idcode = buf_get_u32(buffer, 0, 32); @@ -867,12 +854,11 @@ static int str9xpec_write_options(struct flash_bank *bank) /* execute ISC_PROGRAM command */ str9xpec_set_instr(tap, ISC_PROGRAM, TAP_IRPAUSE); - field.tap = tap; field.num_bits = 64; field.out_value = str9xpec_info->options; field.in_value = NULL; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_dr_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); /* small delay before polling */ jtag_add_sleep(50); @@ -880,12 +866,11 @@ static int str9xpec_write_options(struct flash_bank *bank) str9xpec_set_instr(tap, ISC_NOOP, TAP_IRPAUSE); do { - field.tap = tap; field.num_bits = 8; field.out_value = NULL; field.in_value = &status; - jtag_add_dr_scan(1, &field, jtag_get_end_state()); + jtag_add_dr_scan(tap, 1, &field, jtag_get_end_state()); jtag_execute_queue(); } while (!(status & ISC_STATUS_BUSY)); diff --git a/src/jtag/core.c b/src/jtag/core.c index d43bd1c..2e09cb6 100644 --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -42,7 +42,7 @@ /// The number of JTAG queue flushes (for profiling and debugging purposes). static int jtag_flush_queue_count; -static void jtag_add_scan_check(void (*jtag_add_scan)(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); /** @@ -352,17 +352,17 @@ void jtag_alloc_in_value32(struct scan_field *field) interface_jtag_alloc_in_value32(field); } -void jtag_add_ir_scan_noverify(int in_count, const struct scan_field *in_fields, +void jtag_add_ir_scan_noverify(struct jtag_tap *active, int in_count, const struct scan_field *in_fields, tap_state_t state) { jtag_prelude(state); - int retval = interface_jtag_add_ir_scan(in_count, in_fields, state); + int retval = interface_jtag_add_ir_scan(active, in_count, in_fields, state); jtag_set_error(retval); } -void jtag_add_ir_scan(int in_num_fields, struct scan_field *in_fields, tap_state_t state) +void jtag_add_ir_scan(struct jtag_tap *active, int in_num_fields, struct scan_field *in_fields, tap_state_t state) { assert(state != TAP_RESET); @@ -375,13 +375,13 @@ void jtag_add_ir_scan(int in_num_fields, struct scan_field *in_fields, tap_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[j].check_value = in_fields[j].tap->expected; - in_fields[j].check_mask = in_fields[j].tap->expected_mask; + in_fields[j].check_value = active->expected; + in_fields[j].check_mask = active->expected_mask; } - jtag_add_scan_check(jtag_add_ir_scan_noverify, in_num_fields, in_fields, state); + jtag_add_scan_check(active, jtag_add_ir_scan_noverify, in_num_fields, in_fields, state); } else { - jtag_add_ir_scan_noverify(in_num_fields, in_fields, state); + jtag_add_ir_scan_noverify(active, in_num_fields, in_fields, state); } } @@ -405,7 +405,7 @@ static int jtag_check_value_mask_callback(jtag_callback_data_t data0, jtag_callb return jtag_check_value_inner((uint8_t *)data0, (uint8_t *)data1, (uint8_t *)data2, (int)data3); } -static void jtag_add_scan_check(void (*jtag_add_scan)(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) { for (int i = 0; i < in_num_fields; i++) @@ -419,7 +419,7 @@ static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const s field->modified = 1; } - jtag_add_scan(in_num_fields, in_fields, state); + jtag_add_scan(active, in_num_fields, in_fields, state); for (int i = 0; i < in_num_fields; i++) { @@ -442,19 +442,19 @@ static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const s } } -void jtag_add_dr_scan_check(int in_num_fields, struct scan_field *in_fields, tap_state_t state) +void jtag_add_dr_scan_check(struct jtag_tap *active, int in_num_fields, struct scan_field *in_fields, tap_state_t state) { if (jtag_verify) { - jtag_add_scan_check(jtag_add_dr_scan, in_num_fields, in_fields, state); + jtag_add_scan_check(active, jtag_add_dr_scan, in_num_fields, in_fields, state); } else { - jtag_add_dr_scan(in_num_fields, in_fields, state); + jtag_add_dr_scan(active, in_num_fields, in_fields, state); } } -void jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fields, +void jtag_add_dr_scan(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state) { assert(state != TAP_RESET); @@ -462,7 +462,7 @@ void jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fields, jtag_prelude(state); int retval; - retval = interface_jtag_add_dr_scan(in_num_fields, in_fields, state); + retval = interface_jtag_add_dr_scan(active, in_num_fields, in_fields, state); jtag_set_error(retval); } @@ -894,7 +894,6 @@ void jtag_sleep(uint32_t us) static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned num_idcode) { struct scan_field field = { - .tap = NULL, .num_bits = num_idcode * 32, .out_value = idcode_buffer, .in_value = idcode_buffer, @@ -1201,7 +1200,6 @@ static int jtag_validate_ircapture(void) /* after this scan, all TAPs will capture BYPASS instructions */ buf_set_ones(ir_test, total_ir_length); - field.tap = NULL; field.num_bits = total_ir_length; field.out_value = ir_test; field.in_value = ir_test; diff --git a/src/jtag/drivers/driver.c b/src/jtag/drivers/driver.c index ca59239..673d191 100644 --- a/src/jtag/drivers/driver.c +++ b/src/jtag/drivers/driver.c @@ -64,7 +64,6 @@ static void jtag_callback_queue_reset(void) */ static void cmd_queue_scan_field_clone(struct scan_field * dst, const struct scan_field * src) { - dst->tap = src->tap; dst->num_bits = src->num_bits; dst->out_value = buf_cpy(src->out_value, cmd_queue_alloc(DIV_ROUND_UP(src->num_bits, 8)), src->num_bits); dst->in_value = src->in_value; @@ -75,7 +74,7 @@ static void cmd_queue_scan_field_clone(struct scan_field * dst, const struct sca * see jtag_add_ir_scan() * */ -int interface_jtag_add_ir_scan(int in_num_fields, const struct scan_field *in_fields, tap_state_t state) +int interface_jtag_add_ir_scan(struct jtag_tap* active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state) { size_t num_taps = jtag_tap_count_enabled(); @@ -102,33 +101,19 @@ int interface_jtag_add_ir_scan(int in_num_fields, const struct scan_field *in_fi { /* search the input field list for fields for the current TAP */ - bool found = false; - - for (int j = 0; j < in_num_fields; j++) + if (tap == active) { - if (tap != in_fields[j].tap) - continue; - /* if TAP is listed in input fields, copy the value */ - - found = true; - tap->bypass = 0; - assert(in_fields[j].num_bits == tap->ir_length); /* input fields must have the same length as the TAP's IR */ - - cmd_queue_scan_field_clone(field, in_fields + j); - - break; - } - - if (!found) + for (int j = 0; j < in_num_fields; j++) + cmd_queue_scan_field_clone(field, in_fields + j); + } else { /* if a TAP isn't listed in input fields, set it to BYPASS */ tap->bypass = 1; - field->tap = tap; field->num_bits = tap->ir_length; field->out_value = buf_set_ones(cmd_queue_alloc(DIV_ROUND_UP(tap->ir_length, 8)), tap->ir_length); field->in_value = NULL; /* do not collect input for tap's in bypass */ @@ -178,7 +163,7 @@ int interface_jtag_add_plain_ir_scan(int in_num_fields, const struct scan_field * see jtag_add_dr_scan() * */ -int interface_jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fields, tap_state_t state) +int interface_jtag_add_dr_scan(struct jtag_tap* active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state) { /* count devices in bypass */ @@ -215,6 +200,7 @@ int interface_jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fi if (!tap->bypass) { + assert(active == tap); #ifndef NDEBUG /* remember initial position for assert() */ struct scan_field *start_field = field; @@ -222,9 +208,6 @@ int interface_jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fi for (int j = 0; j < in_num_fields; j++) { - if (tap != in_fields[j].tap) - continue; - cmd_queue_scan_field_clone(field, in_fields + j); field++; @@ -236,7 +219,6 @@ int interface_jtag_add_dr_scan(int in_num_fields, const struct scan_field *in_fi /* if a TAP is bypassed, generated a dummy bit*/ else { - field->tap = tap; field->num_bits = 1; field->out_value = NULL; field->in_value = NULL; @@ -320,7 +302,6 @@ void interface_jtag_add_dr_out(struct jtag_tap *target_tap, size_t scan_size = num_bits[j]; buf_set_u32(out_value, 0, scan_size, value[j]); - field->tap = tap; field->num_bits = scan_size; field->out_value = buf_cpy(out_value, cmd_queue_alloc(DIV_ROUND_UP(scan_size, 8)), scan_size); field->in_value = NULL; @@ -333,7 +314,6 @@ void interface_jtag_add_dr_out(struct jtag_tap *target_tap, else { - field->tap = tap; field->num_bits = 1; field->out_value = NULL; field->in_value = NULL; diff --git a/src/jtag/jtag.h b/src/jtag/jtag.h index 7e5dc10..6e21024 100644 --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -109,9 +109,6 @@ extern tap_state_t cmd_queue_cur_state; * The allocated, modified, and intmp fields are internal work space. */ struct scan_field { - /// A pointer to the tap structure to which this field refers. - struct jtag_tap* tap; - /// The number of bits this field specifies (up to 32) int num_bits; /// A pointer to value to be scanned into the device @@ -353,13 +350,13 @@ int jtag_init_inner(struct command_context *cmd_ctx); * subsequent DR SCANs. * */ -void jtag_add_ir_scan(int num_fields, +void jtag_add_ir_scan(struct jtag_tap* tap, int num_fields, 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(int num_fields, +void jtag_add_ir_scan_noverify(struct jtag_tap* tap, int num_fields, const struct scan_field *fields, tap_state_t state); /** * Duplicate the scan fields passed into the function into an IR SCAN @@ -387,10 +384,10 @@ void jtag_alloc_in_value32(struct scan_field *field); * specified there. For bypassed TAPs, the function generates a dummy * 1-bit field. The bypass status of TAPs is set by jtag_add_ir_scan(). */ -void jtag_add_dr_scan(int num_fields, +void jtag_add_dr_scan(struct jtag_tap* tap, int num_fields, const struct scan_field* fields, tap_state_t endstate); /// A version of jtag_add_dr_scan() that uses the check_value/mask fields -void jtag_add_dr_scan_check(int num_fields, +void jtag_add_dr_scan_check(struct jtag_tap* tap, int num_fields, struct scan_field* fields, tap_state_t endstate); /** * Duplicate the scan fields passed into the function into a DR SCAN diff --git a/src/jtag/minidriver.h b/src/jtag/minidriver.h index 810bb0e..a417216 100644 --- a/src/jtag/minidriver.h +++ b/src/jtag/minidriver.h @@ -49,14 +49,14 @@ // and it may provide additional declarations that must be defined. #include <jtag/minidriver_imp.h> -int interface_jtag_add_ir_scan( +int interface_jtag_add_ir_scan(struct jtag_tap* active, 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, tap_state_t endstate); -int interface_jtag_add_dr_scan( +int interface_jtag_add_dr_scan(struct jtag_tap* active, int num_fields, const struct scan_field* fields, tap_state_t endstate); int interface_jtag_add_plain_dr_scan( diff --git a/src/jtag/minidummy/minidummy.c b/src/jtag/minidummy/minidummy.c index 01cdd2e..98b449f 100644 --- a/src/jtag/minidummy/minidummy.c +++ b/src/jtag/minidummy/minidummy.c @@ -46,7 +46,7 @@ int interface_jtag_execute_queue(void) return ERROR_OK; } -int interface_jtag_add_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_ir_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state) { /* synchronously do the operation here */ @@ -61,7 +61,7 @@ int interface_jtag_add_plain_ir_scan(int num_fields, const struct scan_field *fi return ERROR_OK; } -int interface_jtag_add_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state) { /* synchronously do the operation here */ diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c index ffb5d27..da01f81 100644 --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -175,7 +175,6 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args Jim_GetLong(interp, args[i], &bits); str = Jim_GetString(args[i + 1], &len); - fields[field_count].tap = tap; fields[field_count].num_bits = bits; fields[field_count].out_value = malloc(DIV_ROUND_UP(bits, 8)); str_to_buf(str, len, fields[field_count].out_value, bits, 0); @@ -183,7 +182,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args field_count++; } - jtag_add_dr_scan(num_fields, fields, endstate); + jtag_add_dr_scan(tap, num_fields, fields, endstate); retval = jtag_execute_queue(); if (retval != ERROR_OK) @@ -1462,7 +1461,7 @@ COMMAND_HANDLER(handle_irscan_command) { int i; struct scan_field *fields; - struct jtag_tap *tap; + struct jtag_tap *tap = NULL; tap_state_t endstate; if ((CMD_ARGC < 2) || (CMD_ARGC % 2)) @@ -1510,7 +1509,6 @@ COMMAND_HANDLER(handle_irscan_command) return ERROR_FAIL; } int field_size = tap->ir_length; - fields[i].tap = tap; fields[i].num_bits = field_size; fields[i].out_value = malloc(DIV_ROUND_UP(field_size, 8)); @@ -1523,7 +1521,7 @@ COMMAND_HANDLER(handle_irscan_command) } /* did we have an endstate? */ - jtag_add_ir_scan(num_fields, fields, endstate); + jtag_add_ir_scan(tap, num_fields, fields, endstate); retval = jtag_execute_queue(); diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index c5bc0ff..0b11258 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -574,38 +574,28 @@ static __inline void scanFields(int num_fields, const struct scan_field *fields, } } -int interface_jtag_add_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_ir_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state) { - - int j; 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); - int pause = (nextTap==NULL); - - int found = 0; - + bool pause = (nextTap==NULL); scan_size = tap->ir_length; /* search the list */ - for (j = 0; j < num_fields; j++) + if (tap == active) { - if (tap == fields[j].tap) - { - found = 1; - - scanFields(1, fields + j, TAP_IRSHIFT, pause); - /* update device information */ - buf_cpy(fields[j].out_value, tap->cur_instr, scan_size); + scanFields(num_fields, fields, TAP_IRSHIFT, pause); + /* update device information */ + buf_cpy(fields[0].out_value, tap->cur_instr, scan_size); - tap->bypass = 0; - break; - } - } - - if (!found) + tap->bypass = 0; + } else { /* if a device isn't listed, set it to BYPASS */ assert(scan_size <= 32); @@ -631,46 +621,26 @@ int interface_jtag_add_plain_ir_scan(int num_fields, const struct scan_field *fi return ERROR_OK; } -int interface_jtag_add_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state) +int interface_jtag_add_dr_scan(struct jtag_tap *active, int num_fields, const struct scan_field *fields, tap_state_t state) { - - int j; struct jtag_tap *tap, *nextTap; for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap) { nextTap = jtag_tap_next_enabled(tap); - int found = 0; - int pause = (nextTap==NULL); + bool pause = (nextTap==NULL); - for (j = 0; j < num_fields; j++) + /* Find a range of fields to write to this tap */ + if (tap == active) { - /* Find a range of fields to write to this tap */ - if (tap == fields[j].tap) - { - found = 1; - int i; - for (i = j + 1; i < num_fields; i++) - { - if (tap != fields[j].tap) - { - break; - } - } - - scanFields(i - j, fields + j, TAP_DRSHIFT, pause); + assert(!tap->bypass); - j = i; - } - } - - if (!found) + scanFields(num_fields, fields, TAP_DRSHIFT, pause); + } else { /* Shift out a 0 for disabled tap's */ + assert(tap->bypass); shiftValueInner(TAP_DRSHIFT, pause?TAP_DRPAUSE:TAP_DRSHIFT, 1, 0); } - else - { - } } gotoEndState(state); return ERROR_OK; @@ -683,7 +653,6 @@ int interface_jtag_add_plain_dr_scan(int num_fields, const struct scan_field *fi return ERROR_OK; } - int interface_jtag_add_tlr() { setCurrentState(TAP_RESET); @@ -691,8 +660,6 @@ int interface_jtag_add_tlr() } - - int interface_jtag_add_reset(int req_trst, int req_srst) { zy1000_reset(req_trst, req_srst); @@ -737,7 +704,6 @@ static int zy1000_jtag_add_clocks(int num_cycles, tap_state_t state, tap_state_t ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, state); #endif - return ERROR_OK; } diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c index bbf6b66..15685e6 100644 --- a/src/pld/virtex2.c +++ b/src/pld/virtex2.c @@ -35,13 +35,12 @@ static int virtex2_set_instr(struct jtag_tap *tap, uint32_t new_instr) { struct scan_field field; - field.tap = tap; field.num_bits = tap->ir_length; field.out_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1); buf_set_u32(field.out_value, 0, field.num_bits, new_instr); field.in_value = NULL; - jtag_add_ir_scan(1, &field, jtag_set_end_state(TAP_IDLE)); + jtag_add_ir_scan(tap, 1, &field, jtag_set_end_state(TAP_IDLE)); free(field.out_value); } @@ -59,7 +58,6 @@ static int virtex2_send_32(struct pld_device *pld_device, values = malloc(num_words * 4); - scan_field.tap = virtex2_info->tap; scan_field.num_bits = num_words * 32; scan_field.out_value = values; scan_field.in_value = NULL; @@ -69,7 +67,7 @@ static int virtex2_send_32(struct pld_device *pld_device, virtex2_set_instr(virtex2_info->tap, 0x5); /* CFG_IN */ - jtag_add_dr_scan(1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); + jtag_add_dr_scan(virtex2_info->tap, 1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); free(values); @@ -88,7 +86,6 @@ static int virtex2_receive_32(struct pld_device *pld_device, struct virtex2_pld_device *virtex2_info = pld_device->driver_priv; struct scan_field scan_field; - scan_field.tap = virtex2_info->tap; scan_field.num_bits = 32; scan_field.out_value = NULL; scan_field.in_value = NULL; @@ -99,7 +96,7 @@ static int virtex2_receive_32(struct pld_device *pld_device, { scan_field.in_value = (uint8_t *)words; - jtag_add_dr_scan(1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); + jtag_add_dr_scan(virtex2_info->tap, 1, &scan_field, jtag_set_end_state(TAP_DRPAUSE)); jtag_add_callback(virtexflip32, (jtag_callback_data_t)words); @@ -139,7 +136,6 @@ static int virtex2_load(struct pld_device *pld_device, const char *filename) unsigned int i; struct scan_field field; - field.tap = virtex2_info->tap; field.in_value = NULL; if ((retval = xilinx_read_bit_file(&bit_file, filename)) != ERROR_OK) @@ -159,7 +155,7 @@ static int virtex2_load(struct pld_device *pld_device, const char *filename) field.num_bits = bit_file.length * 8; field.out_value = bit_file.data; - jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE)); + jtag_add_dr_scan(virtex2_info->tap, 1, &field, jtag_set_end_state(TAP_DRPAUSE)); jtag_execute_queue(); jtag_add_tlr(); diff --git a/src/svf/svf.c b/src/svf/svf.c index f46d698..28595d5 100644 --- a/src/svf/svf.c +++ b/src/svf/svf.c @@ -216,8 +216,6 @@ static char *svf_command_buffer = NULL; static int svf_command_buffer_size = 0; static int svf_line_number = 1; -static struct jtag_tap *tap = NULL; - #define SVF_MAX_BUFFER_SIZE_TO_COMMIT (4 * 1024) static uint8_t *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL; static int svf_buffer_index = 0, svf_buffer_size = 0; @@ -1082,7 +1080,6 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str) { svf_add_check_para(0, svf_buffer_index, i); } - field.tap = tap; field.num_bits = i; field.out_value = &svf_tdi_buffer[svf_buffer_index]; field.in_value = &svf_tdi_buffer[svf_buffer_index]; @@ -1178,7 +1175,6 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str) { svf_add_check_para(0, svf_buffer_index, i); } - field.tap = tap; field.num_bits = i; field.out_value = &svf_tdi_buffer[svf_buffer_index]; field.in_value = &svf_tdi_buffer[svf_buffer_index]; diff --git a/src/target/arm11.c b/src/target/arm11.c index 51be701..36bbaba 100644 --- a/src/target/arm11.c +++ b/src/target/arm11.c @@ -123,7 +123,7 @@ static int arm11_debug_entry(struct arm11_common *arm11) arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 1); arm11_setup_field(arm11, 1, NULL, NULL, chain5_fields + 2); - arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE); + arm11_add_dr_scan_vc(arm11->arm.target->tap, ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE); } @@ -317,7 +317,7 @@ static int arm11_leave_debug_state(struct arm11_common *arm11, bool bpwp) arm11_setup_field(arm11, 1, &Ready, NULL, chain5_fields + 1); arm11_setup_field(arm11, 1, &Valid, NULL, chain5_fields + 2); - arm11_add_dr_scan_vc(ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE); + arm11_add_dr_scan_vc(arm11->arm.target->tap, ARRAY_SIZE(chain5_fields), chain5_fields, TAP_DRPAUSE); } /* now processor is ready to RESTART */ @@ -1194,7 +1194,7 @@ static int arm11_examine(struct target *target) arm11_setup_field(arm11, 32, NULL, &device_id, &idcode_field); - arm11_add_dr_scan_vc(1, &idcode_field, TAP_DRPAUSE); + arm11_add_dr_scan_vc(arm11->arm.target->tap, 1, &idcode_field, TAP_DRPAUSE); /* check DIDR */ @@ -1207,7 +1207,7 @@ static int arm11_examine(struct target *target) arm11_setup_field(arm11, 32, NULL, &didr, chain0_fields + 0); arm11_setup_field(arm11, 8, NULL, &implementor, chain0_fields + 1); - arm11_add_dr_scan_vc(ARRAY_SIZE(chain0_fields), chain0_fields, TAP_IDLE); + arm11_add_dr_scan_vc(arm11->arm.target->tap, ARRAY_SIZE(chain0_fields), chain0_fields, TAP_IDLE); CHECK_RETVAL(jtag_execute_queue()); diff --git a/src/target/arm11_dbgtap.c b/src/target/arm11_dbgtap.c index b8388c8..f049059 100644 --- a/src/target/arm11_dbgtap.c +++ b/src/target/arm11_dbgtap.c @@ -49,13 +49,13 @@ static const tap_state_t arm11_move_pi_to_si_via_ci[] = /* REVISIT no error handling here! */ -static void arm11_add_ir_scan_vc(int num_fields, struct scan_field *fields, +static void arm11_add_ir_scan_vc(struct jtag_tap *tap, int num_fields, 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); - jtag_add_ir_scan(num_fields, fields, state); + jtag_add_ir_scan(tap, num_fields, fields, state); } static const tap_state_t arm11_move_pd_to_sd_via_cd[] = @@ -64,13 +64,13 @@ static const tap_state_t arm11_move_pd_to_sd_via_cd[] = }; /* REVISIT no error handling here! */ -void arm11_add_dr_scan_vc(int num_fields, struct scan_field *fields, +void arm11_add_dr_scan_vc(struct jtag_tap *tap, int num_fields, struct scan_field *fields, tap_state_t state) { if (cmd_queue_cur_state == TAP_DRPAUSE) jtag_add_pathmove(ARRAY_SIZE(arm11_move_pd_to_sd_via_cd), arm11_move_pd_to_sd_via_cd); - jtag_add_dr_scan(num_fields, fields, state); + jtag_add_dr_scan(tap, num_fields, fields, state); } @@ -87,7 +87,6 @@ void arm11_add_dr_scan_vc(int num_fields, struct scan_field *fields, void arm11_setup_field(struct arm11_common *arm11, int num_bits, void *out_data, void *in_data, struct scan_field *field) { - field->tap = arm11->arm.target->tap; field->num_bits = num_bits; field->out_value = out_data; field->in_value = in_data; @@ -150,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_add_ir_scan_vc(1, &field, state == ARM11_TAP_DEFAULT ? TAP_IRPAUSE : state); + arm11_add_ir_scan_vc(arm11->arm.target->tap, 1, &field, state == ARM11_TAP_DEFAULT ? TAP_IRPAUSE : state); } /** Verify data shifted out from Scan Chain Register (SCREG). */ @@ -214,7 +213,7 @@ int arm11_add_debug_SCAN_N(struct arm11_common *arm11, uint8_t tmp[1]; arm11_setup_field(arm11, 5, &chain, &tmp, &field); - arm11_add_dr_scan_vc(1, &field, state == ARM11_TAP_DEFAULT ? TAP_DRPAUSE : state); + arm11_add_dr_scan_vc(arm11->arm.target->tap, 1, &field, state == ARM11_TAP_DEFAULT ? TAP_DRPAUSE : state); jtag_execute_queue_noclear(); @@ -253,7 +252,7 @@ static void arm11_add_debug_INST(struct arm11_common * arm11, arm11_setup_field(arm11, 32, &inst, NULL, itr + 0); arm11_setup_field(arm11, 1, NULL, flag, itr + 1); - arm11_add_dr_scan_vc(ARRAY_SIZE(itr), itr, state); + arm11_add_dr_scan_vc(arm11->arm.target->tap, ARRAY_SIZE(itr), itr, state); } /** @@ -281,7 +280,7 @@ int arm... [truncated message content] |