Blame view
cmd/legacy_led.c
4.12 KB
d41ce506b Initial Release, ... |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 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 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 |
/* * (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> * * SPDX-License-Identifier: GPL-2.0+ */ #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() */ void (*off)(void); /* Optional function for turning LED off */ void (*on)(void); /* Optional function for turning LED on */ void (*toggle)(void);/* Optional function for toggling LED */ }; typedef struct led_tbl_s led_tbl_t; static const led_tbl_t led_commands[] = { #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC #ifdef CONFIG_LED_STATUS0 { "0", CONFIG_LED_STATUS_BIT, NULL, NULL, NULL }, #endif #ifdef CONFIG_LED_STATUS1 { "1", CONFIG_LED_STATUS_BIT1, NULL, NULL, NULL }, #endif #ifdef CONFIG_LED_STATUS2 { "2", CONFIG_LED_STATUS_BIT2, NULL, NULL, NULL }, #endif #ifdef CONFIG_LED_STATUS3 { "3", CONFIG_LED_STATUS_BIT3, NULL, NULL, NULL }, #endif #ifdef CONFIG_LED_STATUS4 { "4", CONFIG_LED_STATUS_BIT4, NULL, NULL, NULL }, #endif #ifdef CONFIG_LED_STATUS5 { "5", CONFIG_LED_STATUS_BIT5, NULL, NULL, NULL }, #endif #endif #ifdef CONFIG_LED_STATUS_GREEN { "green", CONFIG_LED_STATUS_GREEN, green_led_off, green_led_on, NULL }, #endif #ifdef CONFIG_LED_STATUS_YELLOW { "yellow", CONFIG_LED_STATUS_YELLOW, yellow_led_off, yellow_led_on, NULL }, #endif #ifdef CONFIG_LED_STATUS_RED { "red", CONFIG_LED_STATUS_RED, red_led_off, red_led_on, NULL }, #endif #ifdef CONFIG_LED_STATUS_BLUE { "blue", CONFIG_LED_STATUS_BLUE, blue_led_off, blue_led_on, NULL }, #endif { NULL, 0, NULL, NULL, NULL } }; enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE, LED_BLINK }; enum led_cmd get_led_cmd(char *var) { if (strcmp(var, "off") == 0) return LED_OFF; if (strcmp(var, "on") == 0) return LED_ON; if (strcmp(var, "toggle") == 0) return LED_TOGGLE; if (strcmp(var, "blink") == 0) return LED_BLINK; return -1; } /* * LED drivers providing a blinking LED functionality, like the * PCA9551, can override this empty weak function */ void __weak __led_blink(led_id_t mask, int freq) { } int do_legacy_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { int i, match = 0; enum led_cmd cmd; int freq; /* Validate arguments */ if ((argc < 3) || (argc > 4)) return CMD_RET_USAGE; cmd = get_led_cmd(argv[2]); if (cmd < 0) { return CMD_RET_USAGE; } for (i = 0; led_commands[i].string; i++) { if ((strcmp("all", argv[1]) == 0) || (strcmp(led_commands[i].string, argv[1]) == 0)) { match = 1; switch (cmd) { case LED_ON: if (led_commands[i].on) led_commands[i].on(); else __led_set(led_commands[i].mask, CONFIG_LED_STATUS_ON); break; case LED_OFF: if (led_commands[i].off) led_commands[i].off(); else __led_set(led_commands[i].mask, CONFIG_LED_STATUS_OFF); break; case LED_TOGGLE: if (led_commands[i].toggle) led_commands[i].toggle(); else __led_toggle(led_commands[i].mask); break; case LED_BLINK: if (argc != 4) return CMD_RET_USAGE; freq = simple_strtoul(argv[3], NULL, 10); __led_blink(led_commands[i].mask, freq); } /* Need to set only 1 led if led_name wasn't 'all' */ if (strcmp("all", argv[1]) != 0) break; } } /* If we ran out of matches, print Usage */ if (!match) { return CMD_RET_USAGE; } return 0; } U_BOOT_CMD( led, 4, 1, do_legacy_led, "[" #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC #ifdef CONFIG_LED_STATUS0 "0|" #endif #ifdef CONFIG_LED_STATUS1 "1|" #endif #ifdef CONFIG_LED_STATUS2 "2|" #endif #ifdef CONFIG_LED_STATUS3 "3|" #endif #ifdef CONFIG_LED_STATUS4 "4|" #endif #ifdef CONFIG_LED_STATUS5 "5|" #endif #endif #ifdef CONFIG_LED_STATUS_GREEN "green|" #endif #ifdef CONFIG_LED_STATUS_YELLOW "yellow|" #endif #ifdef CONFIG_LED_STATUS_RED "red|" #endif #ifdef CONFIG_LED_STATUS_BLUE "blue|" #endif "all] [on|off|toggle|blink] [blink-freq in ms]", "[led_name] [on|off|toggle|blink] sets or clears led(s)" ); |