================================================== UIO-драйвер RGB-светодиода: исходный код и сборка ================================================== Описание -------- Драйвер `rgb_uio` реализует управление RGB-светодиодом через интерфейс UIO (Userspace I/O). Он экспортирует 1 байт памяти в пространство пользователя через `/dev/uioX`, где каждый бит управляет отдельным цветом: - Бит 0 — красный - Бит 1 — зелёный - Бит 2 — синий UIO предоставляет простой способ взаимодействия с железом без написания полноценного ядрового драйвера. Как это работает ---------------- 1. **Связь с Device Tree**: Драйвер ищет узел с `compatible = "kontakts,rgb-uio"`, откуда получает GPIO-пины для управления светодиодами. 2. **GPIO**: С помощью `devm_gpiod_get()` он получает дескрипторы на пины, помеченные как `red`, `green`, `blue`. 3. **MMAP**: Драйвер выделяет 1 байт памяти (`data->mem`), отображаемый в userspace. Запись значения в эту память приводит к изменению состояния GPIO (и, соответственно, цвета). 4. **UIO интерфейс**: Через `uio_register_device()` создаётся файл `/dev/uio0`, который можно открыть, отобразить в память и напрямую писать значения. Сборка .ko ----------- Создайте `Makefile` в той же директории: .. code-block:: make obj-m := rgb_uio.o KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) all: $(MAKE) -C $(KDIR) M=$(PWD) modules clean: $(MAKE) -C $(KDIR) M=$(PWD) clean Соберите модуль: .. code-block:: bash make После сборки появится файл `rgb_uio.ko`. Загрузка модуля ---------------- Перед загрузкой убедитесь, что Device Tree узел добавлен (см. соответствующий раздел) и доступен `/dev/uio0`. 1. Загрузите модуль: .. code-block:: bash sudo insmod rgb_uio.ko 2. Убедитесь, что он загрузился: .. code-block:: bash dmesg | grep rgb_uio lsmod | grep rgb_uio 3. Проверьте наличие устройства: .. code-block:: bash ls /dev/uio* Выгрузка модуля --------------- Для удаления модуля: .. code-block:: bash sudo rmmod rgb_uio dmesg | tail Появится сообщение `rgb_uio: driver removed`. Заключение ---------- Этот драйвер демонстрирует, как можно использовать UIO для управления железом из userspace. Это особенно удобно для экспериментов, разработки и обучения, когда нужен простой и контролируемый доступ к периферии без написания полного драйвера ядра. Следующим шагом можно будет написать userspace-программу на C, Python или Rust, которая будет управлять светодиодами через `mmap()`.