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. Тестирование

  1. Компиляция:

make
  1. Загрузка:

sudo insmod rgb_led_mmio.ko
ls /dev/myrgb
  1. Управление:

echo "g" > /dev/myrgb
cat /dev/myrgb
  1. Выгрузка:

sudo rmmod rgb_led_mmio

—

17.7. Вывод

Мы реализовали полноценный MMIO-драйвер RGB LED, получивший минимальный символьный интерфейс. Он позволяет полностью контролировать физическое устройство без использования GPIO-фреймворка или GPIOD.

На следующем этапе мы рассмотрим описание RGB LED в Device Tree и подключение через GPIOD и LED class.