Blame view

common/cmd_led.c 3.26 KB
b633f66f0   Jason Kridner   Add 'led' command
1
2
3
4
5
6
7
8
9
  /*
   * (C) Copyright 2010
   * Jason Kridner <jkridner@beagleboard.org>
   *
   * Based on cmd_led.c patch from:
   * http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html
   * (C) Copyright 2008
   * Ulf Samuelsson <ulf.samuelsson@atmel.com>
   *
3765b3e7b   Wolfgang Denk   Coding Style clea...
10
   * SPDX-License-Identifier:	GPL-2.0+
b633f66f0   Jason Kridner   Add 'led' command
11
12
13
14
15
16
17
18
19
20
   */
  
  #include <common.h>
  #include <config.h>
  #include <command.h>
  #include <status_led.h>
  
  struct led_tbl_s {
  	char		*string;	/* String for use in the command */
  	led_id_t	mask;		/* Mask used for calling __led_set() */
4086b51cb   Jason Kridner   led: correct off/...
21
22
  	void		(*off)(void);	/* Optional function for turning LED off */
  	void		(*on)(void);	/* Optional function for turning LED on */
b8bc8973a   Joel A Fernandes   led: Remove state...
23
  	void		(*toggle)(void);/* Optional function for toggling LED */
b633f66f0   Jason Kridner   Add 'led' command
24
25
26
27
28
29
30
  };
  
  typedef struct led_tbl_s led_tbl_t;
  
  static const led_tbl_t led_commands[] = {
  #ifdef CONFIG_BOARD_SPECIFIC_LED
  #ifdef STATUS_LED_BIT
b8bc8973a   Joel A Fernandes   led: Remove state...
31
  	{ "0", STATUS_LED_BIT, NULL, NULL, NULL },
b633f66f0   Jason Kridner   Add 'led' command
32
33
  #endif
  #ifdef STATUS_LED_BIT1
b8bc8973a   Joel A Fernandes   led: Remove state...
34
  	{ "1", STATUS_LED_BIT1, NULL, NULL, NULL },
b633f66f0   Jason Kridner   Add 'led' command
35
36
  #endif
  #ifdef STATUS_LED_BIT2
b8bc8973a   Joel A Fernandes   led: Remove state...
37
  	{ "2", STATUS_LED_BIT2, NULL, NULL, NULL },
b633f66f0   Jason Kridner   Add 'led' command
38
39
  #endif
  #ifdef STATUS_LED_BIT3
b8bc8973a   Joel A Fernandes   led: Remove state...
40
  	{ "3", STATUS_LED_BIT3, NULL, NULL, NULL },
b633f66f0   Jason Kridner   Add 'led' command
41
42
43
  #endif
  #endif
  #ifdef STATUS_LED_GREEN
2d3be7c45   Jason Kridner   led: remove camel...
44
  	{ "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
b633f66f0   Jason Kridner   Add 'led' command
45
46
  #endif
  #ifdef STATUS_LED_YELLOW
2d3be7c45   Jason Kridner   led: remove camel...
47
  	{ "yellow", STATUS_LED_YELLOW, yellow_led_off, yellow_led_on, NULL },
b633f66f0   Jason Kridner   Add 'led' command
48
49
  #endif
  #ifdef STATUS_LED_RED
2d3be7c45   Jason Kridner   led: remove camel...
50
  	{ "red", STATUS_LED_RED, red_led_off, red_led_on, NULL },
b633f66f0   Jason Kridner   Add 'led' command
51
52
  #endif
  #ifdef STATUS_LED_BLUE
2d3be7c45   Jason Kridner   led: remove camel...
53
  	{ "blue", STATUS_LED_BLUE, blue_led_off, blue_led_on, NULL },
b633f66f0   Jason Kridner   Add 'led' command
54
  #endif
b8bc8973a   Joel A Fernandes   led: Remove state...
55
  	{ NULL, 0, NULL, NULL, NULL }
b633f66f0   Jason Kridner   Add 'led' command
56
  };
b8bc8973a   Joel A Fernandes   led: Remove state...
57
58
59
  enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE };
  
  enum led_cmd get_led_cmd(char *var)
