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. Функциональные требования

  1. Регистрация каждого узла в качестве led_classdev устройства.

  2. Установка имени устройства в /sys/class/leds/<label> через DT.

  3. Поддержка атрибутов: - brightness (0 или 255) - trigger (по умолчанию «none», возможность установки стандартных и пользовательских триггеров)

  4. Возможность задания default-state = «on» | «off» из DT.

  5. Обработка событий включения/выключения через brightness_set() коллбэк.

  6. Привязка к GPIO с использованием GPIOD API.

  7. Полная работа без использования user-space программ — управление только через sysfs.

  8. Поддержка выгрузки (remove) и освобождения ресурсов.

25.4. Дополнительные пожелания

  • Реализовать пользовательский heartbeat-rgb триггер, который мигает поочерёдно R → G → B.

  • Поддержка linux,default-trigger из DT.

25.5. Ограничения

  • Драйвер должен использовать только новый GPIOD API.

  • Отказ от прямой работы с MMIO.

  • Без зависимости от miscdevice.

25.6. Проверка и тестирование

  1. Проверка загрузки модуля: - Появление /sys/class/leds/ledred, ledgreen, ledblue - Проверка значений trigger, brightness

  2. Установка яркости: - echo 255 > /sys/class/leds/ledred/brightness

  3. Установка триггера: - echo timer > /sys/class/leds/ledgreen/trigger

  4. Наблюдение физической индикации на LED.

  5. Выгрузка драйвера и освобождение GPIO.

25.7. Итог

Созданный модуль будет соответствовать современным стандартам работы с LED в Linux и станет расширяемой основой для более сложных драйверов индикации.