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 odwołań

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. 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ładki DTS. Jeśli Twój dtc nie obsługuje tego cukru syntaktycznego, 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 nakładki DT .dts musi mieć w nagłówku tag /plugin/. Przykład:

/dts-v1/;
/plugin/;

W tym miejscu możesz kierować węzły do nakładania za pomocą odwołania, czyli bezwzględnej ścieżki węzła poprzedzonej znakiem 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 odniesienia istnieje w głównym szablonie DT, zostanie zastąpiona po szablonie DTO. W przeciwnym razie zostanie dołączona. 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 właściwość odniesienia nie istnieje w głównym DT, jest dołączana po DTO. 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";
    };
  };
};