svf: factorize big switch case
Factorize function svf_run_command() by moving out of the 'case' the common code related to the label 'xxr_common'. The target is to drop later on the ugly label 'xxr_common' inside the switch. Apart for: - the function and local variables declaration, - the added function call in place of original code, - the reduced indentation in the new function, this change is a dummy copy/paste with no code modification. Change-Id: I8149cf25f460326ba6666a9287c5c309e5d99488 Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/9040 Tested-by: jenkins
This commit is contained in:
233
src/svf/svf.c
233
src/svf/svf.c
@@ -979,121 +979,12 @@ static int svf_execute_tap(void)
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str)
|
||||
static int svf_xxr_common(char **argus, int num_of_argu, char command, struct svf_xxr_para *xxr_para_tmp)
|
||||
{
|
||||
char *argus[256], command;
|
||||
int num_of_argu = 0, i;
|
||||
|
||||
/* tmp variable */
|
||||
int i_tmp;
|
||||
|
||||
/* for RUNTEST */
|
||||
int run_count;
|
||||
float min_time;
|
||||
/* for XXR */
|
||||
struct svf_xxr_para *xxr_para_tmp;
|
||||
int i, i_tmp;
|
||||
uint8_t **pbuffer_tmp;
|
||||
struct scan_field field;
|
||||
/* for STATE */
|
||||
enum tap_state *path = NULL, state;
|
||||
/* flag padding commands skipped due to -tap command */
|
||||
int padding_command_skipped = 0;
|
||||
|
||||
if (svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu) != ERROR_OK)
|
||||
return ERROR_FAIL;
|
||||
|
||||
/* 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, ARRAY_SIZE(svf_command_name));
|
||||
switch (command) {
|
||||
case ENDDR:
|
||||
case ENDIR:
|
||||
if (num_of_argu != 2) {
|
||||
LOG_ERROR("invalid parameter of %s", argus[0]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
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",
|
||||
tap_state_name(i_tmp));
|
||||
} else {
|
||||
svf_para.dr_end_state = i_tmp;
|
||||
LOG_DEBUG("\tDR end_state = %s",
|
||||
tap_state_name(i_tmp));
|
||||
}
|
||||
} else {
|
||||
LOG_ERROR("%s: %s is not a stable state",
|
||||
argus[0], argus[1]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
break;
|
||||
case FREQUENCY:
|
||||
if (num_of_argu != 1 && num_of_argu != 3) {
|
||||
LOG_ERROR("invalid parameter of %s", argus[0]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
if (num_of_argu == 1) {
|
||||
/* TODO: set jtag speed to full speed */
|
||||
svf_para.frequency = 0;
|
||||
} else {
|
||||
if (strcmp(argus[2], "HZ")) {
|
||||
LOG_ERROR("HZ not found in FREQUENCY command");
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
if (svf_execute_tap() != ERROR_OK)
|
||||
return ERROR_FAIL;
|
||||
svf_para.frequency = atof(argus[1]);
|
||||
/* TODO: set jtag speed to */
|
||||
if (svf_para.frequency > 0) {
|
||||
command_run_linef(cmd_ctx,
|
||||
"adapter speed %d",
|
||||
(int)svf_para.frequency / 1000);
|
||||
LOG_DEBUG("\tfrequency = %f", svf_para.frequency);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HDR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.hdr_para;
|
||||
goto xxr_common;
|
||||
case HIR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.hir_para;
|
||||
goto xxr_common;
|
||||
case TDR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.tdr_para;
|
||||
goto xxr_common;
|
||||
case TIR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.tir_para;
|
||||
goto xxr_common;
|
||||
case SDR:
|
||||
xxr_para_tmp = &svf_para.sdr_para;
|
||||
goto xxr_common;
|
||||
case SIR:
|
||||
xxr_para_tmp = &svf_para.sir_para;
|
||||
goto xxr_common;
|
||||
xxr_common:
|
||||
/* XXR length [TDI (tdi)] [TDO (tdo)][MASK (mask)] [SMASK (smask)] */
|
||||
if (num_of_argu > 10 || (num_of_argu % 2)) {
|
||||
LOG_ERROR("invalid parameter of %s", argus[0]);
|
||||
@@ -1373,6 +1264,126 @@ xxr_common:
|
||||
|
||||
svf_buffer_index += (i + 7) >> 3;
|
||||
}
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str)
|
||||
{
|
||||
char *argus[256], command;
|
||||
int num_of_argu = 0, i, retval;
|
||||
|
||||
/* tmp variable */
|
||||
int i_tmp;
|
||||
|
||||
/* for RUNTEST */
|
||||
int run_count;
|
||||
float min_time;
|
||||
/* for XXR */
|
||||
struct svf_xxr_para *xxr_para_tmp;
|
||||
/* for STATE */
|
||||
enum tap_state *path = NULL, state;
|
||||
/* flag padding commands skipped due to -tap command */
|
||||
int padding_command_skipped = 0;
|
||||
|
||||
if (svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu) != ERROR_OK)
|
||||
return ERROR_FAIL;
|
||||
|
||||
/* 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, ARRAY_SIZE(svf_command_name));
|
||||
switch (command) {
|
||||
case ENDDR:
|
||||
case ENDIR:
|
||||
if (num_of_argu != 2) {
|
||||
LOG_ERROR("invalid parameter of %s", argus[0]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
||||
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",
|
||||
tap_state_name(i_tmp));
|
||||
} else {
|
||||
svf_para.dr_end_state = i_tmp;
|
||||
LOG_DEBUG("\tDR end_state = %s",
|
||||
tap_state_name(i_tmp));
|
||||
}
|
||||
} else {
|
||||
LOG_ERROR("%s: %s is not a stable state",
|
||||
argus[0], argus[1]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
break;
|
||||
case FREQUENCY:
|
||||
if (num_of_argu != 1 && num_of_argu != 3) {
|
||||
LOG_ERROR("invalid parameter of %s", argus[0]);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
if (num_of_argu == 1) {
|
||||
/* TODO: set jtag speed to full speed */
|
||||
svf_para.frequency = 0;
|
||||
} else {
|
||||
if (strcmp(argus[2], "HZ")) {
|
||||
LOG_ERROR("HZ not found in FREQUENCY command");
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
if (svf_execute_tap() != ERROR_OK)
|
||||
return ERROR_FAIL;
|
||||
svf_para.frequency = atof(argus[1]);
|
||||
/* TODO: set jtag speed to */
|
||||
if (svf_para.frequency > 0) {
|
||||
command_run_linef(cmd_ctx,
|
||||
"adapter speed %d",
|
||||
(int)svf_para.frequency / 1000);
|
||||
LOG_DEBUG("\tfrequency = %f", svf_para.frequency);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HDR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.hdr_para;
|
||||
goto xxr_common;
|
||||
case HIR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.hir_para;
|
||||
goto xxr_common;
|
||||
case TDR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.tdr_para;
|
||||
goto xxr_common;
|
||||
case TIR:
|
||||
if (svf_tap_is_specified) {
|
||||
padding_command_skipped = 1;
|
||||
break;
|
||||
}
|
||||
xxr_para_tmp = &svf_para.tir_para;
|
||||
goto xxr_common;
|
||||
case SDR:
|
||||
xxr_para_tmp = &svf_para.sdr_para;
|
||||
goto xxr_common;
|
||||
case SIR:
|
||||
xxr_para_tmp = &svf_para.sir_para;
|
||||
goto xxr_common;
|
||||
xxr_common:
|
||||
retval = svf_xxr_common(argus, num_of_argu, command, xxr_para_tmp);
|
||||
if (retval != ERROR_OK)
|
||||
return retval;
|
||||
break;
|
||||
case PIO:
|
||||
case PIOMAP:
|
||||
|
||||
Reference in New Issue
Block a user