- Fixes '<<' whitespace
[openocd.git] / src / jtag / usbprog.c
index 5d5518da97b2b456596b3c0103e28dc01a6b36dc..c9ade3d6215b9a6aa5e3f77773368fbe34af0ba1 100644 (file)
 #include "config.h"
 #endif
 
-#include "replacements.h"
+#include "interface.h"
+#include "commands.h"
 
-#include "jtag.h"
 #include <usb.h>
 
-/* system includes */
-
-#include "log.h"
 
 #define VID 0x1781
 #define PID 0x0c63
 #define TCK_BIT                        2
 #define TMS_BIT                        1
 
-int usbprog_execute_queue(void);
-int usbprog_speed(int speed);
-int usbprog_register_commands(struct command_context_s *cmd_ctx);
-int usbprog_init(void);
-int usbprog_quit(void);
+static int usbprog_execute_queue(void);
+static int usbprog_speed(int speed);
+static int usbprog_register_commands(struct command_context_s *cmd_ctx);
+static int usbprog_init(void);
+static int usbprog_quit(void);
 
-void usbprog_end_state(tap_state_t state);
-void usbprog_state_move(void);
-void usbprog_path_move(pathmove_command_t *cmd);
-void usbprog_runtest(int num_cycles);
-void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size);
+static void usbprog_end_state(tap_state_t state);
+static void usbprog_state_move(void);
+static void usbprog_path_move(pathmove_command_t *cmd);
+static void usbprog_runtest(int num_cycles);
+static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size);
 
 jtag_interface_t usbprog_interface =
 {
@@ -91,60 +88,54 @@ struct usbprog_jtag
        struct usb_dev_handle* usb_handle;
 };
 
-struct usbprog_jtag * usbprog_jtag_handle;
+static struct usbprog_jtag * usbprog_jtag_handle;
+
+static struct usbprog_jtag* usbprog_jtag_open(void);
+//static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag);
+static void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag);
+static unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen);
 
-struct usbprog_jtag* usbprog_jtag_open(void);
-void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag);
-void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag);
-unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen);
+static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+static void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan);
 
-void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
-void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
-void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
-void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan);
+static char tms_chain[64];
+static int tms_chain_index;
 
-char tms_chain[64];
-int tms_chain_index;
-void usbprog_jtag_tms_collect(char tms_scan);
-void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag);
+static void usbprog_jtag_tms_collect(char tms_scan);
+static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag);
 
-void usbprog_write(int tck, int tms, int tdi);
-void usbprog_reset(int trst, int srst);
+static void usbprog_write(int tck, int tms, int tdi);
+static void usbprog_reset(int trst, int srst);
 
-void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction);
-void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value);
-unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag);
-void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value);
-int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit);
+static void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction);
+static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value);
+//static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag);
+static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value);
+//static int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit);
 
-int usbprog_speed(int speed)
+static int usbprog_speed(int speed)
 {
        return ERROR_OK;
 }
 
-int usbprog_register_commands(struct command_context_s *cmd_ctx)
+static int usbprog_register_commands(struct command_context_s *cmd_ctx)
 {
        return ERROR_OK;
 }
 
-int usbprog_execute_queue(void)
+static int usbprog_execute_queue(void)
 {
        jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
        int scan_size;
        enum scan_type type;
-       u8 *buffer;
+       uint8_t *buffer;
 
        while (cmd)
        {
                switch (cmd->type)
                {
-                       case JTAG_END_STATE:
-#ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("end_state: %i", cmd->cmd.end_state->end_state);
-#endif
-                               if (cmd->cmd.end_state->end_state != TAP_INVALID)
-                                       usbprog_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);
@@ -159,16 +150,14 @@ int usbprog_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
 #endif
-                               if (cmd->cmd.runtest->end_state != TAP_INVALID)
-                                       usbprog_end_state(cmd->cmd.runtest->end_state);
+                               usbprog_end_state(cmd->cmd.runtest->end_state);
                                usbprog_runtest(cmd->cmd.runtest->num_cycles);
                                break;
                        case JTAG_STATEMOVE:
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);
 #endif
-                               if (cmd->cmd.statemove->end_state != TAP_INVALID)
-                                       usbprog_end_state(cmd->cmd.statemove->end_state);
+                               usbprog_end_state(cmd->cmd.statemove->end_state);
                                usbprog_state_move();
                                break;
                        case JTAG_PATHMOVE:
@@ -182,8 +171,7 @@ int usbprog_execute_queue(void)
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("scan end in %i", cmd->cmd.scan->end_state);
 #endif
-                               if (cmd->cmd.scan->end_state != TAP_INVALID)
-                                       usbprog_end_state(cmd->cmd.scan->end_state);
+                               usbprog_end_state(cmd->cmd.scan->end_state);
                                scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
                                type = jtag_scan_type(cmd->cmd.scan);
                                usbprog_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
@@ -209,7 +197,7 @@ int usbprog_execute_queue(void)
        return ERROR_OK;
 }
 
