uboot/common/cmd_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_BOARD_SPECIFIC_LED
  30#ifdef STATUS_LED_BIT
  31        { "0", STATUS_LED_BIT, NULL, NULL, NULL },
  32#endif
  33#ifdef STATUS_LED_BIT1
  34        { "1", STATUS_LED_BIT1, NULL, NULL, NULL },
  35#endif
  36#ifdef STATUS_LED_BIT2
  37        { "2", STATUS_LED_BIT2, NULL, NULL, NULL },
  38#endif
  39#ifdef STATUS_LED_BIT3
  40        { "3", STATUS_LED_BIT3, NULL, NULL, NULL },
  41#endif
  42#endif
  43#ifdef STATUS_LED_GREEN
  44        { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
  45#endif
  46#ifdef STATUS_LED_YELLOW
  47        { "yellow", STATUS_LED_YELLOW, yellow_led_off, yellow_led_on, NULL },
  48#endif
  49#ifdef STATUS_LED_RED
  50        { "red", STATUS_LED_RED, red_led_off, red_led_on, NULL },
  51#endif
  52#ifdef STATUS_LED_BLUE
  53        { "blue", STATUS_LED_BLUE, blue_led_off, blue_led_on, NULL },
  54#endif
  55        { NULL, 0, NULL, NULL, NULL }
  56};
  57
  58enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE };
  59
  60enum led_cmd get_led_cmd(char *var)
  61{
  62        if (strcmp(var, "off") == 0) {
  63                return LED_OFF;
  64        }
  65        if (strcmp(var, "on") == 0) {
  66                return LED_ON;
  67        }
  68        if (strcmp(var, "toggle") == 0)
  69                return LED_TOGGLE;
  70        return -1;
  71}
  72
  73int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  74{
  75        int i, match = 0;
  76        enum led_cmd cmd;
  77
  78        /* Validate arguments */
  79        if ((argc != 3)) {
  80                return CMD_RET_USAGE;
  81        }
  82
  83        cmd = get_led_cmd(argv[2]);
  84        if (cmd < 0) {
  85                return CMD_RET_USAGE;
  86        }
  87
  88        for (i = 0; led_commands[i].string; i++) {
  89                if ((strcmp("all", argv[1]) == 0) ||
  90                    (strcmp(led_commands[i].string, argv[1]) == 0)) {
  91                        match = 1;
  92                        switch (cmd) {
  93                        case LED_ON:
  94                                if (led_commands[i].on)
  95                                        led_commands[i].on();
  96                                else
  97                                        __led_set(led_commands[i].mask,
  98                                                          STATUS_LED_ON);
  99                                break;
 100                        case LED_OFF:
 101                                if (led_commands[i].off)
 102                                        led_commands[i].off();
 103                                else
 104                                        __led_set(led_commands[i].mask,
 105                                                          STATUS_LED_OFF);
 106                                break;
 107                        case LED_TOGGLE:
 108                                if (led_commands[i].toggle)
 109                                        led_commands[i].toggle();
 110                                else
 111                                        __led_toggle(led_commands[i].mask);
 112                        }
 113                        /* Need to set only 1 led if led_name wasn't 'all' */
 114                        if (strcmp("all", argv[1]) != 0)
 115                                break;
 116                }
 117        }
 118
 119        /* If we ran out of matches, print Usage */
 120        if (!match) {
 121                return CMD_RET_USAGE;
 122        }
 123
 124        return 0;
 125}
 126
 127U_BOOT_CMD(
 128        led, 3, 1, do_led,
 129        "["
 130#ifdef CONFIG_BOARD_SPECIFIC_LED
 131#ifdef STATUS_LED_BIT
 132        "0|"
 133#endif
 134#ifdef STATUS_LED_BIT1
 135        "1|"
 136#endif
 137#ifdef STATUS_LED_BIT2
 138        "2|"
 139#endif
 140#ifdef STATUS_LED_BIT3
 141        "3|"
 142#endif
 143#endif
 144#ifdef STATUS_LED_GREEN
 145        "green|"
 146#endif
 147#ifdef STATUS_LED_YELLOW
 148        "yellow|"
 149#endif
 150#ifdef STATUS_LED_RED
 151        "red|"
 152#endif
 153#ifdef STATUS_LED_BLUE
 154        "blue|"
 155#endif
 156        "all] [on|off|toggle]",
 157        "[led_name] [on|off|toggle] sets or clears led(s)"
 158);
 159