26. 5.25. Подключение RGB LED к LED class через DT

26.1. Описание

В этой части проекта мы реализуем подключение RGB светодиода к встроенному механизм управления светодиодами в ядре Linux — LED class. Мы воспользуемся стандартным драйвером gpio-leds, который работает на основе описания в Device Tree. Каждая компонента RGB-светодиода будет зарегистрирована как отдельное led_classdev-устройство.

26.1.1. Структура Device Tree

Ниже приведён фрагмент, который должен быть включён в leds {} внутри файла Device Tree:

leds {
    compatible = "gpio-leds";
    phandle = <0x87>;

    ledred: ledred@0 {
        label = "ledred";
        gpios = <&gpio 16 0>;
        default-state = "off";
        linux,default-trigger = "none";
    };

    ledgreen: ledgreen@1 {
        label = "ledgreen";
        gpios = <&gpio 20 0>;
        default-state = "off";
        linux,default-trigger = "none";
    };

    ledblue: ledblue@2 {
        label = "ledblue";
        gpios = <&gpio 21 0>;
        default-state = "off";
        linux,default-trigger = "none";
    };
};

26.1.2. Функциональные требования

  • [x] Регистрация каждого узла в LED class — автоматически создаётся /sys/class/leds/ledred, ledgreen, ledblue

  • [x] Имя устройства через DT — задаётся через label = «…», и отображается в sysfs

  • [x] Поддержка атрибутов:
    • brightness — установка 0 (выкл) / 255 (вкл)

    • trigger — переключение между none, heartbeat, timer, cpu, и др.

  • [x] default-state = «on»/»off» из DT — влияет на стартовое поведение после загрузки

  • [x] GPIOD API — драйвер использует devm_gpiod_get(), а не legacy GPIO API

  • [x] Работа без user-приложений — управление полностью через /sys/class/leds/*

  • [x] Корректная выгрузка и освобождение ресурсов (если используется custom-драйвер)

  • [ ] heartbeat-rgb trigger — не реализован (пожелание, можно разработать отдельно)

26.1.3. Проверка

  1. Проверить sysfs после загрузки DT:

ls /sys/class/leds/
# → ledred  ledgreen  ledblue
  1. Проверить работу триггеров:

cat /sys/class/leds/ledred/trigger
echo timer | sudo tee /sys/class/leds/ledred/trigger
echo none | sudo tee /sys/class/leds/ledred/trigger
  1. Проверить включение/выключение вручную:

echo 1 | sudo tee /sys/class/leds/ledred/brightness
echo 0 | sudo tee /sys/class/leds/ledred/brightness
  1. Проверить статус:

cat /sys/class/leds/ledred/brightness
cat /sys/class/leds/ledred/trigger
  1. Проверить, какие GPIO задействованы:

gpioinfo | grep led
raspi-gpio get 16
raspi-gpio get 20
raspi-gpio get 21

26.1.4. Заключение

Мы успешно выполнили включение RGB светодиода в LED class Linux только с помощью Device Tree, без написания кода драйвера. Это позволяет полностью пользоваться встроенными возможностями ядра: управление яркостью, триггерами и автоматическое создание интерфейса /sys/class/leds.

Следующим шагом может быть создание пользовательского триггера heartbeat-rgb через kernel module.