- added new test results
[openocd.git] / src / jtag / jtag.c
index d55dc24773389f9bb5980b5a38af07be71fa4cd6..7d0dcab9d80ce91f33b6a43733815db16d691886 100644 (file)
@@ -106,10 +106,7 @@ tap_transition_t tap_transitions[16] =
 
 char* jtag_event_strings[] =
 {
-       "SRST asserted",
-       "TRST asserted",
-       "SRST released",
-       "TRST released"
+       "JTAG controller reset(tms or TRST)"
 };
 
 enum tap_state end_state = TAP_TLR;
@@ -221,6 +218,7 @@ jtag_interface_t *jtag = NULL;
 /* configuration */
 jtag_interface_t *jtag_interface = NULL;
 int jtag_speed = 0;
+int jtag_speed_post_reset = 0;
 
 
 /* forward declarations */
@@ -236,6 +234,7 @@ int jtag_cancel_queue(void);
 /* jtag commands */
 int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -394,7 +393,7 @@ void cmd_queue_free()
        cmd_queue_pages = NULL;
 }
 
-void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+static void jtag_prelude1()
 {
        if (jtag_trst == 1)
        {
@@ -403,16 +402,23 @@ void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state
                return;
        }
 
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
        if (cmd_queue_end_state == TAP_TLR)
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
+}
+
+static void jtag_prelude(enum tap_state state)
+{
+       jtag_prelude1();
        
+       if (state != -1)
+               cmd_queue_end_state = state;
+
        cmd_queue_cur_state = cmd_queue_end_state;
+}
+
+void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+{
+       jtag_prelude(state);
        
        int retval=interface_jtag_add_ir_scan(num_fields, fields, cmd_queue_end_state);
        if (retval!=ERROR_OK)
@@ -498,23 +504,7 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
 
 void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-               
-       cmd_queue_cur_state = cmd_queue_end_state;
+       jtag_prelude(state);
        
        int retval=interface_jtag_add_plain_ir_scan(num_fields, fields, cmd_queue_end_state);
        if (retval!=ERROR_OK)
@@ -560,23 +550,7 @@ int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *f
 
 void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-                       
-       cmd_queue_cur_state = cmd_queue_end_state;
+       jtag_prelude(state);
 
        int retval=interface_jtag_add_dr_scan(num_fields, fields, cmd_queue_end_state);
        if (retval!=ERROR_OK)
@@ -761,23 +735,7 @@ void MINIDRIVER(interface_jtag_add_dr_out)(int device_num,
 
 void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-                       
-       cmd_queue_cur_state = cmd_queue_end_state;
+       jtag_prelude(state);
 
        int retval=interface_jtag_add_plain_dr_scan(num_fields, fields, cmd_queue_end_state);
        if (retval!=ERROR_OK)
@@ -821,23 +779,7 @@ int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *f
 }
 void jtag_add_statemove(enum tap_state state)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-                       
-       cmd_queue_cur_state = cmd_queue_end_state;
+       jtag_prelude(state);
 
        int retval;
        retval=interface_jtag_add_statemove(cmd_queue_end_state);
@@ -864,25 +806,11 @@ int MINIDRIVER(interface_jtag_add_statemove)(enum tap_state state)
 
 void jtag_add_pathmove(int num_states, enum tap_state *path)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-       
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-       
        /* the last state has to be a stable state */
        if (tap_move_map[path[num_states - 1]] == -1)
        {
-               ERROR("TAP path doesn't finish in a stable state");
-               jtag_error=ERROR_JTAG_NOT_IMPLEMENTED;
-               return;
+               ERROR("BUG: TAP path doesn't finish in a stable state");
+               exit(-1);
        }
 
        enum tap_state cur_state=cmd_queue_cur_state;
@@ -898,6 +826,8 @@ void jtag_add_pathmove(int num_states, enum tap_state *path)
                cur_state = path[i];
        }
        
+       jtag_prelude1();
+       
        cmd_queue_cur_state = path[num_states - 1];
 
        int retval=interface_jtag_add_pathmove(num_states, path);
