- Cable driver helper API courtesy of Dick Hollenbeck <dick@softplc.com>
authorkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 3 Feb 2009 05:59:17 +0000 (05:59 +0000)
committerkc8apf <kc8apf@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Tue, 3 Feb 2009 05:59:17 +0000 (05:59 +0000)
- Formatting changes from uncrustify

git-svn-id: svn://svn.berlios.de/openocd/trunk@1366 b42882b7-edfa-0310-969c-e2dbd0fdcd60

21 files changed:
src/flash/str9xpec.c
src/helper/binarybuffer.c
src/jtag/amt_jtagaccel.c
src/jtag/bitbang.c
src/jtag/bitq.c
src/jtag/dummy.c
src/jtag/ft2232.c
src/jtag/gw16012.c
src/jtag/jlink.c
src/jtag/jtag.c
src/jtag/jtag.h
src/jtag/rlink/rlink.c
src/jtag/usbprog.c
src/jtag/vsllink.c
src/jtag/zy1000.c
src/svf/svf.c
src/target/arm11.h
src/target/arm11_dbgtap.c
src/target/xscale.c
src/xsvf/xsvf.c
tools/xsvf_tools/svf2xsvf.py

index 6c49419eb974b34d8aa26c28e03f5b3fbf9517fd..fdfc9c7fe70108ea834afa590187a15ddcf0b463 100644 (file)
@@ -111,7 +111,7 @@ int str9xpec_register_commands(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
-int str9xpec_set_instr(jtag_tap_t *tap, u32 new_instr, enum tap_state end_state)
+int str9xpec_set_instr(jtag_tap_t *tap, u32 new_instr, tap_state_t end_state)
 {
        if( tap == NULL ){
                return ERROR_TARGET_INVALID;
index 4a43d1c0be39bcd039586a38a5cb88545af0f95a..12c9391c59fd621de4c8b3aac7bdd1a1f5e90a2d 100644 (file)
 
 #include "binarybuffer.h"
 
-const unsigned char bit_reverse_table256[] = 
+const unsigned char bit_reverse_table256[] =
 {
-  0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 
-  0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, 
-  0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, 
-  0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, 
-  0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, 
+  0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+  0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+  0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+  0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+  0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
   0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
-  0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, 
+  0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
   0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
   0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
-  0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, 
+  0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
   0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
   0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
-  0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, 
+  0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
   0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
-  0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, 
+  0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
   0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
 };
 
@@ -63,8 +63,8 @@ u8* buf_cpy(u8 *from, u8 *to, int size)
 
        for (i = 0; i < num_bytes; i++)
                to[i] = from[i];
-       
-       /* mask out bits that don't belong to the buffer */     
+
+       /* mask out bits that don't belong to the buffer */
        if (size % 8)
        {
                to[size / 8] &= (0xff >> (8 - (size % 8)));
@@ -111,7 +111,7 @@ int buf_cmp_mask(u8 *buf1, u8 *buf2, u8 *mask, int size)
                /* mask out bits that don't really belong to the buffer if size isn't a multiple of 8 bits */
                if ((size % 8) && (i == num_bytes -1 ))
                {
-                       if ((buf1[i] & ((1 << (size % 8)) - 1) & mask[i]) != 
+                       if ((buf1[i] & ((1 << (size % 8)) - 1) & mask[i]) !=
                                (buf2[i] & ((1 << (size % 8)) - 1) & mask[i]))
                                return 1;
                }
@@ -136,10 +136,10 @@ u8* buf_set_ones(u8 *buf, int count)
                        buf[i] = 0xff;
                else
                        buf[i] = (1 << count) - 1;
-       
+
                count -= 8;
        }
-       
+
        return buf;
 }
 
@@ -147,7 +147,7 @@ u8* buf_set_buf(u8 *src, int src_start, u8 *dst, int dst_start, int len)
 {
        int src_idx = src_start, dst_idx = dst_start;
        int i;
-       
+
        for (i = 0; i < len; i++)
        {
                if (((src[src_idx/8] >> (src_idx % 8)) & 1) == 1)
@@ -164,9 +164,9 @@ u8* buf_set_buf(u8 *src, int src_start, u8 *dst, int dst_start, int len)
 u32 flip_u32(u32 value, unsigned int num)
 {
        u32 c;
-       
-       c = (bit_reverse_table256[value & 0xff] << 24) | 
-               (bit_reverse_table256[(value >> 8) & 0xff] << 16) | 
+
+       c = (bit_reverse_table256[value & 0xff] << 24) |
+               (bit_reverse_table256[(value >> 8) & 0xff] << 16) |
                (bit_reverse_table256[(value >> 16) & 0xff] << 8) |
                (bit_reverse_table256[(value >> 24) & 0xff]);
 
@@ -179,21 +179,21 @@ u32 flip_u32(u32 value, unsigned int num)
 int ceil_f_to_u32(float x)
 {
        u32 y;
-       
+
        if (x < 0)      /* return zero for negative numbers */
                return 0;
-       
+
        y = x;  /* cut off fraction */
-       
+
        if ((x - y) > 0.0) /* if there was a fractional part, increase by one */
                y++;
-       
+
        return y;
 }
 
 char* buf_to_str(const u8 *buf, int buf_len, int radix)
 {
-       const char *DIGITS = "0123456789abcdef";
+       const char *DIGITS = "0123456789ABCDEF";
        float factor;
        char *str;
        int str_len;
@@ -202,7 +202,7 @@ char* buf_to_str(const u8 *buf, int buf_len, int radix)
 
        int j; /* base-256 digits */
        int i; /* output digits (radix) */
-       
+
        if (radix == 16)
        {
                factor = 2.0;   /* log(256) / log(16) = 2.0 */
@@ -217,10 +217,10 @@ char* buf_to_str(const u8 *buf, int buf_len, int radix)
        }
        else
                return NULL;
-       
+
        str_len = ceil_f_to_u32(CEIL(buf_len, 8) * factor);
        str = calloc(str_len + 1, 1);
-       
+
        for (i = b256_len - 1; i >= 0; i--)
        {
                tmp = buf[i];
@@ -237,7 +237,7 @@ char* buf_to_str(const u8 *buf, int buf_len, int radix)
 
        for (j = 0; j < str_len; j++)
                str[j] = DIGITS[(int)str[j]];
-       
+
        return str;
 }
 
@@ -247,12 +247,12 @@ int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
        u32 tmp;
        float factor;
        u8 *b256_buf;
-       int b256_len; 
-       
+       int b256_len;
+
        int j; /* base-256 digits */
        int i; /* input digits (ASCII) */
-       
-       if (radix == 0) 
+
+       if (radix == 0)
        {
                /* identify radix, and skip radix-prefix (0, 0x or 0X) */
                if ((str[0] == '0') && (str[1] && ((str[1] == 'x') || (str[1] == 'X'))))
@@ -272,7 +272,7 @@ int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
                        radix = 10;
                }
        }
-       
+
        if (radix == 16)
                factor = 0.5; /* log(16) / log(256) = 0.5 */
        else if (radix == 10)
@@ -286,14 +286,14 @@ int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
        charbuf = malloc(str_len + 1);
        memcpy(charbuf, str, str_len);
        charbuf[str_len] = '\0';
-       
+
        /* number of digits in base-256 notation */
        b256_len = ceil_f_to_u32(str_len * factor);
        b256_buf = calloc(b256_len, 1);
-               
+
        /* go through zero terminated buffer */
        for (i = 0; charbuf[i]; i++)
-       { 
+       {
                tmp = charbuf[i];
                if ((tmp >= '0') && (tmp <= '9'))
                        tmp = (tmp - '0');
@@ -302,19 +302,19 @@ int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
                else if ((tmp >= 'A') && (tmp <= 'F'))
                        tmp = (tmp - 'A' + 10);
                else continue;  /* skip characters other than [0-9,a-f,A-F] */
-               
+
                if (tmp >= radix)
-                       continue;       /* skip digits invalid for the current radix */ 
-               
+                       continue;       /* skip digits invalid for the current radix */
+
                for (j = 0; j < b256_len; j++)
                {
                        tmp += (u32)b256_buf[j] * radix;
                        b256_buf[j] = (u8)(tmp & 0xFF);
                        tmp >>= 8;
                }
-               
+
        }
-       
+
        for (j = 0; j < CEIL(buf_len, 8); j++)
        {
                if (j < b256_len)
@@ -326,18 +326,18 @@ int str_to_buf(const char *str, int str_len, u8 *buf, int buf_len, int radix)
        /* mask out bits that don't belong to the buffer */
        if (buf_len % 8)
                buf[(buf_len / 8)] &= 0xff >> (8 - (buf_len % 8));
-               
+
        free(b256_buf);
        free(charbuf);
-       
+
        return i;
 }
 
 int buf_to_u32_handler(u8 *in_buf, void *priv, struct scan_field_s *field)
 {
        u32 *dest = priv;
-       
+
        *dest = buf_get_u32(in_buf, 0, 32);
-       
+
        return ERROR_OK;
 }
index 26e2f8ecc6c9cf0caf1893f56f660e5a44b0206d..08d6906e349eca930e79fd869be667042b31b755 100644 (file)
@@ -109,6 +109,7 @@ u8 amt_jtagaccel_tap_move[6][6][2] =
        {{0x1f, 0x00}, {0x0c, 0x00}, {0x07, 0x00}, {0x97, 0x00}, {0x08, 0x00}, {0x00, 0x00}},   /* IRPAUSE  */
 };
 
+
 jtag_interface_t amt_jtagaccel_interface =
 {
        .name = "amt_jtagaccel",
@@ -157,8 +158,8 @@ int amt_jtagaccel_speed(int speed)
 
 void amt_jtagaccel_end_state(int state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -187,8 +188,11 @@ void amt_jtagaccel_state_move(void)
        u8 aw_scan_tms_5;
        u8 tms_scan[2];
 
-       tms_scan[0] = amt_jtagaccel_tap_move[tap_move_map[cur_state]][tap_move_map[end_state]][0];
-       tms_scan[1] = amt_jtagaccel_tap_move[tap_move_map[cur_state]][tap_move_map[end_state]][1];
+       tap_state_t     cur_state = tap_get_state();
+       tap_state_t     end_state = tap_get_end_state();
+
+       tms_scan[0] = amt_jtagaccel_tap_move[tap_move_ndx(cur_state)][tap_move_ndx(end_state)][0];
+       tms_scan[1] = amt_jtagaccel_tap_move[tap_move_ndx(cur_state)][tap_move_ndx(end_state)][1];
 
        aw_scan_tms_5 = 0x40 | (tms_scan[0] & 0x1f);
        AMT_AW(aw_scan_tms_5);
@@ -203,7 +207,7 @@ void amt_jtagaccel_state_move(void)
                        amt_wait_scan_busy();
        }
 
-       cur_state = end_state;
+       tap_set_state(end_state);
 }
 
 void amt_jtagaccel_runtest(int num_cycles)
@@ -212,10 +216,10 @@ void amt_jtagaccel_runtest(int num_cycles)
        u8 aw_scan_tms_5;
        u8 aw_scan_tms_1to4;
 
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                amt_jtagaccel_end_state(TAP_IDLE);
                amt_jtagaccel_state_move();
@@ -235,7 +239,7 @@ void amt_jtagaccel_runtest(int num_cycles)
        }
 
        amt_jtagaccel_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                amt_jtagaccel_state_move();
 }
 
@@ -243,7 +247,7 @@ void amt_jtagaccel_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_s
 {
        int bits_left = scan_size;
        int bit_count = 0;
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
        u8 aw_tdi_option;
        u8 dw_tdi_scan;
        u8 dr_tdo;
@@ -297,8 +301,8 @@ void amt_jtagaccel_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_s
                bits_left -= 8;
        }
 
-       tms_scan[0] = amt_jtagaccel_tap_move[tap_move_map[cur_state]][tap_move_map[end_state]][0];
-       tms_scan[1] = amt_jtagaccel_tap_move[tap_move_map[cur_state]][tap_move_map[end_state]][1];
+       tms_scan[0] = amt_jtagaccel_tap_move[tap_move_ndx(tap_get_state())][tap_move_ndx(tap_get_end_state())][0];
+       tms_scan[1] = amt_jtagaccel_tap_move[tap_move_ndx(tap_get_state())][tap_move_ndx(tap_get_end_state())][1];
        aw_tms_scan = 0x40 | (tms_scan[0] & 0x1f) | (buf_get_u32(buffer, bit_count, 1) << 5);
        AMT_AW(aw_tms_scan);
        if (jtag_speed > 3 || rtck_enabled)
@@ -318,7 +322,7 @@ void amt_jtagaccel_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_s
                if (jtag_speed > 3 || rtck_enabled)
                        amt_wait_scan_busy();
        }
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 int amt_jtagaccel_execute_queue(void)
@@ -351,7 +355,7 @@ int amt_jtagaccel_execute_queue(void)
 #endif
                                if (cmd->cmd.reset->trst == 1)
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                amt_jtagaccel_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
@@ -404,26 +408,26 @@ int amt_jtagaccel_execute_queue(void)
 #if PARPORT_USE_GIVEIO == 1
 int amt_jtagaccel_get_giveio_access(void)
 {
-    HANDLE h;
-    OSVERSIONINFO version;
+       HANDLE h;
+       OSVERSIONINFO version;
 
-    version.dwOSVersionInfoSize = sizeof version;
-    if (!GetVersionEx( &version )) {
+       version.dwOSVersionInfoSize = sizeof version;
+       if (!GetVersionEx( &version )) {
        errno = EINVAL;
        return -1;
-    }
-    if (version.dwPlatformId != VER_PLATFORM_WIN32_NT)
+       }
+       if (version.dwPlatformId != VER_PLATFORM_WIN32_NT)
        return 0;
 
-    h = CreateFile( "\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
-    if (h == INVALID_HANDLE_VALUE) {
+       h = CreateFile( "\\\\.\\giveio", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
+       if (h == INVALID_HANDLE_VALUE) {
        errno = ENODEV;
        return -1;
-    }
+       }
 
-    CloseHandle( h );
+       CloseHandle( h );
 
-    return 0;
+       return 0;
 }
 #endif
 
index 05416005e74351678a2038a9e49d4f5a04ccac31..48bda0f4b8f7004c6468473b3a2ea8cbce4ae765 100644 (file)
@@ -74,13 +74,12 @@ bitbang_interface_t *bitbang_interface;
 int bitbang_execute_queue(void);
 
 
-
 /* The bitbang driver leaves the TCK 0 when in idle */
 
-void bitbang_end_state(enum tap_state state)
+void bitbang_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -88,10 +87,10 @@ void bitbang_end_state(enum tap_state state)
        }
 }
 
-void bitbang_state_move(void) {
-
+void bitbang_state_move(void)
+{
        int i=0, tms=0;
-       u8 tms_scan = TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
        for (i = 0; i < 7; i++)
        {
@@ -101,7 +100,7 @@ void bitbang_state_move(void) {
        }
        bitbang_interface->write(CLOCK_IDLE(), tms, 0);
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 void bitbang_path_move(pathmove_command_t *cmd)
@@ -113,41 +112,41 @@ void bitbang_path_move(pathmove_command_t *cmd)
        state_count = 0;
        while (num_states)
        {
-               if (tap_transitions[cur_state].low == cmd->path[state_count])
+               if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[state_count])
                {
                        tms = 0;
                }
-               else if (tap_transitions[cur_state].high == cmd->path[state_count])
+               else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[state_count])
                {
                        tms = 1;
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
                        exit(-1);
                }
 
                bitbang_interface->write(0, tms, 0);
                bitbang_interface->write(1, tms, 0);
 
-               cur_state = cmd->path[state_count];
+               tap_set_state(cmd->path[state_count]);
                state_count++;
                num_states--;
        }
 
        bitbang_interface->write(CLOCK_IDLE(), tms, 0);
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
 void bitbang_runtest(int num_cycles)
 {
        int i;
 
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                bitbang_end_state(TAP_IDLE);
                bitbang_state_move();
@@ -163,14 +162,14 @@ void bitbang_runtest(int num_cycles)
 
        /* finish in end_state */
        bitbang_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                bitbang_state_move();
 }
 
 
 static void bitbang_stableclocks(int num_cycles)
 {
-       int tms = (cur_state == TAP_RESET ? 1 : 0);
+       int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
        int i;
 
        /* send num_cycles clocks onto the cable */
@@ -185,10 +184,10 @@ static void bitbang_stableclocks(int num_cycles)
 
 void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
        int bit_cnt;
 
-       if (!((!ir_scan && (cur_state == TAP_DRSHIFT)) || (ir_scan && (cur_state == TAP_IRSHIFT))))
+       if (!((!ir_scan && (tap_get_state() == TAP_DRSHIFT)) || (ir_scan && (tap_get_state() == TAP_IRSHIFT))))
        {
                if (ir_scan)
                        bitbang_end_state(TAP_IRSHIFT);
@@ -241,11 +240,11 @@ void bitbang_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        bitbang_interface->write(CLOCK_IDLE(), 0, 0);
 
        if (ir_scan)
-               cur_state = TAP_IRPAUSE;
+               tap_set_state(TAP_IRPAUSE);
        else
-               cur_state = TAP_DRPAUSE;
+               tap_set_state(TAP_DRPAUSE);
 
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                bitbang_state_move();
 }
 
@@ -277,7 +276,7 @@ int bitbang_execute_queue(void)
                {
                        case JTAG_END_STATE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("end_state: %s", jtag_state_name(cmd->cmd.end_state->end_state) );
+                               LOG_DEBUG("end_state: %s", tap_state_name(cmd->cmd.end_state->end_state) );
 #endif
                                if (cmd->cmd.end_state->end_state != -1)
                                        bitbang_end_state(cmd->cmd.end_state->end_state);
@@ -288,13 +287,13 @@ int bitbang_execute_queue(void)
 #endif
                                if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                bitbang_interface->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
                        case JTAG_RUNTEST:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, jtag_state_name(cmd->cmd.runtest->end_state) );
+                               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)
                                        bitbang_end_state(cmd->cmd.runtest->end_state);
@@ -310,7 +309,7 @@ int bitbang_execute_queue(void)
 
                        case JTAG_STATEMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("statemove end in %s", jtag_state_name(cmd->cmd.statemove->end_state));
+                               LOG_DEBUG("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
 #endif
                                if (cmd->cmd.statemove->end_state != -1)
                                        bitbang_end_state(cmd->cmd.statemove->end_state);
@@ -319,13 +318,13 @@ int bitbang_execute_queue(void)
                        case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
                                LOG_DEBUG("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
-                                       jtag_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
+                                       tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
 #endif
                                bitbang_path_move(cmd->cmd.pathmove);
                                break;
                        case JTAG_SCAN:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("%s scan end in %s",  (cmd->cmd.scan->ir_scan) ? "IR" : "DR", jtag_state_name(cmd->cmd.scan->end_state) );
+                               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)
                                        bitbang_end_state(cmd->cmd.scan->end_state);
index a2e7c438c2e5b073825b6bbbab0909764f2630c0..392e3d3da9017e262abc75eb46e97869ff66c288 100644 (file)
@@ -1,22 +1,22 @@
 /***************************************************************************
- *   Copyright (C) 2007 by Pavel Chromy                                    *
- *   chromy@asix.cz                                                        *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
+*   Copyright (C) 2007 by Pavel Chromy                                    *
+*   chromy@asix.cz                                                        *
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU General Public License     *
+*   along with this program; if not, write to the                         *
+*   Free Software Foundation, Inc.,                                       *
+*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+***************************************************************************/
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 #include <stdlib.h>
 #include <unistd.h>
 
-bitq_interface_t *bitq_interface; /* low level bit queue interface */
+bitq_interface_t* bitq_interface;       /* low level bit queue interface */
 
-bitq_state_t bitq_in_state; /* state of input queue */
+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 */
+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
@@ -49,284 +49,338 @@ unsigned long bitq_in_bufsize=32; /* min. buffer size */
 void bitq_in_proc(void)
 {
        /* static information preserved between calls to increase performance */
-       static u8 *in_buff; /* pointer to buffer for scanned data */
-       static int in_idx; /* index of byte being scanned */
-       static u8 in_mask; /* mask of next bit to be scanned */
+       static u8*    in_buff;  /* pointer to buffer for scanned data */
+       static int    in_idx;   /* index of byte being scanned */
+       static u8     in_mask;  /* mask of next bit to be scanned */
 
-       scan_field_t *field;
-       int tdo;
+       scan_field_tfield;
+       int           tdo;
 
        /* loop through the queue */
-       while (bitq_in_state.cmd) {
+       while (bitq_in_state.cmd)
+       {
                /* only JTAG_SCAN command may return data */
-               if (bitq_in_state.cmd->type==JTAG_SCAN) {
+               if (bitq_in_state.cmd->type==JTAG_SCAN)
+               {
                        /* loop through the fields */
-                       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_value || field->in_handler) {
-
-                                       if (bitq_in_state.bit_pos==0) {
+                       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_value || field->in_handler)
+                               {
+                                       if (bitq_in_state.bit_pos==0)
+                                       {
                                                /* initialize field scanning */
-                                               in_mask=0x01;
-                                               in_idx=0;
-                                               if (field->in_value) in_buff=field->in_value;
-                                               else {
+                                               in_mask = 0x01;
+                                               in_idx  = 0;
+                                               if (field->in_value)
+                                                       in_buff = field->in_value;
+                                               else
+                                               {
                                                        /* buffer reallocation needed? */
-                                                       if (field->num_bits>bitq_in_bufsize*8) {
+                                                       if (field->num_bits>bitq_in_bufsize * 8)
+                                                       {
                                                                /* buffer previously allocated? */
-                                                               if (bitq_in_buffer!=NULL) {
+                                                               if (bitq_in_buffer!=NULL)
+                                                               {
                                                                        /* free it */
                                                                        free(bitq_in_buffer);
-                                                                       bitq_in_buffer=NULL;
+                                                                       bitq_in_buffer = NULL;
                                                                }
                                                                /* double the buffer size until it fits */
-                                                               while (field->num_bits>bitq_in_bufsize*8) bitq_in_bufsize*=2;
+                                                               while (field->num_bits>bitq_in_bufsize * 8)
+                                                                       bitq_in_bufsize *= 2;
                                                        }
                                                        /* if necessary, allocate buffer and check for malloc error */
-                                                       if (bitq_in_buffer==NULL && (bitq_in_buffer=malloc(bitq_in_bufsize))==NULL) {
+                                                       if (bitq_in_buffer==NULL && ( bitq_in_buffer = malloc(bitq_in_bufsize) )==NULL)
+                                                       {
                                                                LOG_ERROR("malloc error");
                                                                exit(-1);
                                                        }
-                                                       in_buff=(void *)bitq_in_buffer;
+                                                       in_buff = (void*) bitq_in_buffer;
                                                }
                                        }
 
                                        /* field scanning */
-                                       while (bitq_in_state.bit_pos<field->num_bits) {
-                                               if ((tdo=bitq_interface->in())<0) {
+                                       while (bitq_in_state.bit_pos<field->num_bits)
+                                       {
+                                               if ( ( tdo = bitq_interface->in() )<0 )
+                                               {
 #ifdef _DEBUG_JTAG_IO_
                                                        LOG_DEBUG("bitq in EOF");
 #endif
                                                        return;
                                                }
-                                               if (in_mask==0x01) in_buff[in_idx]=0;
-                                               if (tdo) in_buff[in_idx]|=in_mask;
-                                               if (in_mask==0x80) {
-                                                       in_mask=0x01;
+                                               if (in_mask==0x01)
+                                                       in_buff[in_idx] = 0;
+                                               if (tdo)
+                                                       in_buff[in_idx] |= in_mask;
+                                               if (in_mask==0x80)
+                                               {
+                                                       in_mask = 0x01;
                                                        in_idx++;
                                                }
-                                               else in_mask<<=1;
+                                               else
+                                                       in_mask <<= 1;
                                                bitq_in_state.bit_pos++;
                                        }
 
 
-                                       if (field->in_handler && bitq_in_state.status==ERROR_OK) {
-                                               bitq_in_state.status=(*field->in_handler)(in_buff, field->in_handler_priv, field);
+                                       if (field->in_handler && bitq_in_state.status==ERROR_OK)
+                                       {
+                                               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 */
+                               bitq_in_state.field_idx++;  /* advance to next field */
+                               bitq_in_state.bit_pos = 0;  /* start next field from the first bit */
                        }
-
                }
-               bitq_in_state.cmd=bitq_in_state.cmd->next; /* advance to next command */
-               bitq_in_state.field_idx=0; /* preselect first field */
+               bitq_in_state.cmd = bitq_in_state.cmd->next;    /* advance to next command */
+               bitq_in_state.field_idx = 0;                    /* preselect first field */
        }
 }
 
+
 void bitq_io(int tms, int tdi, int tdo_req)
 {
        bitq_interface->out(tms, tdi, tdo_req);
        /* check and process the input queue */
-       if (bitq_interface->in_rdy()) bitq_in_proc();
+       if ( bitq_interface->in_rdy() )
+               bitq_in_proc();
 }
 
-void bitq_end_state(enum tap_state state)
+
+void bitq_end_state(tap_state_t state)
 {
-       if (state==-1) return;
-       if (tap_move_map[state]==-1) {
+       if (state==-1)
+               return;
+
+       if (!tap_is_state_stable(state))
+       {
                LOG_ERROR("BUG: %i is not a valid end state", state);
                exit(-1);
        }
-       end_state = state;
+       tap_set_end_state(state);
 }
 
-void bitq_state_move(enum tap_state new_state)
+
+void bitq_state_move(tap_state_t new_state)
 {
-       int i=0;
-       u8 tms_scan;
+       int i = 0;
+       u8  tms_scan;
 
-       if (tap_move_map[cur_state]==-1 || tap_move_map[new_state]==-1) {
+       if (!tap_is_state_stable(tap_get_state()) || !tap_is_state_stable(new_state))
+       {
                LOG_ERROR("TAP move from or to unstable state");
                exit(-1);
        }
 
-       tms_scan=TAP_MOVE(cur_state, new_state);
+       tms_scan = tap_get_tms_path(tap_get_state(), new_state);
 
-       for (i=0; i<7; i++) {
-               bitq_io(tms_scan&1, 0, 0);
-               tms_scan>>=1;
+       for (i = 0; i<7; i++)
+       {
+               bitq_io(tms_scan & 1, 0, 0);
+               tms_scan >>= 1;
        }
 
-       cur_state = new_state;
+       tap_set_state(new_state);
 }
 
-void bitq_path_move(pathmove_command_t *cmd)
+
+void bitq_path_move(pathmove_command_t* cmd)
 {
        int i;
 
-       for (i=0; i<=cmd->num_states; i++) {
-               if (tap_transitions[cur_state].low == cmd->path[i]) 
+       for (i = 0; i<=cmd->num_states; i++)
+       {
+               if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[i])
                        bitq_io(0, 0, 0);
-               else if (tap_transitions[cur_state].high == cmd->path[i]) 
+               else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[i])
                        bitq_io(1, 0, 0);
-               else {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[i]));
+               else
+               {
+                       LOG_ERROR( "BUG: %s -> %s isn't a valid TAP transition", tap_state_name(
+                                                        tap_get_state() ), tap_state_name(cmd->path[i]) );
                        exit(-1);
                }
 
-               cur_state = cmd->path[i];
+               tap_set_state(cmd->path[i]);
        }
 
-       end_state = cur_state;
+       tap_set_end_state( tap_get_state() );
 }
 
+
 void bitq_runtest(int num_cycles)
 {
        int i;
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE) bitq_state_move(TAP_IDLE);
+       if (tap_get_state() != TAP_IDLE)
+               bitq_state_move(TAP_IDLE);
 
        /* execute num_cycles */
        for (i = 0; i < num_cycles; i++)
                bitq_io(0, 0, 0);
 
        /* finish in end_state */
-       if (cur_state != end_state) bitq_state_move(end_state);
+       if ( tap_get_state() != tap_get_end_state() )
+               bitq_state_move( tap_get_end_state() );
 }
 
-void bitq_scan_field(scan_field_t *field, int pause)
+
+void bitq_scan_field(scan_field_t* field, int pause)
 {
        int bit_cnt;
        int tdo_req;
 
-       u8 *out_ptr;
-       u8 out_mask;
+       u8out_ptr;
+       u8  out_mask;
 
-       if ( field->in_value || field->in_handler) tdo_req=1;
-       else tdo_req=0;
+       if (field->in_value || field->in_handler)
+               tdo_req = 1;
+       else
+               tdo_req = 0;
 
-       if (field->out_value==NULL) {
+       if (field->out_value==NULL)
+       {
                /* just send zeros and request data from TDO */
-               for (bit_cnt=field->num_bits; bit_cnt>1; bit_cnt--)
+               for (bit_cnt = field->num_bits; bit_cnt>1; bit_cnt--)
                        bitq_io(0, 0, tdo_req);
+
                bitq_io(pause, 0, tdo_req);
        }
-       else {
+       else
+       {
                /* send data, and optionally request TDO */
-               out_mask=0x01;
-               out_ptr=field->out_value;
-               for (bit_cnt=field->num_bits; bit_cnt>1; bit_cnt--) {
-                       bitq_io(0, ((*out_ptr)&out_mask)!=0, tdo_req);
-                       if (out_mask==0x80) {
-                               out_mask=0x01;
+               out_mask = 0x01;
+               out_ptr  = field->out_value;
+               for (bit_cnt = field->num_bits; bit_cnt>1; bit_cnt--)
+               {
+                       bitq_io(0, ( (*out_ptr) & out_mask )!=0, tdo_req);
+                       if (out_mask==0x80)
+                       {
+                               out_mask = 0x01;
                                out_ptr++;
                        }
-                       else out_mask<<=1;
+                       else
+                               out_mask <<= 1;
                }
-               bitq_io(pause, ((*out_ptr)&out_mask)!=0, tdo_req);
+
+               bitq_io(pause, ( (*out_ptr) & out_mask )!=0, tdo_req);
        }
 
-       if (pause) {
-               bitq_io(0,0,0);
-               if (cur_state==TAP_IRSHIFT) cur_state=TAP_IRPAUSE;
-               else if (cur_state==TAP_DRSHIFT) cur_state=TAP_DRPAUSE;
+       if (pause)
+       {
+               bitq_io(0, 0, 0);
+               if (tap_get_state()==TAP_IRSHIFT)
+                       tap_set_state(TAP_IRPAUSE);
+               else if (tap_get_state()==TAP_DRSHIFT)
+                       tap_set_state(TAP_DRPAUSE);
        }
 }
 
-void bitq_scan(scan_command_t *cmd)
+
+void bitq_scan(scan_command_t* cmd)
 {
        int i;
 
-       if (cmd->ir_scan) bitq_state_move(TAP_IRSHIFT);
-       else bitq_state_move(TAP_DRSHIFT);
+       if (cmd->ir_scan)
+               bitq_state_move(TAP_IRSHIFT);
+       else
+               bitq_state_move(TAP_DRSHIFT);
 
-       for (i=0; i < cmd->num_fields-1; i++)
+       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 */
+       jtag_command_tcmd = 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;
-       bitq_in_state.status = ERROR_OK;
-
-       while (cmd) {
+       bitq_in_state.bit_pos   = 0;
+       bitq_in_state.status    = ERROR_OK;
 
-               switch (cmd->type) {
-
-                       case JTAG_END_STATE:
+       while (cmd)
+       {
+               switch (cmd->type)
+               {
+               case JTAG_END_STATE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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;
+                       bitq_end_state(cmd->cmd.end_state->end_state);
+                       break;
 
-                       case JTAG_RESET:
+               case JTAG_RESET:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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;
+                       if ( (cmd->cmd.reset->trst == 1) || ( cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST) ) )
+                       {
+                               tap_set_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:
+               case JTAG_RUNTEST:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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);
-                               break;
+                       bitq_end_state(cmd->cmd.runtest->end_state);
+                       bitq_runtest(cmd->cmd.runtest->num_cycles);
+                       break;
 
-                       case JTAG_STATEMOVE:
+               case JTAG_STATEMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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 */
-                               break;
+                       bitq_end_state(cmd->cmd.statemove->end_state);
+                       bitq_state_move( tap_get_end_state() );   /* uncoditional TAP move */
+                       break;
 
-                       case JTAG_PATHMOVE:
+               case JTAG_PATHMOVE:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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;
+                       bitq_path_move(cmd->cmd.pathmove);
+                       break;
 
-                       case JTAG_SCAN:
+               case JTAG_SCAN:
 #ifdef _DEBUG_JTAG_IO_
-                               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");
+                       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);
-                               if (cur_state != end_state) bitq_state_move(end_state);
-                               break;
+                       bitq_end_state(cmd->cmd.scan->end_state);
+                       bitq_scan(cmd->cmd.scan);
+                       if ( tap_get_state() != tap_get_end_state() )
+                               bitq_state_move( tap_get_end_state() );
+                       break;
 
-                       case JTAG_SLEEP:
+               case JTAG_SLEEP:
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_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;
+                       bitq_interface->sleep(cmd->cmd.sleep->us);
+                       if ( bitq_interface->in_rdy() )
+                               bitq_in_proc();
+                       break;
 
-                       default:
-                               LOG_ERROR("BUG: unknown JTAG command type encountered");
-                               exit(-1);
+               default:
+                       LOG_ERROR("BUG: unknown JTAG command type encountered");
+                       exit(-1);
                }
 
                cmd = cmd->next;
@@ -335,11 +389,13 @@ int bitq_execute_queue(void)
        bitq_interface->flush();
        bitq_in_proc();
 
-       if (bitq_in_state.cmd) {
+       if (bitq_in_state.cmd)
+       {
                LOG_ERROR("missing data from bitq interface");
                return ERROR_JTAG_QUEUE_FAILED;
        }
-       if (bitq_interface->in()>=0) {
+       if (bitq_interface->in()>=0)
+       {
                LOG_ERROR("extra data from bitq interface");
                return ERROR_JTAG_QUEUE_FAILED;
        }
@@ -347,11 +403,12 @@ int bitq_execute_queue(void)
        return bitq_in_state.status;
 }
 
+
 void bitq_cleanup(void)
 {
        if (bitq_in_buffer!=NULL)
        {
                free(bitq_in_buffer);
-               bitq_in_buffer=NULL;
+               bitq_in_buffer = NULL;
        }
 }
index 434a28de50d66cfa537a3c9ea79cee380fd4a5e4..0a64c214a49e662429ae385245a7857c3893aaec 100644 (file)
@@ -34,9 +34,6 @@ static int dummy_clock;         /* edge detector */
 \r
 static int clock_count;         /* count clocks in any stable state, only stable states */\r
 \r
-\r
-static tap_state_t tap_state_transition(tap_state_t cur_state, int tms);\r
-\r
 static u32 dummy_data;\r
 \r
 \r
@@ -105,7 +102,7 @@ void dummy_write(int tck, int tms, int tdi)
                                        clock_count = 0;\r
                                }\r
 \r
-                               LOG_DEBUG("dummy_tap: %s", jtag_state_name(dummy_state) );\r
+                               LOG_DEBUG("dummy_tap: %s", tap_state_name(dummy_state) );\r
 \r
 #if defined(DEBUG)\r
                                if(dummy_state == TAP_DRCAPTURE)\r
@@ -131,7 +128,7 @@ void dummy_reset(int trst, int srst)
        if (trst || (srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))\r
                dummy_state = TAP_RESET;\r
 \r
-       LOG_DEBUG("reset to: %s", jtag_state_name(dummy_state) );\r
+       LOG_DEBUG("reset to: %s", tap_state_name(dummy_state) );\r
 }\r
 \r
 static int dummy_khz(int khz, int *jtag_speed)\r
@@ -187,106 +184,3 @@ void dummy_led(int on)
 {\r
 }\r
 \r
-\r
-/**\r
- * Function tap_state_transition\r
- * takes a current TAP state and returns the next state according to the tms value.\r
- *\r
- * Even though there is code to duplicate this elsewhere, we do it here a little\r
- * differently just to get a second opinion, i.e. a verification, on state tracking\r
- * in that other logic. Plus array lookups without index checking are no favorite thing.\r
- * This is educational for developers new to TAP controllers.\r
- */\r
-static tap_state_t tap_state_transition(tap_state_t cur_state, int tms)\r
-{\r
-       tap_state_t new_state;\r
-\r
-       if (tms)\r
-       {\r
-               switch (cur_state)\r
-               {\r
-               case TAP_RESET:\r
-                       new_state = cur_state;\r
-                       break;\r
-               case TAP_IDLE:\r
-               case TAP_DRUPDATE:\r
-               case TAP_IRUPDATE:\r
-                       new_state = TAP_DRSELECT;\r
-                       break;\r
-               case TAP_DRSELECT:\r
-                       new_state = TAP_IRSELECT;\r
-                       break;\r
-               case TAP_DRCAPTURE:\r
-               case TAP_DRSHIFT:\r
-                       new_state = TAP_DREXIT1;\r
-                       break;\r
-               case TAP_DREXIT1:\r
-               case TAP_DREXIT2:\r
-                       new_state = TAP_DRUPDATE;\r
-                       break;\r
-               case TAP_DRPAUSE:\r
-                       new_state = TAP_DREXIT2;\r
-                       break;\r
-               case TAP_IRSELECT:\r
-                       new_state = TAP_RESET;\r
-                       break;\r
-               case TAP_IRCAPTURE:\r
-               case TAP_IRSHIFT:\r
-                       new_state = TAP_IREXIT1;\r
-                       break;\r
-               case TAP_IREXIT1:\r
-               case TAP_IREXIT2:\r
-                       new_state = TAP_IRUPDATE;\r
-                       break;\r
-               case TAP_IRPAUSE:\r
-                       new_state = TAP_IREXIT2;\r
-                       break;\r
-               default:\r
-                       LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );\r
-                       exit(1);\r
-                       break;\r
-               }\r
-       }\r
-       else\r
-       {\r
-               switch (cur_state)\r
-               {\r
-               case TAP_RESET:\r
-               case TAP_IDLE:\r
-               case TAP_DRUPDATE:\r
-               case TAP_IRUPDATE:\r
-                       new_state = TAP_IDLE;\r
-                       break;\r
-               case TAP_DRSELECT:\r
-                       new_state = TAP_DRCAPTURE;\r
-                       break;\r
-               case TAP_DRCAPTURE:\r
-               case TAP_DRSHIFT:\r
-               case TAP_DREXIT2:\r
-                       new_state = TAP_DRSHIFT;\r
-                       break;\r
-               case TAP_DREXIT1:\r
-               case TAP_DRPAUSE:\r
-                       new_state = TAP_DRPAUSE;\r
-                       break;\r
-               case TAP_IRSELECT:\r
-                       new_state = TAP_IRCAPTURE;\r
-                       break;\r
-               case TAP_IRCAPTURE:\r
-               case TAP_IRSHIFT:\r
-               case TAP_IREXIT2:\r
-                       new_state = TAP_IRSHIFT;\r
-                       break;\r
-               case TAP_IREXIT1:\r
-               case TAP_IRPAUSE:\r
-                       new_state = TAP_IRPAUSE;\r
-                       break;\r
-               default:\r
-                       LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );\r
-                       exit(1);\r
-                       break;\r
-               }\r
-       }\r
-\r
-       return new_state;\r
-}\r
index e63b293923b25d70b6adc9d88631e542301feb47..9a3c986fecf6f70cb2944785dfd4bebbfb16fb82 100644 (file)
@@ -1,25 +1,34 @@
 /***************************************************************************
- *   Copyright (C) 2004, 2006 by Dominic Rath                              *
- *   Dominic.Rath@gmx.de                                                   *
- *                                                                         *
- *   Copyright (C) 2008 by Spencer Oliver                                  *
- *   spen@spen-soft.co.uk                                                  *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
+*   Copyright (C) 2004, 2006 by Dominic Rath                              *
+*   Dominic.Rath@gmx.de                                                   *
+*                                                                         *
+*   Copyright (C) 2008 by Spencer Oliver                                  *
+*   spen@spen-soft.co.uk                                                  *
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU General Public License     *
+*   along with this program; if not, write to the                         *
+*   Free Software Foundation, Inc.,                                       *
+*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+***************************************************************************/
+
+
+/* This code uses information contained in the MPSSE specification which was
+ * found here:
+ * http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
+ * Hereafter this is called the "MPSSE Spec".
+ */
+
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
 int ft2232_execute_queue(void);
 
 int ft2232_speed(int speed);
-int ft2232_speed_div(int speed, int *khz);
-int ft2232_khz(int khz, int *jtag_speed);
-int ft2232_register_commands(struct command_context_s *cmd_ctx);
+int ft2232_speed_div(int speed, intkhz);
+int ft2232_khz(int khz, intjtag_speed);
+int ft2232_register_commands(struct command_context_scmd_ctx);
 int ft2232_init(void);
 int ft2232_quit(void);
 
-int ft2232_handle_device_desc_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int ft2232_handle_serial_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int ft2232_handle_layout_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
+int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
+int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
+int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
+int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc);
 
 
 /**
@@ -85,36 +94,36 @@ int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd,
  * @param num_cycles is the count of clocks cycles to send.
  * @return int - ERROR_OK or ERROR_JTAG_QUEUE_FAILED
  */
-static int ft2232_stableclocks(int num_cycles, jtag_command_t *cmd);
+static int ft2232_stableclocks(int num_cycles, jtag_command_tcmd);
 
 
-char *ft2232_device_desc = NULL;
-char *ft2232_serial = NULL;
-char *ft2232_layout = NULL;
+char*         ft2232_device_desc = NULL;
+char*         ft2232_serial  = NULL;
+char*         ft2232_layout  = NULL;
 unsigned char ft2232_latency = 2;
 
-#define MAX_USB_IDS    8
+#define MAX_USB_IDS 8
 /* vid = pid = 0 marks the end of the list */
-static u16 ft2232_vid[MAX_USB_IDS+1] = { 0x0403, 0 };
-static u16 ft2232_pid[MAX_USB_IDS+1] = { 0x6010, 0 };
+static u16 ft2232_vid[MAX_USB_IDS + 1] = { 0x0403, 0 };
+static u16 ft2232_pid[MAX_USB_IDS + 1] = { 0x6010, 0 };
 
 typedef struct ft2232_layout_s
 {
        char* name;
-       int(*init)(void);
-       void(*reset)(int trst, int srst);
-       void(*blink)(void);
+       int (*init)(void);
+       void (*reset)(int trst, int srst);
+       void (*blink)(void);
 } ft2232_layout_t;
 
 /* init procedures for supported layouts */
-int usbjtag_init(void);
-int jtagkey_init(void);
-int olimex_jtag_init(void);
-int flyswatter_init(void);
-int turtle_init(void);
-int comstick_init(void);
-int stm32stick_init(void);
-int axm0432_jtag_init(void);
+int  usbjtag_init(void);
+int  jtagkey_init(void);
+int  olimex_jtag_init(void);
+int  flyswatter_init(void);
+int  turtle_init(void);
+int  comstick_init(void);
+int  stm32stick_init(void);
+int  axm0432_jtag_init(void);
 
 /* reset procedures for supported layouts */
 void usbjtag_reset(int trst, int srst);
@@ -130,68 +139,68 @@ void axm0432_jtag_reset(int trst, int srst);
 void olimex_jtag_blink(void);
 void turtle_jtag_blink(void);
 
-ft2232_layout_t ft2232_layouts[] =
+ft2232_layout_t            ft2232_layouts[] =
 {
-       {"usbjtag", usbjtag_init, usbjtag_reset, NULL},
-       {"jtagkey", jtagkey_init, jtagkey_reset, NULL},
-       {"jtagkey_prototype_v1", jtagkey_init, jtagkey_reset, NULL},
-       {"oocdlink", jtagkey_init, jtagkey_reset, NULL},
-       {"signalyzer", usbjtag_init, usbjtag_reset, NULL},
-       {"evb_lm3s811", usbjtag_init, usbjtag_reset, NULL},
-       {"olimex-jtag", olimex_jtag_init, olimex_jtag_reset, olimex_jtag_blink},
-       {"flyswatter", flyswatter_init, flyswatter_reset, NULL},
-       {"turtelizer2", turtle_init, turtle_reset, turtle_jtag_blink},
-       {"comstick", comstick_init, comstick_reset, NULL},
-       {"stm32stick", stm32stick_init, stm32stick_reset, NULL},
-       {"axm0432_jtag", axm0432_jtag_init, axm0432_jtag_reset, NULL},
-       {NULL, NULL, NULL},
+       { "usbjtag",              usbjtag_init,              usbjtag_reset,      NULL                    },
+       { "jtagkey",              jtagkey_init,              jtagkey_reset,      NULL                    },
+       { "jtagkey_prototype_v1", jtagkey_init,              jtagkey_reset,      NULL                    },
+       { "oocdlink",             jtagkey_init,              jtagkey_reset,      NULL                    },
+       { "signalyzer",           usbjtag_init,              usbjtag_reset,      NULL                    },
+       { "evb_lm3s811",          usbjtag_init,              usbjtag_reset,      NULL                    },
+       { "olimex-jtag",          olimex_jtag_init,          olimex_jtag_reset,  olimex_jtag_blink       },
+       { "flyswatter",           flyswatter_init,           flyswatter_reset,   NULL                    },
+       { "turtelizer2",          turtle_init,               turtle_reset,       turtle_jtag_blink       },
+       { "comstick",             comstick_init,             comstick_reset,     NULL                    },
+       { "stm32stick",           stm32stick_init,           stm32stick_reset,   NULL                    },
+       { "axm0432_jtag",         axm0432_jtag_init,         axm0432_jtag_reset, NULL                    },
+       { NULL,                   NULL,                      NULL },
 };
 
-static u8 nTRST, nTRSTnOE, nSRST, nSRSTnOE;
+static u8                  nTRST, nTRSTnOE, nSRST, nSRSTnOE;
 
-static ft2232_layout_t *layout;
-static u8 low_output = 0x0;
-static u8 low_direction = 0x0;
-static u8 high_output = 0x0;
-static u8 high_direction = 0x0;
+static ft2232_layout_t*    layout;
+static u8                  low_output     = 0x0;
+static u8                  low_direction  = 0x0;
+static u8                  high_output    = 0x0;
+static u8                  high_direction = 0x0;
 
 #if BUILD_FT2232_FTD2XX == 1
-static FT_HANDLE ftdih = NULL;
+static FT_HANDLE           ftdih = NULL;
 #elif BUILD_FT2232_LIBFTDI == 1
 static struct ftdi_context ftdic;
 #endif
 
 
-static jtag_command_t *first_unsent;           /* next command that has to be sent */
-static int require_send;
+static jtag_command_t* first_unsent;        /* next command that has to be sent */
+static int             require_send;
 
-static u8 *ft2232_buffer = NULL;
-static int ft2232_buffer_size = 0;
-static int ft2232_read_pointer = 0;
-static int ft2232_expect_read = 0;
+static u8*             ft2232_buffer = NULL;
+static int             ft2232_buffer_size  = 0;
+static int             ft2232_read_pointer = 0;
+static int             ft2232_expect_read  = 0;
 
-#define FT2232_BUFFER_SIZE     131072
-#define BUFFER_ADD ft2232_buffer[ft2232_buffer_size++]
-#define BUFFER_READ ft2232_buffer[ft2232_read_pointer++]
+#define FT2232_BUFFER_SIZE 131072
+#define BUFFER_ADD         ft2232_buffer[ft2232_buffer_size++]
+#define BUFFER_READ        ft2232_buffer[ft2232_read_pointer++]
 
 jtag_interface_t ft2232_interface =
 {
-       .name = "ft2232",
+       .name               = "ft2232",
        .execute_queue = ft2232_execute_queue,
-       .speed = ft2232_speed,
+       .speed     = ft2232_speed,
        .speed_div = ft2232_speed_div,
-       .khz = ft2232_khz,
-       .register_commands = ft2232_register_commands,
+       .khz                = ft2232_khz,
+       .register_commands  = ft2232_register_commands,
        .init = ft2232_init,
        .quit = ft2232_quit,
 };
 
-int ft2232_write(u8 *buf, int size, u32* bytes_written)
+int ft2232_write(u8buf, int size, u32* bytes_written)
 {
 #if BUILD_FT2232_FTD2XX == 1
        FT_STATUS status;
-       DWORD dw_bytes_written;
-       if ((status = FT_Write(ftdih, buf, size, &dw_bytes_written)) != FT_OK)
+       DWORD     dw_bytes_written;
+       if ( ( status = FT_Write(ftdih, buf, size, &dw_bytes_written) ) != FT_OK )
        {
                *bytes_written = dw_bytes_written;
                LOG_ERROR("FT_Write returned: %lu", status);
@@ -204,10 +213,10 @@ int ft2232_write(u8 *buf, int size, u32* bytes_written)
        }
 #elif BUILD_FT2232_LIBFTDI == 1
        int retval;
-       if ((retval = ftdi_write_data(&ftdic, buf, size)) < 0)
+       if ( ( retval = ftdi_write_data(&ftdic, buf, size) ) < 0 )
        {
                *bytes_written = 0;
-               LOG_ERROR("ftdi_write_data: %s", ftdi_get_error_string(&ftdic));
+               LOG_ERROR( "ftdi_write_data: %s", ftdi_get_error_string(&ftdic) );
                return ERROR_JTAG_DEVICE_ERROR;
        }
        else
@@ -218,18 +227,19 @@ int ft2232_write(u8 *buf, int size, u32* bytes_written)
 #endif
 }
 
+
 int ft2232_read(u8* buf, int size, u32* bytes_read)
 {
 #if BUILD_FT2232_FTD2XX == 1
-       DWORD dw_bytes_read;
+       DWORD     dw_bytes_read;
        FT_STATUS status;
-       int timeout = 5;
+       int       timeout = 5;
        *bytes_read = 0;
 
-       while ((*bytes_read < size) && timeout--)
+       while ( (*bytes_read < size) && timeout-- )
        {
-               if ((status = FT_Read(ftdih, buf + *bytes_read, size -
-                       *bytes_read, &dw_bytes_read)) != FT_OK)
+               if ( ( status = FT_Read(ftdih, buf + *bytes_read, size -
+                                         *bytes_read, &dw_bytes_read) ) != FT_OK )
                {
                        *bytes_read = 0;
                        LOG_ERROR("FT_Read returned: %lu", status);
@@ -237,21 +247,23 @@ int ft2232_read(u8* buf, int size, u32* bytes_read)
                }
                *bytes_read += dw_bytes_read;
        }
+
 #elif BUILD_FT2232_LIBFTDI == 1
        int retval;
        int timeout = 100;
        *bytes_read = 0;
 
-       while ((*bytes_read < size) && timeout--)
+       while ( (*bytes_read < size) && timeout-- )
        {
-               if ((retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read)) < 0)
+               if ( ( retval = ftdi_read_data(&ftdic, buf + *bytes_read, size - *bytes_read) ) < 0 )
                {
                        *bytes_read = 0;
-                       LOG_ERROR("ftdi_read_data: %s", ftdi_get_error_string(&ftdic));
+                       LOG_ERROR( "ftdi_read_data: %s", ftdi_get_error_string(&ftdic) );
                        return ERROR_JTAG_DEVICE_ERROR;
                }
                *bytes_read += retval;
        }
+
 #endif
 
        if (*bytes_read < size)
@@ -263,18 +275,19 @@ int ft2232_read(u8* buf, int size, u32* bytes_read)
        return ERROR_OK;
 }
 
+
 int ft2232_speed(int speed)
 {
-       u8 buf[3];
+       u8  buf[3];
        int retval;
        u32 bytes_written;
 
-       buf[0] = 0x86; /* command "set divisor" */
-       buf[1] = speed & 0xff; /* valueL (0=6MHz, 1=3MHz, 2=2.0MHz, ...*/
-       buf[2] = (speed >> 8) & 0xff; /* valueH */
+       buf[0] = 0x86;                  /* command "set divisor" */
+       buf[1] = speed & 0xff;          /* valueL (0=6MHz, 1=3MHz, 2=2.0MHz, ...*/
+       buf[2] = (speed >> 8) & 0xff;   /* valueH */
 
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
-       if (((retval = ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( retval = ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't set FT2232 TCK speed");
                return retval;
@@ -283,24 +296,27 @@ int ft2232_speed(int speed)
        return ERROR_OK;
 }
 
-int ft2232_speed_div(int speed, int *khz)
+
+int ft2232_speed_div(int speed, int* khz)
 {
        /* Take a look in the FT2232 manual,
         * AN2232C-01 Command Processor for
         * MPSSE and MCU Host Bus. Chapter 3.8 */
 
-       *khz = 6000 / (1+speed);
+       *khz = 6000 / (1 + speed);
 
        return ERROR_OK;
 }
 
-int ft2232_khz(int khz, int *jtag_speed)
+
+int ft2232_khz(int khz, int* jtag_speed)
 {
        if (khz==0)
        {
                LOG_ERROR("RCLK not supported");
                return ERROR_FAIL;
        }
+
        /* Take a look in the FT2232 manual,
         * AN2232C-01 Command Processor for
         * MPSSE and MCU Host Bus. Chapter 3.8
@@ -333,25 +349,27 @@ int ft2232_khz(int khz, int *jtag_speed)
        return ERROR_OK;
 }
 
-int ft2232_register_commands(struct command_context_s *cmd_ctx)
+
+int ft2232_register_commands(struct command_context_s* cmd_ctx)
 {
        register_command(cmd_ctx, NULL, "ft2232_device_desc", ft2232_handle_device_desc_command,
-               COMMAND_CONFIG, "the USB device description of the FTDI FT2232 device");
+                       COMMAND_CONFIG, "the USB device description of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_serial", ft2232_handle_serial_command,
-               COMMAND_CONFIG, "the serial number of the FTDI FT2232 device");
+                       COMMAND_CONFIG, "the serial number of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_layout", ft2232_handle_layout_command,
-               COMMAND_CONFIG, "the layout of the FT2232 GPIO signals used to control output-enables and reset signals");
+                       COMMAND_CONFIG, "the layout of the FT2232 GPIO signals used to control output-enables and reset signals");
        register_command(cmd_ctx, NULL, "ft2232_vid_pid", ft2232_handle_vid_pid_command,
-                                        COMMAND_CONFIG, "the vendor ID and product ID of the FTDI FT2232 device");
+                       COMMAND_CONFIG, "the vendor ID and product ID of the FTDI FT2232 device");
        register_command(cmd_ctx, NULL, "ft2232_latency", ft2232_handle_latency_command,
-                                        COMMAND_CONFIG, "set the FT2232 latency timer to a new value");
+                       COMMAND_CONFIG, "set the FT2232 latency timer to a new value");
        return ERROR_OK;
 }
 
-void ft2232_end_state(enum tap_state state)
+
+void ft2232_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -359,13 +377,14 @@ void ft2232_end_state(enum tap_state state)
        }
 }
 
+
 void ft2232_read_scan(enum scan_type type, u8* buffer, int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
-       int cur_byte = 0;
+       int cur_byte  = 0;
 
-       while(num_bytes-- > 1)
+       while (num_bytes-- > 1)
        {
                buffer[cur_byte] = BUFFER_READ;
                cur_byte++;
@@ -379,15 +398,15 @@ void ft2232_read_scan(enum scan_type type, u8* buffer, int scan_size)
                buffer[cur_byte] = BUFFER_READ >> 1;
        }
 
-       buffer[cur_byte] = (buffer[cur_byte] | ((BUFFER_READ & 0x02) << 6)) >> (8 - bits_left);
-
+       buffer[cur_byte] = ( buffer[cur_byte] | ( (BUFFER_READ & 0x02) << 6 ) ) >> (8 - bits_left);
 }
 
+
 void ft2232_debug_dump_buffer(void)
 {
-       int i;
-       char line[256];
-       char *line_p = line;
+       int   i;
+       char  line[256];
+       charline_p = line;
 
        for (i = 0; i < ft2232_buffer_size; i++)
        {
@@ -403,19 +422,20 @@ void ft2232_debug_dump_buffer(void)
                LOG_DEBUG("%s", line);
 }
 
-int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
+
+int ft2232_send_and_recv(jtag_command_t* first, jtag_command_t* last)
 {
-       jtag_command_t *cmd;
-       u8 *buffer;
-       int scan_size;
-       enum scan_type type;
-       int retval;
-       u32 bytes_written;
-       u32 bytes_read;
+       jtag_command_tcmd;
+       u8*             buffer;
+       int             scan_size;
+       enum scan_type  type;
+       int             retval;
+       u32             bytes_written;
+       u32             bytes_read;
 
 #ifdef _DEBUG_USB_IO_
-       struct timeval start, inter, inter2, end;
-       struct timeval d_inter, d_inter2, d_end;
+       struct timeval  start, inter, inter2, end;
+       struct timeval  d_inter, d_inter2, d_end;
 #endif
 
 #ifdef _DEBUG_USB_COMMS_
@@ -427,7 +447,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
        gettimeofday(&start, NULL);
 #endif
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
+       if ( ( retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written) ) != ERROR_OK )
        {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                return retval;
@@ -446,7 +466,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
                gettimeofday(&inter2, NULL);
 #endif
 
-               if ((retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read)) != ERROR_OK)
+               if ( ( retval = ft2232_read(ft2232_buffer, ft2232_expect_read, &bytes_read) ) != ERROR_OK )
                {
                        LOG_ERROR("couldn't read from FT2232");
                        return retval;
@@ -459,15 +479,18 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
                timeval_subtract(&d_inter2, &inter2, &start);
                timeval_subtract(&d_end, &end, &start);
 
-               LOG_INFO("inter: %i.%06i, inter2: %i.%06i end: %i.%06i", d_inter.tv_sec, d_inter.tv_usec, d_inter2.tv_sec, d_inter2.tv_usec, d_end.tv_sec, d_end.tv_usec);
+               LOG_INFO("inter: %i.%06i, inter2: %i.%06i end: %i.%06i", d_inter.tv_sec, d_inter.tv_usec, d_inter2.tv_sec,
+                               d_inter2.tv_usec, d_end.tv_sec,
+                               d_end.tv_usec);
 #endif
 
-
                ft2232_buffer_size = bytes_read;
 
                if (ft2232_expect_read != ft2232_buffer_size)
                {
-                       LOG_ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read, ft2232_buffer_size, 100 - timeout);
+                       LOG_ERROR("ft2232_expect_read (%i) != ft2232_buffer_size (%i) (%i retries)", ft2232_expect_read,
+                                       ft2232_buffer_size,
+                                       100 - timeout);
                        ft2232_debug_dump_buffer();
 
                        exit(-1);
@@ -479,7 +502,7 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
 #endif
        }
 
-       ft2232_expect_read = 0;
+       ft2232_expect_read  = 0;
        ft2232_read_pointer = 0;
 
        /* return ERROR_OK, unless a jtag_read_buffer returns a failed check
@@ -492,21 +515,23 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
        {
                switch (cmd->type)
                {
-                       case JTAG_SCAN:
-                               type = jtag_scan_type(cmd->cmd.scan);
-                               if (type != SCAN_OUT)
-                               {
-                                       scan_size = jtag_scan_size(cmd->cmd.scan);
-                                       buffer = calloc(CEIL(scan_size, 8), 1);
-                                       ft2232_read_scan(type, buffer, scan_size);
-                                       if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
-                                               retval = ERROR_JTAG_QUEUE_FAILED;
-                                       free(buffer);
-                               }
-                               break;
-                       default:
-                               break;
+               case JTAG_SCAN:
+                       type = jtag_scan_type(cmd->cmd.scan);
+                       if (type != SCAN_OUT)
+                       {
+                               scan_size = jtag_scan_size(cmd->cmd.scan);
+                               buffer    = calloc(CEIL(scan_size, 8), 1);
+                               ft2232_read_scan(type, buffer, scan_size);
+                               if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)
+                                       retval = ERROR_JTAG_QUEUE_FAILED;
+                               free(buffer);
+                       }
+                       break;
+
+               default:
+                       break;
                }
+
                cmd = cmd->next;
        }
 
@@ -515,71 +540,76 @@ int ft2232_send_and_recv(jtag_command_t *first, jtag_command_t *last)
        return retval;
 }
 
-void ft2232_add_pathmove(pathmove_command_t *cmd)
+
+void ft2232_add_pathmove(pathmove_command_t* cmd)
 {
        int num_states = cmd->num_states;
-       u8 tms_byte;
-       int state_count;
+       int state_count = 0;
 
-       state_count = 0;
        while (num_states)
        {
+               u8  tms_byte = 0;       /* zero this on each MPSSE batch */
+
                int bit_count = 0;
 
                int num_states_batch = num_states > 7 ? 7 : num_states;
 
-               tms_byte = 0x0;
                /* command "Clock Data to TMS/CS Pin (no Read)" */
                BUFFER_ADD = 0x4b;
+
                /* number of states remaining */
                BUFFER_ADD = num_states_batch - 1;
 
                while (num_states_batch--)
                {
-                       if (tap_transitions[cur_state].low == cmd->path[state_count])
+                       if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[state_count])
                                buf_set_u32(&tms_byte, bit_count++, 1, 0x0);
-                       else if (tap_transitions[cur_state].high == cmd->path[state_count])
+                       else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[state_count])
                                buf_set_u32(&tms_byte, bit_count++, 1, 0x1);
                        else
                        {
-                               LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
+                               LOG_ERROR( "BUG: %s -> %s isn't a valid TAP transition", tap_state_name(
+                                                                tap_get_state() ), tap_state_name(cmd->path[state_count]) );
                                exit(-1);
                        }
 
-                       cur_state = cmd->path[state_count];
+                       tap_set_state(cmd->path[state_count]);
                        state_count++;
                        num_states--;
                }
 
                BUFFER_ADD = tms_byte;
        }
-
-       end_state = cur_state;
+       
+       tap_set_end_state(tap_get_state());
 }
 
-void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
+
+void ft2232_add_scan(int ir_scan, enum scan_type type, u8* buffer, int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
-       int cur_byte = 0;
+       int cur_byte  = 0;
        int last_bit;
 
-       if (!((!ir_scan && (cur_state == TAP_DRSHIFT)) || (ir_scan && (cur_state == TAP_IRSHIFT))))
+       if ( !( ( !ir_scan && (tap_get_state() == TAP_DRSHIFT) )
+          || (    ir_scan && (tap_get_state() == TAP_IRSHIFT) ) ) )
        {
                /* command "Clock Data to TMS/CS Pin (no Read)" */
                BUFFER_ADD = 0x4b;
-               /* scan 7 bit */
-               BUFFER_ADD = 0x6;
+
+               BUFFER_ADD = 0x6;       /* scan 7 bits */
+
                /* TMS data bits */
                if (ir_scan)
                {
-                       BUFFER_ADD = TAP_MOVE(cur_state, TAP_IRSHIFT);
-                       cur_state = TAP_IRSHIFT;
+                       BUFFER_ADD = tap_get_tms_path(tap_get_state(), TAP_IRSHIFT);
+                       tap_set_state(TAP_IRSHIFT);
                }
                else
                {
-                       BUFFER_ADD = TAP_MOVE(cur_state, TAP_DRSHIFT);
-                       cur_state = TAP_DRSHIFT;
+                       BUFFER_ADD = tap_get_tms_path(tap_get_state(), TAP_DRSHIFT);
+                       tap_set_state(TAP_DRSHIFT);
                }
                /* LOG_DEBUG("added TMS scan (no read)"); */
        }
@@ -606,14 +636,16 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size
                        BUFFER_ADD = 0x28;
                        /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
                }
+
                thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
-               num_bytes -= thisrun_bytes;
-               BUFFER_ADD = (thisrun_bytes - 1) & 0xff;
-               BUFFER_ADD = ((thisrun_bytes - 1) >> 8) & 0xff;
+               num_bytes    -= thisrun_bytes;
+               BUFFER_ADD    = (thisrun_bytes - 1) & 0xff;
+               BUFFER_ADD    = ( (thisrun_bytes - 1) >> 8 ) & 0xff;
+
                if (type != SCAN_IN)
                {
                        /* add complete bytes */
-                       while(thisrun_bytes-- > 0)
+                       while (thisrun_bytes-- > 0)
                        {
                                BUFFER_ADD = buffer[cur_byte];
                                cur_byte++;
@@ -628,7 +660,7 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size
 
        /* the most signifcant bit is scanned during TAP movement */
        if (type != SCAN_IN)
-               last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
+               last_bit = ( buffer[cur_byte] >> (bits_left - 1) ) & 0x1;
        else
                last_bit = 0;
 
@@ -658,8 +690,8 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size
                        BUFFER_ADD = buffer[cur_byte];
        }
 
-       if ((ir_scan && (end_state == TAP_IRSHIFT)) ||
-               (!ir_scan && (end_state == TAP_DRSHIFT)))
+       if ( (  ir_scan && (tap_get_end_state() == TAP_IRSHIFT) )
+         || ( !ir_scan && (tap_get_end_state() == TAP_DRSHIFT) ) )
        {
                if (type == SCAN_IO)
                {
@@ -697,20 +729,22 @@ void ft2232_add_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size
                        BUFFER_ADD = 0x4b;
                        /* LOG_DEBUG("added TMS scan (no read)"); */
                }
-               BUFFER_ADD = 0x6;
-               BUFFER_ADD = TAP_MOVE(cur_state, end_state) | (last_bit << 7);
-               cur_state = end_state;
+               BUFFER_ADD = 0x6;   /* scan 7 bits */
+
+               BUFFER_ADD = tap_get_tms_path( tap_get_state(), tap_get_end_state() ) | (last_bit << 7);
+               tap_set_state( tap_get_end_state() );
        }
 }
 
-int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int scan_size)
+
+int ft2232_large_scan(scan_command_t* cmd, enum scan_type type, u8* buffer, int scan_size)
 {
        int num_bytes = (scan_size + 7) / 8;
        int bits_left = scan_size;
-       int cur_byte = 0;
+       int cur_byte  = 0;
        int last_bit;
-       u8 *receive_buffer = malloc(CEIL(scan_size, 8));
-       u8 *receive_pointer = receive_buffer;
+       u8* receive_buffer  = malloc( CEIL(scan_size, 8) );
+       u8receive_pointer = receive_buffer;
        u32 bytes_written;
        u32 bytes_read;
        int retval;
@@ -722,18 +756,19 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
                exit(-1);
        }
 
-       if (cur_state != TAP_DRSHIFT)
+       if (tap_get_state() != TAP_DRSHIFT)
        {
                /* command "Clock Data to TMS/CS Pin (no Read)" */
                BUFFER_ADD = 0x4b;
-               /* scan 7 bit */
-               BUFFER_ADD = 0x6;
+
+               BUFFER_ADD = 0x6;       /* scan 7 bits */
+
                /* TMS data bits */
-               BUFFER_ADD = TAP_MOVE(cur_state, TAP_DRSHIFT);
-               cur_state = TAP_DRSHIFT;
+               BUFFER_ADD = tap_get_tms_path(tap_get_state(), TAP_DRSHIFT);
+               tap_set_state(TAP_DRSHIFT);
        }
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
+       if ( ( retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written) ) != ERROR_OK )
        {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                exit(-1);
@@ -764,15 +799,17 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
                        BUFFER_ADD = 0x28;
                        /* LOG_DEBUG("added TDI bytes (i %i)", num_bytes); */
                }
+
                thisrun_bytes = (num_bytes > 65537) ? 65536 : (num_bytes - 1);
-               thisrun_read = thisrun_bytes;
-               num_bytes -= thisrun_bytes;
-               BUFFER_ADD = (thisrun_bytes - 1) & 0xff;
-               BUFFER_ADD = ((thisrun_bytes - 1) >> 8) & 0xff;
+               thisrun_read  = thisrun_bytes;
+               num_bytes    -= thisrun_bytes;
+               BUFFER_ADD    = (thisrun_bytes - 1) & 0xff;
+               BUFFER_ADD    = ( (thisrun_bytes - 1) >> 8 ) & 0xff;
+
                if (type != SCAN_IN)
                {
                        /* add complete bytes */
-                       while(thisrun_bytes-- > 0)
+                       while (thisrun_bytes-- > 0)
                        {
                                BUFFER_ADD = buffer[cur_byte];
                                cur_byte++;
@@ -784,7 +821,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
                        bits_left -= 8 * (thisrun_bytes);
                }
 
-               if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
+               if ( ( retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written) ) != ERROR_OK )
                {
                        LOG_ERROR("couldn't write MPSSE commands to FT2232");
                        exit(-1);
@@ -794,7 +831,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
 
                if (type != SCAN_OUT)
                {
-                       if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
+                       if ( ( retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read) ) != ERROR_OK )
                        {
                                LOG_ERROR("couldn't read from FT2232");
                                exit(-1);
@@ -808,7 +845,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
 
        /* the most signifcant bit is scanned during TAP movement */
        if (type != SCAN_IN)
-               last_bit = (buffer[cur_byte] >> (bits_left - 1)) & 0x1;
+               last_bit = ( buffer[cur_byte] >> (bits_left - 1) ) & 0x1;
        else
                last_bit = 0;
 
@@ -841,7 +878,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
                        thisrun_read += 2;
        }
 
-       if (end_state == TAP_DRSHIFT)
+       if (tap_get_end_state() == TAP_DRSHIFT)
        {
                if (type == SCAN_IO)
                {
@@ -880,14 +917,14 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
                        /* LOG_DEBUG("added TMS scan (no read)"); */
                }
                BUFFER_ADD = 0x6;
-               BUFFER_ADD = TAP_MOVE(cur_state, end_state) | (last_bit << 7);
-               cur_state = end_state;
+               BUFFER_ADD = tap_get_tms_path( tap_get_state(), tap_get_end_state() ) | (last_bit << 7);
+               tap_set_state( tap_get_end_state() );
        }
 
        if (type != SCAN_OUT)
                thisrun_read += 1;
 
-       if ((retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written)) != ERROR_OK)
+       if ( ( retval = ft2232_write(ft2232_buffer, ft2232_buffer_size, &bytes_written) ) != ERROR_OK )
        {
                LOG_ERROR("couldn't write MPSSE commands to FT2232");
                exit(-1);
@@ -897,7 +934,7 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
 
        if (type != SCAN_OUT)
        {
-               if ((retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read)) != ERROR_OK)
+               if ( ( retval = ft2232_read(receive_pointer, thisrun_read, &bytes_read) ) != ERROR_OK )
                {
                        LOG_ERROR("couldn't read from FT2232");
                        exit(-1);
@@ -909,32 +946,34 @@ int ft2232_large_scan(scan_command_t *cmd, enum scan_type type, u8 *buffer, int
        return ERROR_OK;
 }
 
+
 int ft2232_predict_scan_out(int scan_size, enum scan_type type)
 {
        int predicted_size = 3;
        int num_bytes = (scan_size - 1) / 8;
 
-       if (cur_state != TAP_DRSHIFT)
+       if (tap_get_state() != TAP_DRSHIFT)
                predicted_size += 3;
 
-       if (type == SCAN_IN)    /* only from device to host */
+       if (type == SCAN_IN)    /* only from device to host */
        {
                /* complete bytes */
                predicted_size += CEIL(num_bytes, 65536) * 3;
                /* remaining bits - 1 (up to 7) */
-               predicted_size += ((scan_size - 1) % 8) ? 2 : 0;
+               predicted_size += ( (scan_size - 1) % 8 ) ? 2 : 0;
        }
-       else                                    /* host to device, or bidirectional */
+       else                    /* host to device, or bidirectional */
        {
                /* complete bytes */
                predicted_size += num_bytes + CEIL(num_bytes, 65536) * 3;
                /* remaining bits -1 (up to 7) */
-               predicted_size += ((scan_size - 1) % 8) ? 3 : 0;
+               predicted_size += ( (scan_size - 1) % 8 ) ? 3 : 0;
        }
 
        return predicted_size;
 }
 
+
 int ft2232_predict_scan_in(int scan_size, enum scan_type type)
 {
        int predicted_size = 0;
@@ -943,8 +982,10 @@ int ft2232_predict_scan_in(int scan_size, enum scan_type type)
        {
                /* complete bytes */
                predicted_size += (CEIL(scan_size, 8) > 1) ? (CEIL(scan_size, 8) - 1) : 0;
+
                /* remaining bits - 1 */
-               predicted_size += ((scan_size - 1) % 8) ? 1 : 0;
+               predicted_size += ( (scan_size - 1) % 8 ) ? 1 : 0;
+
                /* last bit (from TMS scan) */
                predicted_size += 1;
        }
@@ -954,45 +995,46 @@ int ft2232_predict_scan_in(int scan_size, enum scan_type type)
        return predicted_size;
 }
 
+
 void usbjtag_reset(int trst, int srst)
 {
        if (trst == 1)
        {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
-                       low_direction |= nTRSTnOE;      /* switch to output pin (output is low) */
+                       low_direction |= nTRSTnOE;  /* switch to output pin (output is low) */
                else
-                       low_output &= ~nTRST;   /* switch output low */
+                       low_output &= ~nTRST;       /* switch output low */
        }
        else if (trst == 0)
        {
                if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
                        low_direction &= ~nTRSTnOE; /* switch to input pin (high-Z + internal and external pullup) */
                else
-                       low_output |= nTRST; /* switch output high */
+                       low_output |= nTRST;        /* switch output high */
        }
 
        if (srst == 1)
        {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-                       low_output &= ~nSRST;   /* switch output low */
+                       low_output &= ~nSRST;       /* switch output low */
                else
-                       low_direction |= nSRSTnOE;      /* switch to output pin (output is low) */
+                       low_direction |= nSRSTnOE;  /* switch to output pin (output is low) */
        }
        else if (srst == 0)
        {
                if (jtag_reset_config & RESET_SRST_PUSH_PULL)
-                       low_output |= nSRST;    /* switch output high */
+                       low_output |= nSRST;        /* switch output high */
                else
-                       low_direction &= ~nSRSTnOE;     /* switch to input pin (high-Z) */
+                       low_direction &= ~nSRSTnOE; /* switch to input pin (high-Z) */
        }
 
        /* command "set data bits low byte" */
        BUFFER_ADD = 0x80;
        BUFFER_ADD = low_output;
        BUFFER_ADD = low_direction;
-
 }
 
+
 void jtagkey_reset(int trst, int srst)
 {
        if (trst == 1)
@@ -1029,9 +1071,11 @@ void jtagkey_reset(int trst, int srst)
        BUFFER_ADD = 0x82;
        BUFFER_ADD = high_output;
        BUFFER_ADD = high_direction;
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
+                       high_direction);
 }
 
+
 void olimex_jtag_reset(int trst, int srst)
 {
        if (trst == 1)
@@ -1062,14 +1106,16 @@ void olimex_jtag_reset(int trst, int srst)
        BUFFER_ADD = 0x82;
        BUFFER_ADD = high_output;
        BUFFER_ADD = high_direction;
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
+                       high_direction);
 }
 
+
 void axm0432_jtag_reset(int trst, int srst)
 {
        if (trst == 1)
        {
-               cur_state = TAP_RESET;
+               tap_set_state(TAP_RESET);
                high_output &= ~nTRST;
        }
        else if (trst == 0)
@@ -1090,9 +1136,11 @@ void axm0432_jtag_reset(int trst, int srst)
        BUFFER_ADD = 0x82;
        BUFFER_ADD = high_output;
        BUFFER_ADD = high_direction;
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
+                       high_direction);
 }
 
+
 void flyswatter_reset(int trst, int srst)
 {
        if (trst == 1)
@@ -1120,6 +1168,7 @@ void flyswatter_reset(int trst, int srst)
        LOG_DEBUG("trst: %i, srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", trst, srst, low_output, low_direction);
 }
 
+
 void turtle_reset(int trst, int srst)
 {
        trst = trst;
@@ -1140,6 +1189,7 @@ void turtle_reset(int trst, int srst)
        LOG_DEBUG("srst: %i, low_output: 0x%2.2x, low_direction: 0x%2.2x", srst, low_output, low_direction);
 }
 
+
 void comstick_reset(int trst, int srst)
 {
        if (trst == 1)
@@ -1164,9 +1214,11 @@ void comstick_reset(int trst, int srst)
        BUFFER_ADD = 0x82;
        BUFFER_ADD = high_output;
        BUFFER_ADD = high_direction;
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
+                       high_direction);
 }
 
+
 void stm32stick_reset(int trst, int srst)
 {
        if (trst == 1)
@@ -1196,20 +1248,22 @@ void stm32stick_reset(int trst, int srst)
        BUFFER_ADD = 0x82;
        BUFFER_ADD = high_output;
        BUFFER_ADD = high_direction;
-       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output, high_direction);
+       LOG_DEBUG("trst: %i, srst: %i, high_output: 0x%2.2x, high_direction: 0x%2.2x", trst, srst, high_output,
+                       high_direction);
 }
 
+
 int ft2232_execute_queue()
 {
-       jtag_command_t *cmd = jtag_command_queue; /* currently processed command */
-       u8 *buffer;
-       int scan_size;  /* size of IR or DR scan */
-       enum scan_type type;
-       int i;
-       int predicted_size = 0;
-       int retval;
-
-       first_unsent = cmd;                     /* next command that has to be sent */
+       jtag_command_t* cmd = jtag_command_queue;   /* currently processed command */
+       u8*             buffer;
+       int             scan_size;                  /* size of IR or DR scan */
+       enum scan_type  type;
+       int             i;
+       int             predicted_size = 0;
+       int             retval;
+
+       first_unsent = cmd;         /* next command that has to be sent */
        require_send = 0;
 
        /* return ERROR_OK, unless ft2232_send_and_recv reports a failed check
@@ -1226,209 +1280,219 @@ int ft2232_execute_queue()
 
        while (cmd)
        {
-               switch(cmd->type)
+               switch (cmd->type)
                {
-                       case JTAG_END_STATE:
-                               if (cmd->cmd.end_state->end_state != -1)
-                                       ft2232_end_state(cmd->cmd.end_state->end_state);
-                               break;
+               case JTAG_END_STATE:
+                       if (cmd->cmd.end_state->end_state != -1)
+                               ft2232_end_state(cmd->cmd.end_state->end_state);
+                       break;
 
-                       case JTAG_RESET:
-                               /* only send the maximum buffer size that FT2232C can handle */
-                               predicted_size = 3;
-                               if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-                               {
-                                       if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                                               retval = ERROR_JTAG_QUEUE_FAILED;
-                                       require_send = 0;
-                                       first_unsent = cmd;
-                               }
-
-                               if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
-                               {
-                                       cur_state = TAP_RESET;
-                               }
-                               layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
-                               require_send = 1;
+               case JTAG_RESET:
+                       /* only send the maximum buffer size that FT2232C can handle */
+                       predicted_size = 3;
+                       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
+                       {
+                               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                                       retval = ERROR_JTAG_QUEUE_FAILED;
+                               require_send = 0;
+                               first_unsent = cmd;
+                       }
+
+                       if ( (cmd->cmd.reset->trst == 1) || ( cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST) ) )
+                       {
+                               tap_set_state(TAP_RESET);
+                       }
+                       layout->reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+                       require_send = 1;
 
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+                       LOG_DEBUG("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
 #endif
-                               break;
+                       break;
 
-                       case JTAG_RUNTEST:
-                               /* only send the maximum buffer size that FT2232C can handle */
-                               predicted_size = 0;
-                               if (cur_state != TAP_IDLE)
-                                       predicted_size += 3;
-                               predicted_size += 3 * CEIL(cmd->cmd.runtest->num_cycles, 7);
-                               if ((cmd->cmd.runtest->end_state != -1) && (cmd->cmd.runtest->end_state != TAP_IDLE))
-                                       predicted_size += 3;
-                               if ((cmd->cmd.runtest->end_state == -1) && (end_state != TAP_IDLE))
-                                       predicted_size += 3;
-                               if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-                               {
-                                       if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                                               retval = ERROR_JTAG_QUEUE_FAILED;
-                                       require_send = 0;
-                                       first_unsent = cmd;
-                               }
-                               if (cur_state != TAP_IDLE)
-                               {
-                                       /* command "Clock Data to TMS/CS Pin (no Read)" */
-                                       BUFFER_ADD = 0x4b;
-                                       /* scan 7 bit */
-                                       BUFFER_ADD = 0x6;
-                                       /* TMS data bits */
-                                       BUFFER_ADD = TAP_MOVE(cur_state, TAP_IDLE);
-                                       cur_state = TAP_IDLE;
-                                       require_send = 1;
-                               }
-                               i = cmd->cmd.runtest->num_cycles;
-                               while (i > 0)
-                               {
-                                       /* command "Clock Data to TMS/CS Pin (no Read)" */
-                                       BUFFER_ADD = 0x4b;
-                                       /* scan 7 bit */
-                                       BUFFER_ADD = (i > 7) ? 6 : (i - 1);
-                                       /* TMS data bits */
-                                       BUFFER_ADD = 0x0;
-                                       cur_state = TAP_IDLE;
-                                       i -= (i > 7) ? 7 : i;
-                                       /* LOG_DEBUG("added TMS scan (no read)"); */
-                               }
-                               if (cmd->cmd.runtest->end_state != -1)
-                                       ft2232_end_state(cmd->cmd.runtest->end_state);
-                               if (cur_state != end_state)
-                               {
-                                       /* command "Clock Data to TMS/CS Pin (no Read)" */
-                                       BUFFER_ADD = 0x4b;
-                                       /* scan 7 bit */
-                                       BUFFER_ADD = 0x6;
-                                       /* TMS data bits */
-                                       BUFFER_ADD = TAP_MOVE(cur_state, end_state);
-                                       cur_state = end_state;
-                                       /* LOG_DEBUG("added TMS scan (no read)"); */
-                               }
+               case JTAG_RUNTEST:
+                       /* only send the maximum buffer size that FT2232C can handle */
+                       predicted_size = 0;
+                       if (tap_get_state() != TAP_IDLE)
+                               predicted_size += 3;
+                       predicted_size += 3 * CEIL(cmd->cmd.runtest->num_cycles, 7);
+                       if ( (cmd->cmd.runtest->end_state != -1) && (cmd->cmd.runtest->end_state != TAP_IDLE) )
+                               predicted_size += 3;
+                       if ( (cmd->cmd.runtest->end_state == -1) && (tap_get_end_state() != TAP_IDLE) )
+                               predicted_size += 3;
+                       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
+                       {
+                               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                                       retval = ERROR_JTAG_QUEUE_FAILED;
+                               require_send = 0;
+                               first_unsent = cmd;
+                       }
+                       if (tap_get_state() != TAP_IDLE)
+                       {
+                               /* command "Clock Data to TMS/CS Pin (no Read)" */
+                               BUFFER_ADD = 0x4b;
+                               BUFFER_ADD = 0x6;    /* scan 7 bits */
+
+                               /* TMS data bits */
+                               BUFFER_ADD = tap_get_tms_path(tap_get_state(), TAP_IDLE);
+                               tap_set_state(TAP_IDLE);
                                require_send = 1;
-#ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("runtest: %i, end in %s", cmd->cmd.runtest->num_cycles, jtag_state_name(end_state));
-#endif
-                               break;
+                       }
+                       i = cmd->cmd.runtest->num_cycles;
+                       while (i > 0)
+                       {
+                               /* command "Clock Data to TMS/CS Pin (no Read)" */
+                               BUFFER_ADD = 0x4b;
 
-                       case JTAG_STATEMOVE:
-                               /* only send the maximum buffer size that FT2232C can handle */
-                               predicted_size = 3;
-                               if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-                               {
-                                       if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                                               retval = ERROR_JTAG_QUEUE_FAILED;
-                                       require_send = 0;
-                                       first_unsent = cmd;
-                               }
-                               if (cmd->cmd.statemove->end_state != -1)
-                                       ft2232_end_state(cmd->cmd.statemove->end_state);
+                               /* scan 7 bits */
+                               BUFFER_ADD = (i > 7) ? 6 : (i - 1);
+
+                               /* TMS data bits */
+                               BUFFER_ADD = 0x0;
+                               tap_set_state(TAP_IDLE);
+                               i -= (i > 7) ? 7 : i;
+                               /* LOG_DEBUG("added TMS scan (no read)"); */
+                       }
+
+                       if (cmd->cmd.runtest->end_state != -1)
+                               ft2232_end_state(cmd->cmd.runtest->end_state);
+
+                       if ( tap_get_state() != tap_get_end_state() )
+                       {
                                /* command "Clock Data to TMS/CS Pin (no Read)" */
                                BUFFER_ADD = 0x4b;
                                /* scan 7 bit */
                                BUFFER_ADD = 0x6;
                                /* TMS data bits */
-                               BUFFER_ADD = TAP_MOVE(cur_state, end_state);
+                               BUFFER_ADD = tap_get_tms_path( tap_get_state(), tap_get_end_state() );
+                               tap_set_state( tap_get_end_state() );
                                /* LOG_DEBUG("added TMS scan (no read)"); */
-                               cur_state = end_state;
-                               require_send = 1;
+                       }
+                       require_send = 1;
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("statemove: %s", jtag_state_name(end_state));
+                       LOG_DEBUG( "runtest: %i, end in %s", cmd->cmd.runtest->num_cycles, tap_state_name( tap_get_end_state() ) );
 #endif
-                               break;
+                       break;
 
-                       case JTAG_PATHMOVE:
-                               /* only send the maximum buffer size that FT2232C can handle */
-                               predicted_size = 3 * CEIL(cmd->cmd.pathmove->num_states, 7);
-                               if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-                               {
-                                       if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                                               retval = ERROR_JTAG_QUEUE_FAILED;
-                                       require_send = 0;
-                                       first_unsent = cmd;
-                               }
-                               ft2232_add_pathmove(cmd->cmd.pathmove);
-                               require_send = 1;
+               case JTAG_STATEMOVE:
+                       /* only send the maximum buffer size that FT2232C can handle */
+                       predicted_size = 3;
+                       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
+                       {
+                               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                                       retval = ERROR_JTAG_QUEUE_FAILED;
+                               require_send = 0;
+                               first_unsent = cmd;
+                       }
+                       if (cmd->cmd.statemove->end_state != -1)
+                               ft2232_end_state(cmd->cmd.statemove->end_state);
+
+                       /* command "Clock Data to TMS/CS Pin (no Read)" */
+                       BUFFER_ADD = 0x4b;
+
+                       BUFFER_ADD = 0x6;       /* scan 7 bits */
+
+                       /* TMS data bits */
+                       BUFFER_ADD = tap_get_tms_path( tap_get_state(), tap_get_end_state() );
+                       /* LOG_DEBUG("added TMS scan (no read)"); */
+                       tap_set_state( tap_get_end_state() );
+                       require_send = 1;
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
-                                       jtag_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
+                       LOG_DEBUG( "statemove: %s", tap_state_name( tap_get_end_state() ) );
 #endif
-                               break;
+                       break;
 
-                       case JTAG_SCAN:
-                               scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
-                               type = jtag_scan_type(cmd->cmd.scan);
-                               predicted_size = ft2232_predict_scan_out(scan_size, type);
-                               if ((predicted_size + 1) > FT2232_BUFFER_SIZE)
-                               {
-                                       LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
-                                       /* unsent commands before this */
-                                       if (first_unsent != cmd)
-                                               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
-                                                       retval = ERROR_JTAG_QUEUE_FAILED;
-
-                                       /* current command */
-                                       if (cmd->cmd.scan->end_state != -1)
-                                               ft2232_end_state(cmd->cmd.scan->end_state);
-                                       ft2232_large_scan(cmd->cmd.scan, type, buffer, scan_size);
-                                       require_send = 0;
-                                       first_unsent = cmd->next;
-                                       if (buffer)
-                                               free(buffer);
-                                       break;
-                               }
-                               else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
-                               {
-                                       LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)", first_unsent, cmd);
+               case JTAG_PATHMOVE:
+                       /* only send the maximum buffer size that FT2232C can handle */
+                       predicted_size = 3 * CEIL(cmd->cmd.pathmove->num_states, 7);
+                       if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
+                       {
+                               if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                                       retval = ERROR_JTAG_QUEUE_FAILED;
+                               require_send = 0;
+                               first_unsent = cmd;
+                       }
+                       ft2232_add_pathmove(cmd->cmd.pathmove);
+                       require_send = 1;
+#ifdef _DEBUG_JTAG_IO_
+                       LOG_DEBUG( "pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states,
+                                       tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]) );
+#endif
+                       break;
+
+               case JTAG_SCAN:
+                       scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
+                       type = jtag_scan_type(cmd->cmd.scan);
+                       predicted_size = ft2232_predict_scan_out(scan_size, type);
+                       if ( (predicted_size + 1) > FT2232_BUFFER_SIZE )
+                       {
+                               LOG_DEBUG("oversized ft2232 scan (predicted_size > FT2232_BUFFER_SIZE)");
+                               /* unsent commands before this */
+                               if (first_unsent != cmd)
                                        if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                                                retval = ERROR_JTAG_QUEUE_FAILED;
-                                       require_send = 0;
-                                       first_unsent = cmd;
-                               }
-                               ft2232_expect_read += ft2232_predict_scan_in(scan_size, type);
-                               /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */
+
+                               /* current command */
                                if (cmd->cmd.scan->end_state != -1)
                                        ft2232_end_state(cmd->cmd.scan->end_state);
-                               ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
-                               require_send = 1;
+                               ft2232_large_scan(cmd->cmd.scan, type, buffer, scan_size);
+                               require_send = 0;
+                               first_unsent = cmd->next;
                                if (buffer)
                                        free(buffer);
-#ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("%s scan, %i bits, end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
-                                       jtag_state_name(end_state));
-#endif
                                break;
-
-                       case JTAG_SLEEP:
+                       }
+                       else if (ft2232_buffer_size + predicted_size + 1 > FT2232_BUFFER_SIZE)
+                       {
+                               LOG_DEBUG("ft2232 buffer size reached, sending queued commands (first_unsent: %p, cmd: %p)",
+                                               first_unsent,
+                                               cmd);
                                if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
                                        retval = ERROR_JTAG_QUEUE_FAILED;
-                               first_unsent = cmd->next;
-                               jtag_sleep(cmd->cmd.sleep->us);
+                               require_send = 0;
+                               first_unsent = cmd;
+                       }
+                       ft2232_expect_read += ft2232_predict_scan_in(scan_size, type);
+                       /* LOG_DEBUG("new read size: %i", ft2232_expect_read); */
+                       if (cmd->cmd.scan->end_state != -1)
+                               ft2232_end_state(cmd->cmd.scan->end_state);
+                       ft2232_add_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);
+                       require_send = 1;
+                       if (buffer)
+                               free(buffer);
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("sleep %i usec while in %s", cmd->cmd.sleep->us, jtag_state_name(cur_state));
+                       LOG_DEBUG( "%s scan, %i bits, end in %s", (cmd->cmd.scan->ir_scan) ? "IR" : "DR", scan_size,
+                                       tap_state_name( tap_get_end_state() ) );
 #endif
-                               break;
+                       break;
 
-                       case JTAG_STABLECLOCKS:
-                               /* this is only allowed while in a stable state.  A check for a stable
-                                * state was done in jtag_add_clocks()
-                                */
-                               if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
-                                       retval = ERROR_JTAG_QUEUE_FAILED;
+               case JTAG_SLEEP:
+                       if (ft2232_send_and_recv(first_unsent, cmd) != ERROR_OK)
+                               retval = ERROR_JTAG_QUEUE_FAILED;
+                       first_unsent = cmd->next;
+                       jtag_sleep(cmd->cmd.sleep->us);
 #ifdef _DEBUG_JTAG_IO_
-                               LOG_DEBUG("clocks %i while in %s", cmd->cmd.stableclocks->num_cycles, jtag_state_name(cur_state));
+                       LOG_DEBUG( "sleep %i usec while in %s", cmd->cmd.sleep->us, tap_state_name( tap_get_state() ) );
 #endif
-                               break;
+                       break;
 
-                       default:
-                               LOG_ERROR("BUG: unknown JTAG command type encountered");
-                               exit(-1);
+               case JTAG_STABLECLOCKS:
+
+                       /* this is only allowed while in a stable state.  A check for a stable
+                        * state was done in jtag_add_clocks()
+                        */
+                       if (ft2232_stableclocks(cmd->cmd.stableclocks->num_cycles, cmd) != ERROR_OK)
+                               retval = ERROR_JTAG_QUEUE_FAILED;
+#ifdef _DEBUG_JTAG_IO_
+                       LOG_DEBUG( "clocks %i while in %s", cmd->cmd.stableclocks->num_cycles, tap_state_name( tap_get_state() ) );
+#endif
+                       break;
+
+               default:
+                       LOG_ERROR("BUG: unknown JTAG command type encountered");
+                       exit(-1);
                }
+
                cmd = cmd->next;
        }
 
@@ -1439,19 +1503,20 @@ int ft2232_execute_queue()
        return retval;
 }
 
+
 #if BUILD_FT2232_FTD2XX == 1
-static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
+static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, inttry_more)
 {
        FT_STATUS status;
-       DWORD openex_flags = 0;
-       char *openex_string = NULL;
-       u8 latency_timer;
+       DWORD     openex_flags  = 0;
+       char*     openex_string = NULL;
+       u8        latency_timer;
 
-       LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)",ft2232_layout, vid, pid);
+       LOG_DEBUG("'ft2232' interface using FTD2XX with '%s' layout (%4.4x:%4.4x)", ft2232_layout, vid, pid);
 
 #if IS_WIN32 == 0
        /* Add non-standard Vid/Pid to the linux driver */
-       if ((status = FT_SetVIDPID(vid, pid)) != FT_OK)
+       if ( ( status = FT_SetVIDPID(vid, pid) ) != FT_OK )
        {
                LOG_WARNING("couldn't add %4.4x:%4.4x", vid, pid);
        }
@@ -1466,12 +1531,12 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
        if (ft2232_device_desc)
        {
                openex_string = ft2232_device_desc;
-               openex_flags = FT_OPEN_BY_DESCRIPTION;
+               openex_flags  = FT_OPEN_BY_DESCRIPTION;
        }
        else if (ft2232_serial)
        {
                openex_string = ft2232_serial;
-               openex_flags = FT_OPEN_BY_SERIAL_NUMBER;
+               openex_flags  = FT_OPEN_BY_SERIAL_NUMBER;
        }
        else
        {
@@ -1481,11 +1546,12 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_OpenEx(openex_string, openex_flags, &ftdih)) != FT_OK)
+       if ( ( status = FT_OpenEx(openex_string, openex_flags, &ftdih) ) != FT_OK )
        {
                DWORD num_devices;
 
-               if (more) {
+               if (more)
+               {
                        LOG_WARNING("unable to open ftdi device (trying more): %lu", status);
                        *try_more = 1;
                        return ERROR_JTAG_INIT_FAILED;
@@ -1494,11 +1560,12 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
                status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY);
                if (status == FT_OK)
                {
-                       char **desc_array = malloc(sizeof(char*) * (num_devices + 1));
-                       int i;
+                       char** desc_array = malloc( sizeof(char*) * (num_devices + 1) );
+                       int    i;
 
                        for (i = 0; i < num_devices; i++)
                                desc_array[i] = malloc(64);
+
                        desc_array[num_devices] = NULL;
 
                        status = FT_ListDevices(desc_array, &num_devices, FT_LIST_ALL | openex_flags);
@@ -1512,6 +1579,7 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
 
                        for (i = 0; i < num_devices; i++)
                                free(desc_array[i]);
+
                        free(desc_array);
                }
                else
@@ -1521,13 +1589,13 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_SetLatencyTimer(ftdih, ft2232_latency)) != FT_OK)
+       if ( ( status = FT_SetLatencyTimer(ftdih, ft2232_latency) ) != FT_OK )
        {
                LOG_ERROR("unable to set latency timer: %lu", status);
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK)
+       if ( ( status = FT_GetLatencyTimer(ftdih, &latency_timer) ) != FT_OK )
        {
                LOG_ERROR("unable to get latency timer: %lu", status);
                return ERROR_JTAG_INIT_FAILED;
@@ -1537,13 +1605,13 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
                LOG_DEBUG("current latency timer: %i", latency_timer);
        }
 
-       if ((status = FT_SetTimeouts(ftdih, 5000, 5000)) != FT_OK)
+       if ( ( status = FT_SetTimeouts(ftdih, 5000, 5000) ) != FT_OK )
        {
                LOG_ERROR("unable to set timeouts: %lu", status);
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       if ((status = FT_SetBitMode(ftdih, 0x0b, 2)) != FT_OK)
+       if ( ( status = FT_SetBitMode(ftdih, 0x0b, 2) ) != FT_OK )
        {
                LOG_ERROR("unable to enable bit i/o mode: %lu", status);
                return ERROR_JTAG_INIT_FAILED;
@@ -1552,11 +1620,12 @@ static int ft2232_init_ftd2xx(u16 vid, u16 pid, int more, int *try_more)
        return ERROR_OK;
 }
 
+
 static int ft2232_purge_ftd2xx(void)
 {
        FT_STATUS status;
 
-       if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK)
+       if ( ( status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX) ) != FT_OK )
        {
                LOG_ERROR("error purging ftd2xx device: %lu", status);
                return ERROR_JTAG_INIT_FAILED;
@@ -1564,25 +1633,28 @@ static int ft2232_purge_ftd2xx(void)
 
        return ERROR_OK;
 }
+
+
 #endif /* BUILD_FT2232_FTD2XX == 1 */
 
 #if BUILD_FT2232_LIBFTDI == 1
-static int ft2232_init_libftdi(u16 vid, u16 pid, int more, int *try_more)
+static int ft2232_init_libftdi(u16 vid, u16 pid, int more, inttry_more)
 {
        u8 latency_timer;
 
        LOG_DEBUG("'ft2232' interface using libftdi with '%s' layout (%4.4x:%4.4x)",
-               ft2232_layout, vid, pid);
+                       ft2232_layout, vid, pid);
 
        if (ftdi_init(&ftdic) < 0)
                return ERROR_JTAG_INIT_FAILED;
 
        /* context, vendor id, product id */
        if (ftdi_usb_open_desc(&ftdic, vid, pid, ft2232_device_desc,
-               ft2232_serial) < 0) {
+                               ft2232_serial) < 0)
+       {
                if (more)
                        LOG_WARNING("unable to open ftdi device (trying more): %s",
-                               ftdic.error_str);
+                                       ftdic.error_str);
                else
                        LOG_ERROR("unable to open ftdi device: %s", ftdic.error_str);
                *try_more = 1;
@@ -1622,6 +1694,7 @@ static int ft2232_init_libftdi(u16 vid, u16 pid, int more, int *try_more)
        return ERROR_OK;
 }
 
+
 static int ft2232_purge_libftdi(void)
 {
        if (ftdi_usb_purge_buffers(&ftdic) < 0)
@@ -1632,17 +1705,19 @@ static int ft2232_purge_libftdi(void)
 
        return ERROR_OK;
 }
+
+
 #endif /* BUILD_FT2232_LIBFTDI == 1 */
 
 int ft2232_init(void)
 {
-       u8 buf[1];
+       u8  buf[1];
        int retval;
        u32 bytes_written;
-       ft2232_layout_t *cur_layout = ft2232_layouts;
+       ft2232_layout_tcur_layout = ft2232_layouts;
        int i;
 
-       if ((ft2232_layout == NULL) || (ft2232_layout[0] == 0))
+       if ( (ft2232_layout == NULL) || (ft2232_layout[0] == 0) )
        {
                ft2232_layout = "usbjtag";
                LOG_WARNING("No ft2232 layout specified, using default 'usbjtag'");
@@ -1664,7 +1739,8 @@ int ft2232_init(void)
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       for (i = 0; 1; i++) {
+       for (i = 0; 1; i++)
+       {
                /*
                 * "more indicates that there are more IDs to try, so we should
                 * not print an error for an ID mismatch (but for anything
@@ -1674,15 +1750,15 @@ int ft2232_init(void)
                 * ID mismatch (and nothing else) and that we should proceeed
                 * with the next ID pair.
                 */
-               int more = ft2232_vid[i+1] || ft2232_pid[i+1];
+               int more     = ft2232_vid[i + 1] || ft2232_pid[i + 1];
                int try_more = 0;
 
 #if BUILD_FT2232_FTD2XX == 1
                retval = ft2232_init_ftd2xx(ft2232_vid[i], ft2232_pid[i],
-                       more, &try_more);
+                               more, &try_more);
 #elif BUILD_FT2232_LIBFTDI == 1
                retval = ft2232_init_libftdi(ft2232_vid[i], ft2232_pid[i],
-                       more, &try_more);
+                               more, &try_more);
 #endif
                if (retval >= 0)
                        break;
@@ -1699,7 +1775,7 @@ int ft2232_init(void)
        ft2232_speed(jtag_speed);
 
        buf[0] = 0x85; /* Disconnect TDI/DO to TDO/DI for Loopback */
-       if (((retval = ft2232_write(buf, 1, &bytes_written)) != ERROR_OK) || (bytes_written != 1))
+       if ( ( ( retval = ft2232_write(buf, 1, &bytes_written) ) != ERROR_OK ) || (bytes_written != 1) )
        {
                LOG_ERROR("couldn't write to FT2232 to disable loopback");
                return ERROR_JTAG_INIT_FAILED;
@@ -1714,26 +1790,27 @@ int ft2232_init(void)
        return ERROR_OK;
 }
 
+
 int usbjtag_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x0b;
 
        if (strcmp(ft2232_layout, "usbjtag") == 0)
        {
-               nTRST = 0x10;
+               nTRST    = 0x10;
                nTRSTnOE = 0x10;
-               nSRST = 0x40;
+               nSRST    = 0x40;
                nSRSTnOE = 0x40;
        }
        else if (strcmp(ft2232_layout, "signalyzer") == 0)
        {
-               nTRST = 0x10;
+               nTRST    = 0x10;
                nTRSTnOE = 0x10;
-               nSRST = 0x20;
+               nSRST    = 0x20;
                nSRSTnOE = 0x20;
        }
        else if (strcmp(ft2232_layout, "evb_lm3s811") == 0)
@@ -1742,7 +1819,7 @@ int usbjtag_init(void)
                nTRSTnOE = 0x00;
                nSRST = 0x20;
                nSRSTnOE = 0x20;
-               low_output = 0x88;
+               low_output    = 0x88;
                low_direction = 0x8b;
        }
        else
@@ -1754,32 +1831,32 @@ int usbjtag_init(void)
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
        {
                low_direction &= ~nTRSTnOE; /* nTRST input */
-               low_output &= ~nTRST; /* nTRST = 0 */
+               low_output    &= ~nTRST;    /* nTRST = 0 */
        }
        else
        {
-               low_direction |= nTRSTnOE; /* nTRST output */
-               low_output |= nTRST; /* nTRST = 1 */
+               low_direction |= nTRSTnOE;  /* nTRST output */
+               low_output    |= nTRST;     /* nTRST = 1 */
        }
 
        if (jtag_reset_config & RESET_SRST_PUSH_PULL)
        {
-               low_direction |= nSRSTnOE; /* nSRST output */
-               low_output |= nSRST; /* nSRST = 1 */
+               low_direction |= nSRSTnOE;  /* nSRST output */
+               low_output    |= nSRST;     /* nSRST = 1 */
        }
        else
        {
                low_direction &= ~nSRSTnOE; /* nSRST input */
-               low_output &= ~nSRST; /* nSRST = 0 */
+               low_output    &= ~nSRST;    /* nSRST = 0 */
        }
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, xRST high) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, xRST high) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'USBJTAG' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -1788,21 +1865,22 @@ int usbjtag_init(void)
        return ERROR_OK;
 }
 
+
 int axm0432_jtag_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x2b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -1810,10 +1888,10 @@ int axm0432_jtag_init(void)
 
        if (strcmp(layout->name, "axm0432_jtag") == 0)
        {
-               nTRST = 0x08;
-               nTRSTnOE = 0x0;  /* No output enable for TRST*/
-               nSRST = 0x04;
-               nSRSTnOE = 0x0;  /* No output enable for SRST*/
+               nTRST    = 0x08;
+               nTRSTnOE = 0x0;     /* No output enable for TRST*/
+               nSRST    = 0x04;
+               nSRSTnOE = 0x0;     /* No output enable for SRST*/
        }
        else
        {
@@ -1821,7 +1899,7 @@ int axm0432_jtag_init(void)
                exit(-1);
        }
 
-       high_output = 0x0;
+       high_output    = 0x0;
        high_direction = 0x0c;
 
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
@@ -1843,12 +1921,12 @@ int axm0432_jtag_init(void)
        }
 
        /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output; /* value */
