mirror of
https://xff.cz/git/u-boot/
synced 2025-09-01 08:42:12 +02:00
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:
@@ -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[] = {
|
|||||||
{ 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[])
|
|||||||
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[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
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(
|
|||||||
#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(
|
|||||||
#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[] = {
|
|||||||
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;
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user