Encapsulate JTAG Cable API and interface structure, plan for new header file.
[fw/openocd] / src / jtag / bitbang.c
index 44e889864b2b5a821659c28478e0d3f602ffbd8c..9d50dcc8db35b98a3e042a1c3e4f2e2ff22fa479 100644 (file)
 #endif
 
 #include "bitbang.h"
-
-/* project specific includes */
-#include "log.h"
-#include "types.h"
+#define INCLUDE_JTAG_INTERFACE_H
 #include "jtag.h"
-#include "configuration.h"
-
-/* system includes */
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-
 
 /**
  * Function bitbang_stableclocks
@@ -71,12 +61,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 +74,13 @@ 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++)
+       int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
+       
+       for (i = skip; i < tms_count; i++)
        {
                tms = (tms_scan >> i) & 1;
                bitbang_interface->write(0, tms, 0);
@@ -103,7 +91,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 +127,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 +137,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 +151,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 +170,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 +182,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 +218,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)
@@ -274,13 +254,6 @@ int bitbang_execute_queue(void)
        {
                switch (cmd->type)
                {
-                       case JTAG_END_STATE:
-#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 != TAP_INVALID)
-                                       bitbang_end_state(cmd->cmd.end_state->end_state);
-                               break;
                        case JTAG_RESET:
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
@@ -313,7 +286,7 @@ int bitbang_execute_queue(void)
 #endif
                                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_