Alan Carvalho de Assis <acassis@gmail.com> - testcase
[openocd.git] / src / jtag / jtag.c
index 16dbbd22f0248fe90689d8a73b865809ee8a57b2..bbf90e042ac3613ab8b197864c0c7bfdb2dba169 100644 (file)
@@ -79,22 +79,22 @@ int tap_move_map[16] = {
 
 tap_transition_t tap_transitions[16] =
 {
-       {TAP_RESET, TAP_IDLE},          /* RESET */
-       {TAP_IRSELECT, TAP_DRCAPTURE},          /* DRSELECT */
-       {TAP_DREXIT1, TAP_DRSHIFT},             /* DRCAPTURE  */
-       {TAP_DREXIT1, TAP_DRSHIFT},             /* DRSHIFT  */
+       {TAP_RESET,             TAP_IDLE},                      /* RESET */
+       {TAP_IRSELECT,  TAP_DRCAPTURE},         /* DRSELECT */
+       {TAP_DREXIT1,   TAP_DRSHIFT},           /* DRCAPTURE  */
+       {TAP_DREXIT1,   TAP_DRSHIFT},           /* DRSHIFT  */
        {TAP_DRUPDATE,  TAP_DRPAUSE},           /* DREXIT1 */
-       {TAP_DREXIT2, TAP_DRPAUSE},             /* DRPAUSE  */
+       {TAP_DREXIT2,   TAP_DRPAUSE},           /* DRPAUSE  */
        {TAP_DRUPDATE,  TAP_DRSHIFT},           /* DREXIT2 */
-       {TAP_DRSELECT, TAP_IDLE},               /* DRUPDATE  */
-       {TAP_DRSELECT, TAP_IDLE},               /* IDLE */
-       {TAP_RESET, TAP_IRCAPTURE},             /* IRSELECT */
-       {TAP_IREXIT1, TAP_IRSHIFT},             /* IRCAPTURE  */
-       {TAP_IREXIT1, TAP_IRSHIFT},             /* IRSHIFT  */
+       {TAP_DRSELECT,  TAP_IDLE},                      /* DRUPDATE  */
+       {TAP_DRSELECT,  TAP_IDLE},                      /* IDLE */
+       {TAP_RESET,             TAP_IRCAPTURE},         /* IRSELECT */
+       {TAP_IREXIT1,   TAP_IRSHIFT},           /* IRCAPTURE  */
+       {TAP_IREXIT1,   TAP_IRSHIFT},           /* IRSHIFT  */
        {TAP_IRUPDATE,  TAP_IRPAUSE},           /* IREXIT1 */
-       {TAP_IREXIT2, TAP_IRPAUSE},             /* IRPAUSE  */
+       {TAP_IREXIT2,   TAP_IRPAUSE},           /* IRPAUSE  */
        {TAP_IRUPDATE,  TAP_IRSHIFT},           /* IREXIT2 */
-       {TAP_DRSELECT, TAP_IDLE}                /* IRUPDATE  */
+       {TAP_DRSELECT,  TAP_IDLE}                       /* IRUPDATE  */
 };
 
 char* jtag_event_strings[] =
@@ -196,6 +196,10 @@ static int hasKHz = 0;
        extern jtag_interface_t jlink_interface;
 #endif
 
+#if BUILD_VSLLINK == 1
+       extern jtag_interface_t vsllink_interface;
+#endif
+
 #if BUILD_RLINK == 1
        extern jtag_interface_t rlink_interface;
 #endif
@@ -237,6 +241,9 @@ jtag_interface_t *jtag_interfaces[] = {
 #if BUILD_JLINK == 1
        &jlink_interface,
 #endif
+#if BUILD_VSLLINK == 1
+       &vsllink_interface,
+#endif
 #if BUILD_RLINK == 1
        &rlink_interface,
 #endif
@@ -962,7 +969,7 @@ void jtag_add_tlr(void)
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_tlr)()
+int MINIDRIVER(interface_jtag_add_tlr)(void)
 {
        enum tap_state state = TAP_RESET;
        jtag_command_t **last_cmd = jtag_get_last_command_p();
@@ -976,7 +983,6 @@ int MINIDRIVER(interface_jtag_add_tlr)()
        (*last_cmd)->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
        (*last_cmd)->cmd.statemove->end_state = state;
 
-
        return ERROR_OK;
 }
 
@@ -1067,6 +1073,33 @@ void jtag_add_runtest(int num_cycles, enum tap_state state)
                jtag_error=retval;
 }
 
