32. Техническое задание: UIO-драйвер для управления RGB-светодиодом

32.1. 1. Цель проекта

Разработать пользовательский I/O-драйвер (UIO) для Linux, который позволит управлять RGB-светодиодом (три независимых цвета: красный, зелёный, синий) из пространства пользователя.

Управление должно осуществляться путём записи в память, доступную через mmap(), без использования ioctl или sysfs.

—

32.2. 2. Аппаратная платформа

  • Целевая система: Raspberry Pi (или совместимая ARM-платформа)

  • Устройство: RGB-светодиод, подключённый к трем GPIO: - RED — GPIO 16 - GREEN — GPIO 20 - BLUE — GPIO 21

  • GPIO должны быть настроены на output, управление осуществляется подачей 1/0.

—

32.3. 3. Архитектура программного решения

Ядровая часть (Kernel module): - Написать модуль ядра с использованием UIO API. - Создать одну отображаемую mmap-область размером 1 байт, где каждый бит управляет соответствующим цветом:

  • Бит 0 — RED

  • Бит 1 — GREEN

  • Бит 2 — BLUE

  • Значение этого байта отслеживается в ядре с помощью write()-callback или через отложенную работу (workqueue).

Структура `uio_info`: - name: «rgb_uio» - version: «1.0» - mem[0]: область управления, UIO_MEM_LOGICAL, размер — 1 байт, kmalloc

—

32.4. 4. Пользовательская часть

  • Написать пример программы на C или Python, которая:

    • Открывает /dev/uio0

    • Делает mmap() области управления

    • Устанавливает значения, чтобы: - включить красный (0b001) - зелёный + синий (0b110) - выключить всё (0b000)

  • Проверить результат физически (по светодиоду) или с помощью логического анализатора / мультиметра.

—

32.5. 5. Логика и проверка

При старте модуля: - Все светодиоды должны быть выключены (записано 0x00)

При изменении значения mmap:

  • Каждый бит влияет на соответствующий GPIO

  • Проверка: изменение байта по mmap должно немедленно менять уровень на пинах

Тестовые кейсы:

Таблица управления RGB-светодиодом

Значение

RED

GREEN

BLUE

Описание

0b000

OFF

OFF

OFF

Все выключены

0b001

ON

OFF

OFF

Только красный

0b010

OFF

ON

OFF

Только зелёный

0b100

OFF

OFF

ON

Только синий

0b111

ON

ON

ON

Все включены

—

32.6. 6. Структура проекта

rgb_uio_driver/
├── rgb_uio.c         # ядровой модуль
├── Makefile
├── user_app.c        # приложение, использующее mmap
├── test_script.sh    # bash-скрипт для проверки
└── README.rst

—

32.7. 7. Требования к качеству

  • Код ядра соответствует Linux Kernel Coding Style

  • Поддержка выгрузки и повторной загрузки модуля (rmmod, insmod)

  • Все ресурсы (GPIO, память) корректно освобождаются при выгрузке

  • Драйвер протестирован на Raspberry Pi OS (kernel 5.10+)

—

32.8. 8. Возможности расширения

  • Управление яркостью через PWM (в будущем)

  • Прерывания при изменении состояний GPIO

  • Расширение памяти до 3 байт (по одному на каждый канал)

—