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

Reply via email to