Compilazione e verifica

È possibile utilizzare Device Tree Compiler (DTC) per compilare i file Device Tree Source. Tuttavia, prima di applicare l'overlay DT sul DT principale di destinazione, è necessario verificare anche il risultato simulando il comportamento del DTO.

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 da un'etichetta, che la libreria DTO può utilizzare per i riferimenti.

Esempio di comando per compilare DT .dts principale:

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

Esempio di comando 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ò aiutarti a identificare gli errori che potrebbero verificarsi quando si posiziona il DT overlay sul DT 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 file desiderato).
  2. Crea una copia del .dts principale. Nella copia, dopo l'ultima riga, aggiungi la sintassi include 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 scaricare 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 al SoC DT.

Indicazione delle sovrapposizioni applicate

Per consentire a 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 z x , y come gli indici a base zero dei Device Tree Overlay (DTO) dalla partizione DTBO applicata (in quest'ordine) dal bootloader alla base Struttura dei dispositivi (DT).

Gli overlay possono essere applicati ai nodi dall'albero del dispositivo principale o aggiungere nuovi nodi, ma non possono fare riferimento a un nodo aggiunto in un overlay precedente. Questa restrizione è necessaria perché l'applicazione di sovrapposizione non unisce la tabella dei simboli di sovrapposizione con la tabella dei simboli DT principale (la mancata fusione evita conflitti nei nomi dei simboli e complicanze delle dipendenze tra le sovrapposizioni).

Esempio: overlay non validi

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

main.dts overlay_1.dts overlay_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: overlay validi

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 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 overlay_1.dts overlay_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. Identifica la scheda su cui è in esecuzione e seleziona 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 che ha applicato al DT di base (nello stesso ordine).
    • Gli indici devono fare riferimento alla posizione dell'overlay nella partizione DTBO.

Per i 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 (verificando che Init abbia impostato automaticamente la proprietà di sistema ro.boot.dtbo_idx corrispondente).
  • Validità della proprietà di sistema ro.boot.dtbo_idx (verificando 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 di base).
  • Nodi aggiuntivi o modifiche alle proprietà nel DT risultante vengono presentati al kernel Linux.

Ad esempio, nelle sovrapposizioni seguenti e nel DT finale, l'aggiunta 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.

Sovrapporre DT all'indice 3 Sovrapporre DT all'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";
	};
};