Вы можете использовать компилятор дерева устройств (DTC) для компиляции исходных файлов дерева устройств. Однако перед применением оверлейного DT к целевому основному DT следует также проверить результат, смоделировав поведение DTO.
Компиляция с помощью DTC
При использовании dtc
для компиляции .dts
необходимо добавить опцию -@
, чтобы добавить узел __symbols__
в результирующий .dtbo
. Узел __symbols__
содержит список всех узлов, помеченных меткой, которую библиотека DTO может использовать для ссылок.
Пример команды для сборки основного DT .dts
:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Пример команды для создания наложения DT .dts
:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Проверка результатов DTO на хосте
Проверка может помочь выявить ошибки, которые могут возникнуть при размещении оверлейного ОУ на основном ОУ. Перед обновлением цели вы можете проверить результат наложения DT на хост, смоделировав поведение DTO с помощью /include/
в .dts
.
/include/
для имитации DTO на хосте- Создайте копию наложения
.dts
. В копии удалите заголовок первой строки. Пример:/dts-v1/; /plugin/;
Сохраните файл какmy_overlay_dt_wo_header.dts
(или под любым другим именем). - Создайте копию основного
.dts
. В копии после последней строки добавьте синтаксис включения для файла, созданного на шаге 1. Например:/include/ "my_overlay_dt_wo_header.dts"
Сохраните файл какmy_main_dt_with_include.dts
(или под любым другим именем). - Используйте
dtc
для компиляцииmy_main_dt_with_include.dts
, чтобы получить объединенный DT, который должен быть тем же результатом, что и DTO. Например:dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
- Используйте
dtc
дляmy_merged_dt.dto
.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Проверка DTO в Android 9
Для Android 9 требуется раздел Device Tree Blob Overlay (DTBO). Чтобы добавить узлы или внести изменения в свойства в SoC DT, загрузчик должен динамически наложить специфичное для устройства DT поверх SoC DT.
Индикация примененных наложений
Чтобы позволить Vendor Test Suite (VTS) оценить правильность приложения оверлея, поставщики должны добавить новый параметр командной строки ядра androidboot.dtbo_idx
, который указывает оверлеи, выбранные из раздела DTBO. В Android 12 с ядром версии 5.10 или выше этот параметр проходит через bootconfig. Например, параметр androidboot.dtbo_idx=x,y,z
сообщает x
, y
и z
как отсчитываемые от нуля индексы наложений дерева устройств (DTO) из раздела DTBO, применяемые (в указанном порядке) загрузчиком к базе. Дерево устройств (DT).
Наложения могут применяться к узлам из основного дерева устройств или добавлять новые узлы, но не могут ссылаться на узел, добавленный в предыдущем наложении. Это ограничение необходимо, поскольку приложение наложения не объединяет таблицу символов наложения с основной таблицей символов DT (не слияние позволяет избежать конфликтов в именах символов и усложнения зависимостей между наложениями).
Пример: недопустимые наложения
В этом примере overlay_2.dts
относится к узлу e
, который был добавлен с помощью overlay_1.dts
. Если после применения overlay_1
к основному ОУ будет предпринята попытка применить overlay_2
к результирующему ОУ, приложение оверлея завершится ошибкой, связанной с отсутствием символа e
в таблице символов для базового ОУ.
main.dts | overlay_1.dts | overlay_2.dts |
---|---|---|
[main.dts] /dts-v1/; / { a: a {}; b: b {}; c: c {}; }; | [overlay_1.dts] /dts-v1/; /plugin/; &b { ref1 = <&a>; e: e { prop = <0x0a>; phandle = <0x04>; }; }; | [overlay_2.dts] /dts-v1/; /plugin/; /* invalid! */ &e { prop = <0x0b>; }; |
Пример: Допустимые наложения
В этом примере overlay_2.dts
относится только к узлу b
из основного DTS. Когда overlay_1
применяется к базовому DT, а затем применяется overlay_2
, значение свойства prop
в узле e
(установленное overlay_1.dts
) перезаписывается значением, установленным overlay_2.dts
.
main.dts | overlay_1.dts | overlay_2.dts |
---|---|---|
[final.dts] /dts-v1/; / { a: a {}; b: b {}; c: c {}; }; | [overlay_1.dts] /dts-v1/; /plugin/; &b { ref1 = <&a>; e { prop = <0x0c>; }; }; | [overlay_2.dts] /dts-v1/; /plugin/; /* valid */ &b { ref1 = <&c>; e { prop = <0x0d>; }; }; |
Реализация раздела DTBO
Чтобы реализовать требуемый раздел DTBO, убедитесь, что загрузчик может выполнять следующие действия:
- Определите плату, на которой он работает, и выберите соответствующие наложения, которые необходимо применить.
- Добавьте параметр
androidboot.dtbo_idx
в командную строку ядра.- Параметр должен указывать отсчитываемые от нуля индексы DTO из образа раздела DTBO, которые он применил к базовому DT (в том же порядке).
- Индексы должны относиться к положению оверлея в разделе DTBO.
Дополнительные сведения о структуре раздела DTBO см. в разделе Наложения дерева устройств на сайте source.android.com.
Проверка раздела DTBO
С помощью VTS можно проверить следующее:
- Существование параметра командной строки ядра
androidboot.dtbo_idx
(путем проверки того, чтоInit
автоматически установил соответствующее системное свойствоro.boot.dtbo_idx
). - Действительность системного свойства
ro.boot.dtbo_idx
(путем проверки того, что свойство указывает хотя бы один действительный индекс образа DTBO). - Действительность раздела DTBO (также проверяется наложение в разделе DTBO, которое применяется к базовому DT).
- Дополнительные узлы или изменения свойств в результирующем DT представляются ядру Linux.
Например, в следующих оверлеях и финальном DT добавление androidboot.dtbo_idx=5,3
в командную строку ядра проходит проверку, но добавление androidboot.dtbo_idx=3,5
в командную строку ядра не проходит проверку.
Наложение DT на индекс 3 | Наложение DT на индекс 5 |
---|---|
[overlay_1.dts] /dts-v1/; /plugin/; &c { prop = <0xfe>; }; | [overlay_2.dts] /dts-v1/; /plugin/; &c { prop = <0xff>; }; |
Окончательное ДТ |
---|
/dts-v1/; / { a { phandle = <0x1>; }; b { phandle = <0x2>; }; c { phandle = <0x3>; prop = <0xfe>; }; __symbols__ { a = "/a"; b = "/b"; c = "/c"; }; }; |
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2022-06-06 UTC.