cmd_led: Extend led command to support blinking and more leds

This patch extends the U-Boot "led" command to support automatic blinking
by setting a blink frequency in milliseconds. Additionally the number of
supported LEDs is increased to 6 (0...5).

This will be used by the PCA9551 LED driver.

Signed-off-by: Stefan Roese <sr@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Stefan Roese 2015-03-11 09:51:39 +01:00 committed by Tom Rini
parent ab93bf063b
commit a8eeaf2f7a
3 changed files with 53 additions and 10 deletions

View file

@ -39,6 +39,12 @@ static const led_tbl_t led_commands[] = {
#ifdef STATUS_LED_BIT3
{ "3", STATUS_LED_BIT3, NULL, NULL, NULL },
#endif
#ifdef STATUS_LED_BIT4
{ "4", STATUS_LED_BIT4, NULL, NULL, NULL },
#endif
#ifdef STATUS_LED_BIT5
{ "5", STATUS_LED_BIT5, NULL, NULL, NULL },
#endif
#endif
#ifdef STATUS_LED_GREEN
{ "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
@ -55,30 +61,39 @@ static const led_tbl_t led_commands[] = {
{ NULL, 0, NULL, NULL, NULL }
};
enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE };
enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE, LED_BLINK };
enum led_cmd get_led_cmd(char *var)
{
if (strcmp(var, "off") == 0) {
if (strcmp(var, "off") == 0)
return LED_OFF;
}
if (strcmp(var, "on") == 0) {
if (strcmp(var, "on") == 0)
return LED_ON;
}
if (strcmp(var, "toggle") == 0)
return LED_TOGGLE;
if (strcmp(var, "blink") == 0)
return LED_BLINK;
return -1;
}
/*
* LED drivers providing a blinking LED functionality, like the
* PCA9551, can override this empty weak function
*/
void __weak __led_blink(led_id_t mask, int freq)
{
}
int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int i, match = 0;
enum led_cmd cmd;
int freq;
/* Validate arguments */
if ((argc != 3)) {
if ((argc < 3) || (argc > 4))
return CMD_RET_USAGE;
}
cmd = get_led_cmd(argv[2]);
if (cmd < 0) {
@ -109,6 +124,13 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
led_commands[i].toggle();
else
__led_toggle(led_commands[i].mask);
break;
case LED_BLINK:
if (argc != 4)
return CMD_RET_USAGE;
freq = simple_strtoul(argv[3], NULL, 10);
__led_blink(led_commands[i].mask, freq);
}
/* Need to set only 1 led if led_name wasn't 'all' */
if (strcmp("all", argv[1]) != 0)
@ -125,7 +147,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
}
U_BOOT_CMD(
led, 3, 1, do_led,
led, 4, 1, do_led,
"["
#ifdef CONFIG_BOARD_SPECIFIC_LED
#ifdef STATUS_LED_BIT
@ -140,6 +162,12 @@ U_BOOT_CMD(
#ifdef STATUS_LED_BIT3
"3|"
#endif
#ifdef STATUS_LED_BIT4
"4|"
#endif
#ifdef STATUS_LED_BIT5
"5|"
#endif
#endif
#ifdef STATUS_LED_GREEN
"green|"
@ -153,6 +181,6 @@ U_BOOT_CMD(
#ifdef STATUS_LED_BLUE
"blue|"
#endif
"all] [on|off|toggle]",
"[led_name] [on|off|toggle] sets or clears led(s)"
"all] [on|off|toggle|blink] [blink-freq in ms]",
"[led_name] [on|off|toggle|blink] sets or clears led(s)"
);

View file

@ -53,6 +53,20 @@ led_dev_t led_dev[] = {
0,
},
#endif
#if defined(STATUS_LED_BIT4)
{ STATUS_LED_BIT4,
STATUS_LED_STATE4,
STATUS_LED_PERIOD4,
0,
},
#endif
#if defined(STATUS_LED_BIT5)
{ STATUS_LED_BIT5,
STATUS_LED_STATE5,
STATUS_LED_PERIOD5,
0,
},
#endif
};
#define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t))

View file

@ -105,6 +105,7 @@ typedef unsigned long led_id_t;
extern void __led_toggle (led_id_t mask);
extern void __led_init (led_id_t mask, int state);
extern void __led_set (led_id_t mask, int state);
void __led_blink(led_id_t mask, int freq);
#else
# error Status LED configuration missing
#endif