cmd: button: add a new 'button' command
authorPhilippe Reynes <philippe.reynes@softathome.com>
Fri, 24 Jul 2020 16:19:47 +0000 (18:19 +0200)
committerSimon Glass <sjg@chromium.org>
Wed, 29 Jul 2020 01:30:39 +0000 (19:30 -0600)
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>
cmd/Kconfig
cmd/Makefile
cmd/button.c [new file with mode: 0644]

index e2b0a4f..bea2ddf 100644 (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
index 7952138..6e0086b 100644 (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
diff --git a/cmd/button.c b/cmd/button.c
new file mode 100644 (file)
index 0000000..84ad165
--- /dev/null
@@ -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"
+);