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

  1. Команда для дек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
  1. Соберите все DTB:

    make dtbs
    
  2. Скопируйте обновлённый .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/
    
  3. Перезагрузите систему:

    sudo reboot
    

Предупреждение

Всегда делайте резервную копию оригинального .dtb перед заменой, как показано выше!

—

33.5. Проверка корректности

  1. Убедитесь, что узел добавлен:

strings /proc/device-tree/soc/rgb_led@0/compatible
# → kontakts,rgb-uio
  1. Проверьте наличие других свойств узла:

ls /proc/device-tree/soc/rgb_led@0/
# → blue-gpios  green-gpios  red-gpios  compatible  name  status
  1. Посмотрите имя узла:

cat /proc/device-tree/soc/rgb_led@0/name
# → rgb_led
  1. Убедитесь, что строка совместимости задана корректно (в hex-виде):

hexdump -C /proc/device-tree/soc/rgb_led@0/compatible
# → должен содержать строку "kontakts,rgb-uio"
  1. (опционально) Проверьте, что правильный DTB-файл применён:

dmesg | grep -i dtb
cat /proc/device-tree/model
# → Raspberry Pi 3 Model B Rev 1.2 (или другое, в зависимости от модели)
  1. (если установлен 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.