aboutsummaryrefslogtreecommitdiff
path: root/cmd/button.c
diff options
context:
space:
mode:
authorPhilippe Reynes <philippe.reynes@softathome.com>2020-07-24 18:19:47 +0200
committerSimon Glass <sjg@chromium.org>2020-07-28 19:30:39 -0600
commit325141a6eab0d21c928a4c36aa9b6873bb672dab (patch)
treec469de18160ecc03aac85d6a9ae624aa045312bc /cmd/button.c
parent486b973ee9b9bd89ff53bc9d3d1cff4ada73eb36 (diff)
downloadu-boot-325141a6eab0d21c928a4c36aa9b6873bb672dab.zip
u-boot-325141a6eab0d21c928a4c36aa9b6873bb672dab.tar.gz
u-boot-325141a6eab0d21c928a4c36aa9b6873bb672dab.tar.bz2
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>
Diffstat (limited to 'cmd/button.c')
-rw-r--r--cmd/button.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/cmd/button.c b/cmd/button.c
new file mode 100644
index 0000000..84ad165
--- /dev/null
+++ b/cmd/button.c
@@ -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"
+);