25. 5.22: Техническое задание — Драйвер «RGB LED class» для Linux
25.1. Цель
Разработка ядрового Linux-драйвера для управления тремя светодиодами (R, G, B) с использованием подсистемы LED Class (/sys/class/leds), с полной интеграцией через Device Tree.
Поддержка должна включать: - управление через sysfs (brightness, trigger) - автоматическую регистрацию через Device Tree - использование пользовательских триггеров - возможность кастомного поведения (например, мигать по расписанию)
25.2. Архитектура
Каждый цвет RGB-светодиода должен быть представлен отдельным LED-устройством с отдельным узлом в DT и соответствующим struct led_classdev.
Узел в Device Tree для каждого цвета будет выглядеть так:
ledred@0 {
compatible = "kontakts,rgb-led";
label = "ledred";
gpios = <&gpio 16 0>;
default-state = "off";
};
ledgreen@1 {
compatible = "kontakts,rgb-led";
label = "ledgreen";
gpios = <&gpio 20 0>;
default-state = "off";
};
ledblue@2 {
compatible = "kontakts,rgb-led";
label = "ledblue";
gpios = <&gpio 21 0>;
default-state = "off";
};
25.3. Функциональные требования
Регистрация каждого узла в качестве led_classdev устройства.
Установка имени устройства в /sys/class/leds/<label> через DT.
Поддержка атрибутов: - brightness (0 или 255) - trigger (по умолчанию «none», возможность установки стандартных и пользовательских триггеров)
Возможность задания default-state = «on» | «off» из DT.
Обработка событий включения/выключения через brightness_set() коллбэк.
Привязка к GPIO с использованием GPIOD API.
Полная работа без использования user-space программ — управление только через sysfs.
Поддержка выгрузки (remove) и освобождения ресурсов.
25.4. Дополнительные пожелания
Реализовать пользовательский heartbeat-rgb триггер, который мигает поочерёдно R → G → B.
Поддержка linux,default-trigger из DT.
25.5. Ограничения
Драйвер должен использовать только новый GPIOD API.
Отказ от прямой работы с MMIO.
Без зависимости от miscdevice.
25.6. Проверка и тестирование
Проверка загрузки модуля: - Появление /sys/class/leds/ledred, ledgreen, ledblue - Проверка значений trigger, brightness
Установка яркости: - echo 255 > /sys/class/leds/ledred/brightness
Установка триггера: - echo timer > /sys/class/leds/ledgreen/trigger
Наблюдение физической индикации на LED.
Выгрузка драйвера и освобождение GPIO.
25.7. Итог
Созданный модуль будет соответствовать современным стандартам работы с LED в Linux и станет расширяемой основой для более сложных драйверов индикации.