-       buf[2] = high_direction;   /* all outputs (xRST and xRSTnOE) */
+       buf[0] = 0x82;              /* command "set data bits high byte" */
+       buf[1] = high_output;       /* value */
+       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'Dicarlo' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -1857,21 +1935,22 @@ int axm0432_jtag_init(void)
        return ERROR_OK;
 }
 
+
 int jtagkey_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x1b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -1879,17 +1958,17 @@ int jtagkey_init(void)
 
        if (strcmp(layout->name, "jtagkey") == 0)
        {
-               nTRST = 0x01;
+               nTRST    = 0x01;
                nTRSTnOE = 0x4;
-               nSRST = 0x02;
+               nSRST    = 0x02;
                nSRSTnOE = 0x08;
        }
-       else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0) ||
-               (strcmp(layout->name, "oocdlink") == 0))
+       else if ( (strcmp(layout->name, "jtagkey_prototype_v1") == 0)
+                        || (strcmp(layout->name, "oocdlink") == 0) )
        {
-               nTRST = 0x02;
+               nTRST    = 0x02;
                nTRSTnOE = 0x1;
-               nSRST = 0x08;
+               nSRST    = 0x08;
                nSRSTnOE = 0x04;
        }
        else
@@ -1898,7 +1977,7 @@ int jtagkey_init(void)
                exit(-1);
        }
 
