- Replace 'if(' with 'if ('.
[fw/openocd] / src / xsvf / xsvf.c
index b62de349d5d68466c29e2ba1e879ffffd8bb3e68..6356843989307739932b45fd4fb571a80c17e457 100644 (file)
@@ -44,8 +44,6 @@
 #include "xsvf.h"
 #include "jtag.h"
 
-#include <assert.h>
-
 
 /* XSVF commands, from appendix B of xapp503.pdf  */
 #define XCOMPLETE              0x00
@@ -162,91 +160,6 @@ static tap_state_t xsvf_to_tap( int xsvf_state )
 }
 
 
-/**
- * Function xsvf_add_statemove
- * moves from the current state to the goal \a state. This needs
- * to be handled according to the xsvf spec, see the XSTATE command
- * description.
- */
-static int xsvf_add_statemove(tap_state_t goal_state)
-{
-       int retval = ERROR_OK;
-
-       tap_state_t moves[8];
-       tap_state_t cur_state = cmd_queue_cur_state;
-       int i;
-       int tms_bits;
-       int     tms_count;
-
-       LOG_DEBUG( "cur_state=%s goal_state=%s",
-               tap_state_name(cur_state),
-               tap_state_name(goal_state) );
-
-
-       /*      From the XSVF spec, pertaining to XSTATE:
-
-               For special states known as stable states (Test-Logic-Reset,
-               Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows
-               predefined TAP state paths when the starting state is a stable state and
-               when the XSTATE specifies a new stable state (see the STATE command in
-               the [Ref 5] for the TAP state paths between stable states). For
-               non-stable states, XSTATE should specify a state that is only one TAP
-               state transition distance from the current TAP state to avoid undefined
-               TAP state paths. A sequence of multiple XSTATE commands can be issued to
-               transition the TAP through a specific state path.
-       */
-
-       if (goal_state==cur_state )
-               ;       /* nothing to do */
-
-       else if( goal_state==TAP_RESET )
-       {
-               jtag_add_tlr();
-       }
-
-       else if( tap_is_state_stable(cur_state) && tap_is_state_stable(goal_state) )
-       {
-               /*      note: unless tms_bits holds a path that agrees with [Ref 5] in above
-                       spec, then this code is not fully conformant to the xsvf spec.  This
-                       puts a burden on tap_get_tms_path() function from the xsvf spec.
-                       If in doubt, you should confirm that that burden is being met.
-               */
-
-               tms_bits  = tap_get_tms_path(cur_state, goal_state);
-               tms_count = tap_get_tms_path_len(cur_state, goal_state);
-
-               assert( (unsigned) tms_count < DIM(moves) );
-
-               for (i=0;   i<tms_count;   i++, tms_bits>>=1)
-               {
-                       bool bit = tms_bits & 1;
-
-                       cur_state = tap_state_transition(cur_state, bit);
-                       moves[i] = cur_state;
-               }
-
-               jtag_add_pathmove(tms_count, moves);
-       }
-
-       /*      else state must be immediately reachable in one clock cycle, and does not
-               need to be a stable state.
-       */
-       else if( tap_state_transition(cur_state, true)  == goal_state
-               ||   tap_state_transition(cur_state, false) == goal_state )
-       {
-               /* move a single state */
-               moves[0] = goal_state;
-               jtag_add_pathmove( 1, moves );
-       }
-
-       else
-       {
-               retval = ERROR_FAIL;
-       }
-
-       return retval;
-}
-
 
 int xsvf_register_commands(struct command_context_s *cmd_ctx)
 {
@@ -256,7 +169,7 @@ int xsvf_register_commands(struct command_context_s *cmd_ctx)
        return ERROR_OK;
 }
 
