Format źródłowy drzewa urządzeń (DTS) to tekstowa reprezentacja drzewa urządzeń (DT). Kompilator drzewa urządzeń (DTC) przetwarza ten format na binarny DT, który jest oczekiwany przez jądro systemu Linux.
Korzystanie z materiałów referencyjnych
Projekt DTC (device Tree compiler + overlay patches) opisuje format DTS w plikach dtc-format.txt i manual.txt.
Format i reguły DTO są opisane w pliku dt-object-internal.txt.
W tych dokumentach opisano, jak zaktualizować główny DT za pomocą węzła fragment@x
i składni __overlay__
w nakładce DT. Przykład:
/ { fragment@0 { target = <&some_node>; __overlay__ { some_prop = "okay"; ... }; }; };
Google zdecydowanie odradza jednak używanie nie fragment@x
i składni __overlay__
. Zamiast tego zalecamy używanie składni referencyjnej. Na przykład:
&some_node { some_prop = "okay"; ... };
Składnia odwołania jest kompilowana przez dtc
do tego samego obiektu co powyżej przy użyciu składni __overlay__
. Ta składnia nie wymusza numerowania fragmentów, co ułatwia odczytywanie i zapisywanie nakładających się DTS. Jeśli Twój dtc
nie obsługuje tego uproszczenia składniowego, użyj dtc w AOSP.
Używanie etykiet
Aby zezwolić na niezdefiniowane odwołania do węzłów, które nie są obecne w momencie kompilacji, plik DT nakładki .dts
musi mieć w nagłówku tag /plugin/
. Na przykład:
/dts-v1/; /plugin/;
W tym miejscu możesz kierować reklamy na nakładane węzły za pomocą odwołania, czyli bezwzględnej ścieżki węzła z prefiksem w postaci znaku ampersand (&). Na przykład w przypadku węzła node@0
w głównym drzewie danych:
Zdefiniuj etykiety w głównym DT ... | … a potem użyj etykiet. |
---|---|
[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>; }; |
Zastąp
Jeśli docelowa usługa referencyjna istnieje w głównym pliku DT, zostanie zastąpiona po przetworzeniu pliku DTO. W przeciwnym razie zostanie do niego dołączona. Na przykład:
main.dts | overlay.dts | Wynik po scaleniu |
---|---|---|
[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"; }; }; |
Dołącz
Jeśli docelowa usługa odniesienia nie istnieje w głównym DT, jest ona dołączana po DTO. Na przykład:
main.dts | overlay.dts | Wynik po scaleniu |
---|---|---|
[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"; }; }; |
Węzły podrzędne
Przykłady składni węzła podrzędnego:
main.dts | overlay.dts | Wynik po scaleniu |
---|---|---|
[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"; }; }; }; |