Оверлеи дерева устройств


Оверлеи (наложения) дерева устройств

Здесь даются общие сведения об оверлеях дерева устройств, а также приводится информация об оверлее для OpiZero2, входящем в стоковую прошивку Андроид.

В составе образа прошивки Android 10 для OpiZero2 имеется файл boot-package.fex.
Этот файл используется загрузчиком Boot0, о чем свидетельствуют строки лога загрузки:

[254][mmc]: ***Try SD card 0***
[263][mmc]: HSSDR52/SDR25 4 bit
[267][mmc]: 50000000 Hz
[269][mmc]: 30500 MB
[271][mmc]: ***SD/MMC 0 init OK!!!***
[370]Loading boot-pkg Succeed(index=0).
[374]Entry_name = u-boot
[383]Entry_name = monitor
[387]Entry_name = dtbo
[390]Entry_name = dtb
[393]Jump to second Boot.
 

После распаковки файла boot-package.fex можно получить четыре бинарных файла (расширение .pak взято совершенно условно):

  • u-boot.pak
  • monitor.pak
  • dtbo.pak
  • dtb.pak

    Файл dtbo.pak - это и есть бинарный оверлей дерева устройств OpiZero2.

    В этом бинарном файле как и в основном FDT есть Блок строк и Блок структуры

    Если декомпилировать под Linux этот бинарный файл при помощи утилиты fdtdump , то получим текстовый файл: dtbo.dts , анализ которого показывает, что в нем содержится два фрагмента 'fragment@1' и 'fragment@2'.

    Оверлей 'fragment@2' длелает значение свойства cpu-supply = 0.

    Оверлей 'fragment@1' корректирует значения свойств узла pmu, который описывает параметры контроллера питания axp806.

    Ниже приведены выдержки из некоторых источников, имеющих отношение к оверлеям DT


    Использование оверлеев в U-Boot

    Выясните, где разместить как BLOB-объект дерева базового устройства, так и оверлей. Убедитесь, что у вас достаточно места, чтобы вырастить базовое дерево, ничего не перекрывая.

    => setenv fdtaddr 0x87f00000
    => setenv fdtovaddr 0x87fc0000
    

    Загрузите базовое двоичное дерево устройств и оверлей двоичного дерева устройств.

    => load /base.dtb => load /overlay.dtbo

    Установите базовое двоичное дерево устройств в качестве рабочего дерева fdt.

    => fdtaddr Увеличьте его так, чтобы он мог охватить все примененные оверлеи
    => fdt resize 8192
    

    Теперь можно применить оверлей.

    => fdt apply 
    

    Загрузить систему, как и в случае с традиционным dtb.

    Для bootm:
    => bootm  - 
    
    Для bootz:
    => bootz  - 
     

    Обратите внимание, что в случае ошибки и база, и наложения будут признаны недействительными, поэтому сохраните копии, чтобы избежать перезагрузки.

    Источник: Использование оверлеев в U-Boot


    Примеры оверлеев для Armbian

    Большинство внутрисхемных интерфейсов и интерфейсов на основе GPIO (SPI, I2C, I2S, UART,…) не имеют механизма для обнаружения и идентификации устройств, подключенных к шине, поэтому ядру Linux необходимо явно сообщить об устройстве и деталях его конфигурации.

    В то время как дерево устройств - это способ описания конфигурации оборудования для ядра, оверлеи дерева устройств - это способ изменения дерева устройств с целью предоставить ядру и драйверам ядра сведения о внешних устройствах или активировать интерфейсы, отключенные по умолчанию.

    Все неиспользуемые внутрисхемные интерфейсы, которые используют контакты GPIO, должны быть отключены по умолчанию, а все контакты разъемов или контактных площадках будут настроены как стандартные GPIO.

    Все выделенные интерфейсы, такие как USB, Ethernet или аналоговое аудио, которые подключены к контактным площадкам или контактам разъемов вместо специализированных разъемов (например, разъем USB, разъем Ethernet или разъем 3,5 мм), будут отключены по умолчанию.

    С примерами оверлеев для Armbian можно позакомиться здесь: Примеры оверлеев на GitHub


    Android Open Source Project

    В документах Android Open Source Project приведена следующая информация.

    Дерево устройств (DT) - это структура данных, состоящая из именованных узлов и свойств, которые описывают не обнаруживаемое оборудование. Операционные системы, такие как ядро Linux, используемое в Android, используют DT для поддержки широкого диапазона аппаратных конфигураций, используемых устройствами на базе Android.

    Поставщики оборудования предоставляют свои собственные исходные файлы DT, которые затем Linux компилирует в файл Blob дерева устройств (DTB), используемый загрузчиком.

    Оверлей дерева устройств (DTO) используется для наложения на блоб главного дерева устройств (DTB). Загрузчик, использующий DTO, может поддерживать DT системы на кристалле (SoC) и динамически накладывать DT для конкретного устройства, добавляя узлы в дерево и внося изменения в свойства в существующем дереве.

    В Android 9 загрузчик не должен изменять свойства, определенные в наложениях дерева устройств, перед передачей блоб (большого двоичного объекта) объединенного дерева устройств в ядро. Загрузка дерева устройств в загрузчик включает сборку, разбиение на разделы и запуск.

    Источник: Оверлеи дерева устройств