Note: If using tap_state_by_name, it MUST be totally compatible with the SVF specification(previous version is not match, so I add a private version). Otherwise, a change to the global name of state will affact svf implementation.
2009/10/23 David Brownell <[email protected]> > - Use the name mappings all the other code uses: > + name-to-state ... needed to add one special case > + state-to-name > - Improve various diagnostics: > + don't complain about a "valid" state when the issue > is actually that it must be "stable" > + say which command was affected > - Misc: > + make more private data and code be static > + use public DIM() not private dimof() > + shorten the affected lines > > Re the mappings, this means we're more generous in inputs we > accept, since case won't matter. Also our output diagnostics > will be a smidgeon more informative, saying "RUN/IDLE" not > just "IDLE" (emphasizing that there can be side effects). > --- > committed this ... > > TODO | 1 > src/jtag/interface.c | 4 + > src/jtag/interface.h | 3 - > src/jtag/jtag.h | 5 + > src/svf/svf.c | 135 > +++++++++++++++++++++---------------------------- > 5 files changed, 68 insertions(+), 80 deletions(-) > > --- a/TODO > +++ b/TODO > @@ -46,7 +46,6 @@ This section list issues that need to be > The following tasks have been suggested for cleaning up the JTAG layer: > > - use tap_set_state everywhere to allow logging TAP state transitions > -- rename other tap_states to use standard JTAG names (suggested by ML) > - Encapsulate cmd_queue_cur_state and related varaible handling. > - add slick 32 bit versions of jtag_add_xxx_scan() that avoids > buf_set_u32() calls and other evidence of poor impedance match between > --- a/src/jtag/interface.c > +++ b/src/jtag/interface.c > @@ -365,6 +365,10 @@ tap_state_t tap_state_by_name(const char > { > tap_state_t x; > > + /* standard SVF name is "IDLE" */ > + if (0 == strcasecmp(name, "IDLE")) > + return TAP_IDLE; > + > for (x = 0 ; x < TAP_NUM_STATES ; x++) { > /* be nice to the human */ > if (0 == strcasecmp(name, tap_state_name(x))) { > --- a/src/jtag/interface.h > +++ b/src/jtag/interface.h > @@ -160,9 +160,6 @@ bool tap_is_state_stable(tap_state_t ast > */ > tap_state_t tap_state_transition(tap_state_t current_state, bool tms); > > -/// Provides user-friendly name lookup of TAP states. > -tap_state_t tap_state_by_name(const char *name); > - > /// Allow switching between old and new TMS tables. @see tap_get_tms_path > void tap_use_new_tms_table(bool use_new); > /// @returns True if new TMS table is active; false otherwise. > --- a/src/jtag/jtag.h > +++ b/src/jtag/jtag.h > @@ -102,7 +102,10 @@ typedef enum tap_state > * Function tap_state_name > * Returns a string suitable for display representing the JTAG tap_state > */ > -const char* tap_state_name(tap_state_t state); > +const char *tap_state_name(tap_state_t state); > + > +/// Provides user-friendly name lookup of TAP states. > +tap_state_t tap_state_by_name(const char *name); > > /// The current TAP state of the pending JTAG command queue. > extern tap_state_t cmd_queue_cur_state; > --- a/src/svf/svf.c > +++ b/src/svf/svf.c > @@ -55,7 +55,7 @@ typedef enum > TRST, > }svf_command_t; > > -const char *svf_command_name[14] = > +static const char *svf_command_name[14] = > { > "ENDDR", > "ENDIR", > @@ -81,7 +81,7 @@ typedef enum > TRST_ABSENT > }trst_mode_t; > > -const char *svf_trst_mode_name[4] = > +static const char *svf_trst_mode_name[4] = > { > "ON", > "OFF", > @@ -136,7 +136,6 @@ static const svf_statemove_t svf_statemo > {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) > #define XXR_TDO (1 << 1) > @@ -169,8 +168,8 @@ typedef struct > svf_xxr_para_t sdr_para; > }svf_para_t; > > -svf_para_t svf_para; > -const svf_para_t svf_para_init = > +static svf_para_t svf_para; > +static 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, > @@ -207,8 +206,6 @@ typedef struct > static svf_check_tdo_para_t *svf_check_tdo_para = NULL; > static int svf_check_tdo_para_index = 0; > > -#define dimof(a) (sizeof(a) / > sizeof((a)[0])) > - > static int svf_read_command_from_file(int fd); > static int svf_check_tdo(void); > static int svf_add_check_para(uint8_t enabled, int buffer_offset, int > bit_len); > @@ -236,7 +233,7 @@ int svf_register_commands(struct command > return ERROR_OK; > } > > -void svf_free_xxd_para(svf_xxr_para_t *para) > +static void svf_free_xxd_para(svf_xxr_para_t *para) > { > if (NULL != para) > { > @@ -263,7 +260,7 @@ void svf_free_xxd_para(svf_xxr_para_t *p > } > } > > -unsigned svf_get_mask_u32(int bitlen) > +static unsigned svf_get_mask_u32(int bitlen) > { > uint32_t bitmask; > > @@ -283,34 +280,6 @@ unsigned svf_get_mask_u32(int bitlen) > return bitmask; > } > > -static const char* tap_state_svf_name(tap_state_t state) > -{ > - const char* ret; > - > - switch (state) > - { > - case TAP_RESET: ret = "RESET"; break; > - case TAP_IDLE: ret = "IDLE"; break; > - case TAP_DRSELECT: ret = "DRSELECT"; break; > - case TAP_DRCAPTURE: ret = "DRCAPTURE"; break; > - case TAP_DRSHIFT: ret = "DRSHIFT"; break; > - case TAP_DREXIT1: ret = "DREXIT1"; break; > - case TAP_DRPAUSE: ret = "DRPAUSE"; break; > - case TAP_DREXIT2: ret = "DREXIT2"; break; > - case TAP_DRUPDATE: ret = "DRUPDATE"; break; > - case TAP_IRSELECT: ret = "IRSELECT"; break; > - case TAP_IRCAPTURE: ret = "IRCAPTURE"; break; > - case TAP_IRSHIFT: ret = "IRSHIFT"; break; > - case TAP_IREXIT1: ret = "IREXIT1"; break; > - case TAP_IRPAUSE: ret = "IRPAUSE"; break; > - case TAP_IREXIT2: ret = "IREXIT2"; break; > - case TAP_IRUPDATE: ret = "IRUPDATE"; break; > - default: ret = "???"; break; > - } > - > - return ret; > -} > - > int svf_add_statemove(tap_state_t state_to) > { > tap_state_t state_from = cmd_queue_cur_state; > @@ -322,7 +291,7 @@ int svf_add_statemove(tap_state_t state_ > return ERROR_OK; > } > > - for (index = 0; index < dimof(svf_statemoves); index++) > + for (index = 0; index < DIM(svf_statemoves); index++) > { > if ((svf_statemoves[index].from == state_from) > && (svf_statemoves[index].to == state_to)) > @@ -337,7 +306,7 @@ int svf_add_statemove(tap_state_t state_ > return ERROR_OK; > } > } > - LOG_ERROR("SVF: can not move to %s", tap_state_svf_name(state_to)); > + LOG_ERROR("SVF: can not move to %s", tap_state_name(state_to)); > return ERROR_FAIL; > } > > @@ -426,10 +395,6 @@ static int handle_svf_command(struct com > svf_buffer_size = 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT; > > memcpy(&svf_para, &svf_para_init, sizeof(svf_para)); > - for (i = 0; i < (int)dimof(svf_tap_state_name); i++) > - { > - svf_tap_state_name[i] = (char *)tap_state_svf_name(i); > - } > > // TAP_RESET > jtag_add_tlr(); > @@ -625,11 +590,6 @@ bool svf_tap_state_is_stable(tap_state_t > || (TAP_DRPAUSE == state) || (TAP_IRPAUSE == state); > } > > -static int svf_tap_state_is_valid(tap_state_t state) > -{ > - return state >= 0 && state < TAP_NUM_STATES; > -} > - > static int svf_find_string_in_array(char *str, char **strs, int > num_of_element) > { > int i; > @@ -823,7 +783,12 @@ static int svf_run_command(struct comman > return ERROR_FAIL; > } > > - command = svf_find_string_in_array(argus[0], (char > **)svf_command_name, dimof(svf_command_name)); > + /* NOTE: we're a bit loose here, because we ignore case in > + * TAP state names (instead of insisting on uppercase). > + */ > + > + command = svf_find_string_in_array(argus[0], > + (char **)svf_command_name, DIM(svf_command_name)); > switch (command) > { > case ENDDR: > @@ -833,23 +798,28 @@ static int svf_run_command(struct comman > LOG_ERROR("invalid parameter of %s", argus[0]); > return ERROR_FAIL; > } > - i_tmp = svf_find_string_in_array(argus[1], (char > **)svf_tap_state_name, dimof(svf_tap_state_name)); > + > + i_tmp = tap_state_by_name(argus[1]); > + > if (svf_tap_state_is_stable(i_tmp)) > { > if (command == ENDIR) > { > svf_para.ir_end_state = i_tmp; > - LOG_DEBUG("\tir_end_state = %s", > svf_tap_state_name[svf_para.ir_end_state]); > + LOG_DEBUG("\tIR end_state = %s", > + tap_state_name(i_tmp)); > } > else > { > svf_para.dr_end_state = i_tmp; > - LOG_DEBUG("\tdr_end_state = %s", > svf_tap_state_name[svf_para.dr_end_state]); > + LOG_DEBUG("\tDR end_state = %s", > + tap_state_name(i_tmp)); > } > } > else > { > - LOG_ERROR("%s is not valid state", argus[1]); > + LOG_ERROR("%s: %s is not a stable state", > + argus[0], argus[1]); > return ERROR_FAIL; > } > break; > @@ -1203,25 +1173,31 @@ static int svf_run_command(struct comman > min_time = 0; > max_time = 0; > i = 1; > + > // run_state > - i_tmp = svf_find_string_in_array(argus[i], (char > **)svf_tap_state_name, dimof(svf_tap_state_name)); > - if (svf_tap_state_is_valid(i_tmp)) > + i_tmp = tap_state_by_name(argus[i]); > + if (i_tmp != TAP_INVALID) > { > if (svf_tap_state_is_stable(i_tmp)) > { > svf_para.runtest_run_state = i_tmp; > > - // When a run_state is specified, the new > run_state becomes the default end_state > + /* When a run_state is specified, the new > + * run_state becomes the default end_state. > + */ > svf_para.runtest_end_state = i_tmp; > - LOG_DEBUG("\trun_state = %s", > svf_tap_state_name[svf_para.runtest_run_state]); > + LOG_DEBUG("\trun_state = %s", > + tap_state_name(i_tmp)); > i++; > } > else > { > - LOG_ERROR("%s is not valid state", > svf_tap_state_name[i_tmp]); > + LOG_ERROR("%s: %s is not a stable state", > + argus[0], tap_state_name(i_tmp)); > return ERROR_FAIL; > } > } > + > // run_count run_clk > if (((i + 2) <= num_of_argu) && strcmp(argus[i + 1], "SEC")) > { > @@ -1255,15 +1231,18 @@ static int svf_run_command(struct comman > // ENDSTATE end_state > if (((i + 2) <= num_of_argu) && !strcmp(argus[i], > "ENDSTATE")) > { > - i_tmp = svf_find_string_in_array(argus[i + 1], > (char **)svf_tap_state_name, dimof(svf_tap_state_name)); > + i_tmp = tap_state_by_name(argus[i + 1]); > + > if (svf_tap_state_is_stable(i_tmp)) > { > svf_para.runtest_end_state = i_tmp; > - LOG_DEBUG("\tend_state = %s", > svf_tap_state_name[svf_para.runtest_end_state]); > + LOG_DEBUG("\tend_state = %s", > + tap_state_name(i_tmp)); > } > else > { > - LOG_ERROR("%s is not valid state", > svf_tap_state_name[i_tmp]); > + LOG_ERROR("%s: %s is not a stable state", > + argus[0], tap_state_name(i_tmp)); > return ERROR_FAIL; > } > i += 2; > @@ -1301,8 +1280,8 @@ static int svf_run_command(struct comman > #else > if (svf_para.runtest_run_state != TAP_IDLE) > { > - // RUNTEST can only executed in > TAP_IDLE > - LOG_ERROR("cannot runtest in %s > state", svf_tap_state_name[svf_para.runtest_run_state]); > + LOG_ERROR("cannot runtest in %s > state", > + > tap_state_name(svf_para.runtest_run_state)); > return ERROR_FAIL; > } > > @@ -1333,13 +1312,14 @@ static int svf_run_command(struct comman > return ERROR_FAIL; > } > num_of_argu--; // num of path > - i_tmp = 1; // path is from > patameter 1 > - for (i = 0; i < num_of_argu; i++) > + i_tmp = 1; /* path is from parameter 1 > */ > + for (i = 0; i < num_of_argu; i++, i_tmp++) > { > - path[i] = > svf_find_string_in_array(argus[i_tmp++], (char **)svf_tap_state_name, > dimof(svf_tap_state_name)); > - if (!svf_tap_state_is_valid(path[i])) > + path[i] = tap_state_by_name(argus[i_tmp]); > + if (path[i] == TAP_INVALID) > { > - LOG_ERROR("%s is not valid state", > svf_tap_state_name[path[i]]); > + LOG_ERROR("%s: %s is not a valid > state", > + argus[0], argus[i_tmp]); > free(path); > return ERROR_FAIL; > } > @@ -1362,13 +1342,15 @@ static int svf_run_command(struct comman > if (svf_tap_state_is_stable(path[num_of_argu > - 1])) > { > // last state MUST be stable state > - // TODO: call path_move > jtag_add_pathmove(num_of_argu, > path); > - LOG_DEBUG("\tmove to %s by > path_move", svf_tap_state_name[path[num_of_argu - 1]]); > + LOG_DEBUG("\tmove to %s by > path_move", > + > tap_state_name(path[num_of_argu - 1])); > } > else > { > - LOG_ERROR("%s is not valid state", > svf_tap_state_name[path[num_of_argu - 1]]); > + LOG_ERROR("%s: %s is not a stable > state", > + argus[0], > + > tap_state_name(path[num_of_argu - 1])); > free(path); > return ERROR_FAIL; > } > @@ -1383,17 +1365,18 @@ static int svf_run_command(struct comman > else > { > // STATE stable_state > - state = svf_find_string_in_array(argus[1], (char > **)svf_tap_state_name, dimof(svf_tap_state_name)); > + state = tap_state_by_name(argus[1]); > if (svf_tap_state_is_stable(state)) > { > LOG_DEBUG("\tmove to %s by > svf_add_statemove", > - svf_tap_state_name[state]); > + tap_state_name(state)); > /* FIXME handle statemove failures */ > svf_add_statemove(state); > } > else > { > - LOG_ERROR("%s is not valid state", > svf_tap_state_name[state]); > + LOG_ERROR("%s: %s is not a stable state", > + argus[0], tap_state_name(state)); > return ERROR_FAIL; > } > } > @@ -1411,7 +1394,9 @@ static int svf_run_command(struct comman > { > return ERROR_FAIL; > } > - i_tmp = svf_find_string_in_array(argus[1], (char > **)svf_trst_mode_name, dimof(svf_trst_mode_name)); > + i_tmp = svf_find_string_in_array(argus[1], > + (char **)svf_trst_mode_name, > + DIM(svf_trst_mode_name)); > switch (i_tmp) > { > case TRST_ON: > _______________________________________________ > Openocd-development mailing list > [email protected] > https://lists.berlios.de/mailman/listinfo/openocd-development > -- Best Regards, SimonQian http://www.SimonQian.com
_______________________________________________ Openocd-development mailing list [email protected] https://lists.berlios.de/mailman/listinfo/openocd-development
