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 должно немедленно менять уровень на пинах
Тестовые кейсы:
Значение |
RED |
GREEN |
BLUE |
Описание |
|---|---|---|---|---|
|
OFF |
OFF |
OFF |
Все выключены |
|
ON |
OFF |
OFF |
Только красный |
|
OFF |
ON |
OFF |
Только зелёный |
|
OFF |
OFF |
ON |
Только синий |
|
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 байт (по одному на каждый канал)
—