-       high_output = 0x0;
+       high_output    = 0x0;
        high_direction = 0x0f;
 
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
@@ -1924,12 +2003,12 @@ int jtagkey_init(void)
        }
 
        /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output; /* value */
-       buf[2] = high_direction;   /* all outputs (xRST and xRSTnOE) */
+       buf[0] = 0x82;              /* command "set data bits high byte" */
+       buf[1] = high_output;       /* value */
+       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -1938,32 +2017,33 @@ int jtagkey_init(void)
        return ERROR_OK;
 }
 
+
 int olimex_jtag_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x1b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRST = 0x01;
+       nTRST    = 0x01;
        nTRSTnOE = 0x4;
-       nSRST = 0x02;
+       nSRST    = 0x02;
        nSRSTnOE = 0x00; /* no output enable for nSRST */
 
-       high_output = 0x0;
+       high_output    = 0x0;
        high_direction = 0x0f;
 
        if (jtag_reset_config & RESET_TRST_OPEN_DRAIN)
@@ -1990,12 +2070,12 @@ int olimex_jtag_init(void)
        high_output |= 0x08;
 
        /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output; /* value */
-       buf[2] = high_direction;   /* all outputs (xRST and xRSTnOE) */
+       buf[0] = 0x82;              /* command "set data bits high byte" */
+       buf[1] = high_output;       /* value */
+       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'JTAGkey' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2004,44 +2084,45 @@ int olimex_jtag_init(void)
        return ERROR_OK;
 }
 
