2 * Status LED driver based on GPIO access conventions of Linux
4 * Copyright (C) 2010 Thomas Chou <thomas@wytron.com.tw>
5 * Licensed under the GPL-2 or later.
9 #include <status_led.h>
12 #ifndef CONFIG_GPIO_LED_INVERTED_TABLE
13 #define CONFIG_GPIO_LED_INVERTED_TABLE {}
16 static led_id_t gpio_led_inv
[] = CONFIG_GPIO_LED_INVERTED_TABLE
;
18 static int gpio_led_gpio_value(led_id_t mask
, int state
)
20 int i
, gpio_value
= (state
== CONFIG_LED_STATUS_ON
);
22 for (i
= 0; i
< ARRAY_SIZE(gpio_led_inv
); i
++) {
23 if (gpio_led_inv
[i
] == mask
)
24 gpio_value
= !gpio_value
;
30 void __led_init(led_id_t mask
, int state
)
34 if (gpio_request(mask
, "gpio_led") != 0) {
35 printf("%s: failed requesting GPIO%lu!\n", __func__
, mask
);
39 gpio_value
= gpio_led_gpio_value(mask
, state
);
40 gpio_direction_output(mask
, gpio_value
);
43 void __led_set(led_id_t mask
, int state
)
45 int gpio_value
= gpio_led_gpio_value(mask
, state
);
47 gpio_set_value(mask
, gpio_value
);
50 void __led_toggle(led_id_t mask
)
52 gpio_set_value(mask
, !gpio_get_value(mask
));
55 #ifdef CONFIG_GPIO_LED_STUBS
57 /* 'generic' override of colored LED stubs, to use GPIO functions instead */
59 #ifdef CONFIG_LED_STATUS_RED
62 __led_set(CONFIG_LED_STATUS_RED
, CONFIG_LED_STATUS_ON
);
65 void red_led_off(void)
67 __led_set(CONFIG_LED_STATUS_RED
, CONFIG_LED_STATUS_OFF
);
71 #ifdef CONFIG_LED_STATUS_GREEN
72 void green_led_on(void)
74 __led_set(CONFIG_LED_STATUS_GREEN
, CONFIG_LED_STATUS_ON
);
77 void green_led_off(void)
79 __led_set(CONFIG_LED_STATUS_GREEN
, CONFIG_LED_STATUS_OFF
);
83 #ifdef CONFIG_LED_STATUS_YELLOW
84 void yellow_led_on(void)
86 __led_set(CONFIG_LED_STATUS_YELLOW
, CONFIG_LED_STATUS_ON
);
89 void yellow_led_off(void)
91 __led_set(CONFIG_LED_STATUS_YELLOW
, CONFIG_LED_STATUS_OFF
);
95 #ifdef CONFIG_LED_STATUS_BLUE
96 void blue_led_on(void)
98 __led_set(CONFIG_LED_STATUS_BLUE
, CONFIG_LED_STATUS_ON
);
101 void blue_led_off(void)
103 __led_set(CONFIG_LED_STATUS_BLUE
, CONFIG_LED_STATUS_OFF
);
107 #endif /* CONFIG_GPIO_LED_STUBS */