diff options
Diffstat (limited to 'common/gpio_commands.c')
-rw-r--r-- | common/gpio_commands.c | 92 |
1 files changed, 79 insertions, 13 deletions
diff --git a/common/gpio_commands.c b/common/gpio_commands.c index 25185597ea..e3ce1d046d 100644 --- a/common/gpio_commands.c +++ b/common/gpio_commands.c @@ -77,19 +77,47 @@ static enum ec_error_list set(const char *name, int value) /*****************************************************************************/ /* Console commands */ +static void print_gpio_info(int gpio) +{ + int changed, v, flags; + + if (!gpio_is_implemented(gpio)) + return; /* Skip unsupported signals */ + + v = gpio_get_level(gpio); +#ifdef CONFIG_CMD_GPIO_EXTENDED + flags = gpio_get_flags(gpio); +#else + flags = 0; +#endif + changed = last_val_changed(gpio, v); + + ccprintf(" %d%c %s%s%s%s%s%s%s%s%s%s\n", v, (changed ? '*' : ' '), + (flags & GPIO_INPUT ? "I " : ""), + (flags & GPIO_OUTPUT ? "O " : ""), + (flags & GPIO_LOW ? "L " : ""), + (flags & GPIO_HIGH ? "H " : ""), + (flags & GPIO_ANALOG ? "A " : ""), + (flags & GPIO_OPEN_DRAIN ? "ODR " : ""), + (flags & GPIO_PULL_UP ? "PU " : ""), + (flags & GPIO_PULL_DOWN ? "PD " : ""), + (flags & GPIO_ALTERNATE ? "ALT " : ""), + gpio_get_name(gpio)); + + /* Flush console to avoid truncating output */ + cflush(); +} + static int command_gpio_get(int argc, char **argv) { - int changed, v, i; + int i; /* If a signal is specified, print only that one */ if (argc == 2) { i = find_signal_by_name(argv[1]); if (i == GPIO_COUNT) return EC_ERROR_PARAM1; - v = gpio_get_level(i); - changed = last_val_changed(i, v); - ccprintf(" %d%c %s\n", v, (changed ? '*' : ' '), - gpio_get_name(i)); + print_gpio_info(i); return EC_SUCCESS; } @@ -99,13 +127,7 @@ static int command_gpio_get(int argc, char **argv) if (!gpio_is_implemented(i)) continue; /* Skip unsupported signals */ - v = gpio_get_level(i); - changed = last_val_changed(i, v); - ccprintf(" %d%c %s\n", v, (changed ? '*' : ' '), - gpio_get_name(i)); - - /* Flush console to avoid truncating output */ - cflush(); + print_gpio_info(i); } return EC_SUCCESS; @@ -117,6 +139,46 @@ DECLARE_CONSOLE_COMMAND(gpioget, command_gpio_get, static int command_gpio_set(int argc, char **argv) { +#ifdef CONFIG_CMD_GPIO_EXTENDED + int gpio; + int flags = 0; + int af = -1; + char *e; + + if (argc < 3) + return EC_ERROR_PARAM_COUNT; + + gpio = find_signal_by_name(argv[1]); + if (gpio == GPIO_COUNT) + return EC_ERROR_PARAM1; + + if (strcasecmp(argv[2], "IN") == 0) + flags = GPIO_INPUT; + else if (strcasecmp(argv[2], "1") == 0) + flags = GPIO_OUT_HIGH; + else if (strcasecmp(argv[2], "0") == 0) + flags = GPIO_OUT_LOW; + else if (strcasecmp(argv[2], "A") == 0) + flags = GPIO_ANALOG; + else if (strcasecmp(argv[2], "ALT") == 0) { + if (argc >= 4) { + af = strtoi(argv[3], &e, 0); + if (*e || af < 0 || af > 5) + return EC_ERROR_PARAM2; + } + flags = GPIO_ALTERNATE; + } else + return EC_ERROR_PARAM2; + + /* Update alt function if requested. */ + if (af >= 0) { + const struct gpio_info *g = gpio_list + gpio; + + gpio_set_alternate_function(g->port, g->mask, af); + } + /* Update GPIO flags. */ + gpio_set_flags(gpio, flags); +#else char *e; int v; @@ -129,11 +191,15 @@ static int command_gpio_set(int argc, char **argv) if (set(argv[1], v) != EC_SUCCESS) return EC_ERROR_PARAM1; - +#endif return EC_SUCCESS; } DECLARE_CONSOLE_COMMAND(gpioset, command_gpio_set, +#ifdef CONFIG_CMD_GPIO_EXTENDED + "name <0 | 1 | IN | A | ALT [func]>", +#else "name <0 | 1>", +#endif "Set a GPIO", NULL); |