- Update tap_state_strings to correspond to SVF state names
[openocd.git] / src / jtag / bitq.c
index 05f4c925a45d1eacebf9b8693c6a0e3d7a845144..6dc9ec9690e3976c678cc02b81ee600294100602 100644 (file)
 #include <stdlib.h>
 #include <unistd.h>
 
-#include <sys/time.h>
-#include <time.h>
-
-
 bitq_interface_t *bitq_interface; /* low level bit queue interface */
 
 bitq_state_t bitq_in_state; /* state of input queue */
@@ -45,12 +41,11 @@ bitq_state_t bitq_in_state; /* state of input queue */
 u8 *bitq_in_buffer; /* buffer dynamically reallocated as needed */
 unsigned long bitq_in_bufsize=32; /* min. buffer size */
 
-
 /*
  * input queue processing does not use jtag_read_buffer() to avoid unnecessary overhead
  * also the buffer for incomming data is reallocated only if necessary
  * no parameters, makes use of stored state information
- */ 
+ */
 void bitq_in_proc(void)
 {
        /* static information preserved between calls to increase performance */
@@ -60,8 +55,6 @@ void bitq_in_proc(void)
 
        scan_field_t *field;
        int tdo;
-       
-       int result;
 
        /* loop through the queue */
        while (bitq_in_state.cmd) {
@@ -71,7 +64,7 @@ void bitq_in_proc(void)
                        while (bitq_in_state.field_idx<bitq_in_state.cmd->cmd.scan->num_fields) {
 
                                field=&bitq_in_state.cmd->cmd.scan->fields[bitq_in_state.field_idx];
-                               if (field->in_check_value || field->in_value || field->in_handler) {
+                               if ( field->in_value || field->in_handler) {
 
                                        if (bitq_in_state.bit_pos==0) {
                                                /* initialize field scanning */
@@ -90,10 +83,10 @@ void bitq_in_proc(void)
                                                                /* double the buffer size until it fits */
                                                                while (field->num_bits>bitq_in_bufsize*8) bitq_in_bufsize*=2;
                                                        }
-                                                       /* if necessary, allocate buffer and check for malloc error */ 
+                                                       /* if necessary, allocate buffer and check for malloc error */
                                                        if (bitq_in_buffer==NULL && (bitq_in_buffer=malloc(bitq_in_bufsize))==NULL) {
-                                                               ERROR("malloc error");
-                                                               exit(-1);                
+                                                               LOG_ERROR("malloc error");
+                                                               exit(-1);
                                                        }
                                                        in_buff=(void *)bitq_in_buffer;
                                                }
@@ -103,7 +96,7 @@ void bitq_in_proc(void)
                                        while (bitq_in_state.bit_pos<field->num_bits) {
                                                if ((tdo=bitq_interface->in())<0) {
 #ifdef _DEBUG_JTAG_IO_
-                                                       DEBUG("bitq in EOF");
+                                                       LOG_DEBUG("bitq in EOF");
 #endif
                                                        return;
                                                }
@@ -116,34 +109,14 @@ void bitq_in_proc(void)
                                                else in_mask<<=1;
                                                bitq_in_state.bit_pos++;
                                        }
-                                       
-                                       if (field->in_check_value) {
-                                               /* match scanned in value */
-                                               for (in_idx=0; in_idx*8<field->num_bits; in_idx++) {
-                                                       if (field->in_check_mask) in_mask=field->in_check_mask[in_idx];
-                                                       else in_mask=0xff;
-                                                       if (field->num_bits-in_idx*8<8) in_mask>>=8-(field->num_bits-in_idx*8);
-                                                       if (field->in_check_value[in_idx]&in_mask!=in_buff[in_idx]&in_mask) {
-                                                               char *captured_char = buf_to_str(in_buff, (field->num_bits > 64) ? 64 : field->num_bits, 16);
-                                                               char *in_check_value_char = buf_to_str(field->in_check_value, (field->num_bits > 64) ? 64 : field->num_bits, 16);
-                                                               char *in_check_mask_char = buf_to_str(field->in_check_mask, (field->num_bits > 64) ? 64 : field->num_bits, 16);
-                                                               /* TODO: error reporting */
-                                                               WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s check_mask: 0x%s", captured_char, in_check_value_char, in_check_mask_char);
-                                                               bitq_in_state.status=ERROR_JTAG_QUEUE_FAILED;
-                                                               free(captured_char);
-                                                               free(in_check_value_char);
-                                                               free(in_check_mask_char);
-                                                               break; /* leave the comparison loop upon first mismatch */                                              
-                                                       }
-                                               }
-                                       }
+
 
                                        if (field->in_handler && bitq_in_state.status==ERROR_OK) {
-                                               bitq_in_state.status=(*field->in_handler)(in_buff, field->in_handler_priv);
+                                               bitq_in_state.status=(*field->in_handler)(in_buff, field->in_handler_priv, field);
                                        }
 
                                }
-                               
+
                                bitq_in_state.field_idx++; /* advance to next field */
                                bitq_in_state.bit_pos=0; /* start next field from the first bit */
                        }
@@ -154,37 +127,33 @@ void bitq_in_proc(void)
        }
 }
 
