Формат DTS (Device Tree Source) – это текстовое представление дерева устройств (DT). Компилятор дерева устройств (DTC) преобразует этот формат в двоичный DT, который используется ядром Linux.
Использовать ссылки
В проекте DTC (компилятор дерева устройств + исправления наложения) формат DTS описан в файлах dtc-format.txt и manual.txt.
Формат и правила DTO описаны в файле dt-object-internal.txt.
В этих документах описано, как обновить основное ДУ с помощью узла fragment@x и синтаксиса __overlay__ в наложенном ДУ. Пример:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
Однако Google настоятельно рекомендует не использовать fragment@x и синтаксис __overlay__, а вместо этого применять синтаксис ссылок. Пример:
&some_node {
some_prop = "okay";
...
};Синтаксис ссылок компилируется dtc в тот же объект, что и выше, с использованием синтаксиса __overlay__. Этот синтаксис не требует нумерации фрагментов, что упрощает чтение и запись накладываемых деревьев устройств. Если dtc не поддерживает этот синтаксический сахар, используйте dtc в AOSP.
Как использовать ярлыки
Чтобы разрешить неопределенные ссылки на узлы, отсутствующие во время компиляции, в заголовке файла наложения DT .dts должен быть тег /plugin/. Пример:
/dts-v1/; /plugin/;
Здесь можно указать узлы, которые будут наложены, используя ссылку, представляющую собой абсолютный путь к узлу с префиксом "&". Например, для node@0 в основном дереве данных:
| Как задать ярлыки в основном шаблоне данных | …а затем используйте ярлыки. |
|---|---|
[my_main_dt.dts] /dts-v1/; / { my_node: node@0 { status = "disabled"; my_child: child@0 { value = <0xffffffff>; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; &my_child { value = <0x1>; }; |
Переопределить
Если целевое свойство ссылки существует в основном шаблоне данных, оно переопределяется после DTO, в противном случае оно добавляется. Пример:
| main.dts | overlay.dts | Объединенный результат |
|---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "disabled"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { status = "okay"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; }; }; |
Добавить к существующим
Если целевое свойство ссылки не существует в основном дереве устройств, оно добавляется после наложения. Пример:
| main.dts | overlay.dts | Объединенный результат |
|---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_node: node@0 { status = "okay"; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_node { new_prop = "bar"; }; |
/dts-v1/; / { compatible = "corp,foo"; ... node@0 { linux,phandle = <0x1>; phandle = <0x1>; status = "okay"; new_prop = "bar"; }; }; |
Дочерние узлы
Примеры синтаксиса дочерних узлов:
| main.dts | overlay.dts | Объединенный результат |
|---|---|---|
[my_main_dt.dts] /dts-v1/; / { compatible = "corp,foo"; my_nodes: nodes { compatible = "corp,bar"; node@0 { status = "disabled"; }; }; }; |
[my_overlay_dt.dts] /dts-v1/; /plugin/; &my_nodes { new_prop1 = "abc"; node@0 { status = "okay"; new_prop2 = "xyz"; }; }; |
/dts-v1/; / { compatible = "corp,foo"; ... nodes { linux,phandle = <0x1>; phandle = <0x1>; compatible = "corp,bar"; new_prop1 = "abc"; node@0 { linux,phandle = <0x2>; phandle = <0x2>; status = "okay"; new_prop2 = "xyz"; }; }; }; |