mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +00:00
LED driver for Linux /sys/class/leds (#14981)
New driver for controlling system LEDs offered via /sys/class/leds. Currently it handles led0, led1 etc. type of entries, which are present on e.g. Raspberry Pi's.
This commit is contained in:
parent
c52d3484eb
commit
f56cbd847d
@ -2416,7 +2416,8 @@ ifeq ($(HAVE_STATIC_AUDIO_FILTERS), 1)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(HAVE_RPILED), 1)
|
ifeq ($(HAVE_RPILED), 1)
|
||||||
OBJ += led/drivers/led_rpi.o
|
OBJ += led/drivers/led_rpi.o \
|
||||||
|
led/drivers/led_sys_linux.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifneq ($(findstring Win32,$(OS)),)
|
ifneq ($(findstring Win32,$(OS)),)
|
||||||
|
@ -904,6 +904,7 @@ LEDS
|
|||||||
|
|
||||||
#if defined(HAVE_RPILED)
|
#if defined(HAVE_RPILED)
|
||||||
#include "../led/drivers/led_rpi.c"
|
#include "../led/drivers/led_rpi.c"
|
||||||
|
#include "../led/drivers/led_sys_linux.c"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)
|
||||||
|
114
led/drivers/led_sys_linux.c
Normal file
114
led/drivers/led_sys_linux.c
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
/* RetroArch - A frontend for libretro.
|
||||||
|
*
|
||||||
|
* RetroArch is free software: you can redistribute it and/or modify it under the terms
|
||||||
|
* of the GNU General Public License as published by the Free Software Found-
|
||||||
|
* ation, either version 3 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE. See the GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with RetroArch.
|
||||||
|
* If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <compat/strl.h>
|
||||||
|
|
||||||
|
#include "../led_driver.h"
|
||||||
|
#include "../led_defines.h"
|
||||||
|
|
||||||
|
#include "../../configuration.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
int setup[MAX_LEDS];
|
||||||
|
int map[MAX_LEDS];
|
||||||
|
} sysled_t;
|
||||||
|
|
||||||
|
/* TODO/FIXME - static globals */
|
||||||
|
static sysled_t sys_curins;
|
||||||
|
static sysled_t *sys_cur = &sys_curins;
|
||||||
|
|
||||||
|
static void sys_led_init(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
|
if (!settings)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_LEDS; i++)
|
||||||
|
{
|
||||||
|
sys_cur->setup[i] = 0;
|
||||||
|
sys_cur->map[i] = settings->uints.led_map[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sys_led_free(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_LEDS; i++)
|
||||||
|
{
|
||||||
|
sys_cur->setup[i] = 0;
|
||||||
|
sys_cur->map[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_sysled(int sysled, int value)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char buf[256];
|
||||||
|
snprintf(buf, sizeof(buf), "/sys/class/leds/led%d/brightness", sysled);
|
||||||
|
|
||||||
|
/* Failed to set LED? */
|
||||||
|
if (!(fp = fopen(buf, "w")))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* Simplified: max_brightness could be taken into account */
|
||||||
|
/* Pi Zero may have reversed brightness? */
|
||||||
|
fprintf(fp, "%d\n", value ? 1 : 0);
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setup_sysled(int sysled)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char buf[256];
|
||||||
|
snprintf(buf, sizeof(buf), "/sys/class/leds/led%d/trigger", sysled);
|
||||||
|
|
||||||
|
if (!(fp = fopen(buf, "w")))
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
/* TODO: read actual trigger in [] and restore on exit */
|
||||||
|
fprintf(fp, "none");
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sys_led_set(int led, int state)
|
||||||
|
{
|
||||||
|
int sysled = 0;
|
||||||
|
|
||||||
|
/* Invalid LED? */
|
||||||
|
if((led < 0) || (led >= MAX_LEDS))
|
||||||
|
return;
|
||||||
|
|
||||||
|
sysled = sys_cur->map[led];
|
||||||
|
if(sysled < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(sys_cur->setup[led] == 0)
|
||||||
|
sys_cur->setup[led] = setup_sysled(sysled);
|
||||||
|
if(sys_cur->setup[led] > 0)
|
||||||
|
set_sysled(sysled, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
const led_driver_t sys_led_driver = {
|
||||||
|
sys_led_init,
|
||||||
|
sys_led_free,
|
||||||
|
sys_led_set,
|
||||||
|
"sysled"
|
||||||
|
};
|
@ -47,6 +47,8 @@ void led_driver_init(const char *led_driver)
|
|||||||
#ifdef HAVE_RPILED
|
#ifdef HAVE_RPILED
|
||||||
if (string_is_equal("rpi", drivername))
|
if (string_is_equal("rpi", drivername))
|
||||||
current_led_driver = &rpi_led_driver;
|
current_led_driver = &rpi_led_driver;
|
||||||
|
if (string_is_equal("sysled", drivername))
|
||||||
|
current_led_driver = &sys_led_driver;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || defined(HAVE_X11)
|
#if (defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__)) || defined(HAVE_X11)
|
||||||
@ -54,6 +56,7 @@ void led_driver_init(const char *led_driver)
|
|||||||
current_led_driver = &keyboard_led_driver;
|
current_led_driver = &keyboard_led_driver;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
if (current_led_driver)
|
if (current_led_driver)
|
||||||
(*current_led_driver->init)();
|
(*current_led_driver->init)();
|
||||||
|
|
||||||
|
@ -44,6 +44,7 @@ void led_driver_set_led(int led, int value);
|
|||||||
extern const led_driver_t overlay_led_driver;
|
extern const led_driver_t overlay_led_driver;
|
||||||
extern const led_driver_t rpi_led_driver;
|
extern const led_driver_t rpi_led_driver;
|
||||||
extern const led_driver_t keyboard_led_driver;
|
extern const led_driver_t keyboard_led_driver;
|
||||||
|
extern const led_driver_t sys_led_driver;
|
||||||
|
|
||||||
RETRO_END_DECLS
|
RETRO_END_DECLS
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user