+
 int flyswatter_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x18;
+       low_output    = 0x18;
        low_direction = 0xfb;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE[12]=out, n[ST]srst=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRST = 0x10;
-       nTRSTnOE = 0x0; /* not output enable for nTRST */
-       nSRST = 0x20;
-       nSRSTnOE = 0x00; /* no output enable for nSRST */
+       nTRST    = 0x10;
+       nTRSTnOE = 0x0;     /* not output enable for nTRST */
+       nSRST    = 0x20;
+       nSRSTnOE = 0x00;    /* no output enable for nSRST */
 
-       high_output = 0x00;
+       high_output    = 0x00;
        high_direction = 0x0c;
 
        /* turn red LED1 on, LED2 off */
        high_output |= 0x08;
 
        /* initialize high port */
-       buf[0] = 0x82; /* command "set data bits high byte" */
-       buf[1] = high_output; /* value */
-       buf[2] = high_direction;   /* all outputs (xRST and xRSTnOE) */
+       buf[0] = 0x82;              /* command "set data bits high byte" */
+       buf[1] = high_output;       /* value */
+       buf[2] = high_direction;    /* all outputs (xRST and xRSTnOE) */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'flyswatter' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2050,21 +2131,22 @@ int flyswatter_init(void)
        return ERROR_OK;
 }
 
+
 int turtle_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x5b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2072,7 +2154,7 @@ int turtle_init(void)
 
        nSRST = 0x40;
 
-       high_output = 0x00;
+       high_output    = 0x00;
        high_direction = 0x0C;
 
        /* initialize high port */
@@ -2081,7 +2163,7 @@ int turtle_init(void)
        buf[2] = high_direction;
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'turtelizer2' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2090,32 +2172,33 @@ int turtle_init(void)
        return ERROR_OK;
 }
 
+
 int comstick_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x08;
+       low_output    = 0x08;
        low_direction = 0x0b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRST = 0x01;
-       nTRSTnOE = 0x00; /* no output enable for nTRST */
-       nSRST = 0x02;
-       nSRSTnOE = 0x00; /* no output enable for nSRST */
+       nTRST    = 0x01;
+       nTRSTnOE = 0x00;    /* no output enable for nTRST */
+       nSRST    = 0x02;
+       nSRSTnOE = 0x00;    /* no output enable for nSRST */
 
-       high_output = 0x03;
+       high_output    = 0x03;
        high_direction = 0x03;
 
        /* initialize high port */
@@ -2124,7 +2207,7 @@ int comstick_init(void)
        buf[2] = high_direction;
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'comstick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2133,32 +2216,33 @@ int comstick_init(void)
        return ERROR_OK;
 }
 
+
 int stm32stick_init(void)
 {
-       u8 buf[3];
+       u8  buf[3];
        u32 bytes_written;
 
-       low_output = 0x88;
+       low_output    = 0x88;
        low_direction = 0x8b;
 
        /* initialize low byte for jtag */
-       buf[0] = 0x80; /* command "set data bits low byte" */
-       buf[1] = low_output; /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
+       buf[0] = 0x80;          /* command "set data bits low byte" */
+       buf[1] = low_output;    /* value (TMS=1,TCK=0, TDI=0, nOE=0) */
        buf[2] = low_direction; /* dir (output=1), TCK/TDI/TMS=out, TDO=in, nOE=out */
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
        }
 
-       nTRST = 0x01;
-       nTRSTnOE = 0x00; /* no output enable for nTRST */
-       nSRST = 0x80;
-       nSRSTnOE = 0x00; /* no output enable for nSRST */
+       nTRST    = 0x01;
+       nTRSTnOE = 0x00;    /* no output enable for nTRST */
+       nSRST    = 0x80;
+       nSRSTnOE = 0x00;    /* no output enable for nSRST */
 
-       high_output = 0x01;
+       high_output    = 0x01;
        high_direction = 0x03;
 
        /* initialize high port */
@@ -2167,7 +2251,7 @@ int stm32stick_init(void)
        buf[2] = high_direction;
        LOG_DEBUG("%2.2x %2.2x %2.2x", buf[0], buf[1], buf[2]);
 
-       if (((ft2232_write(buf, 3, &bytes_written)) != ERROR_OK) || (bytes_written != 3))
+       if ( ( ( ft2232_write(buf, 3, &bytes_written) ) != ERROR_OK ) || (bytes_written != 3) )
        {
                LOG_ERROR("couldn't initialize FT2232 with 'stm32stick' layout");
                return ERROR_JTAG_INIT_FAILED;
@@ -2176,6 +2260,7 @@ int stm32stick_init(void)
        return ERROR_OK;
 }
 
