Sintassi DTO

Il formato DTS (Device Tree source) è una rappresentazione testuale di una struttura ad albero dei dispositivi (DT). Il DTC (Device Tree compiler) 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 utilizza invece la sintassi di riferimento. Ad esempio:

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

La sintassi di riferimento viene compilata da dtc nello stesso oggetto dell'elemento in alto utilizzando la sintassi __overlay__. Questa sintassi non ti obbliga a numerare i frammenti, in modo da poter leggere e scrivere facilmente DTS overlay. Se le tue dtc non supporta questo zucchero sintattico, usa DTC in AOSP.

Utilizzare le etichette

Per consentire riferimenti non definiti a nodi non presenti al momento della compilazione, Il file DT .dts dell'overlay deve avere un tag /plugin/ intestazione. Ad esempio:

/dts-v1/;
/plugin/;

Da qui è possibile scegliere come target i nodi da sovrapporre utilizzando un riferimento, che viene un percorso nodo assoluto preceduto dalla e commerciale (&). Ad esempio, per node@0 nel DT principale:

Definisci le etichette nel DT principale ... ... e poi 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>;
};

Ignora

Se la proprietà del target di riferimento esiste nel DT principale, viene ignorata dopo DTO; altrimenti viene accodato. Ad 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à del target di riferimento non esiste nel DT principale, dopo DTO. Ad 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 del nodo figlio:

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