1*a89c3a04SSimon Glass /* 2*a89c3a04SSimon Glass * (C) Copyright 2010 3*a89c3a04SSimon Glass * Jason Kridner <jkridner@beagleboard.org> 4*a89c3a04SSimon Glass * 5*a89c3a04SSimon Glass * Based on cmd_led.c patch from: 6*a89c3a04SSimon Glass * http://www.mail-archive.com/u-boot@lists.denx.de/msg06873.html 7*a89c3a04SSimon Glass * (C) Copyright 2008 8*a89c3a04SSimon Glass * Ulf Samuelsson <ulf.samuelsson@atmel.com> 9*a89c3a04SSimon Glass * 10*a89c3a04SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 11*a89c3a04SSimon Glass */ 12*a89c3a04SSimon Glass 13*a89c3a04SSimon Glass #include <common.h> 14*a89c3a04SSimon Glass #include <config.h> 15*a89c3a04SSimon Glass #include <command.h> 16*a89c3a04SSimon Glass #include <status_led.h> 17*a89c3a04SSimon Glass 18*a89c3a04SSimon Glass struct led_tbl_s { 19*a89c3a04SSimon Glass char *string; /* String for use in the command */ 20*a89c3a04SSimon Glass led_id_t mask; /* Mask used for calling __led_set() */ 21*a89c3a04SSimon Glass void (*off)(void); /* Optional function for turning LED off */ 22*a89c3a04SSimon Glass void (*on)(void); /* Optional function for turning LED on */ 23*a89c3a04SSimon Glass void (*toggle)(void);/* Optional function for toggling LED */ 24*a89c3a04SSimon Glass }; 25*a89c3a04SSimon Glass 26*a89c3a04SSimon Glass typedef struct led_tbl_s led_tbl_t; 27*a89c3a04SSimon Glass 28*a89c3a04SSimon Glass static const led_tbl_t led_commands[] = { 29*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC 30*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS0 31*a89c3a04SSimon Glass { "0", CONFIG_LED_STATUS_BIT, NULL, NULL, NULL }, 32*a89c3a04SSimon Glass #endif 33*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS1 34*a89c3a04SSimon Glass { "1", CONFIG_LED_STATUS_BIT1, NULL, NULL, NULL }, 35*a89c3a04SSimon Glass #endif 36*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS2 37*a89c3a04SSimon Glass { "2", CONFIG_LED_STATUS_BIT2, NULL, NULL, NULL }, 38*a89c3a04SSimon Glass #endif 39*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS3 40*a89c3a04SSimon Glass { "3", CONFIG_LED_STATUS_BIT3, NULL, NULL, NULL }, 41*a89c3a04SSimon Glass #endif 42*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS4 43*a89c3a04SSimon Glass { "4", CONFIG_LED_STATUS_BIT4, NULL, NULL, NULL }, 44*a89c3a04SSimon Glass #endif 45*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS5 46*a89c3a04SSimon Glass { "5", CONFIG_LED_STATUS_BIT5, NULL, NULL, NULL }, 47*a89c3a04SSimon Glass #endif 48*a89c3a04SSimon Glass #endif 49*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_GREEN 50*a89c3a04SSimon Glass { "green", CONFIG_LED_STATUS_GREEN, green_led_off, green_led_on, NULL }, 51*a89c3a04SSimon Glass #endif 52*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_YELLOW 53*a89c3a04SSimon Glass { "yellow", CONFIG_LED_STATUS_YELLOW, yellow_led_off, yellow_led_on, 54*a89c3a04SSimon Glass NULL }, 55*a89c3a04SSimon Glass #endif 56*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_RED 57*a89c3a04SSimon Glass { "red", CONFIG_LED_STATUS_RED, red_led_off, red_led_on, NULL }, 58*a89c3a04SSimon Glass #endif 59*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_BLUE 60*a89c3a04SSimon Glass { "blue", CONFIG_LED_STATUS_BLUE, blue_led_off, blue_led_on, NULL }, 61*a89c3a04SSimon Glass #endif 62*a89c3a04SSimon Glass { NULL, 0, NULL, NULL, NULL } 63*a89c3a04SSimon Glass }; 64*a89c3a04SSimon Glass 65*a89c3a04SSimon Glass enum led_cmd { LED_ON, LED_OFF, LED_TOGGLE, LED_BLINK }; 66*a89c3a04SSimon Glass 67*a89c3a04SSimon Glass enum led_cmd get_led_cmd(char *var) 68*a89c3a04SSimon Glass { 69*a89c3a04SSimon Glass if (strcmp(var, "off") == 0) 70*a89c3a04SSimon Glass return LED_OFF; 71*a89c3a04SSimon Glass if (strcmp(var, "on") == 0) 72*a89c3a04SSimon Glass return LED_ON; 73*a89c3a04SSimon Glass if (strcmp(var, "toggle") == 0) 74*a89c3a04SSimon Glass return LED_TOGGLE; 75*a89c3a04SSimon Glass if (strcmp(var, "blink") == 0) 76*a89c3a04SSimon Glass return LED_BLINK; 77*a89c3a04SSimon Glass 78*a89c3a04SSimon Glass return -1; 79*a89c3a04SSimon Glass } 80*a89c3a04SSimon Glass 81*a89c3a04SSimon Glass /* 82*a89c3a04SSimon Glass * LED drivers providing a blinking LED functionality, like the 83*a89c3a04SSimon Glass * PCA9551, can override this empty weak function 84*a89c3a04SSimon Glass */ 85*a89c3a04SSimon Glass void __weak __led_blink(led_id_t mask, int freq) 86*a89c3a04SSimon Glass { 87*a89c3a04SSimon Glass } 88*a89c3a04SSimon Glass 89*a89c3a04SSimon Glass int do_led (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 90*a89c3a04SSimon Glass { 91*a89c3a04SSimon Glass int i, match = 0; 92*a89c3a04SSimon Glass enum led_cmd cmd; 93*a89c3a04SSimon Glass int freq; 94*a89c3a04SSimon Glass 95*a89c3a04SSimon Glass /* Validate arguments */ 96*a89c3a04SSimon Glass if ((argc < 3) || (argc > 4)) 97*a89c3a04SSimon Glass return CMD_RET_USAGE; 98*a89c3a04SSimon Glass 99*a89c3a04SSimon Glass cmd = get_led_cmd(argv[2]); 100*a89c3a04SSimon Glass if (cmd < 0) { 101*a89c3a04SSimon Glass return CMD_RET_USAGE; 102*a89c3a04SSimon Glass } 103*a89c3a04SSimon Glass 104*a89c3a04SSimon Glass for (i = 0; led_commands[i].string; i++) { 105*a89c3a04SSimon Glass if ((strcmp("all", argv[1]) == 0) || 106*a89c3a04SSimon Glass (strcmp(led_commands[i].string, argv[1]) == 0)) { 107*a89c3a04SSimon Glass match = 1; 108*a89c3a04SSimon Glass switch (cmd) { 109*a89c3a04SSimon Glass case LED_ON: 110*a89c3a04SSimon Glass if (led_commands[i].on) 111*a89c3a04SSimon Glass led_commands[i].on(); 112*a89c3a04SSimon Glass else 113*a89c3a04SSimon Glass __led_set(led_commands[i].mask, 114*a89c3a04SSimon Glass CONFIG_LED_STATUS_ON); 115*a89c3a04SSimon Glass break; 116*a89c3a04SSimon Glass case LED_OFF: 117*a89c3a04SSimon Glass if (led_commands[i].off) 118*a89c3a04SSimon Glass led_commands[i].off(); 119*a89c3a04SSimon Glass else 120*a89c3a04SSimon Glass __led_set(led_commands[i].mask, 121*a89c3a04SSimon Glass CONFIG_LED_STATUS_OFF); 122*a89c3a04SSimon Glass break; 123*a89c3a04SSimon Glass case LED_TOGGLE: 124*a89c3a04SSimon Glass if (led_commands[i].toggle) 125*a89c3a04SSimon Glass led_commands[i].toggle(); 126*a89c3a04SSimon Glass else 127*a89c3a04SSimon Glass __led_toggle(led_commands[i].mask); 128*a89c3a04SSimon Glass break; 129*a89c3a04SSimon Glass case LED_BLINK: 130*a89c3a04SSimon Glass if (argc != 4) 131*a89c3a04SSimon Glass return CMD_RET_USAGE; 132*a89c3a04SSimon Glass 133*a89c3a04SSimon Glass freq = simple_strtoul(argv[3], NULL, 10); 134*a89c3a04SSimon Glass __led_blink(led_commands[i].mask, freq); 135*a89c3a04SSimon Glass } 136*a89c3a04SSimon Glass /* Need to set only 1 led if led_name wasn't 'all' */ 137*a89c3a04SSimon Glass if (strcmp("all", argv[1]) != 0) 138*a89c3a04SSimon Glass break; 139*a89c3a04SSimon Glass } 140*a89c3a04SSimon Glass } 141*a89c3a04SSimon Glass 142*a89c3a04SSimon Glass /* If we ran out of matches, print Usage */ 143*a89c3a04SSimon Glass if (!match) { 144*a89c3a04SSimon Glass return CMD_RET_USAGE; 145*a89c3a04SSimon Glass } 146*a89c3a04SSimon Glass 147*a89c3a04SSimon Glass return 0; 148*a89c3a04SSimon Glass } 149*a89c3a04SSimon Glass 150*a89c3a04SSimon Glass U_BOOT_CMD( 151*a89c3a04SSimon Glass led, 4, 1, do_led, 152*a89c3a04SSimon Glass "[" 153*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_BOARD_SPECIFIC 154*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS0 155*a89c3a04SSimon Glass "0|" 156*a89c3a04SSimon Glass #endif 157*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS1 158*a89c3a04SSimon Glass "1|" 159*a89c3a04SSimon Glass #endif 160*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS2 161*a89c3a04SSimon Glass "2|" 162*a89c3a04SSimon Glass #endif 163*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS3 164*a89c3a04SSimon Glass "3|" 165*a89c3a04SSimon Glass #endif 166*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS4 167*a89c3a04SSimon Glass "4|" 168*a89c3a04SSimon Glass #endif 169*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS5 170*a89c3a04SSimon Glass "5|" 171*a89c3a04SSimon Glass #endif 172*a89c3a04SSimon Glass #endif 173*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_GREEN 174*a89c3a04SSimon Glass "green|" 175*a89c3a04SSimon Glass #endif 176*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_YELLOW 177*a89c3a04SSimon Glass "yellow|" 178*a89c3a04SSimon Glass #endif 179*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_RED 180*a89c3a04SSimon Glass "red|" 181*a89c3a04SSimon Glass #endif 182*a89c3a04SSimon Glass #ifdef CONFIG_LED_STATUS_BLUE 183*a89c3a04SSimon Glass "blue|" 184*a89c3a04SSimon Glass #endif 185*a89c3a04SSimon Glass "all] [on|off|toggle|blink] [blink-freq in ms]", 186*a89c3a04SSimon Glass "[led_name] [on|off|toggle|blink] sets or clears led(s)" 187*a89c3a04SSimon Glass ); 188