@@ -946,23 +876,7 @@ int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, enum tap_state state)
 
 void jtag_add_runtest(int num_cycles, enum tap_state state)
 {
-       if (jtag_trst == 1)
-       {
-               WARNING("JTAG command queued, while TRST is low (TAP in reset)");
-               jtag_error=ERROR_JTAG_TRST_ASSERTED;
-               return;
-       }
-       
-       if (state != -1)
-               cmd_queue_end_state = state;
-
-       if (cmd_queue_cur_state == TAP_TLR && cmd_queue_end_state != TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_RELEASED);
-       
-       if (cmd_queue_end_state == TAP_TLR)
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
-                       
-       cmd_queue_cur_state = cmd_queue_end_state;
+       jtag_prelude(state);
        
        /* executed by sw or hw fifo */
        int retval=interface_jtag_add_runtest(num_cycles, cmd_queue_end_state);
@@ -1020,20 +934,21 @@ int jtag_add_reset(int req_trst, int req_srst)
 
        if (jtag_srst)
        {
-               jtag_call_event_callbacks(JTAG_SRST_ASSERTED);
+               DEBUG("SRST line asserted");
        }
        else
        {
-               jtag_call_event_callbacks(JTAG_SRST_RELEASED);
+               DEBUG("SRST line released");
                if (jtag_nsrst_delay)
                        jtag_add_sleep(jtag_nsrst_delay * 1000);
        }
        
        if (trst_with_tms)
        {
-               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
+               DEBUG("JTAG reset with tms instead of TRST");
                jtag_add_end_state(TAP_TLR);
                jtag_add_statemove(TAP_TLR);
+               jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
                return ERROR_OK;
        }
        
@@ -1042,6 +957,7 @@ int jtag_add_reset(int req_trst, int req_srst)
                /* we just asserted nTRST, so we're now in Test-Logic-Reset,
                 * and inform possible listeners about this
                 */
+               DEBUG("TRST line asserted");
                cmd_queue_cur_state = TAP_TLR;
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
        }
@@ -1050,6 +966,7 @@ int jtag_add_reset(int req_trst, int req_srst)
                /* the nTRST line got deasserted, so we're still in Test-Logic-Reset,
                 * but we might want to add a delay to give the TAP time to settle
                 */
+               DEBUG("Now in TAP_TLR - Test-Logic-Reset(either due to TRST line asserted or tms reset)");
                if (jtag_ntrst_delay)
                        jtag_add_sleep(jtag_ntrst_delay * 1000);
        }
@@ -1492,7 +1409,9 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
        register_command(cmd_ctx, NULL, "interface", handle_interface_command,
                COMMAND_CONFIG, NULL);
        register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
-               COMMAND_ANY, "set jtag speed (if supported) <speed>");
+               COMMAND_ANY, "set jtag speed (if supported) <reset speed> [<post reset speed, default value is reset speed>]");
+       register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
+               COMMAND_ANY, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
        register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
                COMMAND_CONFIG, "jtag_device <ir_length> <ir_expected> <ir_mask>");
        register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
@@ -1583,6 +1502,12 @@ int jtag_init(struct command_context_s *cmd_ctx)
 }
 
 
+static int default_khz(int khz, int *jtag_speed)
+{
+       ERROR("Translation from khz to jtag_speed not implemented");
+       return ERROR_FAIL;
+}
+
 int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        int i;
@@ -1608,6 +1533,11 @@ int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char
                                exit(-1);
 
                        jtag_interface = jtag_interfaces[i];
+                       
+                       if (jtag_interface->khz == NULL)
+                       {
+                               jtag_interface->khz = default_khz;
+                       }
                        return ERROR_OK;
                }
        }
@@ -1780,21 +1710,59 @@ int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd
 
 int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       if (argc == 0)
-               command_print(cmd_ctx, "jtag_speed: %i", jtag_speed);
+       int cur_speed = 0;
+       if ((argc<1) || (argc>2))
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       if (argc >= 1)
+               cur_speed = jtag_speed = jtag_speed_post_reset = strtoul(args[0], NULL, 0);
+       if (argc == 2)
+               cur_speed = jtag_speed_post_reset = strtoul(args[1], NULL, 0);
+               
+       /* this command can be called during CONFIG, 
+        * in which case jtag isn't initialized */
+       if (jtag)
+               jtag->speed(cur_speed);
 
-       if (argc > 0)
+       return ERROR_OK;
+}
+
+int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+       int cur_speed = 0;
+       int speed1, speed2;
+       if ((argc<1) || (argc>2))
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
+       if (jtag == NULL)
        {
-               jtag_speed = strtoul(args[0], NULL, 0);
-               /* this command can be called during CONFIG, 
-                * in which case jtag isn't initialized */
-               if (jtag)
-                       jtag->speed(jtag_speed);
+               ERROR("Interface not selected yet");
+               return ERROR_COMMAND_SYNTAX_ERROR;
        }
+       
+       if (argc >= 1)
+               speed1 = strtoul(args[0], NULL, 0);
+       if (argc == 2)
+               speed2 = strtoul(args[1], NULL, 0);
+       
+       if (jtag->khz(speed1, &speed1)!=ERROR_OK)
+               return ERROR_OK;
+       
+       if (jtag->khz(speed2, &speed2)!=ERROR_OK)
+               return ERROR_OK;
+       
+       if (argc >= 1)
+               cur_speed = jtag_speed = jtag_speed_post_reset = speed1;
+       
+       if (argc == 2)
+               cur_speed = jtag_speed_post_reset = speed2;
+               
+       jtag->speed(cur_speed);
 
        return ERROR_OK;
 }
 
+
 int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        enum tap_state state;

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)