Change last_comand_pointer to last_command_pointer by Michael Bruck <mbruck@digenius.de>
[fw/openocd] / src / jtag / bitbang.c
index 92ba6cc0aa755f5f1b87971e5403dbaf371de2fe..9cb7edc03258f6e069388d3f6ac71c0a07cb19bc 100644 (file)
 #endif
 
 #include "bitbang.h"
-
-/* project specific includes */
-#include "log.h"
-#include "types.h"
 #include "jtag.h"
-#include "configuration.h"
-
-/* system includes */
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
 
 /**
  * Function bitbang_stableclocks
@@ -71,12 +60,9 @@ bitbang_interface_t *bitbang_interface;
  */
 #define CLOCK_IDLE() 0
 
-int bitbang_execute_queue(void);
-
 
 /* The bitbang driver leaves the TCK 0 when in idle */
-
-void bitbang_end_state(tap_state_t state)
+static void bitbang_end_state(tap_state_t state)
 {
        if (tap_is_state_stable(state))
                tap_set_end_state(state);
@@ -87,12 +73,12 @@ void bitbang_end_state(tap_state_t state)
        }
 }
 
-void bitbang_state_move(void)
+static void bitbang_state_move(int skip)
 {
        int i=0, tms=0;
        u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
-       for (i = 0; i < 7; i++)
+       for (i = skip; i < 7; i++)
        {
                tms = (tms_scan >> i) & 1;
                bitbang_interface->write(0, tms, 0);
@@ -103,7 +89,7 @@ void bitbang_state_move(void)
        tap_set_state(tap_get_end_state());
 }
 
-void bitbang_path_move(pathmove_command_t *cmd)
+static void bitbang_path_move(pathmove_command_t *cmd)
 {
        int num_states = cmd->num_states;
        int state_count;
@@ -139,7 +125,7 @@ void bitbang_path_move(pathmove_command_t *cmd)
        tap_set_end_state(tap_get_state());
 }
 
-void bitbang_runtest(int num_cycles)
+static void bitbang_runtest(int num_cycles)
 {
        int i;
 
@@ -149,7 +135,7 @@ void bitbang_runtest(int num_cycles)
        if (tap_get_state() != TAP_IDLE)
        {
                bitbang_end_state(TAP_IDLE);
-               bitbang_state_move();
+               bitbang_state_move(0);
        }
 
        /* execute num_cycles */
@@ -163,7 +149,7 @@ void bitbang_runtest(int num_cycles)
        /* finish in end_state */
        bitbang_end_state(saved_end_state);
        if (tap_get_state() != tap_get_end_state())
-               bitbang_state_move();
+               bitbang_state_move(0);
 }
 
 
@@ -182,7 +168,7 @@ static void bitbang_stableclocks(int num_cycles)
 
 
 
-void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
+static void bitbang_scan(bool ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
        tap_state_t saved_end_state = tap_get_end_state();
        int bit_cnt;
@@ -194,7 +180,7 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
                else
                        bitbang_end_state(TAP_DRSHIFT);
 
-               bitbang_state_move();
+               bitbang_state_move(0);
                bitbang_end_state(saved_end_state);
        }
 
@@ -230,22 +216,14 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
                }
        }
 
-       /* TAP_DRSHIFT & TAP_IRSHIFT are illegal end states, so we always transition to the pause
-        * state which is a legal stable state from which statemove will work.
-        *
-        * Exit1 -> Pause
-        */
-       bitbang_interface->write(0, 0, 0);
-       bitbang_interface->write(1, 0, 0);
-       bitbang_interface->write(CLOCK_IDLE(), 0, 0);
-
-       if (ir_scan)
-               tap_set_state(TAP_IRPAUSE);
-       else
-               tap_set_state(TAP_DRPAUSE);
-
        if (tap_get_state() != tap_get_end_state())
-               bitbang_state_move();
+       {
+               /* we *KNOW* the above loop transitioned out of
+                * the shift state, so we skip the first state
+                * and move directly to the end state.
+                */
+               bitbang_state_move(1);
+       }
 }
 
 int bitbang_execute_queue(void)
@@ -278,7 +256,7 @@ int bitbang_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("end_state: %s", tap_state_name(cmd->cmd.end_state->end_state) );
 #endif
-                               if (cmd->cmd.end_state->end_state != -1)
+                               if (cmd->cmd.end_state->end_state != TAP_INVALID)
                                        bitbang_end_state(cmd->cmd.end_state->end_state);
                                break;
                        case JTAG_RESET:
@@ -295,7 +273,7 @@ int bitbang_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name(cmd->cmd.runtest->end_state) );
 #endif
-                               if (cmd->cmd.runtest->end_state != -1)
+                               if (cmd->cmd.runtest->end_state != TAP_INVALID)
                                        bitbang_end_state(cmd->cmd.runtest->end_state);
                                bitbang_runtest(cmd->cmd.runtest->num_cycles);
                                break;
@@ -311,9 +289,9 @@ int bitbang_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
 #endif
-                               if (cmd->cmd.statemove->end_state != -1)
+                               if (cmd->cmd.statemove->end_state != TAP_INVALID)
                                        bitbang_end_state(cmd->cmd.statemove->end_state);
-                               bitbang_state_move();
+                               bitbang_state_move(0);
                                break;
                        case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
@@ -326,7 +304,7 @@ int bitbang_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("%s scan end in %s",  (cmd->cmd.scan->ir_scan) ? "IR" : "DR", tap_state_name(cmd->cmd.scan->end_state) );
 #endif
-                               if (cmd->cmd.scan->end_state != -1)
+                               if (cmd->cmd.scan->end_state != TAP_INVALID)
                                        bitbang_end_state(cmd->cmd.scan->end_state);
                                scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
                                type = jtag_scan_type(cmd->cmd.scan);