Skip to content
Snippets Groups Projects
Commit a8eeaf2f authored by Stefan Roese's avatar Stefan Roese Committed by Tom Rini
Browse files

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: default avatarStefan Roese <sr@denx.de>
Reviewed-by: default avatarTom Rini <trini@konsulko.com>
parent ab93bf06
No related branches found
No related tags found
No related merge requests found
...@@ -39,6 +39,12 @@ static const led_tbl_t led_commands[] = { ...@@ -39,6 +39,12 @@ static const led_tbl_t led_commands[] = {
#ifdef STATUS_LED_BIT3 #ifdef STATUS_LED_BIT3
{ "3", STATUS_LED_BIT3, NULL, NULL, NULL }, { "3", STATUS_LED_BIT3, NULL, NULL, NULL },
#endif #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 #endif
#ifdef STATUS_LED_GREEN #ifdef STATUS_LED_GREEN
{ "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL }, { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
...@@ -55,30 +61,39 @@ static const led_tbl_t led_commands[] = { ...@@ -55,30 +61,39 @@ static const led_tbl_t led_commands[] = {
{ NULL, 0, NULL, NULL, NULL } { 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) enum led_cmd get_led_cmd(char *var)
{ {
if (strcmp(var, "off") == 0) { if (strcmp(var, "off") == 0)
return LED_OFF; return LED_OFF;
} if (strcmp(var, "on") == 0)
if (strcmp(var, "on") == 0) {
return LED_ON; return LED_ON;
}
if (strcmp(var, "toggle") == 0) if (strcmp(var, "toggle") == 0)
return LED_TOGGLE; return LED_TOGGLE;
if (strcmp(var, "blink") == 0)
return LED_BLINK;
return -1; 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 do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{ {
int i, match = 0; int i, match = 0;
enum led_cmd cmd; enum led_cmd cmd;
int freq;
/* Validate arguments */ /* Validate arguments */
if ((argc != 3)) { if ((argc < 3) || (argc > 4))
return CMD_RET_USAGE; return CMD_RET_USAGE;
}
cmd = get_led_cmd(argv[2]); cmd = get_led_cmd(argv[2]);
if (cmd < 0) { if (cmd < 0) {
...@@ -109,6 +124,13 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ...@@ -109,6 +124,13 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
led_commands[i].toggle(); led_commands[i].toggle();
else else
__led_toggle(led_commands[i].mask); __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' */ /* Need to set only 1 led if led_name wasn't 'all' */
if (strcmp("all", argv[1]) != 0) if (strcmp("all", argv[1]) != 0)
...@@ -125,7 +147,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) ...@@ -125,7 +147,7 @@ int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
} }
U_BOOT_CMD( U_BOOT_CMD(
led, 3, 1, do_led, led, 4, 1, do_led,
"[" "["
#ifdef CONFIG_BOARD_SPECIFIC_LED #ifdef CONFIG_BOARD_SPECIFIC_LED
#ifdef STATUS_LED_BIT #ifdef STATUS_LED_BIT
...@@ -140,6 +162,12 @@ U_BOOT_CMD( ...@@ -140,6 +162,12 @@ U_BOOT_CMD(
#ifdef STATUS_LED_BIT3 #ifdef STATUS_LED_BIT3
"3|" "3|"
#endif #endif
#ifdef STATUS_LED_BIT4
"4|"
#endif
#ifdef STATUS_LED_BIT5
"5|"
#endif
#endif #endif
#ifdef STATUS_LED_GREEN #ifdef STATUS_LED_GREEN
"green|" "green|"
...@@ -153,6 +181,6 @@ U_BOOT_CMD( ...@@ -153,6 +181,6 @@ U_BOOT_CMD(
#ifdef STATUS_LED_BLUE #ifdef STATUS_LED_BLUE
"blue|" "blue|"
#endif #endif
"all] [on|off|toggle]", "all] [on|off|toggle|blink] [blink-freq in ms]",
"[led_name] [on|off|toggle] sets or clears led(s)" "[led_name] [on|off|toggle|blink] sets or clears led(s)"
); );
...@@ -53,6 +53,20 @@ led_dev_t led_dev[] = { ...@@ -53,6 +53,20 @@ led_dev_t led_dev[] = {
0, 0,
}, },
#endif #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)) #define MAX_LED_DEV (sizeof(led_dev)/sizeof(led_dev_t))
......
...@@ -105,6 +105,7 @@ typedef unsigned long led_id_t; ...@@ -105,6 +105,7 @@ typedef unsigned long led_id_t;
extern void __led_toggle (led_id_t mask); extern void __led_toggle (led_id_t mask);
extern void __led_init (led_id_t mask, int state); extern void __led_init (led_id_t mask, int state);
extern void __led_set (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 #else
# error Status LED configuration missing # error Status LED configuration missing
#endif #endif
......
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