Kompilasi & Verifikasi

Anda dapat menggunakan Device Tree Compiler (DTC) untuk mengkompilasi file Sumber Device Tree. Namun, sebelum menerapkan DT overlay pada DT utama target, Anda juga harus memverifikasi hasilnya dengan mensimulasikan perilaku DTO.

Kompilasi dengan DTC

Saat menggunakan dtc untuk mengkompilasi .dts , Anda harus menambahkan opsi -@ untuk menambahkan simpul __symbols__ pada hasil .dtbo . Node __symbols__ berisi daftar semua node yang ditandai dengan label, yang dapat digunakan oleh perpustakaan DTO sebagai referensi.

Contoh perintah untuk membuat DT utama .dts :

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

Contoh perintah untuk membuat overlay DT .dts :

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

Verifikasi hasil DTO pada host

Verifikasi dapat membantu Anda mengidentifikasi kesalahan yang mungkin terjadi saat menempatkan DT overlay pada DT utama. Sebelum memperbarui target, Anda dapat memverifikasi hasil overlay DT pada host dengan mensimulasikan perilaku DTO menggunakan /include/ di .dts .

Gambar 1. Gunakan sintaks /include/ untuk mensimulasikan DTO pada host
  1. Buat salinan overlay .dts . Dalam salinan tersebut, hapus header baris pertama. Contoh:
    /dts-v1/;
    /plugin/;
    
    Simpan file sebagai my_overlay_dt_wo_header.dts (atau nama file apa pun yang Anda inginkan).
  2. Buat salinan .dts utama. Dalam salinan, setelah baris terakhir, tambahkan sintaks penyertaan untuk file yang Anda buat pada langkah 1. Misalnya:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Simpan file sebagai my_main_dt_with_include.dts (atau nama file apa pun yang Anda inginkan).
  3. Gunakan dtc untuk mengkompilasi my_main_dt_with_include.dts untuk mendapatkan DT gabungan, yang seharusnya memiliki hasil yang sama dengan DTO. Misalnya:
    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 partisi Device Tree Blob Overlay (DTBO). Untuk menambahkan node atau membuat perubahan pada properti di SoC DT, bootloader harus secara dinamis melapisi DT khusus perangkat di atas SoC DT.

Menunjukkan overlay yang diterapkan

Untuk mengaktifkan Vendor Test Suite (VTS) guna menilai kebenaran aplikasi overlay, vendor harus menambahkan parameter baris perintah kernel baru androidboot.dtbo_idx yang menunjukkan overlay yang dipilih dari partisi DTBO. Di Android 12 yang menggunakan kernel versi 5.10 atau lebih tinggi, parameter ini melewati bootconfig. Misalnya, parameter androidboot.dtbo_idx=x,y,z melaporkan x , y dan z sebagai indeks berbasis nol dari Device Tree Overlay (DTO) dari partisi DTBO yang diterapkan (dalam urutan itu) oleh bootloader ke basis Pohon Perangkat (DT).

Hamparan dapat diterapkan pada simpul dari pohon perangkat utama atau menambah simpul baru, namun tidak dapat merujuk pada simpul yang ditambahkan pada hamparan sebelumnya. Pembatasan ini diperlukan karena aplikasi overlay tidak menggabungkan tabel simbol overlay dengan tabel simbol DT utama (tidak menggabungkan akan menghindari konflik nama simbol dan komplikasi ketergantungan antar overlay).

Contoh: Hamparan tidak valid

Dalam contoh ini, overlay_2.dts mengacu pada node e , yang ditambahkan oleh overlay_1.dts . Setelah overlay_1 diterapkan pada DT utama, jika dilakukan upaya untuk menerapkan overlay_2 pada DT yang dihasilkan, aplikasi overlay akan gagal dengan kesalahan karena simbol e tidak ada dalam tabel simbol untuk DT dasar.

utama.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: Hamparan yang valid

Dalam contoh ini, overlay_2.dts hanya merujuk ke node b dari DTS utama. Ketika overlay_1 diterapkan ke DT dasar, kemudian diikuti dengan penerapan overlay_2 , nilai properti prop di node e (ditetapkan oleh overlay_1.dts ) ditimpa oleh nilai yang ditetapkan oleh overlay_2.dts .

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

Menerapkan partisi DTBO

Untuk mengimplementasikan partisi DTBO yang diperlukan, pastikan bootloader dapat melakukan hal berikut:

  1. Identifikasi papan yang menjalankannya dan pilih overlay yang sesuai untuk diterapkan.
  2. Tambahkan parameter androidboot.dtbo_idx ke baris perintah kernel.
    • Parameter harus menunjukkan, indeks DTO berbasis nol dari gambar partisi DTBO yang diterapkan ke DT dasar (dalam urutan yang sama).
    • Indeks harus mengacu pada posisi overlay di partisi DTBO.

Untuk detail tentang struktur partisi DTBO, lihat Device Tree Overlay di source.android.com.

Memvalidasi partisi DTBO

Anda dapat menggunakan VTS untuk memverifikasi hal berikut:

  • Keberadaan parameter baris perintah kernel androidboot.dtbo_idx (dengan memeriksa apakah Init telah secara otomatis menyiapkan properti sistem ro.boot.dtbo_idx yang sesuai).
  • Validitas properti sistem ro.boot.dtbo_idx (dengan memeriksa apakah properti tersebut menentukan setidaknya satu indeks gambar DTBO yang valid).
  • Validitas partisi DTBO (juga memverifikasi overlay di partisi DTBO yang diterapkan ke DT dasar).
  • Node tambahan atau perubahan properti pada DT yang dihasilkan disajikan ke kernel Linux.

Misalnya, pada overlay dan DT terakhir berikut, menambahkan androidboot.dtbo_idx=5,3 ke baris perintah kernel akan lolos validasi, namun menambahkan androidboot.dtbo_idx=3,5 ke baris perintah kernel tidak akan lolos validasi.

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

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

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

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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