+
 void olimex_jtag_blink(void)
 {
        /* Olimex ARM-USB-OCD has a LED connected to ACBUS3
@@ -2197,10 +2282,11 @@ void olimex_jtag_blink(void)
        BUFFER_ADD = high_direction;
 }
 
+
 void turtle_jtag_blink(void)
 {
        /*
-   * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
+        * Turtelizer2 has two LEDs connected to ACBUS2 and ACBUS3
         */
        if (high_output & 0x08)
        {
@@ -2216,6 +2302,7 @@ void turtle_jtag_blink(void)
        BUFFER_ADD = high_direction;
 }
 
+
 int ft2232_quit(void)
 {
 #if BUILD_FT2232_FTD2XX == 1
@@ -2236,7 +2323,8 @@ int ft2232_quit(void)
        return ERROR_OK;
 }
 
-int ft2232_handle_device_desc_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+
+int ft2232_handle_device_desc_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
        if (argc == 1)
        {
@@ -2250,7 +2338,8 @@ int ft2232_handle_device_desc_command(struct command_context_s *cmd_ctx, char *c
        return ERROR_OK;
 }
 
-int ft2232_handle_serial_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+
+int ft2232_handle_serial_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
        if (argc == 1)
        {
@@ -2264,7 +2353,8 @@ int ft2232_handle_serial_command(struct command_context_s *cmd_ctx, char *cmd, c
        return ERROR_OK;
 }
 
-int ft2232_handle_layout_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+
+int ft2232_handle_layout_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
        if (argc == 0)
                return ERROR_OK;
@@ -2275,26 +2365,30 @@ int ft2232_handle_layout_command(struct command_context_s *cmd_ctx, char *cmd, c
        return ERROR_OK;
 }
 
-int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+
+int ft2232_handle_vid_pid_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
        int i;
 
-       if (argc > MAX_USB_IDS*2) {
+       if (argc > MAX_USB_IDS * 2)
+       {
                LOG_WARNING("ignoring extra IDs in ft2232_vid_pid "
-                       "(maximum is %d pairs)", MAX_USB_IDS);
-               argc = MAX_USB_IDS*2;
+                                       "(maximum is %d pairs)", MAX_USB_IDS);
+               argc = MAX_USB_IDS * 2;
        }
-       if (argc < 2 || (argc & 1))
+       if ( argc < 2 || (argc & 1) )
        {
                LOG_WARNING("incomplete ft2232_vid_pid configuration directive");
                if (argc < 2)
                        return ERROR_OK;
        }
 
-       for (i = 0; i+1 < argc; i += 2) {
+       for (i = 0; i + 1 < argc; i += 2)
+       {
                ft2232_vid[i >> 1] = strtol(args[i], NULL, 0);
-               ft2232_pid[i >> 1] = strtol(args[i+1], NULL, 0);
+               ft2232_pid[i >> 1] = strtol(args[i + 1], NULL, 0);
        }
+
        /*
         * Explicitly terminate, in case there are multiples instances of
         * ft2232_vid_pid.
@@ -2304,7 +2398,8 @@ int ft2232_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd,
        return ERROR_OK;
 }
 
-int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+
+int ft2232_handle_latency_command(struct command_context_s* cmd_ctx, char* cmd, char** args, int argc)
 {
        if (argc == 1)
        {
@@ -2319,19 +2414,18 @@ int ft2232_handle_latency_command(struct command_context_s *cmd_ctx, char *cmd,
 }
 
 
-static int ft2232_stableclocks(int num_cycles, jtag_command_t *cmd)
+static int ft2232_stableclocks(int num_cycles, jtag_command_tcmd)
 {
        int retval = 0;
 
        /* 7 bits of either ones or zeros. */
-       u8 tms = (cur_state == TAP_RESET ? 0x7F : 0x00);
+       u8  tms = (tap_get_state() == TAP_RESET ? 0x7F : 0x00);
 
        while (num_cycles > 0)
        {
                /* the command 0x4b, "Clock Data to TMS/CS Pin (no Read)" handles
                 * at most 7 bits per invocation.  Here we invoke it potentially
                 * several times.
-                * see: http://www.ftdichip.com/Documents/AppNotes/AN2232C-01_MPSSE_Cmnd.pdf
                 */
                int bitcount_per_command = (num_cycles > 7) ? 7 : num_cycles;
 
@@ -2359,4 +2453,3 @@ static int ft2232_stableclocks(int num_cycles, jtag_command_t *cmd)
 
        return retval;
 }
-
index f9bdec259b5b0bd7fd27b4c4e8e44a4f2d961786..622c81f3286a16aae2d3ddbe9fbc0bccb2593a16 100644 (file)
@@ -196,8 +196,8 @@ int gw16012_speed(int speed)
 
 void gw16012_end_state(int state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -208,7 +208,7 @@ void gw16012_end_state(int state)
 void gw16012_state_move(void)
 {
        int i=0, tms=0;
-       u8 tms_scan = TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
        gw16012_control(0x0); /* single-bit mode */
 
@@ -218,7 +218,7 @@ void gw16012_state_move(void)
                gw16012_data(tms << 1); /* output next TMS bit */
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 void gw16012_path_move(pathmove_command_t *cmd)
@@ -230,35 +230,35 @@ void gw16012_path_move(pathmove_command_t *cmd)
        while (num_states)
        {
                gw16012_control(0x0); /* single-bit mode */
-               if (tap_transitions[cur_state].low == cmd->path[state_count])
+               if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[state_count])
                {
                        gw16012_data(0x0); /* TCK cycle with TMS low */
                }
-               else if (tap_transitions[cur_state].high == cmd->path[state_count])
+               else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[state_count])
                {
                        gw16012_data(0x2); /* TCK cycle with TMS high */
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
                        exit(-1);
                }
 
-               cur_state = cmd->path[state_count];
+               tap_set_state(cmd->path[state_count]);
                state_count++;
                num_states--;
        }
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
 void gw16012_runtest(int num_cycles)
 {
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
        int i;
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                gw16012_end_state(TAP_IDLE);
                gw16012_state_move();
@@ -271,7 +271,7 @@ void gw16012_runtest(int num_cycles)
        }
 
        gw16012_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                gw16012_state_move();
 }
 
@@ -279,11 +279,11 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
        int bits_left = scan_size;
        int bit_count = 0;
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
        u8 scan_out, scan_in;
 
        /* only if we're not already in the correct Shift state */
-       if (!((!ir_scan && (cur_state == TAP_DRSHIFT)) || (ir_scan && (cur_state == TAP_IRSHIFT))))
+       if (!((!ir_scan && (tap_get_state() == TAP_DRSHIFT)) || (ir_scan && (tap_get_state() == TAP_IRSHIFT))))
        {
                if (ir_scan)
                        gw16012_end_state(TAP_IRSHIFT);
@@ -312,8 +312,8 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 
                if (bits_left == 0) /* last bit */
                {
-                       if ((ir_scan && (end_state == TAP_IRSHIFT))
-                               || (!ir_scan && (end_state == TAP_DRSHIFT)))
+                       if ((ir_scan && (tap_get_end_state() == TAP_IRSHIFT))
+                               || (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT)))
                        {
                                tms = 0;
                        }
@@ -334,16 +334,16 @@ void gw16012_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
                bit_count++;
        }
 
-       if (!((ir_scan && (end_state == TAP_IRSHIFT)) ||
-               (!ir_scan && (end_state == TAP_DRSHIFT))))
+       if (!((ir_scan && (tap_get_end_state() == TAP_IRSHIFT)) ||
+               (!ir_scan && (tap_get_end_state() == TAP_DRSHIFT))))
        {
                gw16012_data(0x0);
                if (ir_scan)
-                       cur_state = TAP_IRPAUSE;
+                       tap_set_state(TAP_IRPAUSE);
                else
-                       cur_state = TAP_DRPAUSE;
+                       tap_set_state(TAP_DRPAUSE);
 
-               if (cur_state != end_state)
+               if (tap_get_state() != tap_get_end_state())
                        gw16012_state_move();
        }
 }
@@ -378,7 +378,7 @@ int gw16012_execute_queue(void)
 #endif
                                if (cmd->cmd.reset->trst == 1)
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                gw16012_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
index 04ce65c31f4f60675a428dd37398eb7ef0269503..26f9233008c1ab895afb60ebf43631385e96b601 100644 (file)
@@ -88,9 +88,9 @@ int jlink_quit(void);
 int jlink_handle_jlink_info_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* Queue command functions */
-void jlink_end_state(enum tap_state state);
+void jlink_end_state(tap_state_t state);
 void jlink_state_move(void);
-void jlink_path_move(int num_states, enum tap_state *path);
+void jlink_path_move(int num_states, tap_state_t *path);
 void jlink_runtest(int num_cycles);
 void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command);
 void jlink_reset(int trst, int srst);
@@ -214,7 +214,7 @@ int jlink_execute_queue(void)
 
                                if (cmd->cmd.reset->trst == 1)
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                jlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
@@ -331,11 +331,11 @@ int jlink_quit(void)
 /***************************************************************************/
 /* Queue command implementations */
 
-void jlink_end_state(enum tap_state state)
+void jlink_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
+       if (tap_is_state_stable(state))
        {
-               end_state = state;
+               tap_set_end_state(state);
        }
        else
        {
@@ -349,7 +349,7 @@ void jlink_state_move(void)
 {
        int i;
        int tms = 0;
-       u8 tms_scan = TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
        for (i = 0; i < 7; i++)
        {
@@ -357,43 +357,43 @@ void jlink_state_move(void)
                jlink_tap_append_step(tms, 0);
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
-void jlink_path_move(int num_states, enum tap_state *path)
+void jlink_path_move(int num_states, tap_state_t *path)
 {
        int i;
 
        for (i = 0; i < num_states; i++)
        {
-               if (path[i] == tap_transitions[cur_state].low)
+               if (path[i] == tap_state_transition(tap_get_state(), FALSE))
                {
                        jlink_tap_append_step(0, 0);
                }
-               else if (path[i] == tap_transitions[cur_state].high)
+               else if (path[i] == tap_state_transition(tap_get_state(), TRUE))
                {
                        jlink_tap_append_step(1, 0);
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[i]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i]));
                        exit(-1);
                }
 
-               cur_state = path[i];
+               tap_set_state(path[i]);
        }
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
 void jlink_runtest(int num_cycles)
 {
        int i;
 
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                jlink_end_state(TAP_IDLE);
                jlink_state_move();
@@ -407,7 +407,7 @@ void jlink_runtest(int num_cycles)
 
        /* finish in end_state */
        jlink_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
        {
                jlink_state_move();
        }
@@ -415,11 +415,11 @@ void jlink_runtest(int num_cycles)
 
 void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command)
 {
-       enum tap_state saved_end_state;
+       tap_state_t saved_end_state;
 
        jlink_tap_ensure_space(1, scan_size + 8);
 
-       saved_end_state = end_state;
+       saved_end_state = tap_get_end_state();
 
        /* Move to appropriate scan state */
        jlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
@@ -433,9 +433,9 @@ void jlink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, sca
        /* We are in Exit1, go to Pause */
        jlink_tap_append_step(0, 0);
 
-       cur_state = ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE;
+       tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
 
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
        {
                jlink_state_move();
        }
index 4db99610ebdf96e6fd5f0f8f188724f6cc54af69..590839d289dacf6a95acbf6eff8e3eb0232e8b92 100644 (file)
@@ -4,6 +4,10 @@
  *                                                                         *
  *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
  *   oyvind.harboe@zylin.com                                               *
+ *
+ *   Copyright (C) 2009 SoftPLC Corporation
+ *      http://softplc.com
+ *   dick@softplc.com
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
@@ -51,52 +55,6 @@ typedef struct cmd_queue_page_s
 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
 static cmd_queue_page_t *cmd_queue_pages = NULL;
 
-/* tap_move[i][j]: tap movement command to go from state i to state j
- * 0: Test-Logic-Reset
- * 1: Run-Test/Idle
- * 2: Shift-DR
- * 3: Pause-DR
- * 4: Shift-IR
- * 5: Pause-IR
- *
- * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
- */
-u8 tap_move[6][6] =
-{
-/*       RESET  IDLE  DRSHIFT  DRPAUSE  IRSHIFT  IRPAUSE             */
-       {  0x7f, 0x00,    0x17,    0x0a,    0x1b,    0x16},     /* RESET */
-       {  0x7f, 0x00,    0x25,    0x05,    0x2b,    0x0b},     /* IDLE */
-       {  0x7f, 0x31,    0x00,    0x01,    0x0f,    0x2f},     /* DRSHIFT  */
-       {  0x7f, 0x30,    0x20,    0x17,    0x1e,    0x2f},     /* DRPAUSE  */
-       {  0x7f, 0x31,    0x07,    0x17,    0x00,    0x01},     /* IRSHIFT  */
-       {  0x7f, 0x30,    0x1c,    0x17,    0x20,    0x2f}      /* IRPAUSE  */
-};
-
-int tap_move_map[16] = {
-       0, -1, -1,  2, -1,  3, -1, -1,
-       1, -1, -1,  4, -1,  5, -1, -1
-};
-
-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_DRUPDATE,  TAP_DRPAUSE},           /* DREXIT1 */
-       {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_IRUPDATE,  TAP_IRPAUSE},           /* IREXIT1 */
-       {TAP_IREXIT2,   TAP_IRPAUSE},           /* IRPAUSE  */
-       {TAP_IRUPDATE,  TAP_IRSHIFT},           /* IREXIT2 */
-       {TAP_DRSELECT,  TAP_IDLE}                       /* IRUPDATE  */
-};
-
 char* jtag_event_strings[] =
 {
        "JTAG controller reset (RESET or TRST)"
@@ -109,13 +67,6 @@ const Jim_Nvp nvp_jtag_tap_event[] = {
        { .name = NULL, .value = -1 }
 };
 
-/* kludge!!!! these are just global variables that the
- * interface use internally. They really belong
- * inside the drivers, but we don't want to break
- * linking the drivers!!!!
- */
-enum tap_state end_state = TAP_RESET;
-enum tap_state cur_state = TAP_RESET;
 int jtag_trst = 0;
 int jtag_srst = 0;
 
@@ -124,8 +75,8 @@ jtag_command_t **last_comand_pointer = &jtag_command_queue;
 static jtag_tap_t *jtag_all_taps = NULL;
 
 enum reset_types jtag_reset_config = RESET_NONE;
-enum tap_state cmd_queue_end_state = TAP_RESET;
-enum tap_state cmd_queue_cur_state = TAP_RESET;
+tap_state_t cmd_queue_end_state = TAP_RESET;
+tap_state_t cmd_queue_cur_state = TAP_RESET;
 
 int jtag_verify_capture_ir = 1;
 
@@ -257,9 +208,9 @@ jtag_interface_t *jtag_interface = NULL;
 int jtag_speed = 0;
 
 /* forward declarations */
-void jtag_add_pathmove(int num_states, enum tap_state *path);
-void jtag_add_runtest(int num_cycles, enum tap_state endstate);
-void jtag_add_end_state(enum tap_state endstate);
+void jtag_add_pathmove(int num_states, tap_state_t *path);
+void jtag_add_runtest(int num_cycles, tap_state_t endstate);
+void jtag_add_end_state(tap_state_t endstate);
 void jtag_add_sleep(u32 us);
 int jtag_execute_queue(void);
 
@@ -550,7 +501,7 @@ static void jtag_prelude1(void)
                jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
 }
 
-static void jtag_prelude(enum tap_state state)
+static void jtag_prelude(tap_state_t state)
 {
        jtag_prelude1();
 
@@ -560,7 +511,7 @@ static void jtag_prelude(enum tap_state state)
        cmd_queue_cur_state = cmd_queue_end_state;
 }
 
-void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+void jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int retval;
 
@@ -571,7 +522,7 @@ void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        jtag_command_t **last_cmd;
        jtag_tap_t *tap;
@@ -657,7 +608,7 @@ int MINIDRIVER(interface_jtag_add_ir_scan)(int num_fields, scan_field_t *fields,
        return ERROR_OK;
 }
 
-void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int retval;
 
@@ -668,7 +619,7 @@ void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int i;
        jtag_command_t **last_cmd;
@@ -704,7 +655,7 @@ int MINIDRIVER(interface_jtag_add_plain_ir_scan)(int num_fields, scan_field_t *f
        return ERROR_OK;
 }
 
-void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+void jtag_add_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int retval;
 
@@ -715,7 +666,7 @@ void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+int MINIDRIVER(interface_jtag_add_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int j;
        int nth_tap;
@@ -818,7 +769,7 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
                int num_fields,
                const int *num_bits,
                const u32 *value,
-               enum tap_state end_state)
+               tap_state_t end_state)
 {
        int nth_tap;
        int field_count = 0;
@@ -912,7 +863,7 @@ void MINIDRIVER(interface_jtag_add_dr_out)(jtag_tap_t *target_tap,
        }
 }
 
-void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int retval;
 
@@ -923,7 +874,7 @@ void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, enum tap_state state)
+int MINIDRIVER(interface_jtag_add_plain_dr_scan)(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        int i;
        jtag_command_t **last_cmd = jtag_get_last_command_p();
@@ -971,7 +922,7 @@ void jtag_add_tlr(void)
 
 int MINIDRIVER(interface_jtag_add_tlr)(void)
 {
-       enum tap_state state = TAP_RESET;
+       tap_state_t state = TAP_RESET;
        jtag_command_t **last_cmd = jtag_get_last_command_p();
 
        /* allocate memory for a new list member */
@@ -986,14 +937,14 @@ int MINIDRIVER(interface_jtag_add_tlr)(void)
        return ERROR_OK;
 }
 
-void jtag_add_pathmove(int num_states, enum tap_state *path)
+void jtag_add_pathmove(int num_states, tap_state_t *path)
 {
-       enum tap_state cur_state=cmd_queue_cur_state;
+       tap_state_t cur_state=cmd_queue_cur_state;
        int i;
        int retval;
 
        /* the last state has to be a stable state */
-       if (tap_move_map[path[num_states - 1]] == -1)
+       if (!tap_is_state_stable(path[num_states - 1]))
        {
                LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
                exit(-1);
@@ -1006,10 +957,10 @@ void jtag_add_pathmove(int num_states, enum tap_state *path)
                        LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
                        exit(-1);
                }
-               if ((tap_transitions[cur_state].low != path[i])&&
-                               (tap_transitions[cur_state].high != path[i]))
+               if ( tap_state_transition(cur_state, TRUE)  != path[i]
+                 && tap_state_transition(cur_state, FALSE) != path[i])
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[i]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[i]));
                        exit(-1);
                }
                cur_state = path[i];
@@ -1023,7 +974,7 @@ void jtag_add_pathmove(int num_states, enum tap_state *path)
                jtag_error=retval;
 }
 
-int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, enum tap_state *path)
+int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, tap_state_t *path)
 {
        jtag_command_t **last_cmd = jtag_get_last_command_p();
        int i;
@@ -1036,7 +987,7 @@ int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, enum tap_state *path
 
        (*last_cmd)->cmd.pathmove = cmd_queue_alloc(sizeof(pathmove_command_t));
        (*last_cmd)->cmd.pathmove->num_states = num_states;
-       (*last_cmd)->cmd.pathmove->path = cmd_queue_alloc(sizeof(enum tap_state) * num_states);
+       (*last_cmd)->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states);
 
        for (i = 0; i < num_states; i++)
                (*last_cmd)->cmd.pathmove->path[i] = path[i];
@@ -1044,7 +995,7 @@ int MINIDRIVER(interface_jtag_add_pathmove)(int num_states, enum tap_state *path
        return ERROR_OK;
 }
 
-int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, enum tap_state state)
+int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, tap_state_t state)
 {
        jtag_command_t **last_cmd = jtag_get_last_command_p();
 
@@ -1061,7 +1012,7 @@ int MINIDRIVER(interface_jtag_add_runtest)(int num_cycles, enum tap_state state)
        return ERROR_OK;
 }
 
-void jtag_add_runtest(int num_cycles, enum tap_state state)
+void jtag_add_runtest(int num_cycles, tap_state_t state)
 {
        int retval;
 
@@ -1093,19 +1044,10 @@ void jtag_add_clocks( int num_cycles )
 {
        int retval;
 
-       /* "if (tap_move_map[cm_queue_cur_state] != -1)" is of no help when cur_state==TAP_IDLE */
-       switch(cmd_queue_cur_state)
+       if( !tap_is_state_stable(cmd_queue_cur_state) )
        {
-       case TAP_DRSHIFT:
-       case TAP_IDLE:
-       case TAP_RESET:
-       case TAP_DRPAUSE:
-       case TAP_IRSHIFT:
-       case TAP_IRPAUSE:
-                break;                 /* above stable states are OK */
-       default:
                 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
-                                jtag_state_name(cmd_queue_cur_state) );
+                                tap_state_name(cmd_queue_cur_state) );
                 jtag_error = ERROR_JTAG_NOT_STABLE_STATE;
                 return;
        }
@@ -1114,8 +1056,8 @@ void jtag_add_clocks( int num_cycles )
        {
                jtag_prelude1();
 
-               retval=interface_jtag_add_clocks(num_cycles);
-               if (retval!=ERROR_OK)
+               retval = interface_jtag_add_clocks(num_cycles);
+               if (retval != ERROR_OK)
                        jtag_error=retval;
        }
 }
@@ -1240,7 +1182,7 @@ int MINIDRIVER(interface_jtag_add_reset)(int req_trst, int req_srst)
        return ERROR_OK;
 }
 
-void jtag_add_end_state(enum tap_state state)
+void jtag_add_end_state(tap_state_t state)
 {
        cmd_queue_end_state = state;
        if ((cmd_queue_end_state == TAP_DRSHIFT)||(cmd_queue_end_state == TAP_IRSHIFT))
@@ -2708,7 +2650,7 @@ int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char *
 
 int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       enum tap_state state;
+       tap_state_t state;
 
        if (argc < 1)
        {
@@ -2718,14 +2660,14 @@ int handle_endstate_command(struct command_context_s *cmd_ctx, char *cmd, char *
        {
                for (state = 0; state < 16; state++)
                {
-                       if (strcmp(args[0], jtag_state_name(state)) == 0)
+                       if (strcmp(args[0], tap_state_name(state)) == 0)
                        {
                                jtag_add_end_state(state);
                                jtag_execute_queue();
                        }
                }
        }
-       command_print(cmd_ctx, "current endstate: %s", jtag_state_name(cmd_queue_end_state));
+       command_print(cmd_ctx, "current endstate: %s", tap_state_name(cmd_queue_end_state));
 
        return ERROR_OK;
 }
@@ -2979,8 +2921,247 @@ void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
 }
 
 
-/* map state number to SVF state string */
-const char* jtag_state_name(enum tap_state state)
+/*-----<Cable Helper API>---------------------------------------*/
+
+/*  these Cable Helper API functions are all documented in the jtag.h header file,
+       using a Doxygen format.  And since Doxygen's configuration file "Doxyfile",
+       is setup to prefer its docs in the header file, no documentation is here, for
+       if it were, it would have to be doubly maintained.
+*/
+
+/**
+ * @see tap_set_state() and tap_get_state() accessors.
+ * Actual name is not important since accessors hide it.
+ */
+static tap_state_t state_follower = TAP_RESET;
+
+void tap_set_state_impl( tap_state_t new_state )
+{
+       /* this is the state we think the TAPs are in now, was cur_state */
+       state_follower = new_state;
+}
+
+tap_state_t tap_get_state()
+{
+       return state_follower;
+}
+
+/**
+ * @see tap_set_end_state() and tap_get_end_state() accessors.
+ * Actual name is not important because accessors hide it.
+ */
+static tap_state_t end_state_follower = TAP_RESET;
+
+void tap_set_end_state( tap_state_t new_end_state )
+{
+       /* this is the state we think the TAPs will be in at completion of the
+          current TAP operation, was end_state
+       */
+       end_state_follower = new_end_state;
+}
+
+tap_state_t tap_get_end_state()
+{
+       return end_state_follower;
+}
+
+
+int tap_move_ndx( tap_state_t astate )
+{
+       /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
+
+       /* old version
+       const static int move_map[16] =
+       {
+               0, -1, -1,  2, -1,  3, -1, -1,
+               1, -1, -1,  4, -1,  5, -1, -1
+       };
+       */
+
+       int ndx;
+
+       switch( astate )
+       {
+       case TAP_RESET:         ndx = 0;                        break;
+       case TAP_DRSHIFT:       ndx = 2;                        break;
+       case TAP_DRPAUSE:       ndx = 3;                        break;
+       case TAP_IDLE:          ndx = 1;                        break;
+       case TAP_IRSHIFT:       ndx = 4;                        break;
+       case TAP_IRPAUSE:       ndx = 5;                        break;
+       default:
+               LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate) );
+               exit(1);
+       }
+
+       return ndx;
+}
+
+
+int tap_get_tms_path( tap_state_t from, tap_state_t to )
+{
+       /* tap_move[i][j]: tap movement command to go from state i to state j
+        * 0: Test-Logic-Reset
+        * 1: Run-Test/Idle
+        * 2: Shift-DR
+        * 3: Pause-DR
+        * 4: Shift-IR
+        * 5: Pause-IR
+        *
+        * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
+        */
+       const static u8 tms_seqs[6][6] =
+       {
+               /* value clocked to TMS to move from one of six stable states to another */
+
+               /* RESET  IDLE  DRSHIFT  DRPAUSE  IRSHIFT  IRPAUSE */
+               {  0x7f, 0x00,    0x17,    0x0a,    0x1b,    0x16 },    /* RESET */
+               {  0x7f, 0x00,    0x25,    0x05,    0x2b,    0x0b },    /* IDLE */
+               {  0x7f, 0x31,    0x00,    0x01,    0x0f,    0x2f },    /* DRSHIFT  */
+               {  0x7f, 0x30,    0x20,    0x17,    0x1e,    0x2f },    /* DRPAUSE  */
+               {  0x7f, 0x31,    0x07,    0x17,    0x00,    0x01 },    /* IRSHIFT  */
+               {  0x7f, 0x30,    0x1c,    0x17,    0x20,    0x2f }     /* IRPAUSE  */
+       };
+
+       if( !tap_is_state_stable(from) )
+       {
+               LOG_ERROR( "fatal: tap_state \"from\" (=%s) is not stable", tap_state_name(from) );
+               exit(1);
+       }
+
+       if( !tap_is_state_stable(to) )
+       {
+               LOG_ERROR( "fatal: tap_state \"to\" (=%s) is not stable", tap_state_name(to) );
+               exit(1);
+       }
+
+       /* @todo: support other than 7 clocks ? */
+       return tms_seqs[tap_move_ndx(from)][tap_move_ndx(to)];
+}
+
+
+BOOL tap_is_state_stable(tap_state_t astate)
+{
+       BOOL is_stable;
+
+       /*      A switch() is used because it is symbol dependent
+               (not value dependent like an array), and can also check bounds.
+       */
+       switch( astate )
+       {
+       case TAP_RESET:
+       case TAP_IDLE:
+       case TAP_DRSHIFT:
+       case TAP_DRPAUSE:
+       case TAP_IRSHIFT:
+       case TAP_IRPAUSE:
+               is_stable = TRUE;
+               break;
+       default:
+               is_stable = FALSE;
+       }
+
+       return is_stable;
+}
+
+tap_state_t tap_state_transition(tap_state_t cur_state, BOOL tms)
+{
+       tap_state_t new_state;
+
+       /*      A switch is used because it is symbol dependent and not value dependent
+               like an array.  Also it can check for out of range conditions.
+       */
+
+       if (tms)
+       {
+               switch (cur_state)
+               {
+               case TAP_RESET:
+                       new_state = cur_state;
+                       break;
+               case TAP_IDLE:
+               case TAP_DRUPDATE:
+               case TAP_IRUPDATE:
+                       new_state = TAP_DRSELECT;
+                       break;
+               case TAP_DRSELECT:
+                       new_state = TAP_IRSELECT;
+                       break;
+               case TAP_DRCAPTURE:
+               case TAP_DRSHIFT:
+                       new_state = TAP_DREXIT1;
+                       break;
+               case TAP_DREXIT1:
+               case TAP_DREXIT2:
+                       new_state = TAP_DRUPDATE;
+                       break;
+               case TAP_DRPAUSE:
+                       new_state = TAP_DREXIT2;
+                       break;
+               case TAP_IRSELECT:
+                       new_state = TAP_RESET;
+                       break;
+               case TAP_IRCAPTURE:
+               case TAP_IRSHIFT:
+                       new_state = TAP_IREXIT1;
+                       break;
+               case TAP_IREXIT1:
+               case TAP_IREXIT2:
+                       new_state = TAP_IRUPDATE;
+                       break;
+               case TAP_IRPAUSE:
+                       new_state = TAP_IREXIT2;
+                       break;
+               default:
+                       LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );
+                       exit(1);
+                       break;
+               }
+       }
+       else
+       {
+               switch (cur_state)
+               {
+               case TAP_RESET:
+               case TAP_IDLE:
+               case TAP_DRUPDATE:
+               case TAP_IRUPDATE:
+                       new_state = TAP_IDLE;
+                       break;
+               case TAP_DRSELECT:
+                       new_state = TAP_DRCAPTURE;
+                       break;
+               case TAP_DRCAPTURE:
+               case TAP_DRSHIFT:
+               case TAP_DREXIT2:
+                       new_state = TAP_DRSHIFT;
+                       break;
+               case TAP_DREXIT1:
+               case TAP_DRPAUSE:
+                       new_state = TAP_DRPAUSE;
+                       break;
+               case TAP_IRSELECT:
+                       new_state = TAP_IRCAPTURE;
+                       break;
+               case TAP_IRCAPTURE:
+               case TAP_IRSHIFT:
+               case TAP_IREXIT2:
+                       new_state = TAP_IRSHIFT;
+                       break;
+               case TAP_IREXIT1:
+               case TAP_IRPAUSE:
+                       new_state = TAP_IRPAUSE;
+                       break;
+               default:
+                       LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state );
+                       exit(1);
+                       break;
+               }
+       }
+
+       return new_state;
+}
+
+const char* tap_state_name(tap_state_t state)
 {
        const char* ret;
 
@@ -3008,3 +3189,4 @@ const char* jtag_state_name(enum tap_state state)
        return ret;
 }
 
+/*-----</Cable Helper API>--------------------------------------*/
index 815035a461a4a600e437f112a902911100d0227b..9c4acd70505aeb9ff3bbe13a1ca5be3b5387c4a0 100644 (file)
@@ -1,25 +1,25 @@
 /***************************************************************************
- *   Copyright (C) 2005 by Dominic Rath                                    *
- *   Dominic.Rath@gmx.de                                                   *
- *                                                                         *
- *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
- *   oyvind.harboe@zylin.com                                               *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
+*   Copyright (C) 2005 by Dominic Rath                                    *
+*   Dominic.Rath@gmx.de                                                   *
+*                                                                         *
+*   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
+*   oyvind.harboe@zylin.com                                               *
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+*   This program is distributed in the hope that it will be useful,       *
+*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+*   GNU General Public License for more details.                          *
+*                                                                         *
+*   You should have received a copy of the GNU General Public License     *
+*   along with this program; if not, write to the                         *
+*   Free Software Foundation, Inc.,                                       *
+*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
+***************************************************************************/
 #ifndef JTAG_H
 #define JTAG_H
 
 #endif
 
 #ifndef DEBUG_JTAG_IOZ
-#define DEBUG_JTAG_IOZ         64
+#define DEBUG_JTAG_IOZ 64
 #endif
 
 
 /* 16 Tap States, from page 21 of ASSET InterTech, Inc.'s svf.pdf
  */
-typedef enum tap_state
-{
-       TAP_RESET = 0x0, TAP_IDLE = 0x8,
-       TAP_DRSELECT = 0x1, TAP_DRCAPTURE = 0x2, TAP_DRSHIFT = 0x3, TAP_DREXIT1 = 0x4,
-       TAP_DRPAUSE = 0x5, TAP_DREXIT2 = 0x6, TAP_DRUPDATE = 0x7,
-       TAP_IRSELECT = 0x9, TAP_IRCAPTURE = 0xa, TAP_IRSHIFT = 0xb, TAP_IREXIT1 = 0xc,
-       TAP_IRPAUSE = 0xd, TAP_IREXIT2 = 0xe, TAP_IRUPDATE = 0xf
-} tap_state_t;
+enum tap_state {
+       TAP_RESET    = 0, TAP_IDLE = 8,
+       TAP_DRSELECT = 1, TAP_DRCAPTURE = 2, TAP_DRSHIFT = 3, TAP_DREXIT1 = 4,
+       TAP_DRPAUSE  = 5, TAP_DREXIT2 = 6, TAP_DRUPDATE = 7,
+       TAP_IRSELECT = 9, TAP_IRCAPTURE = 10, TAP_IRSHIFT = 11, TAP_IREXIT1 = 12,
+       TAP_IRPAUSE  = 13, TAP_IREXIT2 = 14, TAP_IRUPDATE = 15
+};
+
+typedef enum tap_state tap_state_t;
+
+typedef unsigned               BOOL;
+#define TRUE                   1
+#define FALSE          0
 
 typedef struct tap_transition_s
 {
-       enum tap_state high;
-       enum tap_state low;
+       tap_state_t high;
+       tap_state_t low;
 } tap_transition_t;
 
-extern int tap_move_map[16];   /* map 16 TAP states to 6 stable states */
-extern u8 tap_move[6][6];              /* value scanned to TMS to move from one of six stable states to another */
-extern tap_transition_t tap_transitions[16];   /* describe the TAP state diagram */
+//extern tap_transition_t tap_transitions[16];    /* describe the TAP state diagram */
+
+
+/*-----<Cable Helper API>-------------------------------------------*/
+
+/* The "Cable Helper API" is what the cable drivers can use to help implement
+ * their "Cable API".  So a Cable Helper API is a set of helper functions used by
+ * cable drivers, and this is different from a Cable API.  A "Cable API" is what
+ * higher level code used to talk to a cable.
+ */
+
+
+/** implementation of wrapper function tap_set_state() */
+void tap_set_state_impl(tap_state_t new_state);
 
-extern enum tap_state end_state;               /* finish DR scans in dr_end_state */
-extern enum tap_state cur_state;               /* current TAP state */
+/**
+ * Function tap_set_state
+ * sets the state of a "state follower" which tracks the state of the TAPs connected to the
+ * cable.  The state follower is hopefully always in the same state as the actual
+ * TAPs in the jtag chain, and will be so if there are no bugs in the tracking logic within that
+ * cable driver. All the cable drivers call this function to indicate the state they think
+ * the TAPs attached to their cables are in.  Because this function can also log transitions,
+ * it will be helpful to call this function with every transition that the TAPs being manipulated
+ * are expected to traverse, not just end points of a multi-step state path.
+ * @param new_state is the state we think the TAPs are currently in or are about to enter.
+ */
+#if defined(_DEBUG_JTAG_IO_)
+#define tap_set_state(new_state) \
+       do { \
+               LOG_DEBUG( "tap_set_state(%s)", tap_state_name(new_state) ); \
+               tap_set_state_impl(new_state); \
+       } while (0)
+#else
+static inline void tap_set_state(tap_state_t new_state)
+{
+       tap_set_state_impl(new_state);
+}
 
-extern enum tap_state cmd_queue_end_state;             /* finish DR scans in dr_end_state */
-extern enum tap_state cmd_queue_cur_state;             /* current TAP state */
+#endif
 
-#define TAP_MOVE(from, to) tap_move[tap_move_map[from]][tap_move_map[to]]
+/**
+ * Function tap_get_state
+ * gets the state of the "state follower" which tracks the state of the TAPs connected to
+ * the cable.
+ * @see tap_set_state
+ * @return tap_state_t - The state the TAPs are in now.
+ */
+tap_state_t tap_get_state(void);
 
