diff options
| author | Jason Kridner <jkridner@beagleboard.org> | 2011-04-18 17:22:44 -0400 | 
|---|---|---|
| committer | Albert ARIBAUD <albert.u.boot@aribaud.net> | 2011-04-27 19:38:05 +0200 | 
| commit | b633f66f02ab3df6adc8fc65f13769e5fb9c328f (patch) | |
| tree | c0720dddb80f62e4f6cc0376cd3d1f25428eec4b /common/cmd_led.c | |
| parent | cd4b8a6329072b971299a83373b6c8c2aafde44e (diff) | |
| download | olio-uboot-2014.01-b633f66f02ab3df6adc8fc65f13769e5fb9c328f.tar.xz olio-uboot-2014.01-b633f66f02ab3df6adc8fc65f13769e5fb9c328f.zip | |
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: Jason Kridner <jkridner@beagleboard.org>
Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
Diffstat (limited to 'common/cmd_led.c')
| -rw-r--r-- | common/cmd_led.c | 153 | 
1 files changed, 153 insertions, 0 deletions
| diff --git a/common/cmd_led.c b/common/cmd_led.c new file mode 100644 index 000000000..f1e8a62cb --- /dev/null +++ b/common/cmd_led.c @@ -0,0 +1,153 @@ +/* + * (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" +); |