Compilazione e verifica

È possibile utilizzare Device Tree Compiler (DTC) per compilare i file di origine della struttura dei dispositivi. Tuttavia, prima di applicare la SEF sovrapposta sulla SEF principale di destinazione, è opportuno verificare anche il risultato simulando il comportamento della SEF.

Compilazione con DTC

Quando si utilizza dtc per compilare .dts , è necessario aggiungere l'opzione -@ per aggiungere un nodo __symbols__ nel .dtbo risultante. Il nodo __symbols__ contiene un elenco di tutti i nodi contrassegnati con un'etichetta, che la libreria DTO può utilizzare come riferimenti.

Comando di esempio per creare il file DT .dts principale:

dtc -@ -O dtb -o my_main_dt.dtb my_main_dt.dts

Comando di esempio per creare l'overlay DT .dts :

dtc -@ -O dtb -o my_overlay_dt.dtbo my_overlay_dt.dts

Verificare i risultati DTO sull'host

La verifica può aiutare a identificare gli errori che potrebbero verificarsi quando si posiziona la SEF sovrapposta sulla SEF principale. Prima di aggiornare la destinazione, è possibile verificare il risultato della sovrapposizione di DT sull'host simulando il comportamento di DTO utilizzando /include/ in .dts .

Figura 1. Utilizzare la sintassi /include/ per simulare DTO sull'host
  1. Crea una copia dell'overlay .dts . Nella copia, rimuovi l'intestazione della prima riga. Esempio:
    /dts-v1/;
    /plugin/;
    
    Salva il file come my_overlay_dt_wo_header.dts (o qualsiasi nome di file tu voglia).
  2. Crea una copia del .dts principale. Nella copia, dopo l'ultima riga, aggiungi la sintassi di inclusione per il file creato nel passaggio 1. Ad esempio:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Salva il file come my_main_dt_with_include.dts (o qualsiasi nome file desiderato).
  3. Usa dtc per compilare my_main_dt_with_include.dts per ottenere il DT unito, che dovrebbe essere lo stesso risultato di DTO. Ad esempio:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Usa dtc per eseguire il dump my_merged_dt.dto .
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Verifica DTO in Android 9

Android 9 richiede una partizione DTBO (Device Tree Blob Overlay). Per aggiungere nodi o apportare modifiche alle proprietà nel SoC DT, il bootloader deve sovrapporre dinamicamente un DT specifico del dispositivo sul SoC DT.

Indicazione delle sovrapposizioni applicate

Per consentire alla Vendor Test Suite (VTS) di valutare la correttezza dell'applicazione overlay, i fornitori devono aggiungere un nuovo parametro della riga di comando del kernel androidboot.dtbo_idx che indichi gli overlay selezionati dalla partizione DTBO. In Android 12 che utilizza la versione del kernel 5.10 o successiva, questo parametro passa attraverso bootconfig. Ad esempio, il parametro androidboot.dtbo_idx=x,y,z riporta x , y e z come indici in base zero dei Device Tree Overlays (DTO) dalla partizione DTBO applicata (in quest'ordine) dal bootloader alla base Albero dei dispositivi (DT).

Le sovrapposizioni possono applicarsi ai nodi dall'albero del dispositivo principale o aggiungere nuovi nodi, ma non possono fare riferimento a un nodo aggiunto in una sovrapposizione precedente. Questa limitazione è necessaria perché l'applicazione di sovrapposizione non unisce la tabella dei simboli di sovrapposizione con la tabella dei simboli DT principale (la mancata unione evita conflitti nei nomi dei simboli e complicazioni delle dipendenze tra sovrapposizioni).

Esempio: overlay non validi

In questo esempio, overlay_2.dts si riferisce al nodo e , che è stato aggiunto da overlay_1.dts . Dopo aver applicato overlay_1 alla SEF principale, se si tenta di applicare overlay_2 alla SEF risultante, l'applicazione di overlay fallirà con un errore indicante che il simbolo e non è presente nella tabella dei simboli della SEF di base.

main.dts sovrapposizione_1.dts sovrapposizione_2.dts
[main.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;

&b { ref1 =  <&a>;
    e: e {
        prop = <0x0a>;
        phandle = <0x04>;
    };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* invalid! */
&e {
    prop = <0x0b>;
};

Esempio: sovrapposizioni valide

In questo esempio, overlay_2.dts si riferisce solo al nodo b del DTS principale. Quando overlay_1 viene applicato al DT di base, seguito quindi dall'applicazione di overlay_2 , il valore della proprietà prop nel nodo e (impostato da overlay_1.dts ) viene sovrascritto dal valore impostato da overlay_2.dts .

main.dts sovrapposizione_1.dts sovrapposizione_2.dts
[final.dts]

/dts-v1/;

/ {
  a: a {};
  b: b {};
  c: c {};
};
[overlay_1.dts]

/dts-v1/;
/plugin/;


&b { ref1 =  <&a>;
     e {
          prop = <0x0c>;
      };
};
[overlay_2.dts]

/dts-v1/;
/plugin/;

/* valid */
&b { ref1 =  <&c>;
     e {
          prop = <0x0d>;
      };
};

Implementazione della partizione DTBO

Per implementare la partizione DTBO richiesta, assicurati che il bootloader possa eseguire le seguenti operazioni:

  1. Identificare la scheda su cui è in esecuzione e selezionare gli overlay corrispondenti da applicare.
  2. Aggiungi il parametro androidboot.dtbo_idx alla riga di comando del kernel.
    • Il parametro deve indicare gli indici in base zero dei DTO dall'immagine della partizione DTBO applicata al DT di base (nello stesso ordine).
    • Gli indici devono fare riferimento alla posizione dell'overlay nella partizione DTBO.

Per dettagli sulla struttura della partizione DTBO, fare riferimento a Device Tree Overlays su source.android.com.

Convalida della partizione DTBO

È possibile utilizzare VTS per verificare quanto segue:

  • Esistenza del parametro della riga di comando del kernel androidboot.dtbo_idx (controllando che Init abbia impostato automaticamente la corrispondente proprietà di sistema ro.boot.dtbo_idx ).
  • Validità della proprietà di sistema ro.boot.dtbo_idx (controllando che la proprietà specifichi almeno un indice di immagine DTBO valido).
  • Validità della partizione DTBO (verifica anche gli overlay nella partizione DTBO applicati al DT base).
  • Ulteriori nodi o modifiche alle proprietà nel DT risultante vengono presentati al kernel Linux.

Ad esempio, nelle sovrapposizioni seguenti e nel DT finale, l'aggiunta di androidboot.dtbo_idx=5,3 alla riga di comando del kernel supera la convalida, ma l'aggiunta androidboot.dtbo_idx=3,5 alla riga di comando del kernel non supera la convalida.

Sovrapposizione DT sull'indice 3 Sovrapposizione DT sull'indice 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xfe>; };
[overlay_2.dts]

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
DT finale
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

	c {
		phandle = <0x3>;
		prop = <0xfe>;
	};

	__symbols__ {
		a = "/a";
		b = "/b";
		c = "/c";
	};
};