]>
Commit | Line | Data |
---|---|---|
b633f66f JK |
1 | /* |
2 | * (C) Copyright 2010 | |
3 | * Jason Kridner <[email protected]> | |
4 | * | |
5 | * Based on cmd_led.c patch from: | |
6 | * http://www.mail-archive.com/[email protected]/msg06873.html | |
7 | * (C) Copyright 2008 | |
8 | * Ulf Samuelsson <[email protected]> | |
9 | * | |
1a459660 | 10 | * SPDX-License-Identifier: GPL-2.0+ |
b633f66f JK |
11 | */ |
12 | ||
13 | #include <common.h> | |
14 | #include <config.h> | |
15 | #include <command.h> | |
16 | #include <status_led.h> | |
17 | ||
18 | struct led_tbl_s { | |
19 | char *string; /* String for use in the command */ | |
20 | led_id_t mask; /* Mask used for calling __led_set() */ | |
4086b51c JK |
21 | void (*off)(void); /* Optional function for turning LED off */ |
22 | void (*on)(void); /* Optional function for turning LED on */ | |
b8bc8973 | 23 | void (*toggle)(void);/* Optional function for toggling LED */ |
b633f66f JK |
24 | }; |
25 | ||
26 | typedef struct led_tbl_s led_tbl_t; | |
27 | ||
28 | static const led_tbl_t led_commands[] = { | |
29 | #ifdef CONFIG_BOARD_SPECIFIC_LED | |
30 | #ifdef STATUS_LED_BIT | |
b8bc8973 | 31 | { "0", STATUS_LED_BIT, NULL, NULL, NULL }, |
b633f66f JK |
32 | #endif |
33 | #ifdef STATUS_LED_BIT1 | |
b8bc8973 | 34 | { "1", STATUS_LED_BIT1, NULL, NULL, NULL }, |
b633f66f JK |
35 | #endif |
36 | #ifdef STATUS_LED_BIT2 | |
b8bc8973 | 37 | { "2", STATUS_LED_BIT2, NULL, NULL, NULL }, |
b633f66f JK |
38 | #endif |
39 | #ifdef STATUS_LED_BIT3 | |
b8bc8973 | 40 | { "3", STATUS_LED_BIT3, NULL, NULL, NULL }, |
b633f66f JK |
41 | #endif |
42 | #endif | |
43 | #ifdef STATUS_LED_GREEN | |
2d3be7c4 | 44 | { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL }, |
b633f66f JK |
45 | #endif |
46 | #ifdef STATUS_LED_YELLOW | |
2d3be7c4 | 47 | { "yellow", STATUS_LED_YELLOW, yellow_led_off, yellow_led_on, NULL }, |
b633f66f JK |
48 | #endif |
49 | #ifdef STATUS_LED_RED | |
2d3be7c4 | 50 | { "red", STATUS_LED_RED, red_led_off, red_led_on, NULL }, |
b633f66f JK |
51 | #endif |
52 | #ifdef STATUS_LED_BLUE | |
2d3be7c4 | 53 | { "blue", STATUS_LED_BLUE, blue_led_off, blue_led_on, NULL }, |
b633f66f | 54 | #endif |
b8bc8973 | 55 | { NULL, 0, NULL, NULL, NULL } |
b633f66f JK |
56 | }; |
57 | ||
b8bc8973 JF |
58 | enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE }; |
59 | ||
60 | enum led_cmd get_led_cmd(char *var) | |
b633f66f JK |
61 | { |
62 | if (strcmp(var, "off") == 0) { | |
b8bc8973 | 63 | return LED_OFF; |
b633f66f JK |
64 | } |
65 | if (strcmp(var, "on") == 0) { | |
b8bc8973 | 66 | return LED_ON; |
b633f66f | 67 | } |
b8bc8973 JF |
68 | if (strcmp(var, "toggle") == 0) |
69 | return LED_TOGGLE; | |
b633f66f JK |
70 | return -1; |
71 | } | |
72 | ||
73 | int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | |
74 | { | |
b8bc8973 JF |
75 | int i, match = 0; |
76 | enum led_cmd cmd; | |
b633f66f JK |
77 | |
78 | /* Validate arguments */ | |
79 | if ((argc != 3)) { | |
4c12eeb8 | 80 | return CMD_RET_USAGE; |
b633f66f JK |
81 | } |
82 | ||
b8bc8973 JF |
83 | cmd = get_led_cmd(argv[2]); |
84 | if (cmd < 0) { | |
4c12eeb8 | 85 | return CMD_RET_USAGE; |
b633f66f JK |
86 | } |
87 | ||
88 | for (i = 0; led_commands[i].string; i++) { | |
cd6881b5 | 89 | if ((strcmp("all", argv[1]) == 0) || |
b633f66f | 90 | (strcmp(led_commands[i].string, argv[1]) == 0)) { |
b8bc8973 JF |
91 | match = 1; |
92 | switch (cmd) { | |
93 | case LED_ON: | |
94 | if (led_commands[i].on) | |
b633f66f | 95 | led_commands[i].on(); |
b8bc8973 | 96 | else |
af73034c OS |
97 | __led_set(led_commands[i].mask, |
98 | STATUS_LED_ON); | |
b8bc8973 JF |
99 | break; |
100 | case LED_OFF: | |
101 | if (led_commands[i].off) | |
b633f66f | 102 | led_commands[i].off(); |
b8bc8973 | 103 | else |
af73034c OS |
104 | __led_set(led_commands[i].mask, |
105 | STATUS_LED_OFF); | |
b8bc8973 JF |
106 | break; |
107 | case LED_TOGGLE: | |
108 | if (led_commands[i].toggle) | |
109 | led_commands[i].toggle(); | |
110 | else | |
111 | __led_toggle(led_commands[i].mask); | |
b633f66f | 112 | } |
d604cda3 JF |
113 | /* Need to set only 1 led if led_name wasn't 'all' */ |
114 | if (strcmp("all", argv[1]) != 0) | |
115 | break; | |
b633f66f JK |
116 | } |
117 | } | |
118 | ||
119 | /* If we ran out of matches, print Usage */ | |
95492d78 | 120 | if (!match) { |
4c12eeb8 | 121 | return CMD_RET_USAGE; |
b633f66f JK |
122 | } |
123 | ||
124 | return 0; | |
125 | } | |
126 | ||
127 | U_BOOT_CMD( | |
128 | led, 3, 1, do_led, | |
d4b901dd | 129 | "[" |
b633f66f JK |
130 | #ifdef CONFIG_BOARD_SPECIFIC_LED |
131 | #ifdef STATUS_LED_BIT | |
132 | "0|" | |
133 | #endif | |
134 | #ifdef STATUS_LED_BIT1 | |
135 | "1|" | |
136 | #endif | |
137 | #ifdef STATUS_LED_BIT2 | |
138 | "2|" | |
139 | #endif | |
140 | #ifdef STATUS_LED_BIT3 | |
141 | "3|" | |
142 | #endif | |
143 | #endif | |
144 | #ifdef STATUS_LED_GREEN | |
145 | "green|" | |
146 | #endif | |
147 | #ifdef STATUS_LED_YELLOW | |
148 | "yellow|" | |
149 | #endif | |
150 | #ifdef STATUS_LED_RED | |
151 | "red|" | |
152 | #endif | |
153 | #ifdef STATUS_LED_BLUE | |
154 | "blue|" | |
155 | #endif | |
d4b901dd RD |
156 | "all] [on|off|toggle]", |
157 | "[led_name] [on|off|toggle] sets or clears led(s)" | |
b633f66f | 158 | ); |