-int usbprog_init(void)
+static int usbprog_init(void)
 {
        usbprog_jtag_handle = usbprog_jtag_open();
 
@@ -229,13 +217,13 @@ int usbprog_init(void)
        return ERROR_OK;
 }
 
-int usbprog_quit(void)
+static int usbprog_quit(void)
 {
        return ERROR_OK;
 }
 
 /*************** jtag execute commands **********************/
-void usbprog_end_state(tap_state_t state)
+static void usbprog_end_state(tap_state_t state)
 {
        if (tap_is_state_stable(state))
                tap_set_end_state(state);
@@ -246,13 +234,14 @@ void usbprog_end_state(tap_state_t state)
        }
 }
 
-void usbprog_state_move(void)
+static void usbprog_state_move(void)
 {
        int i = 0, tms = 0;
-       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
+       uint8_t tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
+       int tms_count = tap_get_tms_path_len(tap_get_state(), tap_get_end_state());
 
        usbprog_jtag_write_tms(usbprog_jtag_handle, (char)tms_scan);
-       for (i = 0; i < 7; i++)
+       for (i = 0; i < tms_count; i++)
        {
                tms = (tms_scan >> i) & 1;
        }
@@ -260,11 +249,15 @@ void usbprog_state_move(void)
        tap_set_state(tap_get_end_state());
 }
 
-void usbprog_path_move(pathmove_command_t *cmd)
+static void usbprog_path_move(pathmove_command_t *cmd)
 {
        int num_states = cmd->num_states;
        int state_count;
 
+       /* There may be queued transitions, and before following a specified
+          path, we must flush those queued transitions */
+       usbprog_jtag_tms_send(usbprog_jtag_handle);
+
        state_count = 0;
        while (num_states)
        {
@@ -294,7 +287,7 @@ void usbprog_path_move(pathmove_command_t *cmd)
        tap_set_end_state(tap_get_state());
 }
 
-void usbprog_runtest(int num_cycles)
+static void usbprog_runtest(int num_cycles)
 {
        int i;
 
@@ -323,6 +316,10 @@ void usbprog_runtest(int num_cycles)
                usbprog_write(0, 0, 0);
        }
 
+#ifdef _DEBUG_JTAG_IO_
+       LOG_DEBUG("runtest: cur_state %s end_state %s", tap_state_name(tap_get_state()), tap_state_name(tap_get_end_state()));
+#endif
+
        /* finish in end_state */
        /*
        usbprog_end_state(saved_end_state);
@@ -331,7 +328,7 @@ void usbprog_runtest(int num_cycles)
        */
 }
 
-void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
+static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size)
 {
        tap_state_t saved_end_state = tap_get_end_state();
 
@@ -340,26 +337,26 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        else
                usbprog_end_state(TAP_DRSHIFT);
 
-       /* usbprog_jtag_tms_send(usbprog_jtag_handle); */
+       /* Only move if we're not already there */
+       if (tap_get_state() != tap_get_end_state())
+               usbprog_state_move();
 
-       usbprog_state_move();
        usbprog_end_state(saved_end_state);
 
        usbprog_jtag_tms_send(usbprog_jtag_handle);
 
-       if (type == SCAN_OUT)
-       {
-               usbprog_jtag_write_tdi(usbprog_jtag_handle,buffer, scan_size);
-       }
-       if (type == SCAN_IN)
-       {
-               usbprog_jtag_read_tdo(usbprog_jtag_handle,buffer, scan_size);
-       }
-       if (type == SCAN_IO)
-       {
-               usbprog_jtag_write_and_read(usbprog_jtag_handle,buffer, scan_size);
+       void (*f)(struct usbprog_jtag *usbprog_jtag, char * buffer, int size);
+       switch (type) {
+       case SCAN_OUT: f = &usbprog_jtag_write_tdi; break;
+       case SCAN_IN: f = &usbprog_jtag_read_tdo; break;
+       case SCAN_IO: f = &usbprog_jtag_write_and_read; break;
+       default:
+               LOG_ERROR("unknown scan type: %i", type);
+               exit(-1);
        }
+       f(usbprog_jtag_handle, (char *)buffer, scan_size);
 
+       /* The adapter does the transition to PAUSE internally */
        if (ir_scan)
                tap_set_state(TAP_IRPAUSE);
        else
@@ -371,22 +368,22 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 
 /*************** jtag wrapper functions *********************/
 
-void usbprog_write(int tck, int tms, int tdi)
+static void usbprog_write(int tck, int tms, int tdi)
 {
        unsigned char output_value=0x00;
 
        if (tms)
-               output_value |= (1<<TMS_BIT);
+               output_value |= (1 << TMS_BIT);
        if (tdi)
-               output_value |= (1<<TDI_BIT);
+               output_value |= (1 << TDI_BIT);
        if (tck)
-               output_value |= (1<<TCK_BIT);
+               output_value |= (1 << TCK_BIT);
 
        usbprog_jtag_write_slice(usbprog_jtag_handle,output_value);
 }
 
 /* (1) assert or (0) deassert reset lines */
-void usbprog_reset(int trst, int srst)
+static void usbprog_reset(int trst, int srst)
 {
        LOG_DEBUG("trst: %i, srst: %i", trst, srst);
 
@@ -441,13 +438,15 @@ struct usbprog_jtag* usbprog_jtag_open(void)
        return 0;
 }
 
-void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag)
+#if 0
+static void usbprog_jtag_close(struct usbprog_jtag *usbprog_jtag)
 {
        usb_close(usbprog_jtag->usb_handle);
        free(usbprog_jtag);
 }
+#endif
 
-unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen)
+static unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg, int msglen)
 {
        int res = usb_bulk_write(usbprog_jtag->usb_handle, 3, msg,msglen, 100);
        if ((msg[0] == 2) || (msg[0] == 1) || (msg[0] == 4) || (msg[0] == 0) || \
@@ -467,12 +466,12 @@ unsigned char usbprog_jtag_message(struct usbprog_jtag *usbprog_jtag, char *msg,
        return 0;
 }
 
-void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag)
+static void usbprog_jtag_init(struct usbprog_jtag *usbprog_jtag)
 {
        usbprog_jtag_set_direction(usbprog_jtag, 0xFE);
 }
 
-void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, fillindex = 0, i, loops;
@@ -527,7 +526,7 @@ void usbprog_jtag_write_and_read(struct usbprog_jtag *usbprog_jtag, char * buffe
        }
 }
 
