cmd: button: add a new 'button' command

Adds a command 'button' that provides the list of buttons
supported by the board, and the state of a button.

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Philippe Reynes <philippe.reynes@softathome.com>
This commit is contained in:
Philippe Reynes 2020-07-24 18:19:47 +02:00 committed by Simon Glass
parent 486b973ee9
commit 325141a6ea
3 changed files with 98 additions and 0 deletions

View File

@ -1680,6 +1680,17 @@ config CMD_BLOCK_CACHE
during development, but also allows the cache to be disabled when
it might hurt performance (e.g. when using the ums command).
config CMD_BUTTON
bool "button"
depends on BUTTON
default y if BUTTON
help
Enable the 'button' command which allows to get the status of
buttons supported by the board. The buttonss can be listed with
'button list' and state can be known with 'button <label>'.
Any button drivers can be controlled with this command, e.g.
button_gpio.
config CMD_CACHE
bool "icache or dcache"
help

View File

@ -33,6 +33,7 @@ obj-$(CONFIG_CMD_BOOTSTAGE) += bootstage.o
obj-$(CONFIG_CMD_BOOTZ) += bootz.o
obj-$(CONFIG_CMD_BOOTI) += booti.o
obj-$(CONFIG_CMD_BTRFS) += btrfs.o
obj-$(CONFIG_CMD_BUTTON) += button.o
obj-$(CONFIG_CMD_CACHE) += cache.o
obj-$(CONFIG_CMD_CBFS) += cbfs.o
obj-$(CONFIG_CMD_CLK) += clk.o

86
cmd/button.c Normal file
View File

@ -0,0 +1,86 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (C) 2020 Philippe Reynes <philippe.reynes@softathome.com>
*
* Based on led.c
*/
#include <common.h>
#include <command.h>
#include <dm.h>
#include <button.h>
#include <dm/uclass-internal.h>
static const char *const state_label[] = {
[BUTTON_OFF] = "off",
[BUTTON_ON] = "on",
};
static int show_button_state(struct udevice *dev)
{
int ret;
ret = button_get_state(dev);
if (ret >= BUTTON_COUNT)
ret = -EINVAL;
if (ret >= 0)
printf("%s\n", state_label[ret]);
return ret;
}
static int list_buttons(void)
{
struct udevice *dev;
int ret;
for (uclass_find_first_device(UCLASS_BUTTON, &dev);
dev;
uclass_find_next_device(&dev)) {
struct button_uc_plat *plat = dev_get_uclass_platdata(dev);
if (!plat->label)
continue;
printf("%-15s ", plat->label);
if (device_active(dev)) {
ret = show_button_state(dev);
if (ret < 0)
printf("Error %d\n", ret);
} else {
printf("<inactive>\n");
}
}
return 0;
}
int do_button(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
{
const char *button_label;
struct udevice *dev;
int ret;
/* Validate arguments */
if (argc < 2)
return CMD_RET_USAGE;
button_label = argv[1];
if (strncmp(button_label, "list", 4) == 0)
return list_buttons();
ret = button_get_by_label(button_label, &dev);
if (ret) {
printf("Button '%s' not found (err=%d)\n", button_label, ret);
return CMD_RET_FAILURE;
}
ret = show_button_state(dev);
return 0;
}
U_BOOT_CMD(
button, 4, 1, do_button,
"manage buttons",
"<button_label> \tGet button state\n"
"button list\t\tShow a list of buttons"
);