-
-
 void bitq_io(int tms, int tdi, int tdo_req)
 {
        bitq_interface->out(tms, tdi, tdo_req);
-       /* check and process the input queue */ 
+       /* check and process the input queue */
        if (bitq_interface->in_rdy()) bitq_in_proc();
 }
 
-
 void bitq_end_state(enum tap_state state)
 {
        if (state==-1) return;
        if (tap_move_map[state]==-1) {
-               ERROR("BUG: %i is not a valid end state", state);
+               LOG_ERROR("BUG: %i is not a valid end state", state);
                exit(-1);
        }
        end_state = state;
 }
 
-
 void bitq_state_move(enum tap_state new_state)
 {
        int i=0;
        u8 tms_scan;
 
        if (tap_move_map[cur_state]==-1 || tap_move_map[new_state]==-1) {
-               ERROR("TAP move from or to unstable state");
+               LOG_ERROR("TAP move from or to unstable state");
                exit(-1);
        }
-       
+
        tms_scan=TAP_MOVE(cur_state, new_state);
 
        for (i=0; i<7; i++) {
@@ -195,7 +164,6 @@ void bitq_state_move(enum tap_state new_state)
        cur_state = new_state;
 }
 
-
 void bitq_path_move(pathmove_command_t *cmd)
 {
        int i;
@@ -204,7 +172,7 @@ void bitq_path_move(pathmove_command_t *cmd)
                if (tap_transitions[cur_state].low == cmd->path[i]) bitq_io(0, 0, 0);
                else if (tap_transitions[cur_state].high == cmd->path[i]) bitq_io(1, 0, 0);
                else {
-                       ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_strings[cur_state], tap_state_strings[cmd->path[i]]);
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[i)]);
                        exit(-1);
                }
 
@@ -214,13 +182,12 @@ void bitq_path_move(pathmove_command_t *cmd)
        end_state = cur_state;
 }
 
-
 void bitq_runtest(int num_cycles)
 {
        int i;
 
-       /* only do a state_move when we're not already in RTI */
-       if (cur_state != TAP_RTI) bitq_state_move(TAP_RTI);
+       /* only do a state_move when we're not already in IDLE */
+       if (cur_state != TAP_IDLE) bitq_state_move(TAP_IDLE);
 
        /* execute num_cycles */
        for (i = 0; i < num_cycles; i++)
@@ -230,7 +197,6 @@ void bitq_runtest(int num_cycles)
        if (cur_state != end_state) bitq_state_move(end_state);
 }
 