-void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, fillindex = 0, i, loops;
@@ -574,7 +573,7 @@ void usbprog_jtag_read_tdo(struct usbprog_jtag *usbprog_jtag, char * buffer, int
        }
 }
 
-void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
+static void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, int size)
 {
        char tmp[64];   /* fastes packet size for usb controller */
        int send_bits, bufindex = 0, i, loops;
@@ -592,7 +591,7 @@ void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, in
                {
                        send_bits = size;
                        loops = size/8;
-                       /* if(loops==0) */
+                       /* if (loops==0) */
                        loops++;
                        size = 0;
                }
@@ -610,12 +609,12 @@ void usbprog_jtag_write_tdi(struct usbprog_jtag *usbprog_jtag, char * buffer, in
        }
 }
 
-void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan)
+static void usbprog_jtag_write_tms(struct usbprog_jtag *usbprog_jtag, char tms_scan)
 {
        usbprog_jtag_tms_collect(tms_scan);
 }
 
-void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction)
+static void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char direction)
 {
        char tmp[2];
        tmp[0] = PORT_DIRECTION;
@@ -623,7 +622,7 @@ void usbprog_jtag_set_direction(struct usbprog_jtag *usbprog_jtag, unsigned char
        usbprog_jtag_message(usbprog_jtag, tmp, 2);
 }
 
-void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value)
+static void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char value)
 {
        char tmp[2];
        tmp[0] = PORT_SET;
@@ -631,15 +630,17 @@ void usbprog_jtag_write_slice(struct usbprog_jtag *usbprog_jtag,unsigned char va
        usbprog_jtag_message(usbprog_jtag, tmp, 2);
 }
 
-unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag)
+#if 0
+static unsigned char usbprog_jtag_get_port(struct usbprog_jtag *usbprog_jtag)
 {
        char tmp[2];
        tmp[0] = PORT_GET;
        tmp[1] = 0x00;
        return usbprog_jtag_message(usbprog_jtag, tmp, 2);
 }
+#endif
 
-void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
+static void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
 {
        char tmp[3];
        tmp[0] = PORT_SETBIT;
@@ -651,7 +652,8 @@ void usbprog_jtag_set_bit(struct usbprog_jtag *usbprog_jtag,int bit, int value)
        usbprog_jtag_message(usbprog_jtag, tmp, 3);
 }
 
-int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit)
+#if 0
+static int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit)
 {
        char tmp[2];
        tmp[0] = PORT_GETBIT;
@@ -662,14 +664,15 @@ int usbprog_jtag_get_bit(struct usbprog_jtag *usbprog_jtag, int bit)
        else
                return 0;
 }
+#endif
 
-void usbprog_jtag_tms_collect(char tms_scan)
+static void usbprog_jtag_tms_collect(char tms_scan)
 {
        tms_chain[tms_chain_index] = tms_scan;
        tms_chain_index++;
 }
 
-void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
+static void usbprog_jtag_tms_send(struct usbprog_jtag *usbprog_jtag)
 {
        int i;
        /* LOG_INFO("TMS SEND"); */

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)