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; /* 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)); return EC_SUCCESS; } /* Otherwise print them all */ for (i = 0; i < GPIO_COUNT; i++) { 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(); } return EC_SUCCESS; }
/** * Find a GPIO signal by name. * * @param name Signal name to find * * @return the signal index, or GPIO_COUNT if no match. */ static enum gpio_signal find_signal_by_name(const char *name) { int i; if (!name || !*name) return GPIO_COUNT; for (i = 0; i < GPIO_COUNT; i++) if (gpio_is_implemented(i) && !strcasecmp(name, gpio_get_name(i))) return i; return GPIO_COUNT; }
static enum ec_error_list set(const char *name, int value) { enum gpio_signal signal = find_signal_by_name(name); if (signal == GPIO_COUNT) return EC_ERROR_INVAL; if (!gpio_is_implemented(signal)) return EC_ERROR_INVAL; if (!(gpio_get_default_flags(signal) & GPIO_OUTPUT)) return EC_ERROR_INVAL; gpio_set_level(signal, value); return EC_SUCCESS; }
static int command_gpio_get(int argc, char **argv) { 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; print_gpio_info(i); return EC_SUCCESS; } /* Otherwise print them all */ for (i = 0; i < GPIO_COUNT; i++) { if (!gpio_is_implemented(i)) continue; /* Skip unsupported signals */ print_gpio_info(i); } return EC_SUCCESS; }