On Saturday 05 September 2009, Øyvind Harboe wrote: > Add "jtag_extra_clocks 100" to your config file
to icepick.cfg in fact ... see the appended patch, which is yours plus (a) "quilt" removed spurious end-of-line whitespace, and (b) the icepic.cfg update is there Not tested. - Dave
--- src/flash/str9xpec.c | 3 ++- src/jtag/core.c | 36 ++++++++++++++++++++++++++++++++++-- src/jtag/jtag.h | 5 +++++ src/jtag/tcl.c | 39 +++++++++++++++++++++++++++++++++++++++ tcl/target/icepick.cfg | 3 +++ 5 files changed, 83 insertions(+), 3 deletions(-) --- a/src/flash/str9xpec.c +++ b/src/flash/str9xpec.c @@ -1254,7 +1254,8 @@ static int str9xpec_handle_flash_disable return ERROR_FAIL; /* exit turbo mode via RESET */ - str9xpec_set_instr(tap, ISC_NOOP, TAP_RESET); + str9xpec_set_instr(tap, ISC_NOOP, TAP_IDLE); + jtag_add_tlr(); jtag_execute_queue(); /* restore previous scan chain */ --- a/src/jtag/core.c +++ b/src/jtag/core.c @@ -43,6 +43,8 @@ /// The number of JTAG queue flushes (for profiling and debugging purposes). static int jtag_flush_queue_count; +static int jtag_extra_tlr_clocks = 0; + static void jtag_add_scan_check(void (*jtag_add_scan)(int in_num_fields, const scan_field_t *in_fields, tap_state_t state), int in_num_fields, scan_field_t *in_fields, tap_state_t state); @@ -339,6 +341,8 @@ void jtag_add_ir_scan_noverify(int in_co void jtag_add_ir_scan(int in_num_fields, scan_field_t *in_fields, tap_state_t state) { + assert(state != TAP_RESET); + if (jtag_verify && jtag_verify_capture_ir) { /* 8 x 32 bit id's is enough for all invocations */ @@ -361,6 +365,8 @@ void jtag_add_ir_scan(int in_num_fields, void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) { + assert(state != TAP_RESET); + jtag_prelude(state); int retval = interface_jtag_add_plain_ir_scan( @@ -439,6 +445,8 @@ void jtag_add_dr_scan_check(int in_num_f void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) { + assert(state != TAP_RESET); + jtag_prelude(state); int retval; @@ -449,6 +457,8 @@ void jtag_add_dr_scan(int in_num_fields, void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields, tap_state_t state) { + assert(state != TAP_RESET); + jtag_prelude(state); int retval; @@ -460,6 +470,8 @@ void jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const uint32_t* value, tap_state_t end_state) { + assert(end_state != TAP_RESET); + assert(end_state != TAP_INVALID); cmd_queue_cur_state = end_state; @@ -473,6 +485,9 @@ void jtag_add_tlr(void) { jtag_prelude(TAP_RESET); jtag_set_error(interface_jtag_add_tlr()); + + jtag_add_clocks(jtag_extra_tlr_clocks); + jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } @@ -677,10 +692,14 @@ void jtag_add_reset(int req_tlr_or_trst, * should trigger a callback. */ LOG_DEBUG("TRST line asserted"); + tap_set_state(TAP_RESET); + jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } else { LOG_DEBUG("TRST line released"); + jtag_add_clocks(jtag_extra_tlr_clocks); + if (jtag_ntrst_delay) jtag_add_sleep(jtag_ntrst_delay * 1000); } @@ -802,6 +821,16 @@ int jtag_get_flush_queue_count(void) return jtag_flush_queue_count; } +int jtag_get_extra_tlr_clocks(void) +{ + return jtag_extra_tlr_clocks; +} + +void jtag_set_extra_tlr_clocks(int extra) +{ + jtag_extra_tlr_clocks = extra; +} + int jtag_execute_queue(void) { jtag_execute_queue_noclear(); @@ -851,7 +880,8 @@ static int jtag_examine_chain_execute(ui for (unsigned i = 0; i < JTAG_MAX_CHAIN_SIZE; i++) buf_set_u32(idcode_buffer, i * 32, 32, 0x000000FF); - jtag_add_plain_dr_scan(1, &field, TAP_RESET); + jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE); + jtag_add_tlr(); return jtag_execute_queue(); } @@ -1065,7 +1095,9 @@ int jtag_validate_chain(void) field.in_value = ir_test; - jtag_add_plain_ir_scan(1, &field, TAP_RESET); + jtag_add_plain_ir_scan(1, &field, TAP_IRPAUSE); + jtag_add_tlr(); + int retval; retval = jtag_execute_queue(); if (retval != ERROR_OK) --- a/src/jtag/jtag.h +++ b/src/jtag/jtag.h @@ -635,6 +635,11 @@ extern void jtag_execute_queue_noclear(v /// @returns the number of times the scan queue has been flushed int jtag_get_flush_queue_count(void); +/// @returns the number of clocks to add while in TAP_RESET +int jtag_get_extra_tlr_clocks(void); +/// @returns set the number of clocks to add while in TAP_RESET +void jtag_set_extra_tlr_clocks(int extra); + /* can be implemented by hw + sw */ extern int jtag_power_dropout(int* dropout); --- a/src/jtag/tcl.c +++ b/src/jtag/tcl.c @@ -65,6 +65,7 @@ static int handle_scan_chain_command(str static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +static int handle_jtag_extra_clocks_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv); static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *argv); @@ -622,6 +623,12 @@ int jtag_register_commands(struct comman COMMAND_ANY, "verify value capture <enable | disable>"); register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command, COMMAND_ANY, "choose short(default) or long tms_sequence <short | long>"); + + register_command(cmd_ctx, NULL, "jtag_extra_clocks", handle_jtag_extra_clocks_command, + COMMAND_EXEC, "extra clocks in reset <clocks> - default 0"); + + + return ERROR_OK; } @@ -1504,3 +1511,35 @@ static int handle_tms_sequence_command(s return ERROR_OK; } + + + +static int handle_jtag_extra_clocks_command(struct command_context_s *cmd_ctx, + char *cmd, char **args, int argc) +{ + if (argc > 1) + { + return ERROR_COMMAND_SYNTAX_ERROR; + } + + if (argc == 1) + { + unsigned num_clocks; + int retval = parse_uint(args[0], &num_clocks); + if (ERROR_OK != retval) + return retval; + + if (num_clocks > 10000) + { + command_print(cmd_ctx, "maximum 10000 extra clocks in reset"); + return ERROR_COMMAND_SYNTAX_ERROR; + } + + jtag_set_extra_tlr_clocks(num_clocks); + } + + command_print(cmd_ctx, "extra clocks in reset %d", jtag_get_extra_tlr_clocks()); + + return ERROR_OK; +} + --- a/tcl/target/icepick.cfg +++ b/tcl/target/icepick.cfg @@ -19,3 +19,6 @@ proc icepick_c_tapenable {jrc port} { irscan $jrc 0x3F -endstate RUN/IDLE runtest 10 } + +# Be sure the ICEpick is fully powered up after JTAG reset +jtag_extra_clocks 100
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development