[U-Boot] [PATCH v2 9/9] dm: led: Add a new 'led' command
Ziping Chen
techping.chan at gmail.com
Wed Apr 12 08:53:19 UTC 2017
2017-04-11 1:34 GMT+08:00 Simon Glass <sjg at chromium.org>:
> When driver model is used for LEDs, provide a command to allow LED access.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2: None
>
> cmd/Kconfig | 9 ++++
> cmd/Makefile | 1 +
> cmd/led.c | 145 ++++++++++++++++++++++++++++++
> +++++++++++++++++++++++++++++
> 3 files changed, 155 insertions(+)
> create mode 100644 cmd/led.c
>
> diff --git a/cmd/Kconfig b/cmd/Kconfig
> index 661ae7a98c..13dc46a174 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -667,6 +667,15 @@ config CMD_CACHE
> help
> Enable the "icache" and "dcache" commands
>
> +config CMD_LED
> + bool "led"
> + default y if LED
> + help
> + Enable the 'led' command which allows for control of LEDs
> supported
> + by the board. The LEDs can be listed with 'led list' and
> controlled
> + with led on/off/togle/blink. Any LED drivers can be controlled
> with
> + this command, e.g. led_gpio.
> +
> config CMD_TIME
> bool "time"
> help
> diff --git a/cmd/Makefile b/cmd/Makefile
> index 19d450e0fb..3cb0cfde7b 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -79,6 +79,7 @@ obj-$(CONFIG_CMD_JFFS2) += jffs2.o
> obj-$(CONFIG_CMD_CRAMFS) += cramfs.o
> obj-$(CONFIG_CMD_LDRINFO) += ldrinfo.o
> obj-$(CONFIG_LED_STATUS_CMD) += legacy_led.o
> +obj-$(CONFIG_CMD_LED) += led.o
> obj-$(CONFIG_CMD_LICENSE) += license.o
> obj-y += load.o
> obj-$(CONFIG_LOGBUFFER) += log.o
> diff --git a/cmd/led.c b/cmd/led.c
> new file mode 100644
> index 0000000000..84173f86f2
> --- /dev/null
> +++ b/cmd/led.c
> @@ -0,0 +1,145 @@
> +/*
> + * Copyright (c) 2017 Google, Inc
> + * Written by Simon Glass <sjg at chromium.org>
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <command.h>
> +#include <dm.h>
> +#include <led.h>
> +#include <dm/uclass-internal.h>
> +
> +#define LED_TOGGLE LEDST_COUNT
> +
> +static const char *const state_label[] = {
> + [LEDST_OFF] = "off",
> + [LEDST_ON] = "on",
> + [LEDST_TOGGLE] = "toggle",
> +#ifdef CONFIG_LED_BLINK
> + [LEDST_BLINK] = "blink",
> +#endif
> +};
> +
> +enum led_state_t get_led_cmd(char *var)
> +{
> + int i;
> +
> + for (i = 0; i < LEDST_COUNT; i++) {
> + if (!strncmp(var, state_label[i], strlen(var)))
> + return i;
> + }
> +
> + return -1;
> +}
> +
> +static int show_led_state(struct udevice *dev)
> +{
> + int ret;
> +
> + ret = led_get_state(dev);
> + if (ret >= LEDST_COUNT)
> + ret = -EINVAL;
> + if (ret >= 0)
> + printf("%s\n", state_label[ret]);
> +
> + return ret;
> +}
> +
> +static int list_leds(void)
> +{
> + struct udevice *dev;
> + int ret;
> +
> + for (uclass_find_first_device(UCLASS_LED, &dev);
> + dev;
> + uclass_find_next_device(&dev)) {
> + struct led_uc_plat *plat = dev_get_uclass_platdata(dev);
> +
> + if (!plat->label)
> + continue;
> + printf("%-15s ", plat->label);
> + if (device_active(dev)) {
> + ret = show_led_state(dev);
> + if (ret < 0)
> + printf("Error %d\n", ret);
> + } else {
> + printf("<inactive>\n");
> + }
> + }
> +
> + return 0;
> +}
> +
> +int do_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
> +{
> + enum led_state_t cmd;
> + const char *led_label;
> + struct udevice *dev;
> +#ifdef CONFIG_LED_BLINK
> + int freq_ms = 0;
> +#endif
> + int ret;
> +
> + /* Validate arguments */
> + if (argc < 2)
> + return CMD_RET_USAGE;
> + led_label = argv[1];
> + if (*led_label == 'l')
> + return list_leds();
> +
> + cmd = argc > 2 ? get_led_cmd(argv[2]) : LEDST_COUNT;
> + if (cmd < 0)
> + return CMD_RET_USAGE;
> +#ifdef CONFIG_LED_BLINK
> + if (cmd == LEDST_BLINK) {
> + if (argc < 4)
> + return CMD_RET_USAGE;
> + freq_ms = simple_strtoul(argv[3], NULL, 10);
> + }
> +#endif
> + ret = led_get_by_label(led_label, &dev);
> + if (ret) {
> + printf("LED '%s' not found (err=%d)\n", led_label, ret);
> + return CMD_RET_FAILURE;
> + }
> + switch (cmd) {
> + case LEDST_OFF:
> + case LEDST_ON:
> + case LEDST_TOGGLE:
> + ret = led_set_state(dev, cmd);
> + break;
> +#ifdef CONFIG_LED_BLINK
> + case LEDST_BLINK:
> + ret = led_set_period(dev, freq_ms);
> + if (!ret)
> + ret = led_set_state(dev, LEDST_BLINK);
> + break;
> +#endif
> + case LEDST_COUNT:
> + printf("LED '%s': ", led_label);
> + ret = show_led_state(dev);
> + break;
> + }
> + if (ret < 0) {
> + printf("LED '%s' operation failed (err=%d)\n", led_label,
> ret);
> + return CMD_RET_FAILURE;
> + }
> +
> + return 0;
> +}
> +
> +#ifdef CONFIG_LED_BLINK
> +#define BLINK "|blink [blink-freq in ms]"
> +#else
> +#define BLINK ""
> +#endif
> +
> +U_BOOT_CMD(
> + led, 4, 1, do_led,
> + "manage LEDs",
> + "<led_label> on|off|toggle" BLINK "\tChange LED state\n"
> + "led [<led_label>\tGet LED state\n"
> + "led list\t\tshow a list of LEDs"
> +);
> --
> 2.12.2.715.g7642488e1d-goog
>
>
Reviewed-by: Ziping Chen <techping.chan at gmail.com>
More information about the U-Boot
mailing list