Kompilasi dan verifikasi

Anda dapat menggunakan compiler pohon perangkat (DTC) untuk mengompilasi sumber hierarki perangkat (DTS) . Namun, sebelum menerapkan pohon perangkat overlay (DT) pada DT utama target, Anda juga harus memverifikasi hasilnya dengan menyimulasikan perilaku overlay hierarki perangkat (DTO).

Kompilasi dengan DTC

Saat menggunakan dtc untuk mengompilasi .dts, Anda harus menambahkan opsi -@ untuk menambahkan node __symbols__ di yang dihasilkan .dtbo. Node __symbols__ berisi daftar semua node yang ditandai dengan label, yang dapat digunakan library DTO sebagai referensi.

Contoh perintah untuk mem-build DT utama .dts:

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

Contoh perintah untuk membuat DT overlay .dts:

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

Memverifikasi hasil DTO pada host

Verifikasi dapat membantu Anda mengidentifikasi kesalahan yang mungkin terjadi saat melakukan DT overlay pada DT utama. Sebelum memperbarui target, Anda dapat memverifikasi hasil overlay DT pada {i>host<i} dengan menyimulasikan perilaku DTO menggunakan /include/ dalam .dts.

Gambar 1. Gunakan sintaksis /include/ untuk menyimulasikan DTO pada host.

  1. Buat salinan overlay .dts. Di salinan, hapus {i>header<i} baris pertama. Contoh:
    /dts-v1/;
    /plugin/;
    
    Simpan file sebagai my_overlay_dt_wo_header.dts (atau nama file yang diinginkan).
  2. Buat salinan .dts utama. Di salinan, setelah baris terakhir, tambahkan sintaks include untuk file yang Anda buat di langkah 1. Contoh:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Simpan file sebagai my_main_dt_with_include.dts (atau nama file yang diinginkan).
  3. Menggunakan dtc untuk mengompilasi my_main_dt_with_include.dts untuk mendapatkan DT gabungan, yang seharusnya hasil yang sama dengan DTO. Contoh:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. Gunakan dtc untuk membuang my_merged_dt.dto.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Memverifikasi DTO di Android 9

Android 9 memerlukan overlay blob hierarki perangkat (DTBO). Untuk menambahkan node atau membuat perubahan pada properti di SoC DT, bootloader harus secara dinamis menempatkan DT khusus perangkat melalui SoC DT.

Menunjukkan overlay yang diterapkan

Untuk mengaktifkan Vendor Test Suite (VTS) untuk menilai ketepatan overlay vendor harus menambahkan parameter baris perintah kernel baru androidboot.dtbo_idx yang menunjukkan overlay yang dipilih dari di partisi DTBO. Di Android 12 menggunakan versi kernel 5.10 atau yang lebih baru, parameter ini melewati {i>bootconfig<i}. Misalnya, parameter androidboot.dtbo_idx=x,y,z melaporkan x, y, dan z sebagai indeks berbasis nol dari DTO dari partisi DTBO yang diterapkan (dalam urutan tersebut) oleh {i>bootloader<i} ke DT basis.

Overlay dapat diterapkan pada {i>node<i} dari DT utama atau menambahkan {i>node<i} baru, namun tidak dapat merujuk ke node yang ditambahkan di overlay sebelumnya. Ini diperlukan karena aplikasi overlay tidak menggabungkan tabel simbol overlay dengan tabel simbol DT utama (tidak menggabungkan menghindari konflik dalam nama simbol dan detail dependensi antara overlay).

Contoh: Overlay tidak valid

Dalam contoh ini, overlay_2.dts merujuk pada node e , yang ditambahkan oleh overlay_1.dts. Setelah overlay_1 diterapkan ke DT utama, jika upaya dilakukan untuk menerapkan overlay_2 ke DT yang dihasilkan, aplikasi overlay gagal dengan pesan error bahwa simbol e tidak ada dalam tabel simbol untuk DT dasar.

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

Contoh: Overlay yang valid

Dalam contoh ini, overlay_2.dts hanya merujuk ke node b dari DTS utama. Kapan overlay_1 diterapkan ke DT dasar, lalu diikuti oleh aplikasi overlay_2, nilai properti prop dalam node e (disetel oleh overlay_1.dts) ditimpa oleh nilai yang ditetapkan oleh 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>;
      };
};

Mengimplementasikan partisi DTBO

Untuk menerapkan partisi DTBO yang diperlukan, pastikan bootloader dapat melakukan berikut ini:

  1. Identifikasi papan yang menjalankan aplikasi tersebut dan pilih yang sesuai overlay yang akan diterapkan.
  2. Menambahkan parameter androidboot.dtbo_idx ke kernel command line.
    • Parameter harus menunjukkan, indeks DTO berbasis nol dari image partisi DTBO yang diterapkan ke DT dasar (dengan cara lainnya).
    • Indeks harus mengacu pada posisi overlay di DTBO partisi.

Untuk mengetahui detail tentang struktur partisi DTBO, lihat Overlay hierarki perangkat.

Memvalidasi partisi DTBO

Anda dapat menggunakan VTS untuk memverifikasi hal berikut:

  • Keberadaan parameter command line kernel androidboot.dtbo_idx (dengan memeriksa bahwa Init telah otomatis menyiapkan sistem ro.boot.dtbo_idx yang sesuai ).
  • Validitas properti sistem ro.boot.dtbo_idx (dengan memeriksa bahwa properti menentukan setidaknya satu gambar DTBO yang valid ).
  • Validitas partisi DTBO (juga memverifikasi overlay di DTBO partisi yang diterapkan ke DT dasar).
  • Node atau perubahan properti tambahan dalam DT yang dihasilkan ditampilkan ke {i>kernel<i} Linux.

Misalnya, dalam overlay dan DT akhir berikut, menambahkan androidboot.dtbo_idx=5,3 ke command line kernel akan diteruskan validasi, tetapi menambahkan androidboot.dtbo_idx=3,5 ke kernel baris perintah tidak lolos validasi.

DT overlay pada indeks 3 DT overlay pada indeks 5
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

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

{i>/dts-v1/<i};
/ {

	{i>
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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