+
+int MINIDRIVER(interface_jtag_add_clocks)( int num_cycles )
+{
+       jtag_command_t **last_cmd = jtag_get_last_command_p();
+
+       /* allocate memory for a new list member */
+       *last_cmd = cmd_queue_alloc(sizeof(jtag_command_t));
+       (*last_cmd)->next = NULL;
+       last_comand_pointer = &((*last_cmd)->next);
+       (*last_cmd)->type = JTAG_STABLECLOCKS;
+
+       (*last_cmd)->cmd.stableclocks = cmd_queue_alloc(sizeof(stableclocks_command_t));
+       (*last_cmd)->cmd.stableclocks->num_cycles = num_cycles;
+       return ERROR_OK;
+}
+
+void jtag_add_clocks( int num_cycles )
+{
+       int retval;
+
+       jtag_prelude1();
+
+       retval=interface_jtag_add_clocks(num_cycles);
+       if (retval!=ERROR_OK)
+               jtag_error=retval;
+}
+
 void jtag_add_reset(int req_tlr_or_trst, int req_srst)
 {
        int trst_with_tlr = 0;
@@ -1245,6 +1278,10 @@ int jtag_build_buffer(scan_command_t *cmd, u8 **buffer)
 
        bit_count = 0;
 
+#ifdef _DEBUG_JTAG_IO_
+       LOG_DEBUG("num_fields: %i",cmd->num_fields);
+#endif
+
        for (i = 0; i < cmd->num_fields; i++)
        {
                if (cmd->fields[i].out_value)
@@ -1254,12 +1291,15 @@ int jtag_build_buffer(scan_command_t *cmd, u8 **buffer)
 #endif
                        buf_set_buf(cmd->fields[i].out_value, 0, *buffer, bit_count, cmd->fields[i].num_bits);
 #ifdef _DEBUG_JTAG_IO_
-                       LOG_DEBUG("fields[%i].out_value: 0x%s", i, char_buf);
+                       LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i, cmd->fields[i].num_bits, char_buf);
                        free(char_buf);
 #endif
                }
 
                bit_count += cmd->fields[i].num_bits;
+#ifdef _DEBUG_JTAG_IO_
+               LOG_DEBUG("bit_count totalling: %i",  bit_count );
+#endif
        }
 
        return bit_count;
@@ -1285,10 +1325,8 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd)
                        u8 *captured = buf_set_buf(buffer, bit_count, malloc(CEIL(num_bits, 8)), 0, num_bits);
 
 #ifdef _DEBUG_JTAG_IO_
-                       char *char_buf;
-
-                       char_buf = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16);
-                       LOG_DEBUG("fields[%i].in_value: 0x%s", i, char_buf);
+                       char *char_buf = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16);
+                       LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i, num_bits, char_buf);
                        free(char_buf);
 #endif
 
@@ -1327,6 +1365,11 @@ int jtag_read_buffer(u8 *buffer, scan_command_t *cmd)
        return retval;
 }
 
+static const char *jtag_tap_name(jtag_tap_t *tap)
+{
+       return (tap == NULL) ? "(unknown)" : tap->dotted_name;
+}
+
 int jtag_check_value(u8 *captured, void *priv, scan_field_t *field)
 {
        int retval = ERROR_OK;
@@ -1345,7 +1388,7 @@ int jtag_check_value(u8 *captured, void *priv, scan_field_t *field)
                 * acknowledged the error
                 */
                LOG_WARNING("TAP %s:",
-                                       (field->tap == NULL) ? "(unknown)" : field->tap->dotted_name );
+                                       jtag_tap_name(field->tap));
                if (compare_failed)
                {
                        char *captured_char = buf_to_str(captured, (num_bits > 64) ? 64 : num_bits, 16);
@@ -1661,17 +1704,18 @@ int jtag_validate_chain(void)
 
        tap = NULL;
        chain_pos = 0;
+       int val;
        for(;;){
                tap = jtag_NextEnabledTap(tap);
                if( tap == NULL ){
                        break;
                }
 
-
-               if (buf_get_u32(ir_test, chain_pos, 2) != 0x1)
+               val = buf_get_u32(ir_test, chain_pos, 2);
+               if (val != 0x1)
                {
                        char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
-                       LOG_ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf);
+                       LOG_ERROR("Could not validate JTAG scan chain, IR mismatch, scan returned 0x%s. tap=%s pos=%d expected 0x1 got %0x", cbuf, jtag_tap_name(tap), chain_pos, val);
                        free(cbuf);
                        free(ir_test);
                        return ERROR_JTAG_INIT_FAILED;
@@ -1679,10 +1723,11 @@ int jtag_validate_chain(void)
                chain_pos += tap->ir_length;
        }
 
-       if (buf_get_u32(ir_test, chain_pos, 2) != 0x3)
+       val = buf_get_u32(ir_test, chain_pos, 2);
+       if (val != 0x3)
        {
                char *cbuf = buf_to_str(ir_test, total_ir_length, 16);
-               LOG_ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf);
+               LOG_ERROR("Could not validate end of JTAG scan chain, IR mismatch, scan returned 0x%s. pos=%d expected 0x3 got %0x", cbuf, chain_pos, val);
                free(cbuf);
                free(ir_test);
                return ERROR_JTAG_INIT_FAILED;
@@ -2064,7 +2109,7 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
                        }
                        switch( n->value ){
                        case JTAG_CMD_TAPISENABLED:
-                               // below
+                               e = t->enabled;
                                break;
                        case JTAG_CMD_TAPENABLE:
                                jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
@@ -2138,7 +2183,8 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
        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,
-               COMMAND_CONFIG, NULL);
+               COMMAND_ANY,
+               "[none/trst_only/srst_only/trst_and_srst] [srst_pulls_trst/trst_pulls_srst] [combined/separate] [trst_push_pull/trst_open_drain] [srst_push_pull/srst_open_drain]");
        register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command,
                COMMAND_ANY, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
        register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command,
@@ -2211,7 +2257,7 @@ static int jtag_init_inner(struct command_context_s *cmd_ctx)
 
        if (jtag_validate_chain() != ERROR_OK)
        {
-               LOG_ERROR("Could not validate JTAG chain, continuing anyway...");
+               LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
        }
 
        return ERROR_OK;

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)