forked from auracaster/openocd
adapter: Add support for 'exit state' of GPIO signal
In addition to a signal's 'init state', add support to configure its 'exit state'. This option determines the state and configuration of a pin when the adapter terminates its operation. Change-Id: I0577ed9e3bc79715290b4e6a21e3f64c66f2ff9a Signed-off-by: Marc Schink <dev@zapb.de> Reviewed-on: https://review.openocd.org/c/openocd/+/9087 Tested-by: jenkins Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
committed by
Antonio Borneo
parent
fcff4b712c
commit
d02389bbfa
+59
-13
@@ -53,17 +53,18 @@ static const struct gpio_map {
|
||||
enum adapter_gpio_direction direction;
|
||||
bool permit_drive_option;
|
||||
bool permit_init_state_option;
|
||||
bool permit_exit_state_option;
|
||||
} gpio_map[ADAPTER_GPIO_IDX_NUM] = {
|
||||
[ADAPTER_GPIO_IDX_TDO] = { "tdo", ADAPTER_GPIO_DIRECTION_INPUT, false, true, },
|
||||
[ADAPTER_GPIO_IDX_TDI] = { "tdi", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, },
|
||||
[ADAPTER_GPIO_IDX_TMS] = { "tms", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, },
|
||||
[ADAPTER_GPIO_IDX_TCK] = { "tck", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, },
|
||||
[ADAPTER_GPIO_IDX_SWDIO] = { "swdio", ADAPTER_GPIO_DIRECTION_BIDIRECTIONAL, true, true, },
|
||||
[ADAPTER_GPIO_IDX_SWDIO_DIR] = { "swdio_dir", ADAPTER_GPIO_DIRECTION_OUTPUT, true, false, },
|
||||
[ADAPTER_GPIO_IDX_SWCLK] = { "swclk", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, },
|
||||
[ADAPTER_GPIO_IDX_TRST] = { "trst", ADAPTER_GPIO_DIRECTION_OUTPUT, false, true, },
|
||||
[ADAPTER_GPIO_IDX_SRST] = { "srst", ADAPTER_GPIO_DIRECTION_OUTPUT, false, true, },
|
||||
[ADAPTER_GPIO_IDX_LED] = { "led", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, },
|
||||
[ADAPTER_GPIO_IDX_TDO] = { "tdo", ADAPTER_GPIO_DIRECTION_INPUT, false, true, true },
|
||||
[ADAPTER_GPIO_IDX_TDI] = { "tdi", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, true },
|
||||
[ADAPTER_GPIO_IDX_TMS] = { "tms", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, true },
|
||||
[ADAPTER_GPIO_IDX_TCK] = { "tck", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, true },
|
||||
[ADAPTER_GPIO_IDX_SWDIO] = { "swdio", ADAPTER_GPIO_DIRECTION_BIDIRECTIONAL, true, true, true },
|
||||
[ADAPTER_GPIO_IDX_SWDIO_DIR] = { "swdio_dir", ADAPTER_GPIO_DIRECTION_OUTPUT, true, false, false },
|
||||
[ADAPTER_GPIO_IDX_SWCLK] = { "swclk", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, true },
|
||||
[ADAPTER_GPIO_IDX_TRST] = { "trst", ADAPTER_GPIO_DIRECTION_OUTPUT, false, true, true },
|
||||
[ADAPTER_GPIO_IDX_SRST] = { "srst", ADAPTER_GPIO_DIRECTION_OUTPUT, false, true, true },
|
||||
[ADAPTER_GPIO_IDX_LED] = { "led", ADAPTER_GPIO_DIRECTION_OUTPUT, true, true, true },
|
||||
};
|
||||
|
||||
static int adapter_config_khz(unsigned int khz);
|
||||
@@ -850,6 +851,7 @@ static COMMAND_HELPER(helper_adapter_gpio_print_config, enum adapter_gpio_config
|
||||
const char *drive = "";
|
||||
const char *pull = "";
|
||||
const char *init_state = "";
|
||||
const char *exit_state = "";
|
||||
|
||||
if (gpio_config->gpio_num == ADAPTER_GPIO_NOT_SET) {
|
||||
command_print(CMD, "adapter gpio %s: not configured", gpio_map[gpio_idx].name);
|
||||
@@ -908,9 +910,27 @@ static COMMAND_HELPER(helper_adapter_gpio_print_config, enum adapter_gpio_config
|
||||
}
|
||||
}
|
||||
|
||||
command_print(CMD, "adapter gpio %s (%s): num %u, chip %d, active-%s%s%s%s",
|
||||
if (gpio_map[gpio_idx].permit_exit_state_option) {
|
||||
switch (gpio_config->exit_state) {
|
||||
case ADAPTER_GPIO_EXIT_STATE_NO_CHANGE:
|
||||
exit_state = ", exit-state no-change";
|
||||
break;
|
||||
case ADAPTER_GPIO_EXIT_STATE_INACTIVE:
|
||||
exit_state = ", exit-state inactive";
|
||||
break;
|
||||
case ADAPTER_GPIO_EXIT_STATE_ACTIVE:
|
||||
exit_state = ", exit-state active";
|
||||
break;
|
||||
case ADAPTER_GPIO_EXIT_STATE_INPUT:
|
||||
exit_state = ", exit-state input";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
command_print(CMD, "adapter gpio %s (%s): num %u, chip %d, active-%s%s%s%s%s",
|
||||
gpio_map[gpio_idx].name, dir, gpio_config->gpio_num, (int)gpio_config->chip_num, active_state,
|
||||
drive, pull, init_state);
|
||||
drive, pull, init_state, exit_state);
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
@@ -1031,6 +1051,31 @@ COMMAND_HANDLER(adapter_gpio_config_handler)
|
||||
}
|
||||
}
|
||||
|
||||
if (gpio_map[gpio_idx].permit_exit_state_option) {
|
||||
if (strcmp(CMD_ARGV[i], "-exit-no-change") == 0) {
|
||||
++i;
|
||||
gpio_config->exit_state = ADAPTER_GPIO_EXIT_STATE_NO_CHANGE;
|
||||
continue;
|
||||
}
|
||||
if (strcmp(CMD_ARGV[i], "-exit-inactive") == 0) {
|
||||
++i;
|
||||
gpio_config->exit_state = ADAPTER_GPIO_EXIT_STATE_INACTIVE;
|
||||
continue;
|
||||
}
|
||||
if (strcmp(CMD_ARGV[i], "-exit-active") == 0) {
|
||||
++i;
|
||||
gpio_config->exit_state = ADAPTER_GPIO_EXIT_STATE_ACTIVE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (gpio_map[gpio_idx].direction == ADAPTER_GPIO_DIRECTION_BIDIRECTIONAL &&
|
||||
strcmp(CMD_ARGV[i], "-exit-input") == 0) {
|
||||
++i;
|
||||
gpio_config->exit_state = ADAPTER_GPIO_EXIT_STATE_INPUT;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
LOG_ERROR("illegal option for adapter %s %s: %s",
|
||||
CMD_NAME, gpio_map[gpio_idx].name, CMD_ARGV[i]);
|
||||
return ERROR_COMMAND_SYNTAX_ERROR;
|
||||
@@ -1168,7 +1213,8 @@ static const struct command_registration adapter_command_handlers[] = {
|
||||
"[-active-high|-active-low] "
|
||||
"[-push-pull|-open-drain|-open-source] "
|
||||
"[-pull-none|-pull-up|-pull-down]"
|
||||
"[-init-inactive|-init-active|-init-input] ]",
|
||||
"[-init-inactive|-init-active|-init-input] ]"
|
||||
"[-exit-no-change|-exit-inactive|-exit-active|-exit-input] ]",
|
||||
},
|
||||
COMMAND_REGISTRATION_DONE
|
||||
};
|
||||
|
||||
@@ -33,6 +33,14 @@ enum adapter_gpio_init_state {
|
||||
ADAPTER_GPIO_INIT_STATE_INPUT,
|
||||
};
|
||||
|
||||
/** Supported exit states for GPIO */
|
||||
enum adapter_gpio_exit_state {
|
||||
ADAPTER_GPIO_EXIT_STATE_NO_CHANGE, /* Should be zero so it is the default state */
|
||||
ADAPTER_GPIO_EXIT_STATE_INACTIVE,
|
||||
ADAPTER_GPIO_EXIT_STATE_ACTIVE,
|
||||
ADAPTER_GPIO_EXIT_STATE_INPUT,
|
||||
};
|
||||
|
||||
/** Supported pull directions for GPIO */
|
||||
enum adapter_gpio_pull {
|
||||
ADAPTER_GPIO_PULL_NONE,
|
||||
@@ -61,6 +69,7 @@ struct adapter_gpio_config {
|
||||
unsigned int chip_num;
|
||||
enum adapter_gpio_drive_mode drive; /* For outputs only */
|
||||
enum adapter_gpio_init_state init_state;
|
||||
enum adapter_gpio_exit_state exit_state;
|
||||
bool active_low;
|
||||
enum adapter_gpio_pull pull;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user