-
 void bitq_scan_field(scan_field_t *field, int pause)
 {
        int bit_cnt;
@@ -238,8 +204,8 @@ void bitq_scan_field(scan_field_t *field, int pause)
 
        u8 *out_ptr;
        u8 out_mask;
-       
-       if (field->in_check_value || field->in_value || field->in_handler) tdo_req=1;
+
+       if ( field->in_value || field->in_handler) tdo_req=1;
        else tdo_req=0;
 
        if (field->out_value==NULL) {
@@ -265,29 +231,27 @@ void bitq_scan_field(scan_field_t *field, int pause)
 
        if (pause) {
                bitq_io(0,0,0);
-               if (cur_state==TAP_SI) cur_state=TAP_PI;
-               else if (cur_state==TAP_SD) cur_state=TAP_PD;
+               if (cur_state==TAP_IRSHIFT) cur_state=TAP_IRPAUSE;
+               else if (cur_state==TAP_DRSHIFT) cur_state=TAP_DRPAUSE;
        }
 }
 
-
 void bitq_scan(scan_command_t *cmd)
 {
        int i;
 
-       if (cmd->ir_scan) bitq_state_move(TAP_SI);
-       else bitq_state_move(TAP_SD);
+       if (cmd->ir_scan) bitq_state_move(TAP_IRSHIFT);
+       else bitq_state_move(TAP_DRSHIFT);
 
        for (i=0; i < cmd->num_fields-1; i++)
                bitq_scan_field(&cmd->fields[i], 0);
        bitq_scan_field(&cmd->fields[i], 1);
 }
 
-
 int bitq_execute_queue(void)
 {
        jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
-       
+
        bitq_in_state.cmd = jtag_command_queue;
        bitq_in_state.field_idx = 0;
        bitq_in_state.bit_pos = 0;
@@ -299,22 +263,26 @@ int bitq_execute_queue(void)
 
                        case JTAG_END_STATE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
+                               LOG_DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
 #endif
                                bitq_end_state(cmd->cmd.end_state->end_state);
                                break;
 
                        case JTAG_RESET:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+                               LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
 #endif
+                               if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
+                               {
+                                       cur_state = TAP_RESET;
+                               }
                                bitq_interface->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                if (bitq_interface->in_rdy()) bitq_in_proc();
                                break;
 
                        case JTAG_RUNTEST:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
+                               LOG_DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
 #endif
                                bitq_end_state(cmd->cmd.runtest->end_state);
                                bitq_runtest(cmd->cmd.runtest->num_cycles);
@@ -322,7 +290,7 @@ int bitq_execute_queue(void)
 
                        case JTAG_STATEMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
+                               LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
 #endif
                                bitq_end_state(cmd->cmd.statemove->end_state);
                                bitq_state_move(end_state); /* uncoditional TAP move */
@@ -330,16 +298,16 @@ int bitq_execute_queue(void)
 
                        case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
+                               LOG_DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
 #endif
                                bitq_path_move(cmd->cmd.pathmove);
                                break;
 
                        case JTAG_SCAN:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("scan end in %i", cmd->cmd.scan->end_state);
-                               if (cmd->cmd.scan->ir_scan) DEBUG("scan ir");
-                               else DEBUG("scan dr");
+                               LOG_DEBUG("scan end in %i", cmd->cmd.scan->end_state);
+                               if (cmd->cmd.scan->ir_scan) LOG_DEBUG("scan ir");
+                               else LOG_DEBUG("scan dr");
 #endif
                                bitq_end_state(cmd->cmd.scan->end_state);
                                bitq_scan(cmd->cmd.scan);
@@ -348,14 +316,14 @@ int bitq_execute_queue(void)
 
                        case JTAG_SLEEP:
 #ifdef _DEBUG_JTAG_IO_
-                               DEBUG("sleep %i", cmd->cmd.sleep->us);
+                               LOG_DEBUG("sleep %i", cmd->cmd.sleep->us);
 #endif
                                bitq_interface->sleep(cmd->cmd.sleep->us);
                                if (bitq_interface->in_rdy()) bitq_in_proc();
                                break;
 
                        default:
-                               ERROR("BUG: unknown JTAG command type encountered");
+                               LOG_ERROR("BUG: unknown JTAG command type encountered");
                                exit(-1);
                }
 
@@ -366,18 +334,17 @@ int bitq_execute_queue(void)
        bitq_in_proc();
 
        if (bitq_in_state.cmd) {
-               ERROR("missing data from bitq interface");
+               LOG_ERROR("missing data from bitq interface");
                return ERROR_JTAG_QUEUE_FAILED;
        }
        if (bitq_interface->in()>=0) {
-               ERROR("extra data from bitq interface");
+               LOG_ERROR("extra data from bitq interface");
                return ERROR_JTAG_QUEUE_FAILED;
        }
 
        return bitq_in_state.status;
 }
 
-
 void bitq_cleanup(void)
 {
        if (bitq_in_buffer!=NULL)

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)