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