[PATCH v3 3/8] cmd: button: add a new 'button' command

Philippe Reynes philippe.reynes at softathome.com
Fri Jul 24 18:19:47 CEST 2020


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 at chromium.org>
Signed-off-by: Philippe Reynes <philippe.reynes at softathome.com>
---
Changelog:
v3:
- no change
v2
- no change

 cmd/Kconfig  | 11 ++++++++
 cmd/Makefile |  1 +
 cmd/button.c | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 98 insertions(+)
 create mode 100644 cmd/button.c

diff --git a/cmd/Kconfig b/cmd/Kconfig
index bfe6c16..8ef87dc 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1679,6 +1679,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
diff --git a/cmd/Makefile b/cmd/Makefile
index 7952138..6e0086b 100644
--- a/cmd/Makefile
+++ b/cmd/Makefile
@@ -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
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 at 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"
+);
-- 
2.7.4



More information about the U-Boot mailing list