================================================================ Техническое задание: UIO-драйвер для управления RGB-светодиодом ================================================================ 1. Цель проекта --------------- Разработать пользовательский I/O-драйвер (UIO) для Linux, который позволит управлять **RGB-светодиодом** (три независимых цвета: красный, зелёный, синий) из **пространства пользователя**. Управление должно осуществляться путём записи в память, доступную через `mmap()`, без использования ioctl или sysfs. --- 2. Аппаратная платформа ----------------------- - **Целевая система**: Raspberry Pi (или совместимая ARM-платформа) - **Устройство**: RGB-светодиод, подключённый к трем GPIO: - **RED** — GPIO 16 - **GREEN** — GPIO 20 - **BLUE** — GPIO 21 - GPIO должны быть настроены на **output**, управление осуществляется подачей 1/0. --- 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` --- 4. Пользовательская часть ------------------------- - Написать пример программы на C или Python, которая: - Открывает `/dev/uio0` - Делает `mmap()` области управления - Устанавливает значения, чтобы: - включить красный (`0b001`) - зелёный + синий (`0b110`) - выключить всё (`0b000`) - Проверить результат физически (по светодиоду) или с помощью логического анализатора / мультиметра. --- 5. Логика и проверка -------------------- **При старте модуля:** - Все светодиоды должны быть выключены (записано `0x00`) **При изменении значения mmap:** - Каждый бит влияет на соответствующий GPIO - Проверка: изменение байта по mmap должно немедленно менять уровень на пинах **Тестовые кейсы:** .. list-table:: Таблица управления RGB-светодиодом :header-rows: 1 :widths: 15 15 15 15 40 * - Значение - RED - GREEN - BLUE - Описание * - ``0b000`` - OFF - OFF - OFF - Все выключены * - ``0b001`` - ON - OFF - OFF - Только красный * - ``0b010`` - OFF - ON - OFF - Только зелёный * - ``0b100`` - OFF - OFF - ON - Только синий * - ``0b111`` - ON - ON - ON - Все включены --- 6. Структура проекта --------------------- .. code-block:: rgb_uio_driver/ ├── rgb_uio.c # ядровой модуль ├── Makefile ├── user_app.c # приложение, использующее mmap ├── test_script.sh # bash-скрипт для проверки └── README.rst --- 7. Требования к качеству ------------------------ - Код ядра соответствует Linux Kernel Coding Style - Поддержка выгрузки и повторной загрузки модуля (`rmmod`, `insmod`) - Все ресурсы (GPIO, память) корректно освобождаются при выгрузке - Драйвер протестирован на Raspberry Pi OS (kernel 5.10+) --- 8. Возможности расширения -------------------------- - Управление яркостью через `PWM` (в будущем) - Прерывания при изменении состояний GPIO - Расширение памяти до 3 байт (по одному на каждый канал) ---