Sintassi DTO

Il formato DTS (Device Tree Source) è una rappresentazione testuale di un DT (Device Tree). Il compilatore DT (DTC) elabora questo formato in un DT binario, che è il formato previsto dal kernel Linux.

Utilizzare i riferimenti

Il DTC (Compilatore Albero dei dispositivi + Patch di overlay) descrive il formato DTS in dtc-format.txt e manual.txt. Il formato e le regole dei DTO sono descritti in dt-object-internal.txt. Questi documenti descrivono come aggiornare il DT principale utilizzando fragment@x e sintassi __overlay__ nel DT overlay. Per esempio:

/ {
  fragment@0 {
    target = <&some_node>;
      __overlay__ {
        some_prop = "okay";
        ...
      };
  };
};

Tuttavia, Google consiglia vivamente di non utilizzare fragment@x e la sintassi __overlay__, ma di utilizzare la sintassi di riferimento. Per esempio:

&some_node {
  some_prop = "okay";
  ...
};

La sintassi di riferimento viene compilata da dtc nello stesso oggetto di quella sopra utilizzando la sintassi __overlay__. Questa sintassi non ti costringe a numerare i frammenti, consentendoti di leggere e scrivere facilmente DTS di overlay. Se il tuo dtc non supporta questo zucchero sintattico, utilizza il dtc in AOSP.

Utilizzare le etichette

Per consentire riferimenti non definiti ai nodi non presenti in fase di compilazione, il file .dts del DT di overlay deve avere un tag /plugin/ nell'intestazione. Per esempio:

/dts-v1/;
/plugin/;

Da qui puoi scegliere come target i nodi da sovrapporre utilizzando un riferimento, ovvero un percorso del nodo assoluto con il prefisso di una e commerciale (&). Ad esempio, per node@0 nel DT principale:

Definisci le etichette nel DT principale ... ... quindi utilizza le etichette.
[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>;
};

Sostituisci

Se la proprietà di destinazione del riferimento esiste nel DT principale, viene sostituita dopo il DTO; in caso contrario, viene aggiunta. Per esempio:

main.dts overlay.dts Risultato unito
[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";
  };
};

Aggiungi

Se la proprietà di destinazione del riferimento non esiste nel DT principale, viene aggiunta dopo il DTO. Per esempio:

main.dts overlay.dts Risultato unito
[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";
  };
};

Nodi secondari

Esempi di sintassi dei nodi secondari:

main.dts overlay.dts Risultato unito
[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";
    };
  };
};