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