Derleme ve Doğrulama

Cihaz Ağacı Kaynağı dosyalarını derlemek için Cihaz Ağacı Derleyicisini (DTC) kullanabilirsiniz. Ancak bindirme CE'sini hedef ana CE'ye uygulamadan önce, DTO'nun davranışını simüle ederek sonucu da doğrulamanız gerekir.

DTC ile derleme

.dts dosyasını derlemek için dtc kullanıldığında, elde edilen .dtbo dosyasına bir __symbols__ düğümü eklemek için -@ seçeneğini eklemelisiniz. __symbols__ düğümü, DTO kütüphanesinin referans olarak kullanabileceği bir etiketle işaretlenmiş tüm düğümlerin bir listesini içerir.

Ana DT .dts oluşturmak için örnek komut:

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

DT .dts kaplamasını oluşturmak için örnek komut:

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

Ana makinedeki DTO sonuçlarını doğrulayın

Doğrulama, bindirme CE'sini ana CE'ye yerleştirirken oluşabilecek hataları tanımlamanıza yardımcı olabilir. Hedefi güncellemeden önce, .dts dosyasında /include/ kullanarak DTO davranışını simüle ederek DT'yi ana makineye yerleştirmenin sonucunu doğrulayabilirsiniz.

Şekil 1. Ana bilgisayardaki DTO'yu simüle etmek için /include/ sözdizimini kullanın
  1. .dts kaplamasının bir kopyasını oluşturun. Kopyada ilk satır başlığını kaldırın. Örnek:
    /dts-v1/;
    /plugin/;
    
    Dosyayı my_overlay_dt_wo_header.dts (veya istediğiniz herhangi bir dosya adı) olarak kaydedin.
  2. Ana .dts dosyasının bir kopyasını oluşturun. Kopyada, son satırın sonrasına, 1. adımda oluşturduğunuz dosyanın dahil etme sözdizimini ekleyin. Örneğin:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Dosyayı my_main_dt_with_include.dts (veya istediğiniz herhangi bir dosya adı) olarak kaydedin.
  3. Birleştirilmiş DT'yi elde etmek amacıyla my_main_dt_with_include.dts dosyasını derlemek için dtc kullanın; bu, DTO ile aynı sonuç olmalıdır. Örneğin:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. my_merged_dt.dto boşaltmak için dtc kullanın.
    dtc -O dts -o my_merged_dt.dts my_merged_dt.dtb
    

Android 9'da DTO'yu doğrulama

Android 9, bir Cihaz Ağacı Blob Yerleşimi (DTBO) bölümü gerektirir. SoC DT'de düğüm eklemek veya özelliklerde değişiklik yapmak için, önyükleyicinin SoC DT üzerine cihaza özel bir DT'yi dinamik olarak yerleştirmesi gerekir.

Uygulanan kaplamaları belirtme

Satıcı Test Paketinin (VTS) kaplama uygulamasının doğruluğunu değerlendirmesini sağlamak için satıcıların, DTBO bölümünden seçilen kaplamaları belirten yeni bir çekirdek komut satırı parametresi androidboot.dtbo_idx eklemesi gerekir. Çekirdek sürümü 5.10 veya üzerini kullanan Android 12'de bu parametre bootconfig'ten geçer. Örneğin, androidboot.dtbo_idx=x,y,z parametresi x , y ve z , önyükleyici tarafından tabana uygulanan (bu sırayla) DTBO bölümündeki Cihaz Ağacı Kaplamalarının (DTO'lar) sıfır tabanlı endeksleri olarak bildirir. Cihaz Ağacı (DT).

Kaplamalar, ana cihaz ağacındaki düğümlere uygulanabilir veya yeni düğümler ekleyebilir ancak önceki katmana eklenen bir düğüme atıfta bulunamaz . Bu kısıtlama gereklidir çünkü bindirme uygulaması bindirme sembol tablosunu ana CE sembol tablosuyla birleştirmez (birleştirmemek sembol adlarındaki çakışmaları ve bindirmeler arasındaki bağımlılıkların karmaşıklığını önler).

Örnek: Geçersiz kaplamalar

Bu örnekte overlay_2.dts , overlay_1.dts tarafından eklenen e düğümünü ifade eder. Ana CE'ye overlay_1 uygulandıktan sonra, ortaya çıkan CE'ye overlay_2 uygulanmaya çalışılırsa, bindirme uygulaması, temel CE'ye ait sembol tablosunda e sembolünün mevcut olmadığı hatasıyla başarısız olacaktır.

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

Örnek: Geçerli katmanlar

Bu örnekte overlay_2.dts yalnızca ana DTS'deki b düğümünü ifade eder. Temel CE'ye overlay_1 uygulandığında ve ardından overlay_2 uygulandığında, e düğümündeki prop özelliğinin değerinin ( overlay_1.dts tarafından ayarlanan) overlay_2.dts tarafından ayarlanan değer üzerine yazılır.

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

DTBO bölümünün uygulanması

Gerekli DTBO bölümünü uygulamak için önyükleyicinin aşağıdakileri yapabildiğinden emin olun:

  1. Üzerinde çalıştığı kartı tanımlayın ve uygulanacak ilgili kaplamayı/katmanları seçin.
  2. androidboot.dtbo_idx parametresini çekirdek komut satırına ekleyin.
    • Parametre, temel CE'ye uyguladığı DTBO bölüm görüntüsündeki DTO'ların sıfır tabanlı endekslerini (aynı sırada) belirtmelidir.
    • Endeksler, DTBO bölümündeki kaplamanın konumuna atıfta bulunmalıdır.

DTBO bölümünün yapısına ilişkin ayrıntılar için source.android.com adresindeki Cihaz Ağacı Kaplamaları'na bakın.

DTBO bölümünü doğrulama

Aşağıdakileri doğrulamak için VTS'yi kullanabilirsiniz:

  • Çekirdek komut satırı parametresi androidboot.dtbo_idx varlığı ( Init karşılık gelen ro.boot.dtbo_idx sistem özelliğini otomatik olarak ayarladığını kontrol ederek).
  • ro.boot.dtbo_idx sistem özelliğinin geçerliliği (özelliğin en az bir geçerli DTBO görüntü dizini belirttiğini kontrol ederek).
  • DTBO bölümünün geçerliliği (aynı zamanda temel DT'ye uygulanan DTBO bölümündeki kaplamaları da doğrular).
  • Ortaya çıkan CE'deki ek düğümler veya özellik değişiklikleri Linux çekirdeğine sunulur.

Örneğin, aşağıdaki kaplamalarda ve son DT'de, androidboot.dtbo_idx=5,3 çekirdek komut satırına eklenmesi doğrulamayı geçer ancak androidboot.dtbo_idx=3,5 çekirdek komut satırına eklenmesi doğrulamayı geçmez.

İndeks 3'te DT kaplaması İndeks 5'te DT kaplaması
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Son CE
/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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