b633f66f0   Jason Kridner   Add 'led' command
60
61
  {
  	if (strcmp(var, "off") == 0) {
b8bc8973a   Joel A Fernandes   led: Remove state...
62
  		return LED_OFF;
b633f66f0   Jason Kridner   Add 'led' command
63
64
  	}
  	if (strcmp(var, "on") == 0) {
b8bc8973a   Joel A Fernandes   led: Remove state...
65
  		return LED_ON;
b633f66f0   Jason Kridner   Add 'led' command
66
  	}
b8bc8973a   Joel A Fernandes   led: Remove state...
67
68
  	if (strcmp(var, "toggle") == 0)
  		return LED_TOGGLE;
b633f66f0   Jason Kridner   Add 'led' command
69
70
71
72
73
  	return -1;
  }
  
  int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  {
b8bc8973a   Joel A Fernandes   led: Remove state...
74
75
  	int i, match = 0;
  	enum led_cmd cmd;
b633f66f0   Jason Kridner   Add 'led' command
76
77
78
  
  	/* Validate arguments */
  	if ((argc != 3)) {
4c12eeb8b   Simon Glass   Convert cmd_usage...
79
  		return CMD_RET_USAGE;
b633f66f0   Jason Kridner   Add 'led' command
80
  	}
b8bc8973a   Joel A Fernandes   led: Remove state...
81
82
  	cmd = get_led_cmd(argv[2]);
  	if (cmd < 0) {
4c12eeb8b   Simon Glass   Convert cmd_usage...
83
  		return CMD_RET_USAGE;
b633f66f0   Jason Kridner   Add 'led' command
84
85
86
  	}
  
  	for (i = 0; led_commands[i].string; i++) {
cd6881b51   Wolfgang Denk   Minor coding styl...
87
  		if ((strcmp("all", argv[1]) == 0) ||
b633f66f0   Jason Kridner   Add 'led' command
88
  		    (strcmp(led_commands[i].string, argv[1]) == 0)) {
b8bc8973a   Joel A Fernandes   led: Remove state...
89
90
91
92
  			match = 1;
  			switch (cmd) {
  			case LED_ON:
  				if (led_commands[i].on)
b633f66f0   Jason Kridner   Add 'led' command
93
  					led_commands[i].on();
b8bc8973a   Joel A Fernandes   led: Remove state...
94
  				else
af73034c6   Otavio Salvador   led: Use STATUS_L...
95
96
  					__led_set(led_commands[i].mask,
  							  STATUS_LED_ON);
b8bc8973a   Joel A Fernandes   led: Remove state...
97
98
99
  				break;
  			case LED_OFF:
  				if (led_commands[i].off)
b633f66f0   Jason Kridner   Add 'led' command
100
  					led_commands[i].off();
b8bc8973a   Joel A Fernandes   led: Remove state...
101
  				else
af73034c6   Otavio Salvador   led: Use STATUS_L...
102
103
  					__led_set(led_commands[i].mask,
  							  STATUS_LED_OFF);
b8bc8973a   Joel A Fernandes   led: Remove state...
104
105
106
107
108
109
  				break;
  			case LED_TOGGLE:
  				if (led_commands[i].toggle)
  					led_commands[i].toggle();
  				else
  					__led_toggle(led_commands[i].mask);
b633f66f0   Jason Kridner   Add 'led' command
110
  			}
d604cda34   Joel A Fernandes   led: Fixed settin...
111
112
113
  			/* Need to set only 1 led if led_name wasn't 'all' */
  			if (strcmp("all", argv[1]) != 0)
  				break;
b633f66f0   Jason Kridner   Add 'led' command
114
115
116
117
  		}
  	}
  
  	/* If we ran out of matches, print Usage */
95492d784   Jason Kridner   Corrected LED nam...
118
  	if (!match) {
4c12eeb8b   Simon Glass   Convert cmd_usage...
119
  		return CMD_RET_USAGE;
b633f66f0   Jason Kridner   Add 'led' command
120
121
122
123
124
125
126
  	}
  
  	return 0;
  }
  
  U_BOOT_CMD(
  	led, 3, 1, do_led,
d4b901dd7   Robert P. J. Day   cmd_led.c: Standa...
127
  	"["
b633f66f0   Jason Kridner   Add 'led' command
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  #ifdef CONFIG_BOARD_SPECIFIC_LED
  #ifdef STATUS_LED_BIT
  	"0|"
  #endif
  #ifdef STATUS_LED_BIT1
  	"1|"
  #endif
  #ifdef STATUS_LED_BIT2
  	"2|"
  #endif
  #ifdef STATUS_LED_BIT3
  	"3|"
  #endif
  #endif
  #ifdef STATUS_LED_GREEN
  	"green|"
  #endif
  #ifdef STATUS_LED_YELLOW
  	"yellow|"
  #endif
  #ifdef STATUS_LED_RED
  	"red|"
  #endif
  #ifdef STATUS_LED_BLUE
  	"blue|"
  #endif
d4b901dd7   Robert P. J. Day   cmd_led.c: Standa...
154
155
  	"all] [on|off|toggle]",
  	"[led_name] [on|off|toggle] sets or clears led(s)"
b633f66f0   Jason Kridner   Add 'led' command
156
  );