Device Tree: DTS, DTB и Overlays - краткое руководство
Зачем вообще нужен Device Tree
На обычном ПК операционная система сама находит всё оборудование: процессор, память, USB-порты, сетевые карты. Для этого существуют стандартные механизмы обнаружения - PCI, ACPI и другие.
На одноплатных компьютерах (ARM-платах вроде NAPI-C и NAPI2) всё иначе. Периферия припаяна прямо к процессору, стандартных механизмов обнаружения нет. Ядру Linux нужно заранее сообщить: какой процессор стоит на плате, сколько у него UART-портов, на каких адресах висит I2C, какие GPIO-пины к чему подключены, на какой частоте работает SPI, и так далее.
Именно для этого существует Device Tree - «дерево устройств». Это структурированное описание всего аппаратного обеспечения платы, которое ядро Linux читает при загрузке.
DTS - исходный текст описания
DTS (Device Tree Source) - это текстовый файл, который описывает оборудование платы в читаемом виде. Он похож на конфигурационный файл и выглядит примерно так:
/ {
model = "Napilab NAPI2";
compatible = "napilab,napi2", "rockchip,rk3568";
chosen {
stdout-path = "serial2:1500000n8";
};
leds {
compatible = "gpio-leds";
power-led {
gpios = <&gpio0 13 GPIO_ACTIVE_HIGH>;
default-state = "on";
};
};
};
Здесь описано: название платы, совместимость с процессором RK3568, консольный порт (UART) и светодиод, подключённый к GPIO.
DTS-файлы могут подключать другие файлы через #include - общие описания процессора, контроллеров памяти и шин обычно вынесены в отдельные .dtsi файлы, а конкретная плата лишь дополняет и переопределяет нужные узлы.
DTB - скомпилированный файл для ядра
Ядро Linux не читает текстовые .dts файлы напрямую. Перед использованием их нужно скомпилировать в бинарный формат - DTB (Device Tree Blob). Это делает компилятор dtc (Device Tree Compiler):
DTS (текст) --[dtc]--> DTB (бинарный)
При сборке прошивки Armbian автоматически компилирует нужный DTB и помещает его в /boot/dtb/. Загрузчик U-Boot при старте передаёт этот DTB ядру, и ядро по нему настраивает драйверы для всего оборудования.
Посмотреть, какой DTB используется, можно командой:
cat /proc/device-tree/model
Overlay - «накладка» на основной DTB
Основной DTB описывает базовую конфигурацию платы. Но что если нужно подключить к плате дополнительный модуль - дисплей по SPI, датчик по I2C, CAN-контроллер, или просто переназначить функцию GPIO-пина?
Перекомпилировать весь DTB заново - неудобно и рискованно. Для этого существуют Device Tree Overlays (DTBO) - небольшие «накладки», которые добавляют или изменяют отдельные узлы основного дерева устройств.
Overlay компилируется в файл .dtbo и хранится в /boot/dtb/rockchip/overlay/.