U-Boot. Device Tree Structure (DTS) как средство настройки

В этой статье рассмотрим, как U-Boot может использовать Device Tree Structure (DTS) для загрузки и конфигурации аппаратных компонентов.
Что такое Device Tree?

Device Tree – это иерархическое описание аппаратного устройства, которое передает конфигурационную информацию ядру операционной системы или загрузчику, такому как U-Boot.
Файл устройства представлен в виде текстового формата DTS (Device Tree Source), который затем компилируется в бинарный формат DTB (Device Tree Blob).
Основная цель DTS – описать, какие аппаратные настройки необходимо применить перед загрузкой системы. Это особенно важно для процессоров архитектуры ARM, где один и тот же образ ядра может использоваться на разных платформах. Специфические параметры, такие как тактирование, GPIO, контроллеры питания и другие настройки, задаются именно через Device Tree.

Как DTS помогает в настройке?

Формат DTS позволяет описать настройки, которые необходимо применить для различных аппаратных компонентов, например:
  • Группировка пинов в блоки – например, в STM32 пины могут относиться как к блокам GPIO (GPIOA, GPIOB и т. д.), так и быть частью конкретных периферийных устройств, таких как I2C, SPI, UART. При этом GPIO-пины могут быть как частью блоков этих самых GPIO-пинов, так и входить внуть других элементов
  • Вариативность конфигурации в зависимости от установленного режима работы устройства.
  • Определение статуса устройства – включено оно или нет (status = "okay" или status = "disabled").
Гибкость переопределения настроек

Один из ключевых моментов Device Tree – возможность переопределять параметры. Например, статус устройства по умолчанию может быть "disabled", но при этом это не означает, что оно вообще не будет использовано.
Система переопределения позволяет:
  1. Создать базовую конфигурацию для процессора (SoC) или модуля (SoM).
  2. Иерархически наследовать настройки путем включения (include) требуемых заготовок. Также include используются не только для построения иерархии, но и позволяют определить макро, например, STM32_PINMUX
  3. Включать или отключать устройства в зависимости от нужной конфигурации.
Такой подход удобен с точки зрения гибкости и позволяет использовать единые DTS-заготовки для разных конфигураций.

Как Device Tree согласуется с U-Boot?

DTS-привязка к драйверам
В U-Boot механизм работы с DTS выглядит следующим образом:
  1. Проверка совместимости (compatible). Если в DTS есть узел с compatible, U-Boot ищет соответствующий драйвер.
  2. Использование конфигурационной утилиты для указания необходимых драйверов в конкретной сборке.
  • Кроме того, существуют заготовки, в которых конфиги прописаны сразу. Однако, при необходимости, DTS-файл можно переопределить и изменить под конкретные требования.
Как DTS хранится в памяти?
Device Tree загружается в оперативную память в виде непрерывного блока данных, который содержит:
  • Заголовок (header) с метаинформацией о структуре DTB.
  • Основные данные – описание устройств и их параметров.