- added "init" command. "init" and "reset" at end of startup script is equivalent
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 9 Apr 2008 05:50:34 +0000 (05:50 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 9 Apr 2008 05:50:34 +0000 (05:50 +0000)
  to daemon_startup(still supported).
- print warning if srst and trst change state at the same time when srst_and_trst
is seperate
- reset now performs a trst, examines and validates the jtag chain before targets
assert reset
- if startup fails to examine and validate the jtag chain, try a reset before
trying again

git-svn-id: svn://svn.berlios.de/openocd/trunk@552 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/jtag.c
src/jtag/jtag.h
src/openocd.c
src/target/arm7_9_common.c
src/target/target.c
src/target/target.h
src/target/target/lpc2148.cfg

index c73e0c9aa879663b1056e796215d2b2591c44a78..291c40107c791e4e6c9b5298c9be8bbc2445ed2a 100644 (file)
@@ -898,6 +898,23 @@ void jtag_add_reset(int req_tlr_or_trst, int req_srst)
        int trst_with_tlr = 0;
        int retval;
        
+       /* FIX!!! there are *many* different cases here. A better
+        * approach is needed for legal combinations of transitions...
+       */
+       if ((jtag_reset_config & RESET_HAS_SRST)&&
+                       (jtag_reset_config & RESET_HAS_TRST)&& 
+                       ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)&&
+                       ((jtag_reset_config & RESET_TRST_PULLS_SRST)==0))
+       {
+               if (((req_tlr_or_trst&&!jtag_trst)||
+                               (!req_tlr_or_trst&&jtag_trst))&&
+                               ((req_srst&&!jtag_srst)||
+                                               (!req_srst&&jtag_srst)))
+               {
+                       LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
+               }
+       }
+       
        /* Make sure that jtag_reset_config allows the requested reset */
        /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
        if (((jtag_reset_config & RESET_SRST_PULLS_TRST) && (req_srst == 1)) && (!req_tlr_or_trst))
