33. UIO-драйвер RGB-светодиода
33.1. Описание
Проект реализует UIO-драйвер для управления RGB-светодиодом на реальном железе. Управление цветами осуществляется из user space через /dev/uio0 с использованием интерфейса mmap.
—
33.2. Описание узла Device Tree
Добавьте следующий узел в ваш .dts (например, my_rpi3.dts), внутрь блока &soc или soc {}:
rgb_led: rgb_led@0 {
compatible = "kontakts,rgb-uio";
status = "okay";
red-gpios = <&gpio 16 GPIO_ACTIVE_HIGH>;
green-gpios = <&gpio 20 GPIO_ACTIVE_HIGH>;
blue-gpios = <&gpio 21 GPIO_ACTIVE_HIGH>;
};
Убедитесь, что блок gpio определён. Пример:
gpio: gpio@7e200000 {
compatible = "brcm,bcm2835-gpio";
reg = <0x7e200000 0x1000>;
gpio-controller;
#gpio-cells = <2>;
};
—
33.3. Компиляция Device Tree
Скомпилируйте .dts в .dtb:
dtc -I dts -O dtb -o bcm2710-rpi-3-b.dtb bcm2710-rpi-3-b.dts
—
33.4. Установка DTB на Raspberry Pi
Команда для декompиляции DTB в DTS (обратное преобразование) — с помощью утилиты dtc (Device Tree Compiler):, например:
dtc -I dtb -O dts -o my_rpi3.dts /boot/bcm2710-rpi-3-b.dtb
- —
- Где:
I dtb — входной формат: DTB (бинарный)
O dts — выходной формат: DTS (текст)
o — имя выходного файла
input.dtb — путь к бинарному DTB-файлу Установка dtc:
sudo apt update sudo apt install device-tree-compiler
Соберите все DTB:
make dtbsСкопируйте обновлённый
.dtbв/boot, предварительно сделав резервную копию:sudo cp /boot/bcm2710-rpi-3-b.dtb /boot/bcm2710-rpi-3-b.dtb.old.$(date +%Y%m%d_%H%M%S) sudo cp bcm2710-rpi-3-b.dtb /boot/
Перезагрузите систему:
sudo reboot
Предупреждение
Всегда делайте резервную копию оригинального .dtb перед заменой, как показано выше!
—
33.5. Проверка корректности
Убедитесь, что узел добавлен:
strings /proc/device-tree/soc/rgb_led@0/compatible
# → kontakts,rgb-uio
Проверьте наличие других свойств узла:
ls /proc/device-tree/soc/rgb_led@0/
# → blue-gpios green-gpios red-gpios compatible name status
Посмотрите имя узла:
cat /proc/device-tree/soc/rgb_led@0/name
# → rgb_led
Убедитесь, что строка совместимости задана корректно (в hex-виде):
hexdump -C /proc/device-tree/soc/rgb_led@0/compatible
# → должен содержать строку "kontakts,rgb-uio"
(опционально) Проверьте, что правильный DTB-файл применён:
dmesg | grep -i dtb
cat /proc/device-tree/model
# → Raspberry Pi 3 Model B Rev 1.2 (или другое, в зависимости от модели)
(если установлен dtc) Проверьте DTB-файл напрямую:
sudo fdtdump /boot/bcm2710-rpi-3-b.dtb | less
# → Найдите блок rgb_led@0 с compatible = "kontakts,rgb-uio"
—
33.6. Заключение
UIO-драйвер RGB-светодиода реализован без использования оверлеев и может быть включён в любой кастомный .dts — как при эмуляции (QEMU), так и на реальном оборудовании (через пересборку и замену .dtb). Такой подход упрощает изучение взаимодействия между UIO, GPIO и Device Tree.