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; }
static int gpio_command_get(struct host_cmd_handler_args *args) { const struct ec_params_gpio_get_v1 *p_v1 = args->params; struct ec_response_gpio_get_v1 *r_v1 = args->response; int i, len; if (args->version == 0) { const struct ec_params_gpio_get *p = args->params; struct ec_response_gpio_get *r = args->response; i = find_signal_by_name(p->name); if (i == GPIO_COUNT) return EC_RES_ERROR; r->val = gpio_get_level(i); args->response_size = sizeof(struct ec_response_gpio_get); return EC_RES_SUCCESS; } switch (p_v1->subcmd) { case EC_GPIO_GET_BY_NAME: i = find_signal_by_name(p_v1->get_value_by_name.name); if (i == GPIO_COUNT) return EC_RES_ERROR; r_v1->get_value_by_name.val = gpio_get_level(i); args->response_size = sizeof(r_v1->get_value_by_name); break; case EC_GPIO_GET_COUNT: r_v1->get_count.val = GPIO_COUNT; args->response_size = sizeof(r_v1->get_count); break; case EC_GPIO_GET_INFO: if (p_v1->get_info.index >= GPIO_COUNT) return EC_RES_ERROR; i = p_v1->get_info.index; len = strlen(gpio_get_name(i)); memcpy(r_v1->get_info.name, gpio_get_name(i), len+1); r_v1->get_info.val = gpio_get_level(i); r_v1->get_info.flags = gpio_get_default_flags(i); args->response_size = sizeof(r_v1->get_info); break; default: return EC_RES_INVALID_PARAM; } return EC_RES_SUCCESS; }
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(); }
/** * 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; }