uboot/cmd/legacy_led.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * (C) Copyright 2010
   4 * Jason Kridner <jkridner@beagleboard.org>
   5 *
   6 * Based on cmd_led.c patch from:
   7 * http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html
   8 * (C) Copyright 2008
   9 * Ulf Samuelsson <ulf.samuelsson@atmel.com>
  10 */
  11
  12#include <common.h>
  13#include <config.h>
  14#include <command.h>
  15#include <status_led.h>
  16
  17struct led_tbl_s {
  18        char            *string;        /* String for use in the command */
  19        led_id_t        mask;           /* Mask used for calling __led_set() */
  20        void            (*off)(void);   /* Optional function for turning LED off */
  21        void            (*on)(void);    /* Optional function for turning LED on */
  22        void            (*toggle)(void);/* Optional function for toggling LED */
  23};
  24
  25typedef struct led_tbl_s led_tbl_t;
  26
  27static const led_tbl_t led_commands[] = {
  28#ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC
  29#ifdef CONFIG_LED_STATUS0
  30        { "0", CONFIG_LED_STATUS_BIT, NULL, NULL, NULL },
  31#endif
  32#ifdef CONFIG_LED_STATUS1
  33        { "1", CONFIG_LED_STATUS_BIT1, NULL, NULL, NULL },
  34#endif
  35#ifdef CONFIG_LED_STATUS2
  36        { "2", CONFIG_LED_STATUS_BIT2, NULL, NULL, NULL },
  37#endif
  38#ifdef CONFIG_LED_STATUS3
  39        { "3", CONFIG_LED_STATUS_BIT3, NULL, NULL, NULL },
  40#endif
  41#ifdef CONFIG_LED_STATUS4
  42        { "4", CONFIG_LED_STATUS_BIT4, NULL, NULL, NULL },
  43#endif
  44#ifdef CONFIG_LED_STATUS5
  45        { "5", CONFIG_LED_STATUS_BIT5, NULL, NULL, NULL },
  46#endif
  47#endif
  48#ifdef CONFIG_LED_STATUS_GREEN
  49        { "green", CONFIG_LED_STATUS_GREEN, green_led_off, green_led_on, NULL },
  50#endif
  51#ifdef CONFIG_LED_STATUS_YELLOW
  52        { "yellow", CONFIG_LED_STATUS_YELLOW, yellow_led_off, yellow_led_on,
  53          NULL },
  54#endif
  55#ifdef CONFIG_LED_STATUS_RED
  56        { "red", CONFIG_LED_STATUS_RED, red_led_off, red_led_on, NULL },
  57#endif
  58#ifdef CONFIG_LED_STATUS_BLUE
  59        { "blue", CONFIG_LED_STATUS_BLUE, blue_led_off, blue_led_on, NULL },
  60#endif
  61        { NULL, 0, NULL, NULL, NULL }
  62};
  63
  64enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE, LED_BLINK };
  65
  66enum led_cmd get_led_cmd(char *var)
  67{
  68        if (strcmp(var, "off") == 0)
  69                return LED_OFF;
  70        if (strcmp(var, "on") == 0)
  71                return LED_ON;
  72        if (strcmp(var, "toggle") == 0)
  73                return LED_TOGGLE;
  74        if (strcmp(var, "blink") == 0)
  75                return LED_BLINK;
  76
  77        return -1;
  78}
  79
  80/*
  81 * LED drivers providing a blinking LED functionality, like the
  82 * PCA9551, can override this empty weak function
  83 */
  84void __weak __led_blink(led_id_t mask, int freq)
  85{
  86}
  87
  88int do_legacy_led(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
  89{
  90        int i, match = 0;
  91        enum led_cmd cmd;
  92        int freq;
  93
  94        /* Validate arguments */
  95        if ((argc < 3) || (argc > 4))
  96                return CMD_RET_USAGE;
  97
  98        cmd = get_led_cmd(argv[2]);
  99        if (cmd < 0) {
 100                return CMD_RET_USAGE;
 101        }
 102
 103        for (i = 0; led_commands[i].string; i++) {
 104                if ((strcmp("all", argv[1]) == 0) ||
 105                    (strcmp(led_commands[i].string, argv[1]) == 0)) {
 106                        match = 1;
 107                        switch (cmd) {
 108                        case LED_ON:
 109                                if (led_commands[i].on)
 110                                        led_commands[i].on();
 111                                else
 112                                        __led_set(led_commands[i].mask,
 113                                                          CONFIG_LED_STATUS_ON);
 114                                break;
 115                        case LED_OFF:
 116                                if (led_commands[i].off)
 117                                        led_commands[i].off();
 118                                else
 119                                        __led_set(led_commands[i].mask,
 120                                                  CONFIG_LED_STATUS_OFF);
 121                                break;
 122                        case LED_TOGGLE:
 123                                if (led_commands[i].toggle)
 124                                        led_commands[i].toggle();
 125                                else
 126                                        __led_toggle(led_commands[i].mask);
 127                                break;
 128                        case LED_BLINK:
 129                                if (argc != 4)
 130                                        return CMD_RET_USAGE;
 131
 132                                freq = dectoul(argv[3], NULL);
 133                                __led_blink(led_commands[i].mask, freq);
 134                        }
 135                        /* Need to set only 1 led if led_name wasn't 'all' */
 136                        if (strcmp("all", argv[1]) != 0)
 137                                break;
 138                }
 139        }
 140
 141        /* If we ran out of matches, print Usage */
 142        if (!match) {
 143                return CMD_RET_USAGE;
 144        }
 145
 146        return 0;
 147}
 148
 149U_BOOT_CMD(
 150        led, 4, 1, do_legacy_led,
 151        "["
 152#ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC
 153#ifdef CONFIG_LED_STATUS0
 154        "0|"
 155#endif
 156#ifdef CONFIG_LED_STATUS1
 157        "1|"
 158#endif
 159#ifdef CONFIG_LED_STATUS2
 160        "2|"
 161#endif
 162#ifdef CONFIG_LED_STATUS3
 163        "3|"
 164#endif
 165#ifdef CONFIG_LED_STATUS4
 166        "4|"
 167#endif
 168#ifdef CONFIG_LED_STATUS5
 169        "5|"
 170#endif
 171#endif
 172#ifdef CONFIG_LED_STATUS_GREEN
 173        "green|"
 174#endif
 175#ifdef CONFIG_LED_STATUS_YELLOW
 176        "yellow|"
 177#endif
 178#ifdef CONFIG_LED_STATUS_RED
 179        "red|"
 180#endif
 181#ifdef CONFIG_LED_STATUS_BLUE
 182        "blue|"
 183#endif
 184        "all] [on|off|toggle|blink] [blink-freq in ms]",
 185        "[led_name] [on|off|toggle|blink] sets or clears led(s)"
 186);
 187