-typedef void * error_handler_t; /* Later on we can delete error_handler_t, but keep it for now to make patches more readable */
+/**
+ * Function tap_set_end_state
+ * sets the state of an "end state follower" which tracks the state that any cable driver
+ * thinks will be the end (resultant) state of the current TAP SIR or SDR operation.  At completion
+ * of that TAP operation this value is copied into the state follower via tap_set_state().
+ * @param new_end_state is that state the TAPs should enter at completion of a pending TAP operation.
+ */
+void        tap_set_end_state(tap_state_t new_end_state);
+
+/**
+ * Function tap_get_end_state
+ * @see tap_set_end_state
+ * @return tap_state_t - The state the TAPs should be in at completion of the current TAP operation.
+ */
+tap_state_t tap_get_end_state(void);
+
+/**
+ * Function tap_get_tms_path
+ * returns a 7 bit long "bit sequence" indicating what has to be done with TMS
+ * during a sequence of seven TAP clock cycles in order to get from
+ * state \a "from" to state \a "to".
+ * @param from is the starting state
+ * @param to is the resultant or final state
+ * @return int - a 7 bit sequence, with the first bit in the sequence at bit 0.
+ */
+int tap_get_tms_path(tap_state_t from, tap_state_t to);
+
+/**
+ * Function tap_move_ndx
+ * when given a stable state, returns an index from 0-5.  The index corresponds to a
+ * sequence of stable states which are given in this order: <p>
+ * { TAP_RESET, TAP_IDLE, TAP_DRSHIFT, TAP_DRPAUSE, TAP_IRSHIFT, TAP_IRPAUSE }
+ * <p>
+ * This sequence corresponds to look up tables which are used in some of the
+ * cable drivers.
+ * @param astate is the stable state to find in the sequence.  If a non stable
+ *  state is passed, this may cause the program to output an error message
+ *  and terminate.
+ * @return int - the array (or sequence) index as described above
+ */
+int tap_move_ndx(tap_state_t astate);
+
+/**
+ * Function tap_is_state_stable
+ * returns TRUE if the \a astate is stable.
+ */
+BOOL tap_is_state_stable(tap_state_t astate);
+
+/**
+ * Function tap_state_transition
+ * takes a current TAP state and returns the next state according to the tms value.
+ * @param current_state is the state of a TAP currently.
+ * @param tms is either zero or non-zero, just like a real TMS line in a jtag interface.
+ * @return tap_state_t - the next state a TAP would enter.
+ */
+tap_state_t tap_state_transition(tap_state_t current_state, BOOL tms);
+
+/**
+ * Function tap_state_name
+ * Returns a string suitable for display representing the JTAG tap_state
+ */
+const char* tap_state_name(tap_state_t state);
+
+/*-----</Cable Helper API>------------------------------------------*/
+
+
+extern tap_state_t cmd_queue_end_state;         /* finish DR scans in dr_end_state */
+extern tap_state_t cmd_queue_cur_state;         /* current TAP state */
+
+typedef void* error_handler_t;  /* Later on we can delete error_handler_t, but keep it for now to make patches more readable */
 
 struct scan_field_s;
-typedef int (*in_handler_t)(u8 *in_value, void *priv, struct scan_field_s *field);
+typedef int (*in_handler_t)(u8* in_value, void* priv, struct scan_field_s* field);
 
 typedef struct scan_field_s
 {
-       jtag_tap_t *tap;        /* tap pointer this instruction refers to */
-       int num_bits;           /* number of bits this field specifies (up to 32) */
-       u8 *out_value;          /* value to be scanned into the device */
-       u8 *out_mask;           /* only masked bits care */
-       u8 *in_value;           /* pointer to a 32-bit memory location to take data scanned out */
+       jtag_tap_t* tap;                /* tap pointer this instruction refers to */
+       int         num_bits;           /* number of bits this field specifies (up to 32) */
+       u8*         out_value;          /* value to be scanned into the device */
+       u8*         out_mask;           /* only masked bits care */
+       u8*         in_value;           /* pointer to a 32-bit memory location to take data scanned out */
        /* in_check_value/mask, in_handler_error_handler, in_handler_priv can be used by the in handler, otherwise they contain garbage  */
-       u8 *in_check_value;     /* used to validate scan results */
-       u8 *in_check_mask;      /* check specified bits against check_value */
-       in_handler_t in_handler;/* process received buffer using this handler */
-       void *in_handler_priv;  /* additional information for the in_handler */
+       u8*          in_check_value;    /* used to validate scan results */
+       u8*          in_check_mask;     /* check specified bits against check_value */
+       in_handler_t in_handler;        /* process received buffer using this handler */
+       void*        in_handler_priv;   /* additional information for the in_handler */
 } scan_field_t;
 
