23. 5.22: Linux LED Class

В этом разделе мы рассмотрим подсистему управления светодиодами в ядре Linux — LED Class, которая позволяет стандартизировано управлять светодиодами через /sys/class/leds.

23.1. Что такое LED Class в Linux

LED class — это часть подсистемы устройств в Linux, предназначенная для абстрагированного управления светодиодами.

Каждый светодиод, управляемый через эту подсистему, отображается в пользовательском пространстве как отдельный каталог:

/sys/class/leds/<имя_led>/

23.2. Примеры полей и файлов в каталоге светодиода

/sys/class/leds/led0/
├── brightness         # уровень яркости (0 или 255)
├── max_brightness     # максимальная яркость (обычно 255)
├── trigger            # триггер: cpu, timer, heartbeat и т.д.
├── delay_on           # таймер "включено", если триггер — "timer"
├── delay_off          # таймер "выключено"

23.3. Преимущества использования LED Class

Унифицированный интерфейс /sys/class/leds

Возможность использования встроенных триггеров (cpu, disk, timer…)

Работа с udev, systemd, udevadm

Лёгкая интеграция с user space

23.4. Пример использования с системным LED

echo none > /sys/class/leds/led0/trigger
echo 1 > /sys/class/leds/led0/brightness

echo timer > /sys/class/leds/led0/trigger
echo 200 > /sys/class/leds/led0/delay_on
echo 200 > /sys/class/leds/led0/delay_off

23.5. Как драйвер ядра может зарегистрировать LED device

Пример на уровне драйвера:

#include <linux/leds.h>

static struct led_classdev my_led = {
    .name = "myred",
    .brightness = 0,
    .max_brightness = 1,
    .brightness_set = my_led_set,
};

static void my_led_set(struct led_classdev *led_cdev,
                       enum led_brightness brightness)
{
    gpio_set_value(MY_LED_GPIO, brightness);
}

// Регистрация
led_classdev_register(&pdev->dev, &my_led);

// Удаление
led_classdev_unregister(&my_led);

23.6. Связь с Device Tree (пример для GPIO-контроллера)

ledred {
    compatible = "gpio-leds";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_ledred>;
    led-0 {
        label = "led0";
        gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
        default-state = "off";
    };
};

23.7. Выводы

  • LED Class позволяет управлять светодиодами через /sys/class/leds, не реализуя прямую работу с GPIO.

  • Подходит для LED, привязанных к GPIO или к другим железным источникам (PMIC, контроллерам и т.п.).

  • Хороший выбор, если нужен стандартный, расширяемый интерфейс с поддержкой триггеров.

23.8. Связанные темы:

  • GPIO descriptor API

  • Device Tree binding: gpio-leds

  • Sysfs-интерфейс и управление оборудованием из user space