@@ -1477,7 +1494,7 @@ int jtag_interface_init(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
-int jtag_init(struct command_context_s *cmd_ctx)
+static int jtag_init_inner(struct command_context_s *cmd_ctx)
 {
        int validate_tries = 0;
        jtag_device_t *device;
@@ -1521,6 +1538,56 @@ int jtag_init(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
+int jtag_init_reset(struct command_context_s *cmd_ctx)
+{
+       int retval;
+       LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / tms");
+
+       /* Reset can happen after a power cycle.
+        * 
+        * Ideally we would only assert TRST or run tms before the target reset.
+        * 
+        * However w/srst_pulls_trst, trst is asserted together with the target
+        * reset whether we want it or not.
+        * 
+        * NB! Some targets have JTAG circuitry disabled until a 
+        * trst & srst has been asserted.
+        * 
+        * NB! here we assume nsrst/ntrst delay are sufficient!
+        * 
+        * NB! order matters!!!! srst *can* disconnect JTAG circuitry
+        * 
+        */
+       jtag_add_reset(1, 0); /* TMS or TRST */
+       if (jtag_reset_config & RESET_HAS_SRST)
+       {
+               jtag_add_reset(1, 1);
+               if ((jtag_reset_config & RESET_SRST_PULLS_TRST)==0)
+                       jtag_add_reset(0, 1);
+       }
+       jtag_add_reset(0, 0);
+       if ((retval = jtag_execute_queue()) != ERROR_OK)
+               return retval;
+       
+       /* Check that we can communication on the JTAG chain + eventually we want to
+        * be able to perform enumeration only after OpenOCD has started 
+        * telnet and GDB server
+        * 
+        * That would allow users to more easily perform any magic they need to before
+        * reset happens.
+        */
+       return jtag_init_inner(cmd_ctx);
+}
+
+int jtag_init(struct command_context_s *cmd_ctx)
+{
+       if (jtag_init_inner(cmd_ctx)==ERROR_OK)
+       {
+               return ERROR_OK;
+       }
+       return jtag_init_reset(cmd_ctx);
+}
+
 
 static int default_khz(int khz, int *jtag_speed)
 {
index 19329447735806bfc481d76a1e616d871344f102..b7ce094d6aeec0f17d6e9ffa639fc70dfa408eed 100644 (file)
@@ -241,8 +241,12 @@ enum reset_types
 
 extern enum reset_types jtag_reset_config;
 
-/* JTAG subsystem */
+/* initialize JTAG chain using only a TLR reset. If init fails,
+ * try reset + init.
+ */
 extern int jtag_init(struct command_context_s *cmd_ctx);
+/* reset, then initialize JTAG chain */
+extern int jtag_init_reset(struct command_context_s *cmd_ctx);
 extern int jtag_register_commands(struct command_context_s *cmd_ctx);
 
 /* JTAG interface, can be implemented with a software or hardware fifo
@@ -325,6 +329,10 @@ extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
  * This is why combinations such as "reset_config srst_only srst_pulls_trst"
  * are supported. 
  *
+ * only req_tlr_or_trst and srst can have a transition for a
+ * call as the effects of transitioning both at the "same time" 
+ * are undefined, but when srst_pulls_trst or vice versa,
+ * then trst & srst *must* be asserted together.
  */
 extern void jtag_add_reset(int req_tlr_or_trst, int srst);
 /* this drives the actual srst and trst pins. srst will always be 0
index fa2d2c6127a59953867621e9322d2417e60d52ae..71963cb965c13d368a3b3c7f63803faf7116a53e 100644 (file)
@@ -57,6 +57,23 @@ int handle_version_command(struct command_context_s *cmd_ctx, char *cmd, char **
        return ERROR_OK;
 }
 
+static int daemon_startup = 0;
+
+int handle_daemon_startup_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+       if (argc==0)
+               return ERROR_OK;
+       if (argc > 1 )
+               return ERROR_COMMAND_SYNTAX_ERROR;
+       
+       daemon_startup = strcmp("reset", args[0])==0;
+       
+       command_print(cmd_ctx, OPENOCD_VERSION);
+
+       return ERROR_OK;
+}
+
+
 void exit_handler(void)
 {
        /* close JTAG interface */
@@ -64,6 +81,51 @@ void exit_handler(void)
                jtag->quit();
 }
 
+
+/* OpenOCD can't really handle failure of this command. Patches welcome! :-) */
+int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+       static int initialized=0;
+       if (initialized)
+               return ERROR_OK;
+       
+       initialized=1;
+       
+       command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
+
+       atexit(exit_handler);
+
+       if (jtag_init(cmd_ctx) != ERROR_OK)
+               return ERROR_FAIL;
+       LOG_DEBUG("jtag init complete");
+
+       if (target_init(cmd_ctx) != ERROR_OK)
+               return ERROR_FAIL;
+       LOG_DEBUG("target init complete");
+
+       if (flash_init_drivers(cmd_ctx) != ERROR_OK)
+               return ERROR_FAIL;
+       LOG_DEBUG("flash init complete");
+
+       if (nand_init(cmd_ctx) != ERROR_OK)
+               return ERROR_FAIL;
+       LOG_DEBUG("NAND init complete");
+
+       if (pld_init(cmd_ctx) != ERROR_OK)
+               return ERROR_FAIL;
+       LOG_DEBUG("pld init complete");
+
+       /* initialize tcp server */
+       server_init();
+
+       /* initialize telnet subsystem */
+       telnet_init("Open On-Chip Debugger");
+       gdb_init();
+
+       return ERROR_OK;
+}
+
+
 /* implementations of OpenOCD that uses multithreading needs to lock OpenOCD while calling
  * OpenOCD fn's. No-op in vanilla OpenOCD
  */
@@ -83,7 +145,9 @@ int main(int argc, char *argv[])
 
        register_command(cmd_ctx, NULL, "version", handle_version_command,
                                         COMMAND_EXEC, "show OpenOCD version");
-
+       register_command(cmd_ctx, NULL, "daemon_startup", handle_daemon_startup_command, COMMAND_CONFIG, 
+                       "deprecated - use \"init\" and \"reset\" at end of startup script instead");
+       
        /* register subsystem commands */
        server_register_commands(cmd_ctx);
        telnet_register_commands(cmd_ctx);
@@ -116,6 +180,9 @@ int main(int argc, char *argv[])
        /* DANGER!!! make sure that the line above does not appear in a patch, do not remove */
        /* DANGER!!! make sure that the line above does not appear in a patch, do not remove */
 
+       register_command(cmd_ctx, NULL, "init", handle_init_command,
+                                        COMMAND_ANY, "initializes target and servers - nop on subsequent invocations");
+
        cfg_cmd_ctx = copy_command_context(cmd_ctx);
        cfg_cmd_ctx->mode = COMMAND_CONFIG;
        command_set_output_handler(cfg_cmd_ctx, configuration_output_handler, NULL);
@@ -128,41 +195,11 @@ int main(int argc, char *argv[])
        
        command_done(cfg_cmd_ctx);
 
-       command_set_output_handler(cmd_ctx, configuration_output_handler, NULL);
-
-       atexit(exit_handler);
-
-       if (jtag_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-       LOG_DEBUG("jtag init complete");
-
-       if (target_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-       LOG_DEBUG("target init complete");
-
-       if (flash_init_drivers(cmd_ctx) != ERROR_OK)
+       if (command_run_line(cmd_ctx, "init")!=ERROR_OK)
                return EXIT_FAILURE;
-       LOG_DEBUG("flash init complete");
-
-       if (nand_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-       LOG_DEBUG("NAND init complete");
-
-       if (pld_init(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-       LOG_DEBUG("pld init complete");
-
-       /* initialize tcp server */
-       server_init();
-
-       /* initialize telnet subsystem */
-       telnet_init("Open On-Chip Debugger");
-       gdb_init();
-
-       /* call any target resets */
-       if (target_init_reset(cmd_ctx) != ERROR_OK)
-               return EXIT_FAILURE;
-       LOG_DEBUG("target init reset complete");
+       
+       if (daemon_startup)
+               command_run_line(cmd_ctx, "reset");
 
        /* handle network connections */
        server_loop(cmd_ctx);
index d77f2000279abbd6e619bf472062b80dfddf0f77..106b95db1c599d9cf8de25eb03eab6a61ed501a7 100644 (file)
@@ -755,6 +755,14 @@ int arm7_9_assert_reset(target_t *target)
 
        if ((target->reset_mode == RESET_HALT) || (target->reset_mode == RESET_INIT))
        {
+               reg_t *dbg_ctrl = &arm7_9->eice_cache->reg_list[EICE_DBG_CTRL];
+               
+               /* program EmbeddedICE Debug Control Register to deassert DBGRQ
+                * i.e. resume.
+                */
+               buf_set_u32(dbg_ctrl->value, EICE_DBG_CONTROL_DBGRQ, 1, 0);     
+               embeddedice_store_reg(dbg_ctrl);
+
                /*
                 * Some targets do not support communication while SRST is asserted. We need to
                 * set up the reset vector catch here.
@@ -777,16 +785,6 @@ int arm7_9_assert_reset(target_t *target)
                }
        }
 
-       /* we can't know what state the target is in as we might e.g.
-        * be resetting after a power dropout, so we need to issue a tms/srst
-        */
-       
-       /* assert SRST and TRST */
-       /* system would get ouf sync if we didn't reset test-logic, too */
-       jtag_add_reset(1, 1);
-       
-       jtag_add_sleep(5000);
-
        /* here we should issue a srst only, but we may have to assert trst as well */
        if (jtag_reset_config & RESET_SRST_PULLS_TRST)
        {
@@ -965,6 +963,15 @@ int arm7_9_halt(target_t *target)
                        LOG_ERROR("can't request a halt while in reset if nSRST pulls nTRST");
                        return ERROR_TARGET_FAILURE;
                }
+               else
+               {
+                       /* we came here in a reset_halt or reset_init sequence
+                        * debug entry was already prepared in arm7_9_prepare_reset_halt()
+                        */
+                       target->debug_reason = DBG_REASON_DBGRQ;
+                       
+                       return ERROR_OK; 
+               }
        }
 
        if (arm7_9->use_dbgrq)
index bfe0f14aeb6a41b35d7420fcab69d921a08a597e..ce411b45b84dbc6e71f43ef6f7e27d5a009d3602 100644 (file)
@@ -51,7 +51,6 @@ int cli_target_callback_event_handler(struct target_s *target, enum target_event
 
 
 int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int handle_daemon_startup_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 int handle_target_script_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -132,8 +131,6 @@ char *target_endianess_strings[] =
        "little endian",
 };
 
-enum daemon_startup_mode startup_mode = DAEMON_ATTACH;
-
 static int target_continous_poll = 1;
 
 /* read a u32 from a buffer in target memory endianness */
@@ -264,6 +261,10 @@ int target_process_reset(struct command_context_s *cmd_ctx)
 
        jtag->speed(jtag_speed);
 
+       if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
+               return retval;
+       
+
        /* prepare reset_halt where necessary */
        target = targets;
        while (target)
@@ -460,14 +461,6 @@ int target_init(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
-int target_init_reset(struct command_context_s *cmd_ctx)
-{
-       if (startup_mode == DAEMON_RESET)
-               target_process_reset(cmd_ctx);
-       
-       return ERROR_OK;
-}
-
 int target_register_event_callback(int (*callback)(struct target_s *target, enum target_event event, void *priv), void *priv)
 {
        target_event_callback_t **callbacks_p = &target_event_callbacks;
@@ -801,7 +794,6 @@ int target_register_commands(struct command_context_s *cmd_ctx)
 {
        register_command(cmd_ctx, NULL, "target", handle_target_command, COMMAND_CONFIG, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
        register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
-       register_command(cmd_ctx, NULL, "daemon_startup", handle_daemon_startup_command, COMMAND_CONFIG, NULL);
        register_command(cmd_ctx, NULL, "target_script", handle_target_script_command, COMMAND_CONFIG, NULL);
        register_command(cmd_ctx, NULL, "run_and_halt_time", handle_run_and_halt_time_command, COMMAND_CONFIG, "<target> <run time ms>");
        register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
@@ -1639,27 +1631,6 @@ int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
        return handle_wait_halt_command(cmd_ctx, cmd, args, argc);
 }
 
-/* what to do on daemon startup */
-int handle_daemon_startup_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       if (argc == 1)
-       {
-               if (strcmp(args[0], "attach") == 0)
-               {
-                       startup_mode = DAEMON_ATTACH;
-                       return ERROR_OK;
-               }
-               else if (strcmp(args[0], "reset") == 0)
-               {
-                       startup_mode = DAEMON_RESET;
-                       return ERROR_OK;
-               }
-       }
-       
-       LOG_WARNING("invalid daemon_startup configuration directive: %s", args[0]);
-       return ERROR_OK;
-
-}
                
 int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
index 6ce8fee9fccca1ca51f6566e9e2b10cece11d39f..d95c4aa76572b333a41a0a70ac0bf52519480ba0 100644 (file)
@@ -54,14 +54,6 @@ enum target_state
 
 extern char *target_state_strings[];
 
-enum daemon_startup_mode
-{
-       DAEMON_ATTACH,          /* simply attach to the target */
-       DAEMON_RESET,           /* reset target (behaviour defined by reset_mode */
-};
-
-extern enum daemon_startup_mode startup_mode;
-
 enum target_reset_mode
 {
        RESET_RUN = 0,          /* reset and let target run */
@@ -130,6 +122,11 @@ typedef struct target_type_s
         * assert_reset() can therefore make no assumptions whatsoever about the
         * state of the target 
         * 
+        * Before assert_reset() for the target is invoked, a TRST/tms and
+        * chain validation is executed. TRST should not be asserted
+        * during target assert unless there is no way around it due to
+        * the way reset's are configured.
+        * 
         */
        int (*assert_reset)(struct target_s *target);
        int (*deassert_reset)(struct target_s *target);
index c357662fd798fd39638c096873dd98d3f0fa87ec..ddc8d44384655452ec65198861f9bae716265e6d 100644 (file)
@@ -5,6 +5,10 @@ jtag_ntrst_delay 200
 #use combined on interfaces or targets that can't set TRST/SRST separately
 reset_config trst_and_srst srst_pulls_trst
 
+#LPCs need reset pulled while RTCK is log. 0 to activate JTAG, power-on reset is not enough
+jtag_reset 1 1
+jtag_reset 0 0
+
 #jtag scan chain
 #format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
 jtag_device 4 0x1 0xf 0xe

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)