Składnia DTO

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.txtmanual.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";
    };
  };
};