Compila y verifica

Puedes usar el compilador de árbol de dispositivos (DTC) para compilar la fuente del árbol de dispositivos (DTS). archivos. Sin embargo, antes de aplicar el árbol de dispositivos de superposición (DT) en el DT principal de destino, también deben verificar el resultado simulando el comportamiento de la superposición del árbol de dispositivos (DTO).

Cómo compilar con DTC

Cuando uses dtc para compilar .dts, deberás agregar la opción -@ para agregar un nodo __symbols__ en el .dtbo resultante. El nodo __symbols__ contiene un lista de todos los nodos que están marcados con una etiqueta, que la biblioteca DTO puede usar para obtener referencias.

Comando de muestra para compilar la DT principal .dts:

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

Comando de muestra para compilar la DT de superposición .dts:

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

Cómo verificar los resultados de la DTO en el host

La verificación puede ayudarte a identificar errores que podrían ocurrir al colocar la DT superpuesta en la DT principal. Antes de actualizar el destino, puedes verificar el resultado de la superposición de la DT en el host simulando el comportamiento de DTO con /include/ en .dts.

Figura 1: Usa la sintaxis /include/ para simular la DTO en el host.

  1. Crea una copia de la superposición .dts. En la copia, quita el encabezado de primera línea. Ejemplo:
    /dts-v1/;
    /plugin/;
    
    Guarda el archivo como my_overlay_dt_wo_header.dts (o cualquier nombre de archivo que desees).
  2. Crea una copia del .dts principal. En la copia, después del última línea, agrega la sintaxis de inclusión para el archivo que creaste en el paso 1. Por ejemplo:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Guarda el archivo como my_main_dt_with_include.dts (o cualquier nombre de archivo que desees).
  3. Usa dtc para compilar my_main_dt_with_include.dts para obtener la DT combinada, que debería será el mismo resultado que DTO. Por ejemplo:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Usa dtc para volcar my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Cómo verificar la DTO en Android 9

Android 9 requiere una superposición de BLOB del árbol de dispositivos (DTBO). Para agregar nodos o realizar cambios en las propiedades del SoC DT, el bootloader debe superponer dinámicamente un DT específico del dispositivo sobre el SoC DT.

Cómo indicar las superposiciones aplicadas

Para habilitar el Conjunto de pruebas de proveedores (VTS) para evaluar la precisión de la superposición los proveedores deben agregar un nuevo parámetro de línea de comandos del kernel androidboot.dtbo_idx, que indica las superposiciones seleccionadas la partición de DTBO. En Android 12 con la versión de kernel 5.10 o superior, este parámetro pasa a través de bootconfig. Por ejemplo, el parámetro androidboot.dtbo_idx=x,y,z informa x, y y z como índices basados en cero de las DTO de la partición de DTBO aplicada (en ese orden) que realiza el bootloader a la DT base.

Las superposiciones se pueden aplicar a los nodos del DT principal o agregar nodos nuevos, pero no puede hacer referencia a un nodo agregado en una superposición anterior. Esta es necesaria porque la app superpuesta no combina la tabla de símbolos de superposición con la tabla de símbolos de la DT principal (sin combinaciones evasivas) conflictos en nombres de símbolos y complicaciones de dependencias entre superposiciones).

Ejemplo: Superposiciones no válidas

En este ejemplo, overlay_2.dts hace referencia a nodos e , agregado por overlay_1.dts Después de aplicar overlay_1 al DT principal, si se intenta aplicar overlay_2 a la DT resultante, la aplicación superpuesta falla y muestra un error que indica que el símbolo e no está presente en la tabla de símbolos de la DT de base

main.dts superposición_1.dts superposición_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>;
};

Ejemplo: Superposiciones válidas

En este ejemplo, overlay_2.dts se refiere solo al nodo b del DTS principal. Cuándo overlay_1 se aplica al DT base y, luego, sigue el app de overlay_2, el valor de la propiedad prop en el nodo e (configurada por overlay_1.dts) se reemplaza por el valor establecido por overlay_2.dts

main.dts superposición_1.dts superposición_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>;
      };
};

Implementa la partición de DTBO

Para implementar la partición de DTBO requerida, asegúrate de que el bootloader pueda hacer lo siguiente: lo siguiente:

  1. Identifica la placa en la que se está ejecutando y selecciona la que corresponda superposiciones que se deben aplicar.
  2. Agrega el parámetro androidboot.dtbo_idx al kernel la línea de comandos.
    • El parámetro debe indicar los índices basados en cero de las DTO de la imagen de partición de DTBO que aplicó al DT base (en el mismo por orden).
    • Los índices deben hacer referencia a la posición de la superposición en el DTBO. por cada partición.

Para obtener detalles sobre la estructura de la partición de DTBO, consulta Superposiciones del árbol de dispositivos.

Valida la partición de DTBO

Puedes usar VTS para verificar lo siguiente:

  • Existencia del parámetro de línea de comandos del kernel androidboot.dtbo_idx (comprobando que Init tenga configurar automáticamente el sistema de ro.boot.dtbo_idx correspondiente propiedad).
  • La validez de la propiedad del sistema ro.boot.dtbo_idx (por comprobar que la propiedad especifique al menos una imagen de DTBO válida ).
  • Validez de la partición de DTBO (también verifica las superposiciones en el DTBO particiones que se aplican a la DT base).
  • Se presentan los nodos adicionales o los cambios de propiedades en la DT resultante. al kernel de Linux.

Por ejemplo, en las siguientes superposiciones y DT final, agregar androidboot.dtbo_idx=5,3 a la línea de comandos del kernel pasa pero si agregas androidboot.dtbo_idx=3,5 al kernel la línea de comandos no pasa la validación.

DT de superposición en el índice 3 DT de superposición en el índice 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
DT final

/dts-v1/;
/

	un {
		phandle = <0x1>;
	}.

	b {
		phandle = <0x2>;
	}.

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

	__símbolos__ {
		a = "/a";
		b = "/b";
		c = "/c";
	}.
}.