Compilar e verificar

Você pode usar o compilador da árvore de dispositivos (DTC, na sigla em inglês) para compilar a origem da árvore de dispositivos (DTS, na sigla em inglês). . No entanto, antes de aplicar a árvore de dispositivos de sobreposição (DT, na sigla em inglês) à DT principal de destino, você também deve verificar o resultado simulando o comportamento da sobreposição da árvore de dispositivos (DTO, na sigla em inglês).

Compilar com o DTC

Ao usar dtc para compilar .dts, você precisa adicionar opção -@ para adicionar um nó __symbols__ na .dtbo resultante. O nó __symbols__ contém um lista de todos os nós marcados com um rótulo, que a biblioteca de DTO pode usar para referências.

Exemplo de comando para criar .dts da DT principal:

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

Exemplo de comando para criar a sobreposição da DT .dts:

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

Verifique os resultados da DTO no host

A verificação pode ajudar você a identificar erros que podem ocorrer ao à Transferência de dados de sobreposição na Transferência de dados principal. Antes de atualizar o destino, é possível verificar resultado da sobreposição da DT no host ao simular o comportamento da DT usando /include/ em .dts.

Figura 1. Use a sintaxe /include/ para simular DTO no host.

  1. Crie uma cópia da sobreposição .dts. Na cópia, remova o cabeçalho da primeira linha. Exemplo:
    /dts-v1/;
    /plugin/;
    
    Salve o arquivo como my_overlay_dt_wo_header.dts (ou qualquer nome de arquivo desejado).
  2. Crie uma cópia do .dts principal. No texto, após última linha, anexe a sintaxe "include" do arquivo criado na etapa 1. Por exemplo:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Salve o arquivo como my_main_dt_with_include.dts (ou qualquer nome de arquivo desejado).
  3. Usar dtc para compilar my_main_dt_with_include.dts para receber a DT mesclada, que precisa ser terá o mesmo resultado da DTO. Por exemplo:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Use dtc para despejar my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Verificar DTO no Android 9

O Android 9 exige uma sobreposição de blob da árvore de dispositivos (DTBO). Para adicionar nós ou fazer alterações nas propriedades no SoC DT, o carregador de inicialização precisa sobrepor dinamicamente um DT específico do dispositivo pelo SoC DT.

Indicar sobreposições aplicadas

Para ativar o Conjunto de testes de fornecedor (VTS, na sigla em inglês) para avaliar a exatidão da sobreposição app, os fornecedores precisam adicionar um novo parâmetro de linha de comando do kernel androidboot.dtbo_idx que indica as sobreposições selecionadas de da partição de DTBO. No Android 12, usando a versão do kernel 5.10 ou superior, esse parâmetro passa pelo bootconfig. Por exemplo, o parâmetro androidboot.dtbo_idx=x,y,z informa x, y e z como índices baseados em zero de as DTOs da partição de DTBO aplicadas (nessa ordem) pelo carregador de inicialização à DT de base.

As sobreposições podem ser aplicadas a nós da DT principal ou adicionar novos nós, mas não podem se referir a um nó adicionado em uma sobreposição anterior. Isso restrição é necessária porque o aplicativo de sobreposição não mescla o sobrepor a tabela de símbolos com a tabela principal de símbolos de DT (não mesclar evita conflitos nos nomes de símbolos e complicação de dependências entre sobreposições).

Exemplo: sobreposições inválidas

Neste exemplo, overlay_2.dts se refere ao nó e , adicionado pelo overlay_1.dts. Depois que overlay_1 for aplicado ao DT principal, se for feita uma tentativa de aplicar overlay_2 à da DT resultante, o aplicativo de sobreposição falha com um erro informando que o símbolo e não está presente na tabela de símbolos do da transferência de dados de base.

main.dts sobreposição_1.dts sobreposição_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>;
};

Exemplo: sobreposições válidas

Neste exemplo, overlay_2.dts se refere apenas ao nó b no DTS principal. Quando overlay_1 é aplicado à DT de base, depois pelo app de overlay_2, o valor da propriedade prop no nó e (definido por overlay_1.dts) é substituído pelo valor definido por overlay_2.dts.

main.dts sobreposição_1.dts sobreposição_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>;
      };
};

Implementar a partição de DTBO

Para implementar a partição de DTBO necessária, verifique se o carregador de inicialização pode fazer o seguintes:

  1. Identifique a placa em que ela está sendo executada e selecione a sobreposições a serem aplicadas.
  2. Anexe o parâmetro androidboot.dtbo_idx ao kernel. linha de comando.
    • O parâmetro precisa indicar os índices baseados em zero das DTOs. da imagem da partição de DTBO aplicada à DT de base (na mesma ).
    • Os índices devem fazer referência à posição da sobreposição no DTBO partição.

Para detalhes sobre a estrutura da partição de DTBO, consulte Sobreposições da árvore de dispositivos.

Validar a partição de DTBO

Você pode usar o VTS para verificar o seguinte:

  • Existência do parâmetro de linha de comando do kernel androidboot.dtbo_idx (verificando se Init tem configura automaticamente o sistema ro.boot.dtbo_idx correspondente ).
  • A validade da propriedade do sistema ro.boot.dtbo_idx (por verificar se a propriedade especifica pelo menos uma imagem de DTBO válida índice).
  • Validade da partição de DTBO (também verifica as sobreposições no DTBO que são aplicadas à DT de base).
  • São apresentados outros nós ou alterações de propriedade na transferência de dados resultante ao kernel do Linux.

Por exemplo, nas seguintes sobreposições e DT final, adicionar androidboot.dtbo_idx=5,3 para a linha de comando do kernel passa validação, mas com a adição de androidboot.dtbo_idx=3,5 ao kernel a linha de comando não passa na validação.

DT de sobreposição no índice 3 DT de sobreposição no índice 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Transferência de dados final

/dts-v1/
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

	__symbols__ {
		a = "/a";

		b = "/b";
		c = "/c";
	};
};