-enum scan_type
-{
+enum scan_type {
        /* IN: from device to host, OUT: from host to device */
        SCAN_IN = 1, SCAN_OUT = 2, SCAN_IO = 3
 };
 
 typedef struct scan_command_s
 {
-       int ir_scan;    /* instruction/not data scan */
-       int num_fields;         /* number of fields in *fields array */
-       scan_field_t *fields;   /* pointer to an array of data scan fields */
-       enum tap_state end_state;       /* TAP state in which JTAG commands should finish */
+       int           ir_scan;      /* instruction/not data scan */
+       int           num_fields;   /* number of fields in *fields array */
+       scan_field_t* fields;       /* pointer to an array of data scan fields */
+       tap_state_t   end_state;    /* TAP state in which JTAG commands should finish */
 } scan_command_t;
 
 typedef struct statemove_command_s
 {
-       enum tap_state end_state;       /* TAP state in which JTAG commands should finish */
+       tap_state_t end_state;   /* TAP state in which JTAG commands should finish */
 } statemove_command_t;
 
 typedef struct pathmove_command_s
 {
-       int num_states;                         /* number of states in *path */
-       enum tap_state *path;           /* states that have to be passed */
+       int          num_states;    /* number of states in *path */
+       tap_state_t* path;          /* states that have to be passed */
 } pathmove_command_t;
 
 typedef struct runtest_command_s
 {
-       int num_cycles;         /* number of cycles that should be spent in Run-Test/Idle */
-       enum tap_state end_state;       /* TAP state in which JTAG commands should finish */
+       int         num_cycles;     /* number of cycles that should be spent in Run-Test/Idle */
+       tap_state_t end_state;      /* TAP state in which JTAG commands should finish */
 } runtest_command_t;
 
 
 typedef struct stableclocks_command_s
 {
-       int num_cycles;                         /* number of clock cycles that should be sent */
+       int num_cycles;             /* number of clock cycles that should be sent */
 } stableclocks_command_t;
 
 
 typedef struct reset_command_s
 {
-       int trst;                       /* trst/srst 0: deassert, 1: assert, -1: don't change */
+       int trst;           /* trst/srst 0: deassert, 1: assert, -1: don't change */
        int srst;
 } reset_command_t;
 
 typedef struct end_state_command_s
 {
-       enum tap_state end_state;       /* TAP state in which JTAG commands should finish */
+       tap_state_t end_state;   /* TAP state in which JTAG commands should finish */
 } end_state_command_t;
 
 typedef struct sleep_command_s
 {
-       u32 us;         /* number of microseconds to sleep */
+       u32 us;     /* number of microseconds to sleep */
 } sleep_command_t;
 
 typedef union jtag_command_container_u
 {
-       scan_command_t *scan;
-       statemove_command_t *statemove;
-       pathmove_command_t *pathmove;
-       runtest_command_t *runtest;
-       stableclocks_command_t *stableclocks;
-       reset_command_t *reset;
-       end_state_command_t *end_state;
-       sleep_command_t *sleep;
+       scan_command_t*         scan;
+       statemove_command_t*    statemove;
+       pathmove_command_t*     pathmove;
+       runtest_command_t*      runtest;
+       stableclocks_command_tstableclocks;
+       reset_command_t*        reset;
+       end_state_command_t*    end_state;
+       sleep_command_tsleep;
 } jtag_command_container_t;
 
-enum jtag_command_type
-{
-       JTAG_SCAN = 1,
-       JTAG_STATEMOVE = 2, JTAG_RUNTEST = 3,
-       JTAG_RESET = 4, JTAG_END_STATE = 5,
-       JTAG_PATHMOVE = 6, JTAG_SLEEP = 7,
+enum jtag_command_type {
+       JTAG_SCAN         = 1,
+       JTAG_STATEMOVE    = 2,
+       JTAG_RUNTEST      = 3,
+       JTAG_RESET        = 4,
+       JTAG_END_STATE    = 5,
+       JTAG_PATHMOVE     = 6,
+       JTAG_SLEEP        = 7,
        JTAG_STABLECLOCKS = 8
 };
 
 typedef struct jtag_command_s
 {
        jtag_command_container_t cmd;
-       enum jtag_command_type type;
-       struct jtag_command_s *next;
+       enum jtag_command_type   type;
+       struct jtag_command_s*   next;
 } jtag_command_t;
 
-extern jtag_command_t *jtag_command_queue;
+extern jtag_command_tjtag_command_queue;
 
 /* forward declaration */
 typedef struct jtag_tap_event_action_s jtag_tap_event_action_t;
@@ -179,59 +291,66 @@ typedef struct jtag_tap_event_action_s jtag_tap_event_action_t;
 /* due to "forward decloration reasons" */
 struct jtag_tap_s
 {
-       const char *chip;
-       const char *tapname;
-       const char *dotted_name;
+       const charchip;
+       const chartapname;
+       const chardotted_name;
        int         abs_chain_position;
-       int enabled;
-       int ir_length;          /* size of instruction register */
-       u32 ir_capture_value;
-       u8 *expected;           /* Capture-IR expected value */
-       u32 ir_capture_mask;
-       u8 *expected_mask;      /* Capture-IR expected mask */
-       u32 idcode;                     /* device identification code */
-       u32 *expected_ids;      /* Array of expected identification codes */
-       u8 expected_ids_cnt;/* Number of expected identification codes */
-       u8 *cur_instr;          /* current instruction */
-       int bypass;                     /* bypass register selected */
-
-       jtag_tap_event_action_t *event_action;
-
-       jtag_tap_t *next_tap;
+       int         enabled;
+       int         ir_length;          /* size of instruction register */
+       u32         ir_capture_value;
+       u8*         expected;           /* Capture-IR expected value */
+       u32         ir_capture_mask;
+       u8*         expected_mask;      /* Capture-IR expected mask */
+       u32         idcode;             /* device identification code */
+       u32*        expected_ids;       /* Array of expected identification codes */
+       u8          expected_ids_cnt;   /* Number of expected identification codes */
+       u8*         cur_instr;          /* current instruction */
+       int         bypass;             /* bypass register selected */
+
+       jtag_tap_event_action_tevent_action;
+
+       jtag_tap_tnext_tap;
 };
-extern jtag_tap_t *jtag_AllTaps(void);
-extern jtag_tap_t *jtag_TapByPosition(int n);
-extern jtag_tap_t *jtag_TapByPosition(int n);
-extern jtag_tap_t *jtag_TapByString(const char *dotted_name);
-extern jtag_tap_t *jtag_TapByJimObj(Jim_Interp *interp, Jim_Obj *obj);
-extern jtag_tap_t *jtag_TapByAbsPosition(int abs_position);
-extern int jtag_NumEnabledTaps(void);
-extern int jtag_NumTotalTaps(void);
-
-static __inline__ jtag_tap_t *
-jtag_NextEnabledTap( jtag_tap_t *p )
+extern jtag_tap_t* jtag_AllTaps(void);
+extern jtag_tap_t* jtag_TapByPosition(int n);
+extern jtag_tap_t* jtag_TapByPosition(int n);
+extern jtag_tap_t* jtag_TapByString(const char* dotted_name);
+extern jtag_tap_t* jtag_TapByJimObj(Jim_Interp* interp, Jim_Obj* obj);
+extern jtag_tap_t* jtag_TapByAbsPosition(int abs_position);
+extern int         jtag_NumEnabledTaps(void);
+extern int         jtag_NumTotalTaps(void);
+
+static __inline__ jtag_tap_t* jtag_NextEnabledTap(jtag_tap_t* p)
 {
-       if( p == NULL ){
+       if (p == NULL)
+       {
                /* start at the head of list */
                p = jtag_AllTaps();
-       } else {
+       }
+       else
+       {
                /* start *after* this one */
                p = p->next_tap;
        }
-       while( p ){
-               if( p->enabled ){
+       while (p)
+       {
+               if (p->enabled)
+               {
                        break;
-               } else {
+               }
+               else
+               {
                        p = p->next_tap;
                }
        }
+
        return p;
 }
 
-enum reset_line_mode
-{
+
+enum reset_line_mode {
        LINE_OPEN_DRAIN = 0x0,
-       LINE_PUSH_PULL = 0x1,
+       LINE_PUSH_PULL  = 0x1,
 };
 
 typedef struct jtag_interface_s
@@ -245,61 +364,62 @@ typedef struct jtag_interface_s
        /* interface initalization
         */
        int (*speed)(int speed);
-       int (*register_commands)(struct command_context_s *cmd_ctx);
+       int (*register_commands)(struct command_context_scmd_ctx);
        int (*init)(void);
        int (*quit)(void);
+
        /* returns JTAG maxium speed for KHz. 0=RTCK. The function returns
-       a failure if it can't support the KHz/RTCK.
-
-       WARNING!!!! if RTCK is *slow* then think carefully about
-       whether you actually want to support this in the driver.
-       Many target scripts are written to handle the absence of RTCK
-       and use a fallback kHz TCK.
-       */
-       int (*khz)(int khz, int *jtag_speed);
+        *  a failure if it can't support the KHz/RTCK.
+        *
+        *  WARNING!!!! if RTCK is *slow* then think carefully about
+        *  whether you actually want to support this in the driver.
+        *  Many target scripts are written to handle the absence of RTCK
+        *  and use a fallback kHz TCK.
+        */
+       int (*khz)(int khz, int* jtag_speed);
+
        /* returns the KHz for the provided JTAG speed. 0=RTCK. The function returns
-       a failure if it can't support the KHz/RTCK. */
-       int (*speed_div)(int speed, int *khz);
+        *  a failure if it can't support the KHz/RTCK. */
+       int (*speed_div)(int speed, intkhz);
 
        /* Read and clear the power dropout flag. Note that a power dropout
-          can be transitionary, easily much less than a ms.
-
-          So to find out if the power is *currently* on, you must invoke
-          this method twice. Once to clear the power dropout flag and a
-          second time to read the current state.
+        *  can be transitionary, easily much less than a ms.
+        *
+        *  So to find out if the power is *currently* on, you must invoke
+        *  this method twice. Once to clear the power dropout flag and a
+        *  second time to read the current state.
+        *
+        *  Currently the default implementation is never to detect power dropout.
+        */
+       int (*power_dropout)(int* power_dropout);
 
-          Currently the default implementation is never to detect power dropout.
-       */
-       int (*power_dropout)(int *power_dropout);
        /* Read and clear the srst asserted detection flag.
         *
         * NB!!!! like power_dropout this does *not* read the current
         * state. srst assertion is transitionary and *can* be much
         * less than 1ms.
         */
-       int (*srst_asserted)(int *srst_asserted);
-
+       int (*srst_asserted)(int* srst_asserted);
 } jtag_interface_t;
 
-enum jtag_event
-{
+enum jtag_event {
        JTAG_TRST_ASSERTED
 };
 
-extern char * jtag_event_strings[];
+extern char* jtag_event_strings[];
 
-enum jtag_tap_event
-{
+enum jtag_tap_event {
        JTAG_TAP_EVENT_ENABLE,
        JTAG_TAP_EVENT_DISABLE
 };
 
 extern const Jim_Nvp nvp_jtag_tap_event[];
 
-struct jtag_tap_event_action_s {
-       enum jtag_tap_event event;
-       Jim_Obj *body;
-       jtag_tap_event_action_t *next;
+struct jtag_tap_event_action_s
+{
+       enum jtag_tap_event      event;
+       Jim_Obj*                 body;
+       jtag_tap_event_action_t* next;
 };
 
 extern int jtag_trst;
@@ -307,30 +427,27 @@ extern int jtag_srst;
 
 typedef struct jtag_event_callback_s
 {
-       int (*callback)(enum jtag_event event, void *priv);
-       void *priv;
-       struct jtag_event_callback_s *next;
+       int (*callback)(enum jtag_event event, voidpriv);
+       void*                         priv;
+       struct jtag_event_callback_snext;
 } jtag_event_callback_t;
 
-extern jtag_event_callback_t *jtag_event_callbacks;
+extern jtag_event_callback_tjtag_event_callbacks;
 
-extern jtag_interface_t *jtag; /* global pointer to configured JTAG interface */
-extern enum tap_state end_state;
-extern enum tap_state cur_state;
+extern jtag_interface_t*      jtag; /* global pointer to configured JTAG interface */
 
 extern int jtag_speed;
 extern int jtag_speed_post_reset;
 
-enum reset_types
-{
-       RESET_NONE = 0x0,
-       RESET_HAS_TRST = 0x1,
-       RESET_HAS_SRST = 0x2,
-       RESET_TRST_AND_SRST = 0x3,
+enum reset_types {
+       RESET_NONE            = 0x0,
+       RESET_HAS_TRST        = 0x1,
+       RESET_HAS_SRST        = 0x2,
+       RESET_TRST_AND_SRST   = 0x3,
        RESET_SRST_PULLS_TRST = 0x4,
        RESET_TRST_PULLS_SRST = 0x8,
        RESET_TRST_OPEN_DRAIN = 0x10,
-       RESET_SRST_PUSH_PULL = 0x20,
+       RESET_SRST_PUSH_PULL  = 0x20,
 };
 
 extern enum reset_types jtag_reset_config;
@@ -338,14 +455,16 @@ extern enum reset_types jtag_reset_config;
 /* initialize interface upon startup. A successful no-op
  * upon subsequent invocations
  */
-extern int jtag_interface_init(struct command_context_s *cmd_ctx);
+extern int  jtag_interface_init(struct command_context_s* cmd_ctx);
+
 /* initialize JTAG chain using only a RESET reset. If init fails,
  * try reset + init.
  */
-extern int jtag_init(struct command_context_s *cmd_ctx);
+extern int  jtag_init(struct command_context_s* cmd_ctx);
+
 /* reset, then initialize JTAG chain */
-extern int jtag_init_reset(struct command_context_s *cmd_ctx);
-extern int jtag_register_commands(struct command_context_s *cmd_ctx);
+extern int  jtag_init_reset(struct command_context_s* cmd_ctx);
+extern int  jtag_register_commands(struct command_context_s* cmd_ctx);
 
 /* JTAG interface, can be implemented with a software or hardware fifo
  *
@@ -359,19 +478,21 @@ extern int jtag_register_commands(struct command_context_s *cmd_ctx);
  * be issued.
  *
  */
-extern void jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern void jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern void jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
-extern int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state endstate);
+extern void jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern int  interface_jtag_add_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern void jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern int  interface_jtag_add_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern void jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern int  interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern void jtag_add_plain_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+extern int  interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t* fields, tap_state_t endstate);
+
 /* run a TAP_RESET reset. End state is TAP_RESET, regardless
  * of start state.
  */
 extern void jtag_add_tlr(void);
-extern int interface_jtag_add_tlr(void);
+extern int  interface_jtag_add_tlr(void);
+
 /* Do not use jtag_add_pathmove() unless you need to, but do use it
  * if you have to.
  *
@@ -402,8 +523,9 @@ extern int interface_jtag_add_tlr(void);
  * a partial implementation of pathmove would have little practical
  * application.
  */
-extern void jtag_add_pathmove(int num_states, enum tap_state *path);
-extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
+extern void jtag_add_pathmove(int num_states, tap_state_t* path);
+extern int  interface_jtag_add_pathmove(int num_states, tap_state_t* path);
+
 /* go to TAP_IDLE, if we're not already there and cycle
  * precisely num_cycles in the TAP_IDLE after which move
  * to the end state, if it is != TAP_IDLE
@@ -411,8 +533,9 @@ extern int interface_jtag_add_pathmove(int num_states, enum tap_state *path);
  * nb! num_cycles can be 0, in which case the fn will navigate
  * to endstate via TAP_IDLE
  */
-extern void jtag_add_runtest(int num_cycles, enum tap_state endstate);
-extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
+extern void jtag_add_runtest(int num_cycles, tap_state_t endstate);
+extern int  interface_jtag_add_runtest(int num_cycles, tap_state_t endstate);
+
 /* A reset of the TAP state machine can be requested.
  *
  * Whether tms or trst reset is used depends on the capabilities of
@@ -436,6 +559,7 @@ extern int interface_jtag_add_runtest(int num_cycles, enum tap_state endstate);
  * then trst & srst *must* be asserted together.
  */
 extern void jtag_add_reset(int req_tlr_or_trst, int srst);
+
 /* this drives the actual srst and trst pins. srst will always be 0
  * if jtag_reset_config & RESET_SRST_PULLS_TRST != 0 and ditto for
  * trst.
@@ -443,11 +567,11 @@ extern void jtag_add_reset(int req_tlr_or_trst, int srst);
  * the higher level jtag_add_reset will invoke jtag_add_tlr() if
  * approperiate
  */
-extern int interface_jtag_add_reset(int trst, int srst);
-extern void jtag_add_end_state(enum tap_state endstate);
-extern int interface_jtag_add_end_state(enum tap_state endstate);
+extern int  interface_jtag_add_reset(int trst, int srst);
+extern void jtag_add_end_state(tap_state_t endstate);
+extern int  interface_jtag_add_end_state(tap_state_t endstate);
 extern void jtag_add_sleep(u32 us);
-extern int interface_jtag_add_sleep(u32 us);
+extern int  interface_jtag_add_sleep(u32 us);
 
 
 /**
@@ -455,8 +579,8 @@ extern int interface_jtag_add_sleep(u32 us);
  * first checks that the state in which the clocks are to be issued is
  * stable, then queues up clock_count clocks for transmission.
  */
-void jtag_add_clocks( int num_cycles );
-int interface_jtag_add_clocks( int num_cycles );
+void jtag_add_clocks(int num_cycles);
+int  interface_jtag_add_clocks(int num_cycles);
 
 
 /*
@@ -479,37 +603,38 @@ int interface_jtag_add_clocks( int num_cycles );
  * jtag_add_xxx() commands can either be executed immediately or
  * at some time between the jtag_add_xxx() fn call and jtag_execute_queue().
  */
-extern int jtag_execute_queue(void);
+extern int            jtag_execute_queue(void);
+
 /* can be implemented by hw+sw */
-extern int interface_jtag_execute_queue(void);
-extern int jtag_power_dropout(int *dropout);
-extern int jtag_srst_asserted(int *srst_asserted);
+extern int            interface_jtag_execute_queue(void);
+extern int            jtag_power_dropout(int* dropout);
+extern int            jtag_srst_asserted(int* srst_asserted);
 
 /* JTAG support functions */
-extern void jtag_set_check_value(scan_field_t *field, u8 *value,  u8 *mask, error_handler_t *in_error_handler);
-extern enum scan_type jtag_scan_type(scan_command_t *cmd);
-extern int jtag_scan_size(scan_command_t *cmd);
-extern int jtag_read_buffer(u8 *buffer, scan_command_t *cmd);
-extern int jtag_build_buffer(scan_command_t *cmd, u8 **buffer);
+extern void           jtag_set_check_value(scan_field_t* field, u8* value, u8* mask, error_handler_t* in_error_handler);
+extern enum scan_type jtag_scan_type(scan_command_tcmd);
+extern int            jtag_scan_size(scan_command_t* cmd);
+extern int            jtag_read_buffer(u8* buffer, scan_command_t* cmd);
+extern int            jtag_build_buffer(scan_command_t* cmd, u8** buffer);
 
-extern void jtag_sleep(u32 us);
-extern int jtag_call_event_callbacks(enum jtag_event event);
-extern int jtag_register_event_callback(int (*callback)(enum jtag_event event, void *priv), void *priv);
+extern void           jtag_sleep(u32 us);
+extern int            jtag_call_event_callbacks(enum jtag_event event);
+extern int            jtag_register_event_callback(int (* callback)(enum jtag_event event, void* priv), void* priv);
 
 extern int jtag_verify_capture_ir;
 
-void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e);
+void jtag_tap_handle_event(jtag_tap_t* tap, enum jtag_tap_event e);
 
 /* error codes
  * JTAG subsystem uses codes between -100 and -199 */
 
-#define ERROR_JTAG_INIT_FAILED                 (-100)
-#define ERROR_JTAG_INVALID_INTERFACE           (-101)
-#define ERROR_JTAG_NOT_IMPLEMENTED             (-102)
-#define ERROR_JTAG_TRST_ASSERTED                       (-103)
-#define ERROR_JTAG_QUEUE_FAILED                        (-104)
-#define ERROR_JTAG_NOT_STABLE_STATE            (-105)
-#define ERROR_JTAG_DEVICE_ERROR                        (-107)
+#define ERROR_JTAG_INIT_FAILED       (-100)
+#define ERROR_JTAG_INVALID_INTERFACE (-101)
+#define ERROR_JTAG_NOT_IMPLEMENTED   (-102)
+#define ERROR_JTAG_TRST_ASSERTED     (-103)
+#define ERROR_JTAG_QUEUE_FAILED      (-104)
+#define ERROR_JTAG_NOT_STABLE_STATE  (-105)
+#define ERROR_JTAG_DEVICE_ERROR      (-107)
 
 
 /* this allows JTAG devices to implement the entire jtag_xxx() layer in hw/sw */
@@ -519,6 +644,7 @@ void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e);
 #define MINIDRIVER(a) notused ## a
 #else
 #define MINIDRIVER(a) a
+
 /* jtag_add_dr_out() is a faster version of jtag_add_dr_scan()
  *
  * Current or end_state can not be TAP_RESET. end_state can be -1
@@ -536,30 +662,19 @@ void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e);
  *
  * Note that this jtag_add_dr_out can be defined as an inline function.
  */
-extern void interface_jtag_add_dr_out(jtag_tap_t *tap,
-               int num_fields,
-               const int *num_bits,
-               const u32 *value,
-               enum tap_state end_state);
+extern void interface_jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
+               tap_state_t end_state);
+
 #endif
 
-static __inline__ void jtag_add_dr_out(jtag_tap_t *tap,
-               int num_fields,
-               const int *num_bits,
-               const u32 *value,
-               enum tap_state end_state)
+static __inline__ void jtag_add_dr_out(jtag_tap_t* tap, int num_fields, const int* num_bits, const u32* value,
+               tap_state_t end_state)
 {
        if (end_state != -1)
-               cmd_queue_end_state=end_state;
-       cmd_queue_cur_state=cmd_queue_end_state;
+               cmd_queue_end_state = end_state;
+       cmd_queue_cur_state = cmd_queue_end_state;
        interface_jtag_add_dr_out(tap, num_fields, num_bits, value, cmd_queue_end_state);
 }
 
-/**
- * Function jtag_state_name
- * Returns a string suitable for display representing the JTAG tap_state
- */
-const char* jtag_state_name(enum tap_state state);
-
 
 #endif /* JTAG_H */
index 4b6dde2fc9ce37d03c978b01c381cd81769fb10f..80bd08afb5606a24785189bedef463ac72514729 100644 (file)
@@ -122,7 +122,7 @@ ep1_generic_commandl(
                *usb_buffer_p++ = va_arg(ap, int);
                length--;
        }
-       
+
        memset(
                usb_buffer_p,
                0,
@@ -176,7 +176,7 @@ ep1_memory_read(
                usb_buffer[2] = addr;
                usb_buffer[3] = length;
 
-               usb_ret = usb_bulk_write(
+                       usb_ret = usb_bulk_write(
                        pHDev, USB_EP1OUT_ADDR,
                        usb_buffer, sizeof(usb_buffer),
                        USB_TIMEOUT_MS
@@ -185,7 +185,7 @@ ep1_memory_read(
                if(usb_ret < sizeof(usb_buffer)) {
                        break;
                }
-               
+
                usb_ret = usb_bulk_read(
                        pHDev, USB_EP1IN_ADDR,
                        buffer, length,
@@ -195,7 +195,7 @@ ep1_memory_read(
                if(usb_ret < length) {
                        break;
                }
-               
+
                addr += length;
                buffer += length;
                count += length;
@@ -247,7 +247,7 @@ ep1_memory_write(
                        sizeof(usb_buffer) - 4 - length
                );
 
-               usb_ret = usb_bulk_write(
+                       usb_ret = usb_bulk_write(
                        pHDev, USB_EP1OUT_ADDR,
                        (char *)usb_buffer, sizeof(usb_buffer),
                        USB_TIMEOUT_MS
@@ -256,7 +256,7 @@ ep1_memory_write(
                if(usb_ret < sizeof(usb_buffer)) {
                        break;
                }
-               
+
                addr += length;
                buffer += length;
                count += length;
@@ -343,7 +343,7 @@ dtc_load_from_buffer(
                        LOG_ERROR("Malformed DTC image\n");
                        exit(1);
                }
-               
+
                header = (struct header_s *)buffer;
                buffer += sizeof(*header);
                length -= sizeof(*header);
@@ -352,7 +352,7 @@ dtc_load_from_buffer(
                        LOG_ERROR("Malformed DTC image\n");
                        exit(1);
                }
-               
+
                switch(header->type) {
                        case DTCLOAD_COMMENT:
                                break;
@@ -365,7 +365,7 @@ dtc_load_from_buffer(
                                break;
 
                        case DTCLOAD_LOAD:
-                               /* Send the DTC program to ST7 RAM. */
+                               /* Send the DTC program to ST7 RAM. */
                                usb_err = ep1_memory_write(
                                        pHDev,
                                        DTC_LOAD_BUFFER,
@@ -398,9 +398,9 @@ dtc_load_from_buffer(
                        case DTCLOAD_LUT_START:
                                lut_start = buffer[0];
                                break;
-               
+
                        case DTCLOAD_LUT:
-                               usb_err = ep1_memory_write(
+                               usb_err = ep1_memory_write(
                                        pHDev,
                                        ST7_USB_BUF_EP0OUT + lut_start,
                                        header->length + 1, buffer
@@ -413,7 +413,7 @@ dtc_load_from_buffer(
                                exit(1);
                                break;
                }
-               
+
                buffer += (header->length + 1);
                length -= (header->length + 1);
        }
@@ -434,7 +434,7 @@ dtc_start_download(void) {
        /* set up for download mode and make sure EP2 is set up to transmit */
        usb_err = ep1_generic_commandl(
                pHDev, 7,
-                
+
                EP1_CMD_DTC_STOP,
                EP1_CMD_SET_UPLOAD,
                EP1_CMD_SET_DOWNLOAD,
@@ -455,7 +455,7 @@ dtc_start_download(void) {
 
        usb_err = ep1_generic_commandl(
                pHDev, 13,
-                
+
                EP1_CMD_MEMORY_WRITE,   /* preinitialize poll byte */
                        DTC_STATUS_POLL_BYTE >> 8,
                        DTC_STATUS_POLL_BYTE,
@@ -682,7 +682,7 @@ dtc_queue_run(void) {
                usb_err = dtc_run_download(pHDev,
                        dtc_queue.cmd_buffer, dtc_queue.cmd_index,
                        NULL, 0
-               );      
+               );
                if(usb_err < 0) {
                        LOG_ERROR("dtc_run_download: %s\n", usb_strerror());
                        exit(1);
@@ -691,7 +691,7 @@ dtc_queue_run(void) {
                usb_err = dtc_run_download(pHDev,
                        dtc_queue.cmd_buffer, dtc_queue.cmd_index,
                        reply_buffer, dtc_queue.reply_index
-               );      
+               );
                if(usb_err < 0) {
                        LOG_ERROR("dtc_run_download: %s\n", usb_strerror());
                        exit(1);
@@ -726,7 +726,7 @@ dtc_queue_run(void) {
                                                } else {
                                                        *tdo_p &=~ tdo_mask;
                                                }
-                                               
+
                                                dtc_mask >>= 1;
                                                if(dtc_mask == 0) {
                                                        dtc_p++;
@@ -772,7 +772,7 @@ dtc_queue_run(void) {
                                                        tdo_p++;
                                                        tdo_mask = 1;
                                                }
-                                                               
+
                                        }
                                }
 
@@ -825,7 +825,7 @@ tap_state_queue_run(void) {
        bits = 1;
        byte = 0;
        for(i = tap_state_queue.length; i--;) {
-               
+
                byte <<= 1;
                if(tap_state_queue.buffer & 1) {
                        byte |= 1;
@@ -890,10 +890,10 @@ tap_state_queue_append(
 
 
 static
-void rlink_end_state(enum tap_state state)
+void rlink_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -906,7 +906,7 @@ static
 void rlink_state_move(void) {
 
        int i=0, tms=0;
-       u8 tms_scan = TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
        for (i = 0; i < 7; i++)
        {
@@ -914,7 +914,7 @@ void rlink_state_move(void) {
                tap_state_queue_append(tms);
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 static
@@ -927,28 +927,28 @@ void rlink_path_move(pathmove_command_t *cmd)
        state_count = 0;
        while (num_states)
        {
-               if (tap_transitions[cur_state].low == cmd->path[state_count])
+               if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[state_count])
                {
                        tms = 0;
                }
-               else if (tap_transitions[cur_state].high == cmd->path[state_count])
+               else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[state_count])
                {
                        tms = 1;
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
                        exit(-1);
                }
 
                tap_state_queue_append(tms);
 
-               cur_state = cmd->path[state_count];
+               tap_set_state(cmd->path[state_count]);
                state_count++;
                num_states--;
        }
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
 
@@ -957,10 +957,10 @@ void rlink_runtest(int num_cycles)
 {
        int i;
 
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
        /* only do a state_move when we're not already in RTI */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                rlink_end_state(TAP_IDLE);
                rlink_state_move();
@@ -974,7 +974,7 @@ void rlink_runtest(int num_cycles)
 
        /* finish in end_state */
        rlink_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                rlink_state_move();
 }
 
@@ -997,7 +997,7 @@ void rlink_reset(int trst, int srst)
 
        usb_err = ep1_generic_commandl(
                pHDev, 6,
-                
+
                EP1_CMD_MEMORY_WRITE,
                        ST7_PADR >> 8,
                        ST7_PADR,
@@ -1031,7 +1031,7 @@ rlink_scan(
        int                     scan_size
 ) {
        int                     ir_scan;
-       enum tap_state  saved_end_state;
+       tap_state_t     saved_end_state;
        int                     byte_bits;
        int                     extra_bits;
        int                     chunk_bits;
@@ -1051,11 +1051,11 @@ rlink_scan(
 
        /* Move to the proper state before starting to shift TDI/TDO. */
        if (!(
-               (!ir_scan && (cur_state == TAP_DRSHIFT))
+               (!ir_scan && (tap_get_state() == TAP_DRSHIFT))
                ||
-               (ir_scan && (cur_state == TAP_IRSHIFT))
+               (ir_scan && (tap_get_state() == TAP_IRSHIFT))
        )) {
-               saved_end_state = end_state;
+               saved_end_state = tap_get_end_state();
                rlink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
                rlink_state_move();
                rlink_end_state(saved_end_state);
@@ -1102,7 +1102,7 @@ rlink_scan(
 
                x = 0;
                dtc_mask = 1 << (extra_bits - 1);
-       
+
                while(extra_bits--) {
                        if(*tdi_p & tdi_mask) {
                                x |= dtc_mask;
@@ -1170,7 +1170,7 @@ rlink_scan(
                                LOG_ERROR("enqueuing DTC reply entry: %s\n", strerror(errno));
                                exit(1);
                        }
-                       
+
                        tdi_bit_offset += chunk_bits;
                }
 
@@ -1193,12 +1193,12 @@ rlink_scan(
                if(type != SCAN_IN) {
                        x = 0;
                        dtc_mask = 1 << (8 - 1);
-               
+
                        while(chunk_bits--) {
                                if(*tdi_p & tdi_mask) {
                                        x |= dtc_mask;
                                }
-       
+
                                dtc_mask >>= 1;
                                if(dtc_mask == 0) {
                                        dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = x;
@@ -1206,7 +1206,7 @@ rlink_scan(
                                        x = 0;
                                        dtc_mask = 1 << (8 - 1);
                                }
-       
+
                                tdi_mask <<= 1;
                                if(tdi_mask == 0) {
                                        tdi_p++;
@@ -1235,7 +1235,7 @@ rlink_scan(
                        LOG_ERROR("enqueuing DTC reply entry: %s\n", strerror(errno));
                        exit(1);
                }
-                       
+
                tdi_bit_offset += extra_bits;
 
                if(type == SCAN_IN) {
@@ -1248,14 +1248,14 @@ rlink_scan(
 
                        x = 0;
                        dtc_mask = 1 << (8 - 1);
-               
+
                        while(extra_bits--) {
                                if(*tdi_p & tdi_mask) {
                                        x |= dtc_mask;
                                }
-       
+
                                dtc_mask >>= 1;
-       
+
                                tdi_mask <<= 1;
                                if(tdi_mask == 0) {
                                        tdi_p++;
@@ -1293,8 +1293,8 @@ rlink_scan(
                                LOG_ERROR("enqueuing DTC reply entry: %s\n", strerror(errno));
                                exit(1);
                        }
-                       
-                       dtc_queue.cmd_buffer[dtc_queue.cmd_index++] = 
+
+                       dtc_queue.cmd_buffer[dtc_queue.cmd_index++] =
                                DTC_CMD_SHIFT_TMS_TDI_BIT_PAIR(1, (*tdi_p & tdi_mask), 1);
 
                        dtc_queue.reply_index++;
@@ -1303,8 +1303,8 @@ rlink_scan(
 
        /* Move to pause state */
        tap_state_queue_append(0);
-       cur_state = ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE;
-       if (cur_state != end_state) rlink_state_move();
+       tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
+       if (tap_get_state() != tap_get_end_state()) rlink_state_move();
 
        return(0);
 }
@@ -1363,7 +1363,7 @@ int rlink_execute_queue(void)
 #endif
                                if ((cmd->cmd.reset->trst == 1) || (cmd->cmd.reset->srst && (jtag_reset_config & RESET_SRST_PULLS_TRST)))
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                rlink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
@@ -1451,7 +1451,7 @@ int rlink_speed(int speed)
                                LOG_ERROR("An error occurred while trying to load DTC code for speed \"%d\".\n", speed);
                                exit(1);
                        }
-       
+
                        if(dtc_start_download() < 0) {
                                LOG_ERROR("%s, %d: starting DTC: %s",
                                        __FILE__, __LINE__,
@@ -1605,7 +1605,7 @@ int rlink_init(void)
 
                                                /* usb_set_configuration required under win32 */
                                                usb_set_configuration(pHDev, dev->config[0].bConfigurationValue);
-                                               
+
                                                retries = 3;
                                                do
                                                {
index be0501185979ed7d2bdc9db9d55f4f580d10326f..773f2977a4990d446cf090fe09a8bf8c9b1ef694 100644 (file)
@@ -58,7 +58,7 @@ int usbprog_register_commands(struct command_context_s *cmd_ctx);
 int usbprog_init(void);
 int usbprog_quit(void);
 
-void usbprog_end_state(enum tap_state state);
+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);
@@ -151,7 +151,7 @@ int usbprog_execute_queue(void)
 #endif
                                if (cmd->cmd.reset->trst == 1)
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
                                break;
@@ -235,10 +235,10 @@ int usbprog_quit(void)
 }
 
 /*************** jtag execute commands **********************/
-void usbprog_end_state(enum tap_state state)
+void usbprog_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
-               end_state = state;
+       if (tap_is_state_stable(state))
+               tap_set_end_state(state);
        else
        {
                LOG_ERROR("BUG: %i is not a valid end state", state);
@@ -249,7 +249,7 @@ void usbprog_end_state(enum tap_state state)
 void usbprog_state_move(void)
 {
        int i = 0, tms = 0;
-       u8 tms_scan = TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = tap_get_tms_path(tap_get_state(), tap_get_end_state());
 
        usbprog_jtag_write_tms(usbprog_jtag_handle, (char)tms_scan);
        for (i = 0; i < 7; i++)
@@ -257,7 +257,7 @@ void usbprog_state_move(void)
                tms = (tms_scan >> i) & 1;
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 void usbprog_path_move(pathmove_command_t *cmd)
@@ -268,13 +268,13 @@ void usbprog_path_move(pathmove_command_t *cmd)
        state_count = 0;
        while (num_states)
        {
-               if (tap_transitions[cur_state].low == cmd->path[state_count])
+               if (tap_state_transition(tap_get_state(), FALSE) == cmd->path[state_count])
                {
                        /* LOG_INFO("1"); */
                        usbprog_write(0, 0, 0);
                        usbprog_write(1, 0, 0);
                }
-               else if (tap_transitions[cur_state].high == cmd->path[state_count])
+               else if (tap_state_transition(tap_get_state(), TRUE) == cmd->path[state_count])
                {
                        /* LOG_INFO("2"); */
                        usbprog_write(0, 1, 0);
@@ -282,16 +282,16 @@ void usbprog_path_move(pathmove_command_t *cmd)
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(cmd->path[state_count]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(cmd->path[state_count]));
                        exit(-1);
                }
 
-               cur_state = cmd->path[state_count];
+               tap_set_state(cmd->path[state_count]);
                state_count++;
                num_states--;
        }
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
 void usbprog_runtest(int num_cycles)
@@ -299,7 +299,7 @@ void usbprog_runtest(int num_cycles)
        int i;
 
        /* only do a state_move when we're not already in IDLE */
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                usbprog_end_state(TAP_IDLE);
                usbprog_state_move();
@@ -326,14 +326,14 @@ void usbprog_runtest(int num_cycles)
        /* finish in end_state */
        /*
        usbprog_end_state(saved_end_state);
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                usbprog_state_move();
        */
 }
 
 void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
 {
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
        if (ir_scan)
                usbprog_end_state(TAP_IRSHIFT);
@@ -361,11 +361,11 @@ void usbprog_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)
        }
 
        if (ir_scan)
-               cur_state = TAP_IRPAUSE;
+               tap_set_state(TAP_IRPAUSE);
        else
-               cur_state = TAP_DRPAUSE;
+               tap_set_state(TAP_DRPAUSE);
 
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
                usbprog_state_move();
 }
 
index 7c2244434eb86371ad4e043cd5130c5177ae742c..fd2b397ec145160383222af192d67cb91bdc38e1 100644 (file)
@@ -92,7 +92,7 @@ static u8* vsllink_usb_out_buffer = NULL;
 #define JTAG_PINMSK_TDO                                (1 << 7)
 
 
-#define VSLLINK_TAP_MOVE(from, to)     VSLLINK_tap_move[tap_move_map[from]][tap_move_map[to]]
+#define VSLLINK_TAP_MOVE(from, to)     VSLLINK_tap_move[tap_move_ndx(from)][tap_move_ndx(to)]
 
 /* VSLLINK_tap_move[i][j]: tap movement command to go from state i to state j
  * 0: Test-Logic-Reset
@@ -101,7 +101,7 @@ static u8* vsllink_usb_out_buffer = NULL;
  * 3: Pause-DR
  * 4: Shift-IR
  * 5: Pause-IR
- * 
+ *
  * SD->SD and SI->SI have to be caught in interface specific code
  */
 u8 VSLLINK_tap_move[6][6] =
@@ -202,9 +202,9 @@ int vsllink_handle_usb_bulkin_command(struct command_context_s *cmd_ctx, char *c
 int vsllink_handle_usb_bulkout_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* Queue command functions */
-void vsllink_end_state(enum tap_state state);
+void vsllink_end_state(tap_state_t state);
 void vsllink_state_move(void);
-void vsllink_path_move(int num_states, enum tap_state *path);
+void vsllink_path_move(int num_states, tap_state_t *path);
 void vsllink_runtest(int num_cycles);
 void vsllink_stableclocks(int num_cycles, int tms);
 void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command);
@@ -267,17 +267,17 @@ int vsllink_execute_queue(void)
                switch (cmd->type)
                {
                        case JTAG_END_STATE:
-                               DEBUG_JTAG_IO("end_state: %s", jtag_state_name(cmd->cmd.end_state->end_state));
-                       
+                               DEBUG_JTAG_IO("end_state: %s", tap_state_name(cmd->cmd.end_state->end_state));
+
                                if (cmd->cmd.end_state->end_state != -1)
                                {
                                        vsllink_end_state(cmd->cmd.end_state->end_state);
                                }
                                break;
-       
+
                        case JTAG_RUNTEST:
                                DEBUG_JTAG_IO( "runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, \
-                                       jtag_state_name(cmd->cmd.runtest->end_state));
+                                       tap_state_name(cmd->cmd.runtest->end_state));
 
                                if (cmd->cmd.runtest->end_state != -1)
                                {
@@ -285,39 +285,39 @@ int vsllink_execute_queue(void)
                                }
                                vsllink_runtest(cmd->cmd.runtest->num_cycles);
                                break;
-       
+
                        case JTAG_STATEMOVE:
-                               DEBUG_JTAG_IO("statemove end in %s", jtag_state_name(cmd->cmd.statemove->end_state));
-                       
+                               DEBUG_JTAG_IO("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state));
+
                                if (cmd->cmd.statemove->end_state != -1)
                                {
                                        vsllink_end_state(cmd->cmd.statemove->end_state);
                                }
                                vsllink_state_move();
                                break;
-       
+
                        case JTAG_PATHMOVE:
                                DEBUG_JTAG_IO("pathmove: %i states, end in %s", \
                                        cmd->cmd.pathmove->num_states, \
-                                       jtag_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
-                       
+                                       tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
+
                                vsllink_path_move(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
                                break;
-       
+
                        case JTAG_SCAN:
                                if (cmd->cmd.scan->end_state != -1)
                                {
                                        vsllink_end_state(cmd->cmd.scan->end_state);
                                }
-                       
+
                                scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);
                                if (cmd->cmd.scan->ir_scan)
                                {
-                                       DEBUG_JTAG_IO("JTAG Scan write IR(%d bits), end in %s:", scan_size, jtag_state_name(cmd->cmd.scan->end_state));
+                                       DEBUG_JTAG_IO("JTAG Scan write IR(%d bits), end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state));
                                }
                                else
                                {
-                                       DEBUG_JTAG_IO("JTAG Scan write DR(%d bits), end in %s:", scan_size, jtag_state_name(cmd->cmd.scan->end_state));
+                                       DEBUG_JTAG_IO("JTAG Scan write DR(%d bits), end in %s:", scan_size, tap_state_name(cmd->cmd.scan->end_state));
                                }
 
 #ifdef _DEBUG_JTAG_IO_
@@ -328,7 +328,7 @@ int vsllink_execute_queue(void)
 
                                vsllink_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size, cmd->cmd.scan);
                                break;
-       
+
                        case JTAG_RESET:
                                DEBUG_JTAG_IO("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);
 
@@ -336,14 +336,14 @@ int vsllink_execute_queue(void)
 
                                if (cmd->cmd.reset->trst == 1)
                                {
-                                       cur_state = TAP_RESET;
+                                       tap_set_state(TAP_RESET);
                                }
                                vsllink_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
 
                                vsllink_usb_out_buffer[0] = VSLLINK_CMD_HW_JTAGSEQCMD;
                                vsllink_usb_out_buffer_idx = 3;
                                break;
-       
+
                        case JTAG_SLEEP:
                                DEBUG_JTAG_IO("sleep %i", cmd->cmd.sleep->us);
                                vsllink_tap_execute();
@@ -352,7 +352,7 @@ int vsllink_execute_queue(void)
 
                        case JTAG_STABLECLOCKS:
                                DEBUG_JTAG_IO("add %d clocks", cmd->cmd.stableclocks->num_cycles);
-                               switch(cur_state)
+                               switch(tap_get_state())
                                {
                                case TAP_RESET:
                                        // tms should be '1' to stay in TAP_RESET mode
@@ -368,7 +368,7 @@ int vsllink_execute_queue(void)
                                        break;                  /* above stable states are OK */
                                default:
                                         LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
-                                                        jtag_state_name(cur_state) );
+                                                        tap_state_name(tap_get_state()) );
                                         exit(-1);
                                }
                                vsllink_stableclocks(cmd->cmd.stableclocks->num_cycles, scan_size);
@@ -380,7 +380,7 @@ int vsllink_execute_queue(void)
                }
                cmd = cmd->next;
        }
-       
+
        return vsllink_tap_execute();
 }
 
@@ -391,9 +391,9 @@ int vsllink_speed(int speed)
        vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_SPEED;
        vsllink_usb_out_buffer[1] = (speed >> 0) & 0xff;
        vsllink_usb_out_buffer[2] = (speed >> 8) & 0xFF;
-               
+
        result = vsllink_usb_write(vsllink_jtag_handle, 3);
-               
+
        if (result == 3)
        {
                return ERROR_OK;
@@ -403,14 +403,14 @@ int vsllink_speed(int speed)
                LOG_ERROR("VSLLink setting speed failed (%d)", result);
                return ERROR_JTAG_DEVICE_ERROR;
        }
-       
+
        return ERROR_OK;
 }
 
 int vsllink_khz(int khz, int *jtag_speed)
 {
        *jtag_speed = khz;
-       
+
        return ERROR_OK;
 }
 
@@ -423,13 +423,13 @@ int vsllink_speed_div(int jtag_speed, int *khz)
 
 int vsllink_register_commands(struct command_context_s *cmd_ctx)
 {
-       register_command(cmd_ctx, NULL, "vsllink_usb_vid", vsllink_handle_usb_vid_command, 
+       register_command(cmd_ctx, NULL, "vsllink_usb_vid", vsllink_handle_usb_vid_command,
                                        COMMAND_CONFIG, NULL);
-       register_command(cmd_ctx, NULL, "vsllink_usb_pid", vsllink_handle_usb_pid_command, 
+       register_command(cmd_ctx, NULL, "vsllink_usb_pid", vsllink_handle_usb_pid_command,
                                        COMMAND_CONFIG, NULL);
-       register_command(cmd_ctx, NULL, "vsllink_usb_bulkin", vsllink_handle_usb_bulkin_command, 
+       register_command(cmd_ctx, NULL, "vsllink_usb_bulkin", vsllink_handle_usb_bulkin_command,
                                        COMMAND_CONFIG, NULL);
-       register_command(cmd_ctx, NULL, "vsllink_usb_bulkout", vsllink_handle_usb_bulkout_command, 
+       register_command(cmd_ctx, NULL, "vsllink_usb_bulkout", vsllink_handle_usb_bulkout_command,
                                        COMMAND_CONFIG, NULL);
 
        return ERROR_OK;
@@ -437,7 +437,7 @@ int vsllink_register_commands(struct command_context_s *cmd_ctx)
 
 int vsllink_init(void)
 {
-       int check_cnt;  
+       int check_cnt;
        int result;
        char version_str[100];
 
@@ -450,13 +450,13 @@ int vsllink_init(void)
        }
 
        vsllink_jtag_handle = vsllink_usb_open();
-       
+
        if (vsllink_jtag_handle == 0)
        {
                LOG_ERROR("Can't find USB JTAG Interface! Please check connection and permissions.");
                return ERROR_JTAG_INIT_FAILED;
        }
-               
+
        check_cnt = 0;
        while (check_cnt < 3)
        {
@@ -517,7 +517,7 @@ int vsllink_init(void)
        LOG_INFO("VSLLink JTAG Interface ready");
 
        vsllink_tap_init();
-       
+
        return ERROR_OK;
 }
 
@@ -555,10 +555,11 @@ int vsllink_quit(void)
 // length of VSLLINK_CMDJTAGSEQ_TMSBYTE has been set, no need to set it here.
 void vsllink_append_tms(void)
 {
-       u8 tms_scan = VSLLINK_TAP_MOVE(cur_state, end_state);
+       u8 tms_scan = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state());
        u16 tms2;
+       tap_state_t     end_state = tap_get_end_state();
 
-       if (((cur_state != TAP_RESET) && (cur_state != TAP_IDLE) && (cur_state != TAP_DRPAUSE) && (cur_state != TAP_IRPAUSE)) || \
+       if (((tap_get_state() != TAP_RESET) && (tap_get_state() != TAP_IDLE) && (tap_get_state() != TAP_DRPAUSE) && (tap_get_state() != TAP_IRPAUSE)) || \
                        (vsllink_tms_data_len <= 0) || (vsllink_tms_data_len >= 8) || \
                        (vsllink_tms_cmd_pos == NULL))
        {
@@ -566,15 +567,15 @@ void vsllink_append_tms(void)
                exit(-1);
        }
 
-       tms2 = (tms_scan & VSLLINK_BIT_MSK[VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_map[cur_state]][tap_move_map[end_state]].insert_position]) << \
+       tms2 = (tms_scan & VSLLINK_BIT_MSK[VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(end_state)].insert_position]) << \
                                vsllink_tms_data_len;
-       if (VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_map[cur_state]][tap_move_map[end_state]].insert_value == 1)
+       if (VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(end_state)].insert_value == 1)
        {
                tms2 |= VSLLINK_BIT_MSK[8 - vsllink_tms_data_len] << \
-                               (vsllink_tms_data_len + VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_map[cur_state]][tap_move_map[end_state]].insert_position);
+                               (vsllink_tms_data_len + VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(end_state)].insert_position);
        }
-       tms2 |= (tms_scan >> VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_map[cur_state]][tap_move_map[end_state]].insert_position) << \
-                               (8 + VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_map[cur_state]][tap_move_map[end_state]].insert_position);
+       tms2 |= (tms_scan >> VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(end_state)].insert_position) << \
+                               (8 + VSLLINK_TAP_MOVE_INSERT_INSIGNIFICANT[tap_move_ndx(tap_get_state())][tap_move_ndx(end_state)].insert_position);
 
        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] |= (tms2 >> 0) & 0xff;
        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = (tms2 >> 8) & 0xff;
@@ -586,11 +587,11 @@ void vsllink_append_tms(void)
 /***************************************************************************/
 /* Queue command implementations */
 
-void vsllink_end_state(enum tap_state state)
+void vsllink_end_state(tap_state_t state)
 {
-       if (tap_move_map[state] != -1)
+       if (tap_is_state_stable(state))
        {
-               end_state = state;
+               tap_set_end_state(state);
        }
        else
        {
@@ -611,14 +612,14 @@ void vsllink_state_move(void)
                vsllink_tap_ensure_space(0, 2);
 
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_TMSBYTE;
-               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(cur_state, end_state);
+               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state());
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 // write tms from current vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx]
-void vsllink_add_path(int start, int num, enum tap_state *path)
+void vsllink_add_path(int start, int num, tap_state_t *path)
 {
        int i;
 
@@ -633,20 +634,20 @@ void vsllink_add_path(int start, int num, enum tap_state *path)
                        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] = 0;
                }
 
-               if (path[i - start] == tap_transitions[cur_state].high)
+               if (path[i - start] == tap_state_transition(tap_get_state(), TRUE))
                {
                        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] |= 1 << (i & 7);
                }
-               else if (path[i - start] == tap_transitions[cur_state].low)
+               else if (path[i - start] == tap_state_transition(tap_get_state(), FALSE))
                {
                        // nothing to do
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[i]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(tap_get_state()), tap_state_name(path[i]));
                        exit(-1);
                }
-               cur_state = path[i - start];
+               tap_set_state(path[i - start]);
        }
        if ((i > 0) && ((i & 7) == 0))
        {
@@ -654,10 +655,10 @@ void vsllink_add_path(int start, int num, enum tap_state *path)
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] = 0;
        }
 
-       end_state = cur_state;
+       tap_set_end_state(tap_get_state());
 }
 
-void vsllink_path_move(int num_states, enum tap_state *path)
+void vsllink_path_move(int num_states, tap_state_t *path)
 {
        int i, tms_len, tms_cmd_pos, path_idx = 0;
 
@@ -934,9 +935,9 @@ void vsllink_stableclocks(int num_cycles, int tms)
 
 void vsllink_runtest(int num_cycles)
 {
-       enum tap_state saved_end_state = end_state;
+       tap_state_t saved_end_state = tap_get_end_state();
 
-       if (cur_state != TAP_IDLE)
+       if (tap_get_state() != TAP_IDLE)
        {
                // enter into IDLE state
                vsllink_end_state(TAP_IDLE);
@@ -948,8 +949,8 @@ void vsllink_runtest(int num_cycles)
        // post-process
        // set end_state
        vsllink_end_state(saved_end_state);
-       cur_state = TAP_IDLE;
-       if (end_state != TAP_IDLE)
+       tap_set_state(TAP_IDLE);
+       if (tap_get_end_state() != TAP_IDLE)
        {
                vsllink_state_move();
        }
@@ -957,7 +958,7 @@ void vsllink_runtest(int num_cycles)
 
 void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, scan_command_t *command)
 {
-       enum tap_state saved_end_state;
+       tap_state_t saved_end_state;
        u8 bits_left, tms_tmp, tdi_len;
        int i;
 
@@ -972,15 +973,15 @@ void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, s
                LOG_ERROR("Your implementation of VSLLink has not enough buffer");
                exit(-1);
        }
-       
-       saved_end_state = end_state;
-       
+
+       saved_end_state = tap_get_end_state();
+
        /* Move to appropriate scan state */
        vsllink_end_state(ir_scan ? TAP_IRSHIFT : TAP_DRSHIFT);
 
        if (vsllink_tms_data_len > 0)
        {
-               if (cur_state == end_state)
+               if (tap_get_state() == tap_get_end_state())
                {
                        // already in IRSHIFT or DRSHIFT state
                        // merge tms data in the last tms shift command into next scan command
@@ -1001,7 +1002,7 @@ void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, s
                        }
 
                        vsllink_tap_ensure_space(1, tdi_len + 7);
-                       // VSLLINK_CMDJTAGSEQ_SCAN ored by 1 means that tms_before is valid 
+                       // VSLLINK_CMDJTAGSEQ_SCAN ored by 1 means that tms_before is valid
                        // which is merged from the last tms shift command
                        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_SCAN | 1;
                        vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = ((tdi_len + 1) >> 0) & 0xff;
@@ -1041,7 +1042,7 @@ void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, s
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_CMDJTAGSEQ_SCAN | 1;
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = ((tdi_len + 1) >> 0) & 0xff;
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = ((tdi_len + 1)>> 8) & 0xff;
-               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(cur_state, end_state);
+               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state());
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = 0;
 
                vsllink_tap_append_scan(scan_size, buffer, command, 8);
@@ -1049,7 +1050,7 @@ void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, s
        vsllink_end_state(saved_end_state);
 
        bits_left = scan_size & 0x07;
-       cur_state = ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE;
+       tap_set_state(ir_scan ? TAP_IRPAUSE : TAP_DRPAUSE);
 
        if (bits_left > 0)
        {
@@ -1060,16 +1061,16 @@ void vsllink_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size, s
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = 1 << 7;
        }
 
-       if (cur_state != end_state)
+       if (tap_get_state() != tap_get_end_state())
        {
-               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(cur_state, end_state);
+               vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = VSLLINK_TAP_MOVE(tap_get_state(), tap_get_end_state());
        }
        else
        {
                vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx++] = 0;
        }
 
-       cur_state = end_state;
+       tap_set_state(tap_get_end_state());
 }
 
 void vsllink_reset(int trst, int srst)
@@ -1077,7 +1078,7 @@ void vsllink_reset(int trst, int srst)
        int result;
 
        LOG_DEBUG("trst: %i, srst: %i", trst, srst);
-       
+
        /* Signals are active low */
        vsllink_usb_out_buffer[0] = VSLLINK_CMD_SET_PORT;
        vsllink_usb_out_buffer[1] = JTAG_PINMSK_SRST | JTAG_PINMSK_TRST;
@@ -1101,12 +1102,12 @@ void vsllink_reset(int trst, int srst)
 void vsllink_simple_command(u8 command)
 {
        int result;
-       
+
        DEBUG_JTAG_IO("0x%02x", command);
-       
+
        vsllink_usb_out_buffer[0] = command;
        result = vsllink_usb_write(vsllink_jtag_handle, 1);
-       
+
        if (result != 1)
        {
                LOG_ERROR("VSLLink command 0x%02x failed (%d)", command, result);
@@ -1116,7 +1117,7 @@ void vsllink_simple_command(u8 command)
 int vsllink_handle_usb_vid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc != 1) {
-           LOG_ERROR("parameter error, should be one parameter for VID");
+               LOG_ERROR("parameter error, should be one parameter for VID");
                return ERROR_OK;
        }
 
@@ -1128,7 +1129,7 @@ int vsllink_handle_usb_vid_command(struct command_context_s *cmd_ctx, char *cmd,
 int vsllink_handle_usb_pid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc != 1) {
-           LOG_ERROR("parameter error, should be one parameter for PID");
+               LOG_ERROR("parameter error, should be one parameter for PID");
                return ERROR_OK;
        }
 
@@ -1140,7 +1141,7 @@ int vsllink_handle_usb_pid_command(struct command_context_s *cmd_ctx, char *cmd,
 int vsllink_handle_usb_bulkin_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc != 1) {
-           LOG_ERROR("parameter error, should be one parameter for BULKIN endpoint");
+               LOG_ERROR("parameter error, should be one parameter for BULKIN endpoint");
                return ERROR_OK;
        }
 
@@ -1152,7 +1153,7 @@ int vsllink_handle_usb_bulkin_command(struct command_context_s *cmd_ctx, char *c
 int vsllink_handle_usb_bulkout_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
        if (argc != 1) {
-           LOG_ERROR("parameter error, should be one parameter for BULKOUT endpoint");
+               LOG_ERROR("parameter error, should be one parameter for BULKOUT endpoint");
                return ERROR_OK;
        }
 
@@ -1175,7 +1176,7 @@ void vsllink_tap_ensure_space(int scans, int bytes)
 {
        int available_scans = MAX_PENDING_SCAN_RESULTS - pending_scan_results_length;
        int available_bytes = VSLLINK_BufferSize - vsllink_usb_out_buffer_idx;
-       
+
        if (scans > available_scans || bytes > available_bytes)
        {
                vsllink_tap_execute();
@@ -1218,9 +1219,9 @@ int vsllink_tap_execute(void)
 
        if (vsllink_tms_data_len > 0)
        {
-               if((cur_state != TAP_RESET) && (cur_state != TAP_IDLE) && (cur_state != TAP_IRPAUSE) && (cur_state != TAP_DRPAUSE))
+               if((tap_get_state() != TAP_RESET) && (tap_get_state() != TAP_IDLE) && (tap_get_state() != TAP_IRPAUSE) && (tap_get_state() != TAP_DRPAUSE))
                {
-                       LOG_WARNING("%s is not in RESET or IDLE or PAUSR state", jtag_state_name(cur_state));
+                       LOG_WARNING("%s is not in RESET or IDLE or PAUSR state", tap_state_name(tap_get_state()));
                }
 
                if (vsllink_usb_out_buffer[vsllink_usb_out_buffer_idx] & (1 << (vsllink_tms_data_len - 1)))
@@ -1238,7 +1239,7 @@ int vsllink_tap_execute(void)
                        vsllink_tms_data_len = 0;
                }
        }
-       
+
        if (vsllink_usb_out_buffer_idx > 3)
        {
                if (vsllink_usb_out_buffer[0] == VSLLINK_CMD_HW_JTAGSEQCMD)
@@ -1248,7 +1249,7 @@ int vsllink_tap_execute(void)
                }
 
                result = vsllink_usb_message(vsllink_jtag_handle, vsllink_usb_out_buffer_idx, vsllink_usb_in_want_length);
-       
+
                if (result == vsllink_usb_in_want_length)
                {
                        for (i = 0; i < pending_scan_results_length; i++)
@@ -1264,7 +1265,7 @@ int vsllink_tap_execute(void)
                                        // IRSHIFT or DRSHIFT
                                        buf_set_buf(vsllink_usb_in_buffer, first * 8 + offset, buffer, 0, length);
                                        first += (length + offset + 7) >> 3;
-       
+
                                        DEBUG_JTAG_IO("JTAG scan read(%d bits):", length);
 #ifdef _DEBUG_JTAG_IO_
                                        vsllink_debug_buffer(buffer, (length + 7) >> 3);
@@ -1290,7 +1291,7 @@ int vsllink_tap_execute(void)
                        LOG_ERROR("vsllink_tap_execute, wrong result %d, expected %d", result, vsllink_usb_in_want_length);
                        return ERROR_JTAG_QUEUE_FAILED;
                }
-               
+
                vsllink_tap_init();
        }
 
@@ -1308,19 +1309,19 @@ vsllink_jtag_t* vsllink_usb_open(void)
        struct usb_bus *busses;
        struct usb_bus *bus;
        struct usb_device *dev;
-       
+
        vsllink_jtag_t *result;
-       
+
        result = (vsllink_jtag_t*) malloc(sizeof(vsllink_jtag_t));
-       
+
        usb_init();
        usb_find_busses();
        usb_find_devices();
-       
+
        busses = usb_get_busses();
-       
+
        /* find vsllink_jtag device in usb bus */
-       
+
        for (bus = busses; bus; bus = bus->next)
        {
                for (dev = bus->devices; dev; dev = dev->next)
@@ -1328,23 +1329,23 @@ vsllink_jtag_t* vsllink_usb_open(void)
                        if ((dev->descriptor.idVendor == vsllink_vid) && (dev->descriptor.idProduct == vsllink_pid))
                        {
                                result->usb_handle = usb_open(dev);
-                               
+
                                /* usb_set_configuration required under win32 */
                                usb_set_configuration(result->usb_handle, dev->config[0].bConfigurationValue);
                                usb_claim_interface(result->usb_handle, 0);
-                               
+
 #if 0
-                               /* 
+                               /*
                                 * This makes problems under Mac OS X. And is not needed
                                 * under Windows. Hopefully this will not break a linux build
                                 */
                                usb_set_altinterface(result->usb_handle, 0);
-#endif                         
+#endif
                                return result;
                        }
                }
        }
-       
+
        free(result);
        return NULL;
 }
@@ -1359,7 +1360,7 @@ void vsllink_usb_close(vsllink_jtag_t *vsllink_jtag)
 int vsllink_usb_message(vsllink_jtag_t *vsllink_jtag, int out_length, int in_length)
 {
        int result;
-       
+
        result = vsllink_usb_write(vsllink_jtag, out_length);
        if (result == out_length)
        {
@@ -1389,18 +1390,18 @@ int vsllink_usb_message(vsllink_jtag_t *vsllink_jtag, int out_length, int in_len
 int vsllink_usb_write(vsllink_jtag_t *vsllink_jtag, int out_length)
 {
        int result;
-       
+
        if (out_length > VSLLINK_BufferSize)
        {
                LOG_ERROR("vsllink_jtag_write illegal out_length=%d (max=%d)", out_length, VSLLINK_BufferSize);
                return -1;
        }
-       
+
        result = usb_bulk_write(vsllink_jtag->usb_handle, vsllink_bulkout, \
                (char *)vsllink_usb_out_buffer, out_length, VSLLINK_USB_TIMEOUT);
-       
+
        DEBUG_JTAG_IO("vsllink_usb_write, out_length = %d, result = %d", out_length, result);
-       
+
 #ifdef _DEBUG_USB_COMMS_
        LOG_DEBUG("USB out:");
        vsllink_debug_buffer(vsllink_usb_out_buffer, out_length);
@@ -1420,7 +1421,7 @@ int vsllink_usb_read(vsllink_jtag_t *vsllink_jtag)
                (char *)vsllink_usb_in_buffer, VSLLINK_BufferSize, VSLLINK_USB_TIMEOUT);
 
        DEBUG_JTAG_IO("vsllink_usb_read, result = %d", result);
-       
+
 #ifdef _DEBUG_USB_COMMS_
        LOG_DEBUG("USB in:");
        vsllink_debug_buffer(vsllink_usb_in_buffer, result);
@@ -1436,7 +1437,7 @@ void vsllink_debug_buffer(u8 *buffer, int length)
        char s[4];
        int i;
        int j;
-       
+
        for (i = 0; i < length; i += BYTES_PER_LINE)
        {
                snprintf(line, 5, "%04x", i);
index 2c56191326a5af2ece954f385b6702fb0d24d552..de13ba4d2c8bfd3ad44d42cbab8e8f2a77630ceb 100644 (file)
@@ -321,7 +321,7 @@ int handle_zy1000_version_command(struct command_context_s *cmd_ctx, char *cmd,
 
 static int
 zylinjtag_Jim_Command_powerstatus(Jim_Interp *interp,
-                                   int argc,
+                                                                  int argc,
                Jim_Obj * const *argv)
 {
        if (argc != 1)
@@ -424,9 +424,9 @@ static cyg_uint32 getShiftValueFlip(void)
 #endif
 
 #if 0
-static void shiftValueInnerFlip(const enum tap_state state, const enum tap_state endState, int repeat, cyg_uint32 value)
+static void shiftValueInnerFlip(const tap_state_t state, const tap_state_t endState, int repeat, cyg_uint32 value)
 {
-       VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", jtag_state_name(state), jtag_state_name(endState), repeat, value));
+       VERBOSE(LOG_INFO("shiftValueInner %s %s %d %08x (flipped)", tap_state_name(state), tap_state_name(endState), repeat, value));
        cyg_uint32 a,b;
        a=state;
        b=endState;
@@ -443,7 +443,7 @@ static void gotoEndState(void)
        setCurrentState(cmd_queue_end_state);
 }
 
-static __inline void scanFields(int num_fields, scan_field_t *fields, enum tap_state shiftState, int pause)
+static __inline void scanFields(int num_fields, scan_field_t *fields, tap_state_t shiftState, int pause)
 {
        int i;
        int j;
@@ -487,7 +487,7 @@ static __inline void scanFields(int num_fields, scan_field_t *fields, enum tap_s
                j=0;
                while (j<num_bits)
                {
-                       enum tap_state pause_state;
+                       tap_state_t pause_state;
                        int l;
                        k=num_bits-j;
                        pause_state=(shiftState==TAP_DRSHIFT)?TAP_DRSHIFT:TAP_IRSHIFT;
@@ -544,13 +544,13 @@ static __inline void scanFields(int num_fields, scan_field_t *fields, enum tap_s
        }
 }
 
-int interface_jtag_add_end_state(enum tap_state state)
+int interface_jtag_add_end_state(tap_state_t state)
 {
        return ERROR_OK;
 }
 
 
-int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
 
        int j;
@@ -614,7 +614,7 @@ int interface_jtag_add_ir_scan(int num_fields, scan_field_t *fields, enum tap_st
 
 
 
-int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        scanFields(num_fields, fields, TAP_IRSHIFT, 1);
        gotoEndState();
@@ -624,7 +624,7 @@ int interface_jtag_add_plain_ir_scan(int num_fields, scan_field_t *fields, enum
 
 /*extern jtag_command_t **jtag_get_last_command_p(void);*/
 
-int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
 
        int j;
@@ -667,7 +667,7 @@ int interface_jtag_add_dr_scan(int num_fields, scan_field_t *fields, enum tap_st
        return ERROR_OK;
 }
 
-int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, enum tap_state state)
+int interface_jtag_add_plain_dr_scan(int num_fields, scan_field_t *fields, tap_state_t state)
 {
        scanFields(num_fields, fields, TAP_DRSHIFT, 1);
        gotoEndState();
@@ -693,7 +693,7 @@ int interface_jtag_add_reset(int req_trst, int req_srst)
        return ERROR_OK;
 }
 
-static int zy1000_jtag_add_clocks(int num_cycles, enum tap_state state, enum tap_state clockstate)
+static int zy1000_jtag_add_clocks(int num_cycles, tap_state_t state, tap_state_t clockstate)
 {
        /* num_cycles can be 0 */
        setCurrentState(clockstate);
@@ -715,10 +715,10 @@ static int zy1000_jtag_add_clocks(int num_cycles, enum tap_state state, enum tap
        /* finish in end_state */
        setCurrentState(state);
 #else
-       enum tap_state t=TAP_IDLE;
+       tap_state_t t=TAP_IDLE;
        /* test manual drive code on any target */
        int tms;
-       u8 tms_scan = TAP_MOVE(t, state);
+       u8 tms_scan = tap_get_tms_path(t, state);
 
        for (i = 0; i < 7; i++)
        {
@@ -734,7 +734,7 @@ static int zy1000_jtag_add_clocks(int num_cycles, enum tap_state state, enum tap
        return ERROR_OK;
 }
 
-int interface_jtag_add_runtest(int num_cycles, enum tap_state state)
+int interface_jtag_add_runtest(int num_cycles, tap_state_t state)
 {
        return zy1000_jtag_add_clocks(num_cycles, state, TAP_IDLE);
 }
@@ -750,7 +750,7 @@ int interface_jtag_add_sleep(u32 us)
        return ERROR_OK;
 }
 
-int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
+int interface_jtag_add_pathmove(int num_states, tap_state_t *path)
 {
        int state_count;
        int tms = 0;
@@ -760,21 +760,21 @@ int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
 
        state_count = 0;
 
-       enum tap_state cur_state=cmd_queue_cur_state;
+       tap_state_t cur_state=cmd_queue_cur_state;
 
        while (num_states)
        {
-               if (tap_transitions[cur_state].low == path[state_count])
+               if (tap_state_transition(cur_state, FALSE) == path[state_count])
                {
                        tms = 0;
                }
-               else if (tap_transitions[cur_state].high == path[state_count])
+               else if (tap_state_transition(cur_state, TRUE) == path[state_count])
                {
                        tms = 1;
                }
                else
                {
-                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", jtag_state_name(cur_state), jtag_state_name(path[state_count]));
+                       LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state), tap_state_name(path[state_count]));
                        exit(-1);
                }
 
@@ -796,7 +796,7 @@ int interface_jtag_add_pathmove(int num_states, enum tap_state *path)
 void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, u8 *buffer, int little, int count)
 {
 //     static int const reg_addr=0x5;
-       enum tap_state end_state=cmd_queue_end_state;
+       tap_state_t end_state=cmd_queue_end_state;
        if (jtag_NextEnabledTap(jtag_NextEnabledTap(NULL))==NULL)
        {
                /* better performance via code duplication */
index a82c03890e169772d79b013f309977402e610e6a..f1a52da09d727fd629b4f7af1936eb476afe1a14 100644 (file)
@@ -69,7 +69,7 @@ typedef enum
        TRST,
 }svf_command_t;
 
-const char *svf_command_name[14] = 
+const char *svf_command_name[14] =
 {
        "ENDDR",
        "ENDIR",
@@ -137,7 +137,7 @@ typedef struct
 }svf_para_t;
 
 svf_para_t svf_para;
-const svf_para_t svf_para_init = 
+const svf_para_t svf_para_init =
 {
 //     frequency,      ir_end_state,   dr_end_state,   runtest_run_state,      runtest_end_state,      trst_mode
        0,                      TAP_IDLE,               TAP_IDLE,               TAP_IDLE,                       TAP_IDLE,                       TRST_Z,
@@ -318,7 +318,7 @@ static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char
        memcpy(&svf_para, &svf_para_init, sizeof(svf_para));
        for (i = 0; i < dimof(svf_tap_state_name); i++)
        {
-               svf_tap_state_name[i] = (char *)jtag_state_name(i);
+               svf_tap_state_name[i] = (char *)tap_state_name(i);
        }
        // TAP_RESET
        jtag_add_tlr();
@@ -653,10 +653,10 @@ static int svf_check_tdo(void)
                        {
                                if ((svf_tdi_buffer[index + j] & svf_mask_buffer[index + j]) != svf_tdo_buffer[index + j])
                                {
-                                       LOG_ERROR("tdo check error at line %d, read = 0x%X, want = 0x%X, mask = 0x%X", 
-                                                               svf_check_tdo_para[i].line_num, 
-                                                               (*(int*)(svf_tdi_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1), 
-                                                               (*(int*)(svf_tdo_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1), 
+                                       LOG_ERROR("tdo check error at line %d, read = 0x%X, want = 0x%X, mask = 0x%X",
+                                                               svf_check_tdo_para[i].line_num,
+                                                               (*(int*)(svf_tdi_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1),
+                                                               (*(int*)(svf_tdo_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1),
                                                                (*(int*)(svf_mask_buffer + index)) & ((1 << svf_check_tdo_para[i].bit_len) - 1));
                                        return ERROR_FAIL;
                                }
@@ -872,7 +872,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                        }
                        LOG_DEBUG("\t%s = 0x%X", argus[i], (**(int**)pbuffer_tmp) & ((1 << (xxr_para_tmp->len)) - 1));
                }
-               // If a command changes the length of the last scan of the same type and the MASK parameter is absent, 
+               // If a command changes the length of the last scan of the same type and the MASK parameter is absent,
                // the mask pattern used is all cares
                if (!(xxr_para_tmp->data_mask & XXR_MASK) && (i_tmp != xxr_para_tmp->len))
                {
index 35b577ce41f3aadcf7368f739260669230e157fa..25b465cccf94910ae8f8bdf903f876acc6f30d9a 100644 (file)
@@ -230,9 +230,9 @@ void arm11_dump_reg_changes(arm11_common_t * arm11);
 /* internals */
 
 void arm11_setup_field         (arm11_common_t * arm11, int num_bits, void * in_data, void * out_data, scan_field_t * field);
-void arm11_add_IR              (arm11_common_t * arm11, u8 instr, enum tap_state state);
-void arm11_add_debug_SCAN_N    (arm11_common_t * arm11, u8 chain, enum tap_state state);
-void arm11_add_debug_INST      (arm11_common_t * arm11, u32 inst, u8 * flag, enum tap_state state);
+void arm11_add_IR              (arm11_common_t * arm11, u8 instr, tap_state_t state);
+void arm11_add_debug_SCAN_N    (arm11_common_t * arm11, u8 chain, tap_state_t state);
+void arm11_add_debug_INST      (arm11_common_t * arm11, u32 inst, u8 * flag, tap_state_t state);
 u32  arm11_read_DSCR           (arm11_common_t * arm11);
 void arm11_write_DSCR          (arm11_common_t * arm11, u32 dscr);
 
@@ -249,8 +249,8 @@ void arm11_run_instr_data_from_core         (arm11_common_t * arm11, u32 opcode, u32 *
 void arm11_run_instr_data_from_core_via_r0     (arm11_common_t * arm11, u32 opcode, u32 * data);
 void arm11_run_instr_data_to_core_via_r0       (arm11_common_t * arm11, u32 opcode, u32 data);
 
-int arm11_add_dr_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state);
-int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state);
+int arm11_add_dr_scan_vc(int num_fields, scan_field_t *fields, tap_state_t state);
+int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, tap_state_t state);
 
 /** Used to make a list of read/write commands for scan chain 7
  *
index 03dc49f9b86197172ffb467dd69326b9cc488bee..cfa8de647fccdbaa6ecf586314859b553e536362 100644 (file)
 #define JTAG_DEBUG(expr ...)   do {} while(0)
 #endif
 
-enum tap_state arm11_move_pi_to_si_via_ci[] =
+tap_state_t arm11_move_pi_to_si_via_ci[] =
 {
     TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IRSHIFT
 };
 
 
-int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state)
+int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, tap_state_t state)
 {
     if (cmd_queue_cur_state == TAP_IRPAUSE)
        jtag_add_pathmove(asizeof(arm11_move_pi_to_si_via_ci), arm11_move_pi_to_si_via_ci);
@@ -51,12 +51,12 @@ int arm11_add_ir_scan_vc(int num_fields, scan_field_t *fields, enum tap_state st
     return ERROR_OK;
 }
 
-enum tap_state arm11_move_pd_to_sd_via_cd[] =
+tap_state_t arm11_move_pd_to_sd_via_cd[] =
 {
     TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
 };
 
-int arm11_add_dr_scan_vc(int num_fields, scan_field_t *fields, enum tap_state state)
+int arm11_add_dr_scan_vc(int num_fields, scan_field_t *fields, tap_state_t state)
 {
     if (cmd_queue_cur_state == TAP_DRPAUSE)
        jtag_add_pathmove(asizeof(arm11_move_pd_to_sd_via_cd), arm11_move_pd_to_sd_via_cd);
@@ -99,7 +99,7 @@ void arm11_setup_field(arm11_common_t * arm11, int num_bits, void * out_data, vo
  *
  * \remarks This adds to the JTAG command queue but does \em not execute it.
  */
-void arm11_add_IR(arm11_common_t * arm11, u8 instr, enum tap_state state)
+void arm11_add_IR(arm11_common_t * arm11, u8 instr, tap_state_t state)
 {
        jtag_tap_t *tap;
        tap = arm11->jtag_info.tap;
@@ -167,7 +167,7 @@ static int arm11_in_handler_SCAN_N(u8 *in_value, void *priv, struct scan_field_s
  * \remarks This adds to the JTAG command queue but does \em not execute it.
  */
 
-void arm11_add_debug_SCAN_N(arm11_common_t * arm11, u8 chain, enum tap_state state)
+void arm11_add_debug_SCAN_N(arm11_common_t * arm11, u8 chain, tap_state_t state)
 {
     JTAG_DEBUG("SCREG <= 0x%02x", chain);
 
@@ -199,7 +199,7 @@ void arm11_add_debug_SCAN_N(arm11_common_t * arm11, u8 chain, enum tap_state sta
  *
  * \remarks This adds to the JTAG command queue but does \em not execute it.
  */
-void arm11_add_debug_INST(arm11_common_t * arm11, u32 inst, u8 * flag, enum tap_state state)
+void arm11_add_debug_INST(arm11_common_t * arm11, u32 inst, u8 * flag, tap_state_t state)
 {
     JTAG_DEBUG("INST <= 0x%08x", inst);
 
@@ -471,7 +471,7 @@ void arm11_run_instr_data_to_core(arm11_common_t * arm11, u32 opcode, u32 * data
  *  the core but still shorter than any manually inducible delays.
  *
  */
-enum tap_state arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay[] =
+tap_state_t arm11_MOVE_DRPAUSE_IDLE_DRPAUSE_with_delay[] =
 {
     TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DRSHIFT
 };
index e98644b48cf02622778698543fb64bb5aaa1fc28..0a162959cf4609fbb4aab4ddb544ae362593c2bc 100644 (file)
@@ -318,7 +318,7 @@ int xscale_receive(target_t *target, u32 *buffer, int num_words)
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
 
-       enum tap_state path[3];
+       tap_state_t path[3];
        scan_field_t fields[3];
 
        u8 *field0 = malloc(num_words * 1);
@@ -427,8 +427,8 @@ int xscale_read_tx(target_t *target, int consume)
 {
        armv4_5_common_t *armv4_5 = target->arch_info;
        xscale_common_t *xscale = armv4_5->arch_info;
-       enum tap_state path[3];
-       enum tap_state noconsume_path[6];
+       tap_state_t path[3];
+       tap_state_t noconsume_path[6];
 
        int retval;
        struct timeval timeout, now;
index d69c1a9394c45ea2052bf84c18f415e0937cb031..855021df75118ee59b54b9844caa06bd30d51743 100644 (file)
@@ -141,7 +141,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 static int xsvf_fd = 0;
 
 
-/* map xsvf tap state to an openocd "enum tap_state" */
+/* map xsvf tap state to an openocd "tap_state_t" */
 static tap_state_t xsvf_to_tap( int xsvf_state )
 {
        tap_state_t     ret;
@@ -185,7 +185,7 @@ static void xsvf_add_statemove(tap_state_t state)
        tap_state_t curstate = cmd_queue_cur_state;
        int i;
 
-       u8 move = TAP_MOVE(cmd_queue_cur_state, state);
+       u8 move = tap_get_tms_path(cmd_queue_cur_state, state);
 
        if (state != TAP_RESET  &&  state==cmd_queue_cur_state)
                return;
@@ -201,11 +201,11 @@ static void xsvf_add_statemove(tap_state_t state)
                int j = (move >> i) & 1;
                if (j)
                {
-                       curstate = tap_transitions[curstate].high;
+                       curstate = tap_state_transition(curstate, TRUE);
                }
                else
                {
-                       curstate = tap_transitions[curstate].low;
+                       curstate = tap_state_transition(curstate, FALSE);
                }
                moves[i] = curstate;
        }
@@ -257,7 +257,7 @@ static int xsvf_read_xstates(int fd, tap_state_t *path, int max_path, int *path_
 
                mystate = xsvf_to_tap(uc);
 
-               LOG_DEBUG("XSTATE %02X %s", uc, jtag_state_name(mystate) );
+               LOG_DEBUG("XSTATE %02X %s", uc, tap_state_name(mystate) );
 
                path[(*path_len)++] = mystate;
        }
@@ -581,7 +581,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                                        mystate = xsvf_to_tap(uc);
 
-                                       LOG_DEBUG("XSTATE 0x%02X %s", uc, jtag_state_name(mystate) );
+                                       LOG_DEBUG("XSTATE 0x%02X %s", uc, tap_state_name(mystate) );
 
                                        path = calloc(XSTATE_MAX_PATH, 4);
                                        path_len = 1;
@@ -631,14 +631,14 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        /* see page 22 of XSVF spec */
                                        mystate = uc == 1 ? TAP_IRPAUSE : TAP_IDLE;
 
-                                       LOG_DEBUG("XENDIR 0x%02X %s", uc, jtag_state_name(mystate));
+                                       LOG_DEBUG("XENDIR 0x%02X %s", uc, tap_state_name(mystate));
 
                                        /* assuming that the XRUNTEST comes from SVF RUNTEST, then only these states
                                         * should come here because the SVF spec only allows these with a RUNTEST
                                         */
                                        if (mystate != TAP_IRPAUSE && mystate != TAP_DRPAUSE && mystate != TAP_RESET && mystate != TAP_IDLE )
                                        {
-                                               LOG_ERROR("illegal XENDIR endstate: \"%s\"", jtag_state_name(mystate));
+                                               LOG_ERROR("illegal XENDIR endstate: \"%s\"", tap_state_name(mystate));
                                                unsupported = 1;
                                                break;
                                        }
@@ -659,11 +659,11 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        /* see page 22 of XSVF spec */
                                        mystate = uc == 1 ? TAP_DRPAUSE : TAP_IDLE;
 
-                                       LOG_DEBUG("XENDDR %02X %s", uc, jtag_state_name(mystate));
+                                       LOG_DEBUG("XENDDR %02X %s", uc, tap_state_name(mystate));
 
                                        if (mystate != TAP_IRPAUSE && mystate != TAP_DRPAUSE && mystate != TAP_RESET && mystate != TAP_IDLE )
                                        {
-                                               LOG_ERROR("illegal XENDDR endstate: \"%s\"", jtag_state_name( mystate ));
+                                               LOG_ERROR("illegal XENDDR endstate: \"%s\"", tap_state_name( mystate ));
                                                unsupported = 1;
                                                break;
                                        }
@@ -798,7 +798,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        end_state  = xsvf_to_tap(end);
                                        delay      = be_to_h_u32(delay_buf);
 
-                                       LOG_DEBUG("XWAIT %s %s usecs:%d", jtag_state_name(wait_state), jtag_state_name(end_state), delay);
+                                       LOG_DEBUG("XWAIT %s %s usecs:%d", tap_state_name(wait_state), tap_state_name(end_state), delay);
 
                                        if (runtest_requires_tck && wait_state == TAP_IDLE )
                                        {
@@ -844,8 +844,8 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        usecs       = be_to_h_u32(usecs_buf);
 
                                        LOG_DEBUG("XWAITSTATE %s %s clocks:%i usecs:%i",
-                                               jtag_state_name(wait_state),
-                                               jtag_state_name(end_state),
+                                               tap_state_name(wait_state),
+                                               tap_state_name(end_state),
                                                clock_count, usecs);
 
                                        /* the following states are 'stable', meaning that they have a transition
@@ -855,7 +855,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                         */
                                        if (wait_state != TAP_IRPAUSE && wait_state != TAP_DRPAUSE && wait_state != TAP_RESET && wait_state != TAP_IDLE)
                                        {
-                                               LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"", jtag_state_name( wait_state ));
+                                               LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"", tap_state_name( wait_state ));
                                                unsupported = 1;
                                        }
 
@@ -908,7 +908,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        loop_clocks = be_to_h_u32(clock_buf);
                                        loop_usecs  = be_to_h_u32(usecs_buf);
 
-                                       LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", jtag_state_name(loop_state), loop_clocks, loop_usecs);
+                                       LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", tap_state_name(loop_state), loop_clocks, loop_usecs);
                                }
                                break;
 
index bf2a12099f42dda152c1a24ca8cee419201ca63d..113e0a61a39fc736b164345fac918e83a9fef7e6 100644 (file)
@@ -704,6 +704,8 @@ try:
             nextTok()
             if tokVal != ';':
                 raise ParseError( tokLn, tokVal, "Expecting ';' after TRST trst_mode")
+            if doCOMMENTs:
+                writeComment( output, tokLn, 'TRST %s' % trst_mode )
             obuf = bytearray( 2 )
             obuf[0] = XTRST
             obuf[1] = trst_mode_allowed.index( trst_mode )  # use the index as the binary argument to XTRST opcode

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)