Skip to content
Snippets Groups Projects
Commit b633f66f authored by Jason Kridner's avatar Jason Kridner Committed by Albert ARIBAUD
Browse files

Add 'led' command

This patch allows any board implementing the coloured LED API
to control the LEDs from the console.

led [green | yellow | red | all ]  [ on | off ]

or

led [ 1 | 2 | 3 | all ]  [ on | off ]

Adds configuration item CONFIG_CMD_LED enabling the command.

Partially based on patch from Ulf Samuelsson:
http://www.mail-archive.com/u-boot@lists.denx.de/msg09593.html.

Updated based on feedback:
http://www.mail-archive.com/u-boot@lists.denx.de/msg41847.html
https://groups.google.com/d/topic/beagleboard/8Wf1HiK_QBo/discussion


* Fixed a handful of style issues.
* Significantly reduced the number of #ifdefs and redundant code
* Converted redundant code into loops test against a structure
* Made use of cmd_usage()
* Introduced a str_onoff() function, but haven't yet put it in common
* Eliminated trailing newline

Signed-off-by: default avatarJason Kridner <jkridner@beagleboard.org>
Signed-off-by: default avatarSandeep Paulraj <s-paulraj@ti.com>
parent cd4b8a63
No related branches found
No related tags found
No related merge requests found
/*
* (C) Copyright 2010
* Jason Kridner <jkridner@beagleboard.org>
*
* Based on cmd_led.c patch from:
* http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html
* (C) Copyright 2008
* Ulf Samuelsson <ulf.samuelsson@atmel.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#include <common.h>
#include <config.h>
#include <command.h>
#include <status_led.h>
struct led_tbl_s {
char *string; /* String for use in the command */
led_id_t mask; /* Mask used for calling __led_set() */
void (*on)(void); /* Optional fucntion for turning LED on */
void (*off)(void); /* Optional fucntion for turning LED on */
};
typedef struct led_tbl_s led_tbl_t;
static const led_tbl_t led_commands[] = {
#ifdef CONFIG_BOARD_SPECIFIC_LED
#ifdef STATUS_LED_BIT
{ "0", STATUS_LED_BIT, NULL, NULL },
#endif
#ifdef STATUS_LED_BIT1
{ "1", STATUS_LED_BIT1, NULL, NULL },
#endif
#ifdef STATUS_LED_BIT2
{ "2", STATUS_LED_BIT2, NULL, NULL },
#endif
#ifdef STATUS_LED_BIT3
{ "3", STATUS_LED_BIT3, NULL, NULL },
#endif
#endif
#ifdef STATUS_LED_GREEN
{ "green", STATUS_LED_GREEN, green_LED_off, green_LED_on },
#endif
#ifdef STATUS_LED_YELLOW
{ "yellow", STATUS_LED_YELLOW, yellow_LED_off, yellow_LED_on },
#endif
#ifdef STATUS_LED_RED
{ "red", STATUS_LED_RED, red_LED_off, red_LED_on },
#endif
#ifdef STATUS_LED_BLUE
{ "blue", STATUS_LED_BLUE, blue_LED_off, blue_LED_on },
#endif
{ NULL, 0, NULL, NULL }
};
int str_onoff (char *var)
{
if (strcmp(var, "off") == 0) {
return 0;
}
if (strcmp(var, "on") == 0) {
return 1;
}
return -1;
}
int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int state, i;
/* Validate arguments */
if ((argc != 3)) {
return cmd_usage(cmdtp);
}
state = str_onoff(argv[2]);
if (state < 0) {
return cmd_usage(cmdtp);
}
for (i = 0; led_commands[i].string; i++) {
if ((strcmp("all", argv[1]) == 0) ||
(strcmp(led_commands[i].string, argv[1]) == 0)) {
if (led_commands[i].on) {
if (state) {
led_commands[i].on();
} else {
led_commands[i].off();
}
} else {
__led_set(led_commands[i].mask, state);
}
break;
}
}
/* If we ran out of matches, print Usage */
if (!led_commands[i].string && !(strcmp("all", argv[1]) == 0)) {
return cmd_usage(cmdtp);
}
return 0;
}
U_BOOT_CMD(
led, 3, 1, do_led,
"led\t- ["
#ifdef CONFIG_BOARD_SPECIFIC_LED
#ifdef STATUS_LED_BIT
"0|"
#endif
#ifdef STATUS_LED_BIT1
"1|"
#endif
#ifdef STATUS_LED_BIT2
"2|"
#endif
#ifdef STATUS_LED_BIT3
"3|"
#endif
#endif
#ifdef STATUS_LED_GREEN
"green|"
#endif
#ifdef STATUS_LED_YELLOW
"yellow|"
#endif
#ifdef STATUS_LED_RED
"red|"
#endif
#ifdef STATUS_LED_BLUE
"blue|"
#endif
"all] [on|off]\n",
"led [led_name] [on|off] sets or clears led(s)\n"
);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment