5.16. RGB LED как platform device: управление через MMIO ========================================================= Описание -------- В этом разделе мы реализуем управление RGB-светодиодом как символьным устройством через прямой доступ к GPIO-регистрам (MMIO) на Raspberry Pi 3. Это логическое продолжение темы 5.14, где мы познакомились с принципами Memory-Mapped I/O. Мы создаём драйвер, который: - отображает физическую область GPIO в память ядра (через `ioremap()`); - настраивает 3 GPIO (16, 20, 21) как выходы; - управляет состоянием GPIO через регистры `GPSET0` и `GPCLR0`; - создаёт символьное устройство `/dev/myrgb`, через которое можно управлять цветом. --- Подключение RGB-светодиода --------------------------- Используем 3 GPIO: +-----------+------------+----------------+ | Цвет | GPIO | Назначение | +===========+============+================+ | Красный | GPIO 16 | LED_R | +-----------+------------+----------------+ | Зелёный | GPIO 20 | LED_G | +-----------+------------+----------------+ | Синий | GPIO 21 | LED_B | +-----------+------------+----------------+ Резисторы 220–330 Ом на каждый цвет обязательны. Катод подключается к GND. --- Управление устройством ----------------------- После загрузки модуля создаётся устройство `/dev/myrgb`. Примеры: .. code-block:: bash echo "r" > /dev/myrgb # включить красный echo "gb" > /dev/myrgb # зелёный и синий echo "rgb" > /dev/myrgb # все цвета echo "off" > /dev/myrgb # выключить всё Состояние можно прочитать: .. code-block:: bash cat /dev/myrgb # GPIO R: 1, G: 0, B: 1 --- MMIO-регистры Raspberry Pi --------------------------- Базовый адрес: ``0x3F200000`` +----------------+--------------+------------------------+ | Название | Смещение | Назначение | +================+==============+========================+ | GPFSEL2 | 0x08 | настройка GPIO 10–19 | +----------------+--------------+------------------------+ | GPSET0 | 0x1C | установка GPIO 0–31 | +----------------+--------------+------------------------+ | GPCLR0 | 0x28 | сброс GPIO 0–31 | +----------------+--------------+------------------------+ --- Функции драйвера ----------------- - `set_gpio_output(gpio)` — перевод GPIO в режим вывода; - `gpio_on(gpio)` / `gpio_off(gpio)` — установить/сбросить пин; - `rgb_write()` — анализирует команды (`r`, `g`, `b`, `off`); - `rgb_read()` — возвращает состояние каждого пина; - `ioremap()` / `iounmap()` — отображение и освобождение памяти; - `misc_register()` — регистрация устройства `/dev/myrgb`. --- Тестирование ------------ 1. Компиляция: .. code-block:: bash make 2. Загрузка: .. code-block:: bash sudo insmod rgb_led_mmio.ko ls /dev/myrgb 3. Управление: .. code-block:: bash echo "g" > /dev/myrgb cat /dev/myrgb 4. Выгрузка: .. code-block:: bash sudo rmmod rgb_led_mmio --- Вывод ----- Мы реализовали полноценный MMIO-драйвер RGB LED, получивший минимальный символьный интерфейс. Он позволяет полностью контролировать физическое устройство без использования GPIO-фреймворка или GPIOD. На следующем этапе мы рассмотрим описание RGB LED в Device Tree и подключение через GPIOD и LED class.