-static int xsvf_read_buffer(int num_bits, int fd, u8* buf)
+static int xsvf_read_buffer(int num_bits, int fd, uint8_t* buf)
 {
        int num_bytes;
 
@@ -273,9 +186,9 @@ static int xsvf_read_buffer(int num_bits, int fd, u8* buf)
 
 static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
-       u8 *dr_out_buf = NULL;                          /* from host to device (TDI) */
-       u8 *dr_in_buf = NULL;                           /* from device to host (TDO) */
-       u8 *dr_in_mask = NULL;
+       uint8_t *dr_out_buf = NULL;                             /* from host to device (TDI) */
+       uint8_t *dr_in_buf = NULL;                              /* from device to host (TDO) */
+       uint8_t *dr_in_mask = NULL;
 
        int xsdrsize = 0;
        int xruntest = 0;                                       /* number of TCK cycles OR microseconds */
@@ -284,8 +197,8 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
        tap_state_t     xendir = TAP_IDLE;              /* see page 8 of the SVF spec, initial xendir to be TAP_IDLE */
        tap_state_t xenddr = TAP_IDLE;
 
-       u8              opcode;
-       u8              uc;
+       uint8_t                 opcode;
+       uint8_t         uc;
        long            file_offset = 0;
 
        int             loop_count = 0;
@@ -319,7 +232,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
        if (strcmp(args[0], "plain") != 0)
        {
-               tap = jtag_TapByString( args[0] );
+               tap = jtag_tap_by_string( args[0] );
                if (!tap )
                {
                        command_print( cmd_ctx, "Tap: %s unknown", args[0] );
@@ -374,7 +287,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                case XRUNTEST:
                        {
-                               u8      xruntest_buf[4];
+                               uint8_t xruntest_buf[4];
 
                                if (read(xsvf_fd, xruntest_buf, 4) < 0)
                                {
@@ -389,7 +302,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                case XREPEAT:
                        {
-                               u8 myrepeat;
+                               uint8_t myrepeat;
 
                                if (read(xsvf_fd, &myrepeat, 1) < 0)
                                        do_abort = 1;
@@ -403,7 +316,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                case XSDRSIZE:
                        {
-                               u8      xsdrsize_buf[4];
+                               uint8_t xsdrsize_buf[4];
 
                                if (read(xsvf_fd, xsdrsize_buf, 4) < 0)
                                {
@@ -414,9 +327,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                xsdrsize = be_to_h_u32(xsdrsize_buf);
                                LOG_DEBUG("XSDRSIZE %d", xsdrsize);
 
-                               if( dr_out_buf ) free(dr_out_buf);
-                               if( dr_in_buf)   free(dr_in_buf);
-                               if( dr_in_mask)  free(dr_in_mask);
+                               if ( dr_out_buf ) free(dr_out_buf);
+                               if ( dr_in_buf)   free(dr_in_buf);
+                               if ( dr_in_mask)  free(dr_in_mask);
 
                                dr_out_buf = malloc((xsdrsize + 7) / 8);
                                dr_in_buf = malloc((xsdrsize + 7) / 8);
@@ -441,7 +354,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                                if (opcode == XSDRTDO)
                                {
-                                       if(xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf)  != ERROR_OK )
+                                       if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf)  != ERROR_OK )
                                        {
                                                do_abort = 1;
                                                break;
@@ -457,7 +370,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                {
                                        scan_field_t field;
 
-                                       if( attempt>0 )
+                                       if ( attempt>0 )
                                        {
                                                /* perform the XC9500 exception handling sequence shown in xapp067.pdf and
                                                   illustrated in psuedo code at end of this file.  We start from state
@@ -492,9 +405,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        field.in_value = calloc(CEIL(field.num_bits, 8), 1);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE);
+                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
                                        else
-                                               jtag_add_dr_scan(1, &field, TAP_DRPAUSE);
+                                               jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -520,7 +433,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                /* See page 19 of XSVF spec regarding opcode "XSDR" */
                                if (xruntest)
                                {
-                                       xsvf_add_statemove(TAP_IDLE);
+                                       jtag_add_statemove(TAP_IDLE);
 
                                        if (runtest_requires_tck)
                                                jtag_add_clocks(xruntest);
@@ -528,7 +441,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                                jtag_add_sleep(xruntest);
                                }
                                else if (xendir != TAP_DRPAUSE) /* we are already in TAP_DRPAUSE */
-                                       xsvf_add_statemove(xenddr);
+                                       jtag_add_statemove(xenddr);
                        }
                        break;
 
@@ -575,7 +488,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                case XSTATE:
                        {
                                tap_state_t     mystate;
-                               u8                      uc;
+                               uint8_t                 uc;
 
                                if (read(xsvf_fd, &uc, 1) < 0)
                                {
@@ -592,7 +505,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        the XSTATE.
                                */
 
-                               if( xsvf_add_statemove( mystate ) != ERROR_OK )
+                               if ( jtag_add_statemove( mystate ) != ERROR_OK )
                                {
                                        /*      For special states known as stable states
                                                (Test-Logic-Reset, Run-Test/Idle, Pause-DR, Pause- IR),
@@ -625,9 +538,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                        }
 
                        /* see page 22 of XSVF spec */
-                       if( uc == 0 )
+                       if ( uc == 0 )
                                xendir = TAP_IDLE;
-                       else if( uc == 1 )
+                       else if ( uc == 1 )
                                xendir = TAP_IRPAUSE;
                        else
                        {
@@ -648,9 +561,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                        }
 
                        /* see page 22 of XSVF spec */
-                       if( uc == 0 )
+                       if ( uc == 0 )
                                xenddr = TAP_IDLE;
-                       else if( uc == 1 )
+                       else if ( uc == 1 )
                                xenddr = TAP_DRPAUSE;
                        else
                        {
@@ -665,12 +578,12 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                case XSIR:
                case XSIR2:
                        {
-                               u8      short_buf[2];
-                               u8*     ir_buf;
+                               uint8_t short_buf[2];
+                               uint8_t*        ir_buf;
                                int bitcount;
                                tap_state_t my_end_state = xruntest ? TAP_IDLE : xendir;
 
-                               if( opcode == XSIR )
+                               if ( opcode == XSIR )
                                {
                                        /* one byte bitcount */
                                        if (read(xsvf_fd, short_buf, 1) < 0)
@@ -729,7 +642,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                                        /* LOG_DEBUG("FLUSHING QUEUE"); */
                                        result = jtag_execute_queue();
-                                       if(result != ERROR_OK)
+                                       if (result != ERROR_OK)
                                        {
                                                tdo_mismatch = 1;
                                        }
@@ -765,12 +678,12 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                case XWAIT:
                        {
                                /* expected in stream:
-                                  XWAIT <u8 wait_state> <u8 end_state> <u32 usecs>
+                                  XWAIT <uint8_t wait_state> <uint8_t end_state> <uint32_t usecs>
                                */
 
-                               u8      wait;
-                               u8      end;
-                               u8      delay_buf[4];
+                               uint8_t wait;
+                               uint8_t end;
+                               uint8_t delay_buf[4];
 
                                tap_state_t wait_state;
                                tap_state_t end_state;
@@ -796,9 +709,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                }
                                else
                                {
-                                       xsvf_add_statemove( wait_state );
+                                       jtag_add_statemove( wait_state );
                                        jtag_add_sleep(delay);
-                                       xsvf_add_statemove( end_state );
+                                       jtag_add_statemove( end_state );
                                }
                        }
                        break;
@@ -806,13 +719,13 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                case XWAITSTATE:
                        {
                                /* expected in stream:
-                                  XWAITSTATE <u8 wait_state> <u8 end_state> <u32 clock_count> <u32 usecs>
+                                  XWAITSTATE <uint8_t wait_state> <uint8_t end_state> <uint32_t clock_count> <uint32_t usecs>
                                */
 
-                               u8  clock_buf[4];
-                               u8      usecs_buf[4];
-                               u8      wait;
-                               u8      end;
+                               uint8_t  clock_buf[4];
+                               uint8_t         usecs_buf[4];
+                               uint8_t wait;
+                               uint8_t end;
                                tap_state_t wait_state;
                                tap_state_t end_state;
                                int clock_count;
@@ -849,22 +762,22 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                        unsupported = 1;
                                }
 
-                               xsvf_add_statemove( wait_state );
+                               jtag_add_statemove( wait_state );
 
                                jtag_add_clocks( clock_count );
 
                                jtag_add_sleep( usecs );
 
-                               xsvf_add_statemove( end_state );
+                               jtag_add_statemove( end_state );
                        }
                        break;
 
                case LCOUNT:
                        {
                                /* expected in stream:
-                                  LCOUNT <u32 loop_count>
+                                  LCOUNT <uint32_t loop_count>
                                */
-                               u8  count_buf[4];
+                               uint8_t  count_buf[4];
 
                                if ( read(xsvf_fd, count_buf, 4) < 0 )
                                {
@@ -880,11 +793,11 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                case LDELAY:
                        {
                                /* expected in stream:
-                                  LDELAY <u8 wait_state> <u32 clock_count> <u32 usecs_to_sleep>
+                                  LDELAY <uint8_t wait_state> <uint32_t clock_count> <uint32_t usecs_to_sleep>
                                */
-                               u8      state;
-                               u8  clock_buf[4];
-                               u8  usecs_buf[4];
+                               uint8_t state;
+                               uint8_t  clock_buf[4];
+                               uint8_t  usecs_buf[4];
 
                                if ( read(xsvf_fd, &state, 1) < 0
                                  || read(xsvf_fd, clock_buf, 4) < 0
@@ -927,7 +840,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                {
                                        scan_field_t field;
 
-                                       xsvf_add_statemove( loop_state );
+                                       jtag_add_statemove( loop_state );
                                        jtag_add_clocks(loop_clocks);
                                        jtag_add_sleep(loop_usecs);
 
@@ -940,9 +853,9 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                                                LOG_USER("LSDR retry %d", attempt);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE);
+                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
                                        else
-                                               jtag_add_dr_scan(1, &field, TAP_DRPAUSE);
+                                               jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -951,7 +864,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                                        /* LOG_DEBUG("FLUSHING QUEUE"); */
                                        result = jtag_execute_queue();
-                                       if(result == ERROR_OK)
+                                       if (result == ERROR_OK)
                                        {
                                                matched = 1;
                                                break;
@@ -969,7 +882,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
                case XTRST:
                        {
-                               u8      trst_mode;
+                               uint8_t trst_mode;
 
                                if (read(xsvf_fd, &trst_mode, 1) < 0)
                                {
@@ -1005,7 +918,7 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
                        LOG_DEBUG("xsvf failed, setting taps to reasonable state");
 
                        /* upon error, return the TAPs to a reasonable state */
-                       xsvf_add_statemove( TAP_IDLE );
+                       jtag_add_statemove( TAP_IDLE );
                        jtag_execute_queue();
                        break;
                }
@@ -1022,9 +935,10 @@ static int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, cha
 
        if (unsupported)
        {
+               off_t offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
                command_print(cmd_ctx,
-                        "unsupported xsvf command: 0x%02X in xsvf file at offset %ld, aborting",
-                                         uc,  lseek(xsvf_fd, 0, SEEK_CUR)-1 );
+                               "unsupported xsvf command (0x%02X) at offset %jd, aborting",
+                               uc, (intmax_t)offset);
                return ERROR_FAIL;
        }