Remove whitespace at end of lines, step 2.
[openocd.git] / src / svf / svf.c
index 62599c64cfcd4dfd60a0d8cebf3f44d4325ad1fe..51edadaf575f8aa4c010bb7c537b1d0a2e6ad8e1 100644 (file)
@@ -90,6 +90,38 @@ const char *svf_trst_mode_name[4] =
        "ABSENT"
 };
 
+typedef struct
+{
+       tap_state_t from;
+       tap_state_t to;
+       uint32_t num_of_moves;
+       tap_state_t paths[8];
+}svf_statemove_t;
+
+svf_statemove_t svf_statemoves[] =
+{
+       // from                 to                              num_of_moves,   paths[8]
+//     {TAP_RESET,             TAP_RESET,              1,                              {TAP_RESET}},
+       {TAP_RESET,             TAP_IDLE,               2,                              {TAP_RESET, TAP_IDLE}},
+       {TAP_RESET,             TAP_DRPAUSE,    6,                              {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
+       {TAP_RESET,             TAP_IRPAUSE,    7,                              {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
+
+//     {TAP_IDLE,              TAP_RESET,              4,                              {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
+       {TAP_IDLE,              TAP_IDLE,               1,                              {TAP_IDLE}},
+       {TAP_IDLE,              TAP_DRPAUSE,    5,                              {TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
+       {TAP_IDLE,              TAP_IRPAUSE,    6,                              {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
+
+//     {TAP_DRPAUSE,   TAP_RESET,              6,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
+       {TAP_DRPAUSE,   TAP_IDLE,               4,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE}},
+       {TAP_DRPAUSE,   TAP_DRPAUSE,    7,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
+       {TAP_DRPAUSE,   TAP_IRPAUSE,    8,                              {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
+
+//     {TAP_IRPAUSE,   TAP_RESET,              6,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
+       {TAP_IRPAUSE,   TAP_IDLE,               4,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_IDLE}},
+       {TAP_IRPAUSE,   TAP_DRPAUSE,    7,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
+       {TAP_IRPAUSE,   TAP_IRPAUSE,    8,                              {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}}
+};
+
 char *svf_tap_state_name[TAP_NUM_STATES];
 
 #define XXR_TDI                                                (1 << 0)
@@ -100,10 +132,10 @@ typedef struct
 {
        int len;
        int data_mask;
-       u8 *tdi;
-       u8 *tdo;
-       u8 *mask;
-       u8 *smask;
+       uint8_t *tdi;
+       uint8_t *tdo;
+       uint8_t *mask;
+       uint8_t *smask;
 }svf_xxr_para_t;
 
 typedef struct
@@ -165,7 +197,7 @@ static int svf_check_tdo_para_index = 0;
 
 static int svf_read_command_from_file(int fd);
 static int svf_check_tdo(void);
-static int svf_add_check_para(u8 enabled, int buffer_offset, int bit_len);
+static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len);
 static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str);
 static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
@@ -175,10 +207,9 @@ static int svf_command_buffer_size = 0;
 static int svf_line_number = 1;
 
 static jtag_tap_t *tap = NULL;
-static tap_state_t last_state = TAP_RESET;
 
 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT  (4 * 1024)
-static u8 *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL;
+static uint8_t *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL;
 static int svf_buffer_index = 0, svf_buffer_size = 0;
 static int svf_quiet = 0;
 
@@ -220,7 +251,7 @@ void svf_free_xxd_para(svf_xxr_para_t *para)
 
 unsigned svf_get_mask_u32(int bitlen)
 {
-       u32 bitmask;
+       uint32_t bitmask;
 
        if (bitlen < 0)
        {
@@ -242,7 +273,7 @@ static const char* tap_state_svf_name(tap_state_t state)
 {
        const char* ret;
 
-       switch( state )
+       switch (state)
        {
        case TAP_RESET:         ret = "RESET";          break;
        case TAP_IDLE:          ret = "IDLE";           break;
@@ -266,6 +297,38 @@ static const char* tap_state_svf_name(tap_state_t state)
        return ret;
 }
 
+static int svf_add_statemove(tap_state_t state_to)
+{
+       tap_state_t state_from = cmd_queue_cur_state;
+       uint8_t index;
+
+       for (index = 0; index < dimof(svf_statemoves); index++)
+       {
+               if ((svf_statemoves[index].from == state_from)
+                       && (svf_statemoves[index].to == state_to))
+               {
+                       if (TAP_RESET == state_from)
+                       {
+                               jtag_add_tlr();
+                               if (svf_statemoves[index].num_of_moves > 1)
+                               {
+                                       jtag_add_pathmove(svf_statemoves[index].num_of_moves - 1, svf_statemoves[index].paths + 1);
+                               }
+                       }
+                       else
+                       {
+                               if (svf_statemoves[index].num_of_moves > 0)
+                               {
+                                       jtag_add_pathmove(svf_statemoves[index].num_of_moves, svf_statemoves[index].paths);
+                               }
+                       }
+                       return ERROR_OK;
+               }
+       }
+       LOG_ERROR("can not move to %s", tap_state_svf_name(state_to));
+       return ERROR_FAIL;
+}
+
 static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
 #define SVF_NUM_OF_OPTIONS                     1
@@ -327,21 +390,21 @@ static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char
        // in case current command cannot be commited, and next command is a bit scan command
        // here is 32K bits for this big scan command, it should be enough
        // buffer will be reallocated if buffer size is not enough
-       svf_tdi_buffer = (u8 *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
+       svf_tdi_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
        if (NULL == svf_tdi_buffer)
        {
                LOG_ERROR("not enough memory");
                ret = ERROR_FAIL;
                goto free_all;
        }
-       svf_tdo_buffer = (u8 *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
+       svf_tdo_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
        if (NULL == svf_tdo_buffer)
        {
                LOG_ERROR("not enough memory");
                ret = ERROR_FAIL;
                goto free_all;
        }
-       svf_mask_buffer = (u8 *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
+       svf_mask_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
        if (NULL == svf_mask_buffer)
        {
                LOG_ERROR("not enough memory");
@@ -355,10 +418,11 @@ static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char
        {
                svf_tap_state_name[i] = (char *)tap_state_svf_name(i);
        }
+
        // TAP_RESET
        jtag_add_tlr();
 
-       while ( ERROR_OK == svf_read_command_from_file(svf_fd) )
+       while (ERROR_OK == svf_read_command_from_file(svf_fd))
        {
                if (ERROR_OK != svf_run_command(cmd_ctx, svf_command_buffer))
                {
@@ -441,9 +505,9 @@ static int svf_read_command_from_file(int fd)
        char ch, *tmp_buffer = NULL;
        int cmd_pos = 0, cmd_ok = 0, slash = 0, comment = 0;
 
-       while (!cmd_ok && (read(fd, &ch, 1) > 0) )
+       while (!cmd_ok && (read(fd, &ch, 1) > 0))
        {
-               switch(ch)
+               switch (ch)
                {
                case '!':
                        slash = 0;
@@ -514,7 +578,7 @@ static int svf_parse_cmd_string(char *str, int len, char **argus, int *num_of_ar
 
        while (pos < len)
        {
-               switch(str[pos])
+               switch (str[pos])
                {
                case '\n':
                case '\r':
@@ -567,7 +631,7 @@ static int svf_find_string_in_array(char *str, char **strs, int num_of_element)
        return 0xFF;
 }
 
-static int svf_adjust_array_length(u8 **arr, int orig_bit_len, int new_bit_len)
+static int svf_adjust_array_length(uint8_t **arr, int orig_bit_len, int new_bit_len)
 {
        int new_byte_len = (new_bit_len + 7) >> 3;
 
@@ -578,7 +642,7 @@ static int svf_adjust_array_length(u8 **arr, int orig_bit_len, int new_bit_len)
                        free(*arr);
                        *arr = NULL;
                }
-               *arr = (u8*)malloc(new_byte_len);
+               *arr = (uint8_t*)malloc(new_byte_len);
                if (NULL == *arr)
                {
                        LOG_ERROR("not enough memory");
@@ -589,10 +653,10 @@ static int svf_adjust_array_length(u8 **arr, int orig_bit_len, int new_bit_len)
        return ERROR_OK;
 }
 
-static int svf_copy_hexstring_to_binary(char *str, u8 **bin, int orig_bit_len, int bit_len)
+static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_len, int bit_len)
 {
        int i, str_len = strlen(str), str_byte_len = (bit_len + 3) >> 2, loop_cnt;
-       u8 ch, need_write = 1;
+       uint8_t ch, need_write = 1;
 
        if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len))
        {
@@ -682,7 +746,7 @@ static int svf_check_tdo(void)
        {
                index = svf_check_tdo_para[i].buffer_offset;
                len = svf_check_tdo_para[i].bit_len;
-               if ((svf_check_tdo_para[i].enabled) 
+               if ((svf_check_tdo_para[i].enabled)
                        && buf_cmp_mask(&svf_tdi_buffer[index], &svf_tdo_buffer[index], &svf_mask_buffer[index], len))
                {
                        unsigned bitmask;
@@ -692,11 +756,11 @@ static int svf_check_tdo(void)
                        memcpy(&received, svf_tdi_buffer + index, sizeof(unsigned));
                        memcpy(&expected, svf_tdo_buffer + index, sizeof(unsigned));
                        memcpy(&tapmask, svf_mask_buffer + index, sizeof(unsigned));
-                       LOG_ERROR("tdo check error at line %d", 
+                       LOG_ERROR("tdo check error at line %d",
                                          svf_check_tdo_para[i].line_num);
-                       LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X", 
-                                         received & bitmask, 
-                                         expected & bitmask, 
+                       LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X",
+                                         received & bitmask,
+                                         expected & bitmask,
                                          tapmask & bitmask);
                        return ERROR_FAIL;
                }
@@ -706,7 +770,7 @@ static int svf_check_tdo(void)
        return ERROR_OK;
 }
 
-static int svf_add_check_para(u8 enabled, int buffer_offset, int bit_len)
+static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len)
 {
        if (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE)
        {
@@ -739,10 +803,6 @@ static int svf_execute_tap(void)
        return ERROR_OK;
 }
 
-// not good to use this
-extern void* cmd_queue_alloc(size_t size);
-extern void jtag_queue_command(jtag_command_t * cmd);
-
 static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
 {
        char *argus[256], command;
@@ -756,7 +816,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
        float min_time, max_time;
        // for XXR
        svf_xxr_para_t *xxr_para_tmp;
-       u8 **pbuffer_tmp;
+       uint8_t **pbuffer_tmp;
        scan_field_t field;
        // for STATE
        tap_state_t *path = NULL, state;
@@ -772,7 +832,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
        }
 
        command = svf_find_string_in_array(argus[0], (char **)svf_command_name, dimof(svf_command_name));
-       switch(command)
+       switch (command)
        {
        case ENDDR:
        case ENDIR:
@@ -951,10 +1011,10 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                LOG_ERROR("buffer is not enough, report to author");
                                return ERROR_FAIL;
 #else
-                               u8 *buffer_tmp;
+                               uint8_t *buffer_tmp;
 
                                // reallocate buffer
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -965,7 +1025,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                free(svf_tdi_buffer);
                                svf_tdi_buffer = buffer_tmp;
 
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -976,7 +1036,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                free(svf_tdo_buffer);
                                svf_tdo_buffer = buffer_tmp;
 
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -1030,16 +1090,10 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                        field.tap = tap;
                        field.num_bits = i;
                        field.out_value = &svf_tdi_buffer[svf_buffer_index];
-                       
                        field.in_value = &svf_tdi_buffer[svf_buffer_index];
-                       
-                       
-                       
-                       
                        jtag_add_plain_dr_scan(1, &field, svf_para.dr_end_state);
 
                        svf_buffer_index += (i + 7) >> 3;
-                       last_state = svf_para.dr_end_state;
                }
                else if (SIR == command)
                {
@@ -1052,10 +1106,10 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                LOG_ERROR("buffer is not enough, report to author");
                                return ERROR_FAIL;
 #else
-                               u8 *buffer_tmp;
+                               uint8_t *buffer_tmp;
 
                                // reallocate buffer
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -1066,7 +1120,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                free(svf_tdi_buffer);
                                svf_tdi_buffer = buffer_tmp;
 
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -1077,7 +1131,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                free(svf_tdo_buffer);
                                svf_tdo_buffer = buffer_tmp;
 
-                               buffer_tmp = (u8 *)malloc(svf_buffer_index + ((i + 7) >> 3));
+                               buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
                                if (NULL == buffer_tmp)
                                {
                                        LOG_ERROR("not enough memory");
@@ -1131,16 +1185,10 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                        field.tap = tap;
                        field.num_bits = i;
                        field.out_value = &svf_tdi_buffer[svf_buffer_index];
-                       
                        field.in_value = &svf_tdi_buffer[svf_buffer_index];
-                       
-                       
-                       
-                       
                        jtag_add_plain_ir_scan(1, &field, svf_para.ir_end_state);
 
                        svf_buffer_index += (i + 7) >> 3;
-                       last_state = svf_para.ir_end_state;
                }
                break;
        case PIO:
@@ -1240,35 +1288,19 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                // TODO: do runtest
 #if 1
                                // enter into run_state if necessary
-                               if (last_state != svf_para.runtest_run_state)
+                               if (cmd_queue_cur_state != svf_para.runtest_run_state)
                                {
-                                       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
-                                       
-                                       jtag_queue_command(cmd);
-                               
-                                       cmd->type = JTAG_STATEMOVE;
-                                       cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
-                                       cmd->cmd.statemove->end_state = svf_para.runtest_run_state;
-
-                                       cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
+                                       svf_add_statemove(svf_para.runtest_run_state);
                                }
 
                                // call jtag_add_clocks
                                jtag_add_clocks(run_count);
 
+                               // move to end_state if necessary
                                if (svf_para.runtest_end_state != svf_para.runtest_run_state)
                                {
-                                       // move to end_state
-                                       jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
-                                       
-                                       jtag_queue_command(cmd);
-                                       cmd->type = JTAG_STATEMOVE;
-                                       cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
-                                       cmd->cmd.statemove->end_state = svf_para.runtest_end_state;
-
-                                       cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
+                                       svf_add_statemove(svf_para.runtest_end_state);
                                }
-                               last_state = svf_para.runtest_end_state;
 #else
                                if (svf_para.runtest_run_state != TAP_IDLE)
                                {
@@ -1332,7 +1364,6 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                                        // last state MUST be stable state
                                        // TODO: call path_move
                                        jtag_add_pathmove(num_of_argu, path);
-                                       last_state = path[num_of_argu - 1];
                                        LOG_DEBUG("\tmove to %s by path_move", svf_tap_state_name[path[num_of_argu - 1]]);
                                }
                                else
@@ -1355,18 +1386,9 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                        if (svf_tap_state_is_stable(state))
                        {
                                // TODO: move to state
-                               jtag_command_t * cmd = cmd_queue_alloc(sizeof(jtag_command_t));
-                                       
-                               jtag_queue_command(cmd);
-                               
-                               cmd->type = JTAG_STATEMOVE;
-                               cmd->cmd.statemove = cmd_queue_alloc(sizeof(statemove_command_t));
-                               cmd->cmd.statemove->end_state = state;
-
-                               cmd_queue_end_state = cmd_queue_cur_state = cmd->cmd.statemove->end_state;
-                               last_state = state;
-
-                               LOG_DEBUG("\tmove to %s by state_move", svf_tap_state_name[state]);
+                               svf_add_statemove(state);
+
+                               LOG_DEBUG("\tmove to %s by svf_add_statemove", svf_tap_state_name[state]);
                        }
                        else
                        {
@@ -1392,7 +1414,6 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
                        switch (i_tmp)
                        {
                        case TRST_ON:
-                               last_state = TAP_RESET;
                                jtag_add_reset(1, 0);
                                break;
                        case TRST_Z:

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)