cmd_led.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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. #include <common.h>
  29. #include <config.h>
  30. #include <command.h>
  31. #include <status_led.h>
  32. struct led_tbl_s {
  33. char *string; /* String for use in the command */
  34. led_id_t mask; /* Mask used for calling __led_set() */
  35. void (*off)(void); /* Optional function for turning LED off */
  36. void (*on)(void); /* Optional function for turning LED on */
  37. void (*toggle)(void);/* Optional function for toggling LED */
  38. };
  39. typedef struct led_tbl_s led_tbl_t;
  40. static const led_tbl_t led_commands[] = {
  41. #ifdef CONFIG_BOARD_SPECIFIC_LED
  42. #ifdef STATUS_LED_BIT
  43. { "0", STATUS_LED_BIT, NULL, NULL, NULL },
  44. #endif
  45. #ifdef STATUS_LED_BIT1
  46. { "1", STATUS_LED_BIT1, NULL, NULL, NULL },
  47. #endif
  48. #ifdef STATUS_LED_BIT2
  49. { "2", STATUS_LED_BIT2, NULL, NULL, NULL },
  50. #endif
  51. #ifdef STATUS_LED_BIT3
  52. { "3", STATUS_LED_BIT3, NULL, NULL, NULL },
  53. #endif
  54. #endif
  55. #ifdef STATUS_LED_GREEN
  56. { "green", STATUS_LED_GREEN, green_led_off, green_led_on, NULL },
  57. #endif
  58. #ifdef STATUS_LED_YELLOW
  59. { "yellow", STATUS_LED_YELLOW, yellow_led_off, yellow_led_on, NULL },
  60. #endif
  61. #ifdef STATUS_LED_RED
  62. { "red", STATUS_LED_RED, red_led_off, red_led_on, NULL },
  63. #endif
  64. #ifdef STATUS_LED_BLUE
  65. { "blue", STATUS_LED_BLUE, blue_led_off, blue_led_on, NULL },
  66. #endif
  67. { NULL, 0, NULL, NULL, NULL }
  68. };
  69. enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE };
  70. enum led_cmd get_led_cmd(char *var)
  71. {
  72. if (strcmp(var, "off") == 0) {
  73. return LED_OFF;
  74. }
  75. if (strcmp(var, "on") == 0) {
  76. return LED_ON;
  77. }
  78. if (strcmp(var, "toggle") == 0)
  79. return LED_TOGGLE;
  80. return -1;
  81. }
  82. int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  83. {
  84. int i, match = 0;
  85. enum led_cmd cmd;
  86. /* Validate arguments */
  87. if ((argc != 3)) {
  88. return CMD_RET_USAGE;
  89. }
  90. cmd = get_led_cmd(argv[2]);
  91. if (cmd < 0) {
  92. return CMD_RET_USAGE;
  93. }
  94. for (i = 0; led_commands[i].string; i++) {
  95. if ((strcmp("all", argv[1]) == 0) ||
  96. (strcmp(led_commands[i].string, argv[1]) == 0)) {
  97. match = 1;
  98. switch (cmd) {
  99. case LED_ON:
  100. if (led_commands[i].on)
  101. led_commands[i].on();
  102. else
  103. __led_set(led_commands[i].mask,
  104. STATUS_LED_ON);
  105. break;
  106. case LED_OFF:
  107. if (led_commands[i].off)
  108. led_commands[i].off();
  109. else
  110. __led_set(led_commands[i].mask,
  111. STATUS_LED_OFF);
  112. break;
  113. case LED_TOGGLE:
  114. if (led_commands[i].toggle)
  115. led_commands[i].toggle();
  116. else
  117. __led_toggle(led_commands[i].mask);
  118. }
  119. /* Need to set only 1 led if led_name wasn't 'all' */
  120. if (strcmp("all", argv[1]) != 0)
  121. break;
  122. }
  123. }
  124. /* If we ran out of matches, print Usage */
  125. if (!match) {
  126. return CMD_RET_USAGE;
  127. }
  128. return 0;
  129. }
  130. U_BOOT_CMD(
  131. led, 3, 1, do_led,
  132. "["
  133. #ifdef CONFIG_BOARD_SPECIFIC_LED
  134. #ifdef STATUS_LED_BIT
  135. "0|"
  136. #endif
  137. #ifdef STATUS_LED_BIT1
  138. "1|"
  139. #endif
  140. #ifdef STATUS_LED_BIT2
  141. "2|"
  142. #endif
  143. #ifdef STATUS_LED_BIT3
  144. "3|"
  145. #endif
  146. #endif
  147. #ifdef STATUS_LED_GREEN
  148. "green|"
  149. #endif
  150. #ifdef STATUS_LED_YELLOW
  151. "yellow|"
  152. #endif
  153. #ifdef STATUS_LED_RED
  154. "red|"
  155. #endif
  156. #ifdef STATUS_LED_BLUE
  157. "blue|"
  158. #endif
  159. "all] [on|off|toggle]",
  160. "[led_name] [on|off|toggle] sets or clears led(s)"
  161. );