X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fsvf%2Fsvf.c;h=16495ac140d1f92ea862bf65037afafca101cb06;hb=bf5f21e39a6c04c3845dc61becc90d8602546290;hp=609830fe613e8a450a06c578942254f0aa3c3aea;hpb=c18947b947064e7eceed8047c42d4c8dfd8ae964;p=openocd.git diff --git a/src/svf/svf.c b/src/svf/svf.c index 609830fe61..16495ac140 100644 --- a/src/svf/svf.c +++ b/src/svf/svf.c @@ -94,28 +94,28 @@ typedef struct { tap_state_t from; tap_state_t to; - u32 num_of_moves; + uint32_t num_of_moves; tap_state_t paths[8]; }svf_statemove_t; -svf_statemove_t svf_statemoves[] = +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}}, @@ -251,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) { @@ -273,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; @@ -304,7 +304,7 @@ static int svf_add_statemove(tap_state_t state_to) for (index = 0; index < dimof(svf_statemoves); index++) { - if ((svf_statemoves[index].from == state_from) + if ((svf_statemoves[index].from == state_from) && (svf_statemoves[index].to == state_to)) { if (TAP_RESET == state_from) @@ -422,7 +422,7 @@ static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char // 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)) { @@ -505,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; @@ -578,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': @@ -655,8 +655,8 @@ static int svf_adjust_array_length(uint8_t **arr, int orig_bit_len, int new_bit_ 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; - uint8_t ch, need_write = 1; + int i, str_len = strlen(str), str_hbyte_len = (bit_len + 3) >> 2; + uint8_t ch; if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len)) { @@ -664,75 +664,54 @@ static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_l return ERROR_FAIL; } - if (str_byte_len > str_len) - { - loop_cnt = str_byte_len; - } - else - { - loop_cnt = str_len; - } - - for (i = 0; i < loop_cnt; i++) + for (i = 0; i < str_hbyte_len; i++) { - if (i < str_len) + ch = 0; + while (str_len > 0) { - ch = str[str_len - i - 1]; - if ((ch >= '0') && (ch <= '9')) - { - ch = ch - '0'; - } - else if ((ch >= 'A') && (ch <= 'F')) - { - ch = ch - 'A' + 10; - } - else + ch = str[--str_len]; + + if (!isblank(ch)) { - LOG_ERROR("invalid hex string"); - return ERROR_FAIL; + if ((ch >= '0') && (ch <= '9')) + { + ch = ch - '0'; + break; + } + else if ((ch >= 'A') && (ch <= 'F')) + { + ch = ch - 'A' + 10; + break; + } + else + { + LOG_ERROR("invalid hex string"); + return ERROR_FAIL; + } } - } - else - { + ch = 0; } - // check valid - if (i >= str_byte_len) + // write bin + if (i % 2) { - // all data written, other data should be all '0's and needn't to be written - need_write = 0; - if (ch != 0) - { - LOG_ERROR("value execede length"); - return ERROR_FAIL; - } + // MSB + (*bin)[i / 2] |= ch << 4; } - else if (i == (str_byte_len - 1)) + else { - // last data byte, written if valid - if ((ch & ~((1 << (bit_len - 4 * i)) - 1)) != 0) - { - LOG_ERROR("value execede length"); - return ERROR_FAIL; - } + // LSB + (*bin)[i / 2] = 0; + (*bin)[i / 2] |= ch; } + } - if (need_write) - { - // write bin - if (i % 2) - { - // MSB - (*bin)[i / 2] |= ch << 4; - } - else - { - // LSB - (*bin)[i / 2] = 0; - (*bin)[i / 2] |= ch; - } - } + // check valid + if (str_len > 0 || (ch & ~((1 << (4 - (bit_len % 4))) - 1)) != 0) + { + LOG_ERROR("value execede length"); + return ERROR_FAIL; } return ERROR_OK; @@ -746,7 +725,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; @@ -756,11 +735,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; } @@ -832,7 +811,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: @@ -1343,6 +1322,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str) if (!svf_tap_state_is_valid(path[i])) { LOG_ERROR("%s is not valid state", svf_tap_state_name[path[i]]); + free(path); return ERROR_FAIL; } if (TAP_RESET == path[i]) @@ -1369,6 +1349,7 @@ static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str) else { LOG_ERROR("%s is not valid state", svf_tap_state_name[path[num_of_argu - 1]]); + free(path); return ERROR_FAIL; } }