Вы можете использовать компилятор дерева устройств (DTC) для компиляции исходных файлов дерева устройств (DTS). Однако перед тем, как применить наложение дерева устройств (DT) на целевое основное DT, вам следует проверить результат, смоделировав поведение наложения дерева устройств (DTO).
Компиляция с помощью DTC
При использовании dtc для компиляции .dts необходимо добавить параметр -@, чтобы добавить узел __symbols__ в полученный файл .dtbo. Узел __symbols__ содержит список всех узлов, отмеченных ярлыком, который библиотека DTO может использовать для ссылок.
Пример команды для создания основного DT .dts:
dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts
Пример команды для создания наложенного дерева устройств .dts:
dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts
Как проверить результаты DTO на хосте
Проверка помогает выявить ошибки, которые могут возникнуть при размещении оверлея ДУ на основном ДУ. Прежде чем обновлять целевой объект, вы можете проверить результат наложения DT на хост, смоделировав поведение DTO с помощью /include/ в .dts.

Рисунок 1. Используйте синтаксис /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
- Чтобы получить
my_merged_dt.dto, используйтеdtc.dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
Как проверить DTO в Android 9
В Android 9 требуется раздел DTBO. Чтобы добавить узлы или изменить свойства в ДУ процессора, загрузчик операционной системы должен динамически наложить ДУ устройства на ДУ процессора.
Указывать примененные оверлеи
Чтобы
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, а затем 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 рассказывается в статье Наложения дерева устройств.
Как проверить раздел 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 в командную строку ядра не проходит проверку.
| Оверлей ДУ в индексе 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";
};
};
|