- Введение
- Форматы файлов
- *.dtb файл
- *.dts файл
- Компилятор/декомпилятор dtc
- Оверлеи *.dtbo
- Настройки
- Ванильные *.dtb файлы ядра
- Настройка устройств под себя
- Обновление ядра
- Синтаксис
- Включение и отключение устройств
- Ссылки
- How to decompile a device tree in PetaLinux
- Device tree compiler (DTC)
- Where to find it
- How to use it
- aakbar5 / dts <> dtb
Введение
Данная статья посвящена механизму описания структуры периферии, использующемуся в частности в ядре Linux для архитектур armh и aarch64.
Одноплатные компьютеры семейств RaspberryPi, OrangePi, Repka Pi3 и многие прочие подобные используют в качестве процессора микросхему — систему на кристалле (SoC). Микросхема SoC нуждается только во внешнем ОЗУ, при этом она реализует в одном чипе множество возможных, часто взаимоисключающих конфигураций периферии интерфейсов ввода-вывода.
Таким образом должен быть механизм, позволяющий передать ядру, какая из конфигураций соответствует тому, что распаяно на печатной плате, а также какое поведение инженер-разработчик ожидает от внешних универсальных контактов (штырьков) ввода-вывода платы (GPIO). Данным механизмом и является описываемое здесь дерево устройств — Device Tree.
Форматы файлов
*.dtb файл
Device Tree Binary — иерархическое описание структуры периферии в бинарном формате. Именно в таком формате оно подргужается в ядро Linux в качестве аргумента через загрузчик. Ядро использует структуру, чтобы узнать о периферийных устройствах — какие включены, какие модули ядра задействовать, символические имена.
*.dts файл
Device Tree Source (aka Strings) — представление дерева устройств в человекочитаемом формате, в виде исходного кода. Синтаксис языка похож на JSON. Для связи с описанием в *.dtb формате используется утилита dtc.
Компилятор/декомпилятор dtc
Для работы с описанием дерева устройств предназначен компилятор dtc (пакет dtc).
Для конвертации бинарного дерева устройств в текстовое представление:
Для компиляции текстового описания дерева устройств обратно в бинарное представление:
Оверлеи *.dtbo
В специализированном дистрибутиве Raspbian реализован механизм, позволяющий во время загрузки накладывать на *.dtb файлы патчи. Такой патч, включающий какую-то аппаратную возможность платы, называется оверлеем. Формат файла — такой же, как у .dtb — файл можно прочитать при помощи утилиты dtc.
Файлы находятся в папке /boot/dtb/overlay системы Raspbian. Исследование их помогает понять, как исправить дерево устройств, чтобы включить какую-либо нужную фичу.
Вроде бы, загрузчик U-Boot умеет их применять. Данный вопрос требует дальнейшего исследования.
Настройки
Ванильные *.dtb файлы ядра
Вместе с ядром Linux (проверено для ядер для 5.*) поставляется библиотека *.dtb файлов под разные одноплатные компьютеры, модули и системы. При установке ядра файлы оказываются в папке
Для каждого чипа и платы имеется свой файл — одна и та же микросхема может оказаться на разных платах разных производителей.
Настройка устройств под себя
Конфигурации *.dtb, поставляемые вместе с ядром для каждой платы, описывают некоторую базовую конфигурацию, которая подойдёт всем. Учитывая настраиваемость платы, однако же, может потребоваться эту конфигурацию изменить. Для этого следует вскрыть *.dtb файл утилитой dtc, отредактировать его в *.dts формате и сохранить обратно. Какой из многих файлов загружается — можно посмотреть в выводе загрузчика U-Boot во время старта системы, этот файл будет единственный с именем, соответствующем модели платы.
Обновление ядра
Очевидна проблема — при обновлении ядра исправления будут утеряны. Это не является проблемой, если сборка подготавливается для встраиваемой системы, которую не будут обновлять. Иначе следовало бы написать скрипт, делающий исправления автоматически, и прописать его как-то в механизм /etc/initrd.mk. Эта секция требует уточнения.
Синтаксис
Синтаксис *.dts файла достаточно понятен (очевидно!) =) Лучший способ исследования — вскрыть файл и посмотреть, что там внутри.
Приглашаю всех практикующих инженеров писать сюда свои примеры 😉
Включение и отключение устройств
В исходном, «ванильном» дереве многие устройства описаны, но отключены. Примеры таких устройств — контроллеры шины i2c, контроллер uart (serial). Для включения устройства достаточно поправить один параметр.
Отключённое устройство имеет в своём описании поле:
Для включения устройства следует исправить:
Ссылки
How to decompile a device tree in PetaLinux
Posted on January 8, 2021 | Jeff Johnson
One of the output products of a PetaLinux project is a compiled (binary) device tree. Sometimes we’d like to be able to read that compiled device tree to see exactly what is inside it. This can help with debugging a problem, or you may just want to make sure that your device tree additions are actually being pulled in. Either way, a compiled device tree can be “decompiled” using a tool that you can find hidden away in the PetaLinux build collateral.
Device tree compiler (DTC)
DTC is a tool that can be used to interpret a compiled device tree (.dtb) and convert it into a text file (.dts). You can find DTC inside a build PetaLinux project after petalinux-build has been run, but the exact path will depend on the version of PetaLinux that you are using. The paths listed below are specifically for PetaLinux 2020.2, but the paths in earlier versions should be very similar.
Where to find it
To find DTC in your PetaLinux project, first check the value of CONFIG_YOCTO_MACHINE_NAME in the project-spec/configs/config file. Now the path to DTC is given by the path shown below with replaced with the correct value for your project. You also have to swap all of the dashes ( — ) for underscores ( _ ) in the Yocto machine name.
build/ tmp/ work/ -xilinx-linux/ linux-xlnx/ 5.4+gitAUTOINC+62ea514294-r0/ linux--standard-build/ scripts/ dtc/
Here’s an example path to DTC in a Microblaze based design where the Yocto machine name is microblazeel-v11.0-bs-cmp-mh-div-generic :
build/ tmp/ work/ microblazeel_v11.0_bs_cmp_mh_div_generic-xilinx-linux/ linux-xlnx/ 5.4+gitAUTOINC+62ea514294-r0/ linux-microblazeel_v11.0_bs_cmp_mh_div_generic-standard-build/ scripts/ dtc/
Here’s an example path to DTC in a Zynq based design where the Yocto machine name is zynq-generic :
build/ tmp/ work/ zynq_generic-xilinx-linux-gnueabi/ linux-xlnx/ 5.4+gitAUTOINC+62ea514294-r0/ linux-zynq_generic-standard-build/ scripts/ dtc/
How to use it
The compiled device tree of a PetaLinux project is system.dtb and it can be found in the images/linux directory. DTC can be called from that directory to parse the device tree like this:
cd images/linux ../..//dtc -I dtb -O dts -o system.dts system.dtb
The output file system.dts is a text file that you can read in a text editor.
aakbar5 / dts <> dtb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters