I've written up a patch(it compiles, but I haven't run it), which adds a command to add extra clocks in TAP_RESET.
It also makes TAP_RESET a forbidden end state in jtag_add_xxx_scan(). I'm not planning to dive into Cortex A8 or Beagleboard stuff, but perhaps this can be a useful start for someone trying to solve the 100 clocks problem when resetting OMAP parts? -- Øyvind Harboe Embedded software and hardware consulting services http://www.zylin.com
### Eclipse Workspace Patch 1.0 #P openocd Index: src/flash/str9xpec.c =================================================================== --- src/flash/str9xpec.c (revision 2652) +++ src/flash/str9xpec.c (working copy) @@ -1254,7 +1254,8 @@ 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 */ Index: src/jtag/jtag.h =================================================================== --- src/jtag/jtag.h (revision 2652) +++ src/jtag/jtag.h (working copy) @@ -635,6 +635,11 @@ /// @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); Index: src/jtag/core.c =================================================================== --- src/jtag/core.c (revision 2652) +++ src/jtag/core.c (working copy) @@ -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(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_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(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_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 @@ 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 @@ { 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,7 +692,11 @@ * should trigger a callback. */ LOG_DEBUG("TRST line asserted"); + tap_set_state(TAP_RESET); + + jtag_add_clocks(jtag_extra_tlr_clocks); + jtag_call_event_callbacks(JTAG_TRST_ASSERTED); } else { LOG_DEBUG("TRST line released"); @@ -802,6 +821,16 @@ 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 @@ 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 @@ 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) Index: src/jtag/tcl.c =================================================================== --- src/jtag/tcl.c (revision 2652) +++ src/jtag/tcl.c (working copy) @@ -65,6 +65,7 @@ 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 @@ 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; } @@ -1454,3 +1461,35 @@ 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; +} +
_______________________________________________ Openocd-development mailing list Openocd-development@lists.berlios.de https://lists.berlios.de/mailman/listinfo/openocd-development