summaryrefslogtreecommitdiffstats
path: root/commands/trigger.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2017-03-13 10:33:39 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2017-03-30 08:23:20 +0200
commit7dd8ae82311daa9ee22ffc762ea158c3977fb20c (patch)
treea4730bd86f490b0f02b1fa5cccc242923357a995 /commands/trigger.c
parentebc5ed5310b2aadbd6b1f1d914dce8639b759a7d (diff)
downloadbarebox-7dd8ae82311daa9ee22ffc762ea158c3977fb20c.tar.gz
barebox-7dd8ae82311daa9ee22ffc762ea158c3977fb20c.tar.xz
led-trigger: Allow multiple led triggers of the same type
We used to have a static array of trigger types which, allows only one led per trigger. While this is enough for panic and heartbeat, it falls short when multiple leds are associated to the default-on trigger. The default-on trigger is used to turn on a led statically from devicetree and may be used multiple times. This patch reworks the led triggers so that a trigger struct is allocated dynamically when needed and put onto a list. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/trigger.c')
-rw-r--r--commands/trigger.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/commands/trigger.c b/commands/trigger.c
index 2758ce74e8..0dd3b346fa 100644
--- a/commands/trigger.c
+++ b/commands/trigger.c
@@ -28,59 +28,62 @@
#define LED_COMMAND_SHOW_INFO 2
#define LED_COMMAND_DISABLE_TRIGGER 3
-static char *trigger_names[] = {
- [LED_TRIGGER_PANIC] = "panic",
- [LED_TRIGGER_HEARTBEAT] = "heartbeat",
- [LED_TRIGGER_NET_RX] = "net rx",
- [LED_TRIGGER_NET_TX] = "net tx",
- [LED_TRIGGER_NET_TXRX] = "net",
- [LED_TRIGGER_DEFAULT_ON] = "default on",
-};
static int do_trigger(int argc, char *argv[])
{
- struct led *led;
- int i, opt, ret = 0;
+ struct led *led = NULL;
+ int opt, ret = 0;
int cmd = LED_COMMAND_SHOW_INFO;
- unsigned long trigger = 0;
+ enum led_trigger trigger;
+ const char *led_name = NULL;
+ const char *trigger_name = NULL;
while((opt = getopt(argc, argv, "t:d:")) > 0) {
switch(opt) {
case 't':
- trigger = simple_strtoul(optarg, NULL, 0);
+ trigger_name = optarg;
cmd = LED_COMMAND_SET_TRIGGER;
break;
case 'd':
- trigger = simple_strtoul(optarg, NULL, 0);
+ led_name = optarg;
cmd = LED_COMMAND_DISABLE_TRIGGER;
}
}
+ if (optind < argc)
+ led = led_by_name_or_number(argv[optind]);
+
switch (cmd) {
case LED_COMMAND_SHOW_INFO:
- for (i = 0; i < LED_TRIGGER_MAX; i++) {
- int led = led_get_trigger(i);
- printf("%d: %s", i, trigger_names[i]);
- if (led >= 0)
- printf(" (led %d)", led);
- printf("\n");
- }
+ led_triggers_show_info();
break;
case LED_COMMAND_DISABLE_TRIGGER:
- ret = led_set_trigger(trigger, NULL);
+ led = led_by_name_or_number(led_name);
+ if (!led) {
+ printf("no such led: %s\n", led_name);
+ return 1;
+ }
+
+ led_trigger_disable(led);
break;
case LED_COMMAND_SET_TRIGGER:
if (argc - optind != 1)
return COMMAND_ERROR_USAGE;
- led = led_by_name_or_number(argv[optind]);
+ led = led_by_name_or_number(argv[optind]);
if (!led) {
printf("no such led: %s\n", argv[optind]);
return 1;
}
+ trigger = trigger_by_name(trigger_name);
+ if (trigger == LED_TRIGGER_INVALID) {
+ printf("no such trigger: %s\n", trigger_name);
+ return 1;
+ }
+
ret = led_set_trigger(trigger, led);
break;
}
@@ -92,16 +95,17 @@ static int do_trigger(int argc, char *argv[])
BAREBOX_CMD_HELP_START(trigger)
BAREBOX_CMD_HELP_TEXT("Control a LED trigger. Without options assigned triggers are shown.")
+BAREBOX_CMD_HELP_TEXT("triggers are given with their name, LEDs are given with their name or number")
BAREBOX_CMD_HELP_TEXT("")
BAREBOX_CMD_HELP_TEXT("Options:")
-BAREBOX_CMD_HELP_OPT ("-t", "set a trigger (needs LED argument)")
-BAREBOX_CMD_HELP_OPT ("-d", "disable a trigger")
+BAREBOX_CMD_HELP_OPT ("-t <trigger> <led>", "set a trigger")
+BAREBOX_CMD_HELP_OPT ("-d <led>", "disable a trigger")
BAREBOX_CMD_HELP_END
BAREBOX_CMD_START(trigger)
.cmd = do_trigger,
BAREBOX_CMD_DESC("handle LED triggers")
- BAREBOX_CMD_OPTS("[-td] TRIGGER [LED]")
+ BAREBOX_CMD_OPTS("[-td] [LED]")
BAREBOX_CMD_GROUP(CMD_GRP_HWMANIP)
BAREBOX_CMD_HELP(cmd_trigger_help)
BAREBOX_CMD_END