]>
Commit | Line | Data |
---|---|---|
b633f66f JK |
1 | /* |
2 | * (C) Copyright 2010 | |
3 | * Jason Kridner <jkridner@beagleboard.org> | |
4 | * | |
5 | * Based on cmd_led.c patch from: | |
6 | * http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html | |
7 | * (C) Copyright 2008 | |
8 | * Ulf Samuelsson <ulf.samuelsson@atmel.com> | |
9 | * | |
10 | * See file CREDITS for list of people who contributed to this | |
11 | * project. | |
12 | * | |
13 | * This program is free software; you can redistribute it and/or | |
14 | * modify it under the terms of the GNU General Public License as | |
15 | * published by the Free Software Foundation; either version 2 of | |
16 | * the License, or (at your option) any later version. | |
17 | * | |
18 | * This program is distributed in the hope that it will be useful, | |
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 | * GNU General Public License for more details. | |
22 | * | |
23 | * You should have received a copy of the GNU General Public License | |
24 | * along with this program; if not, write to the Free Software | |
25 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
26 | * MA 02111-1307 USA | |
27 | */ | |
28 | ||
29 | #include <common.h> | |
30 | #include <config.h> | |
31 | #include <command.h> | |
32 | #include <status_led.h> | |
33 | ||
34 | struct led_tbl_s { | |
35 | char *string; /* String for use in the command */ | |
36 | led_id_t mask; /* Mask used for calling __led_set() */ | |
4086b51c JK |
37 | void (*off)(void); /* Optional function for turning LED off */ |
38 | void (*on)(void); /* Optional function for turning LED on */ | |
b8bc8973 | 39 | void (*toggle)(void);/* Optional function for toggling LED */ |
b633f66f JK |
40 | }; |
41 | ||
42 | typedef struct led_tbl_s led_tbl_t; | |
43 | ||
44 | static const led_tbl_t led_commands[] = { | |
45 | #ifdef CONFIG_BOARD_SPECIFIC_LED | |
46 | #ifdef STATUS_LED_BIT | |
b8bc8973 | 47 | { "0", STATUS_LED_BIT, NULL, NULL, NULL }, |
b633f66f JK |
48 | #endif |
49 | #ifdef STATUS_LED_BIT1 | |
b8bc8973 | 50 | { "1", STATUS_LED_BIT1, NULL, NULL, NULL }, |
b633f66f JK |
51 | #endif |
52 | #ifdef STATUS_LED_BIT2 | |
b8bc8973 | 53 | { "2", STATUS_LED_BIT2, NULL, NULL, NULL }, |
b633f66f JK |
54 | #endif |
55 | #ifdef STATUS_LED_BIT3 | |
b8bc8973 | 56 | { "3", STATUS_LED_BIT3, NULL, NULL, NULL }, |
b633f66f JK |
57 | #endif |
58 | #endif | |
59 | #ifdef STATUS_LED_GREEN | |
2d3be7c4 | 60 | { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL }, |
b633f66f JK |
61 | #endif |
62 | #ifdef STATUS_LED_YELLOW | |
2d3be7c4 | 63 | { "yellow", STATUS_LED_YELLOW, yellow_led_off, yellow_led_on, NULL }, |
b633f66f JK |
64 | #endif |
65 | #ifdef STATUS_LED_RED | |
2d3be7c4 | 66 | { "red", STATUS_LED_RED, red_led_off, red_led_on, NULL }, |
b633f66f JK |
67 | #endif |
68 | #ifdef STATUS_LED_BLUE | |
2d3be7c4 | 69 | { "blue", STATUS_LED_BLUE, blue_led_off, blue_led_on, NULL }, |
b633f66f | 70 | #endif |
b8bc8973 | 71 | { NULL, 0, NULL, NULL, NULL } |
b633f66f JK |
72 | }; |
73 | ||
b8bc8973 JF |
74 | enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE }; |
75 | ||
76 | enum led_cmd get_led_cmd(char *var) | |
b633f66f JK |
77 | { |
78 | if (strcmp(var, "off") == 0) { | |
b8bc8973 | 79 | return LED_OFF; |
b633f66f JK |
80 | } |
81 | if (strcmp(var, "on") == 0) { | |
b8bc8973 | 82 | return LED_ON; |
b633f66f | 83 | } |
b8bc8973 JF |
84 | if (strcmp(var, "toggle") == 0) |
85 | return LED_TOGGLE; | |
b633f66f JK |
86 | return -1; |
87 | } | |
88 | ||
89 | int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) | |
90 | { | |
b8bc8973 JF |
91 | int i, match = 0; |
92 | enum led_cmd cmd; | |
b633f66f JK |
93 | |
94 | /* Validate arguments */ | |
95 | if ((argc != 3)) { | |
4c12eeb8 | 96 | return CMD_RET_USAGE; |
b633f66f JK |
97 | } |
98 | ||
b8bc8973 JF |
99 | cmd = get_led_cmd(argv[2]); |
100 | if (cmd < 0) { | |
4c12eeb8 | 101 | return CMD_RET_USAGE; |
b633f66f JK |
102 | } |
103 | ||
104 | for (i = 0; led_commands[i].string; i++) { | |
cd6881b5 | 105 | if ((strcmp("all", argv[1]) == 0) || |
b633f66f | 106 | (strcmp(led_commands[i].string, argv[1]) == 0)) { |
b8bc8973 JF |
107 | match = 1; |
108 | switch (cmd) { | |
109 | case LED_ON: | |
110 | if (led_commands[i].on) | |
b633f66f | 111 | led_commands[i].on(); |
b8bc8973 | 112 | else |
af73034c OS |
113 | __led_set(led_commands[i].mask, |
114 | STATUS_LED_ON); | |
b8bc8973 JF |
115 | break; |
116 | case LED_OFF: | |
117 | if (led_commands[i].off) | |
b633f66f | 118 | led_commands[i].off(); |
b8bc8973 | 119 | else |
af73034c OS |
120 | __led_set(led_commands[i].mask, |
121 | STATUS_LED_OFF); | |
b8bc8973 JF |
122 | break; |
123 | case LED_TOGGLE: | |
124 | if (led_commands[i].toggle) | |
125 | led_commands[i].toggle(); | |
126 | else | |
127 | __led_toggle(led_commands[i].mask); | |
b633f66f | 128 | } |
d604cda3 JF |
129 | /* Need to set only 1 led if led_name wasn't 'all' */ |
130 | if (strcmp("all", argv[1]) != 0) | |
131 | break; | |
b633f66f JK |
132 | } |
133 | } | |
134 | ||
135 | /* If we ran out of matches, print Usage */ | |
95492d78 | 136 | if (!match) { |
4c12eeb8 | 137 | return CMD_RET_USAGE; |
b633f66f JK |
138 | } |
139 | ||
140 | return 0; | |
141 | } | |
142 | ||
143 | U_BOOT_CMD( | |
144 | led, 3, 1, do_led, | |
d4b901dd | 145 | "[" |
b633f66f JK |
146 | #ifdef CONFIG_BOARD_SPECIFIC_LED |
147 | #ifdef STATUS_LED_BIT | |
148 | "0|" | |
149 | #endif | |
150 | #ifdef STATUS_LED_BIT1 | |
151 | "1|" | |
152 | #endif | |
153 | #ifdef STATUS_LED_BIT2 | |
154 | "2|" | |
155 | #endif | |
156 | #ifdef STATUS_LED_BIT3 | |
157 | "3|" | |
158 | #endif | |
159 | #endif | |
160 | #ifdef STATUS_LED_GREEN | |
161 | "green|" | |
162 | #endif | |
163 | #ifdef STATUS_LED_YELLOW | |
164 | "yellow|" | |
165 | #endif | |
166 | #ifdef STATUS_LED_RED | |
167 | "red|" | |
168 | #endif | |
169 | #ifdef STATUS_LED_BLUE | |
170 | "blue|" | |
171 | #endif | |
d4b901dd RD |
172 | "all] [on|off|toggle]", |
173 | "[led_name] [on|off|toggle] sets or clears led(s)" | |
b633f66f | 174 | ); |