Derleme ve doğrulama

Cihaz ağacı kaynak (DTS) dosyalarını derlemek için cihaz ağacı derleyicisini (DTC) kullanabilirsiniz. Ancak hedef ana DT'ye yer paylaşımı cihaz ağacını (DT) uygulamadan önce, cihaz ağacı yer paylaşımı (DTO) davranışını simüle ederek sonucu da doğrulamanız gerekir.

DTC ile derleme

dtc kullanarak .dts derlerken sonuçtaki .dtbo öğesine __symbols__ düğümü eklemek için -@ seçeneğini eklemeniz gerekir. __symbols__ düğümü, DTO kitaplığının referanslar için kullanabileceği, etiketle işaretlenmiş tüm düğümlerin listesini içerir.

Ana DT'yi oluşturmaya yönelik örnek komut .dts:

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

Yer paylaşımı DT'sini oluşturmaya yönelik örnek komut .dts:

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

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

Doğrulama, ana DT'ye yerleştirilen yer paylaşımı DT'sinde oluşabilecek hataları belirlemenize yardımcı olabilir. Hedefi güncellemeden önce, /include/ kullanarak .dts içinde DTO davranışını simüle ederek DT'nin ana makineye yerleştirilmesinin sonucunu doğrulayabilirsiniz.

Şekil 1. Ana makinede DTO'yu simüle etmek için /include/ söz dizimini kullanın.

  1. Yer paylaşımının .dts 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 öğesinin bir kopyasını oluşturun. Kopyada, son satırdan sonra 1. adımda oluşturduğunuz dosyanın include söz dizimini 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. dtc ile derleyin. Birleştirilmiş DT'yi almak için my_main_dt_with_include.dts 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 dökümü almak 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, cihaz ağacı blob kaplaması (DTBO) bölümü gerektirir. SoC DT'ye düğüm eklemek veya özelliklerde değişiklik yapmak için önyükleyicinin, SoC DT'nin üzerine cihaza özel bir DT'yi dinamik olarak yerleştirmesi gerekir.

Uygulanan yer paylaşımlarını belirtme

Tedarikçilerin, yer paylaşımı uygulamasının doğruluğunu değerlendirmek için Tedarikçi Test Paketi'ni (VTS) etkinleştirmesi gerekir. Bunun için DTBO bölümünden seçilen yer paylaşımlarını belirten yeni bir çekirdek komut satırı parametresi androidboot.dtbo_idx eklemeleri gerekir. Çekirdek sürümü 5.10 veya daha yeni olan Android 12'de bu parametre, bootconfig üzerinden iletilir. Örneğin, androidboot.dtbo_idx=x,y,z parametresi, önyükleyici tarafından temel DT'ye uygulanan DTBO bölümündeki DTO'ların sıfır tabanlı dizinleri olarak x, y ve z değerlerini bildirir (bu sırayla).

Yer paylaşımları, ana DT'deki düğümler için geçerli olabilir veya yeni düğümler ekleyebilir. Ancak önceki bir yer paylaşımında eklenen bir düğüme başvuramaz. Bu kısıtlama, yer paylaşımı uygulaması yer paylaşımı sembol tablosunu ana DT sembol tablosuyla birleştirmediği için gereklidir (birleştirme yapılmaması, sembol adlarında çakışmaları ve yer paylaşımları arasındaki bağımlılıkların karmaşıklaşmasını önler).

Örnek: Geçersiz yer paylaşımları

Bu örnekte, overlay_2.dts , overlay_1.dts tarafından eklenen e düğümünü ifade eder. overlay_1 ana DT'ye uygulandıktan sonra, sonuçtaki DT'ye overlay_2 uygulanmaya çalışılırsa yer paylaşımı uygulaması, temel DT'nin sembol tablosunda e sembolünün bulunmadığına dair bir hatayla başarısız olur.

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

Örnek: Geçerli yer paylaşımları

Bu örnekte, overlay_2.dts yalnızca ana DTS'deki düğüm b'ü ifade eder. overlay_1 temel DT'ye uygulandıktan sonra overlay_2 uygulaması uygulandığında, e düğümündeki prop özelliğinin değeri (overlay_1.dts tarafından ayarlanır) overlay_2.dts tarafından ayarlanan değerle üzerine yazılır.

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

DTBO bölümünü uygulama

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

  1. Üzerinde çalıştığı kartı belirleyin ve uygulanacak ilgili katmanları seçin.
  2. androidboot.dtbo_idx parametresini çekirdek komut satırına ekleyin.
    • Parametre, DTBO bölümü görüntüsündeki DTO'ların sıfır tabanlı dizinlerini, temel DT'ye uygulandığı şekilde (aynı sırada) belirtmelidir.
    • Dizinler, DTBO bölümündeki yer paylaşımının konumunu belirtmelidir.

DTBO bölümünün yapısıyla ilgili ayrıntılar için Cihaz ağacı katmanları başlıklı makaleyi inceleyin.

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

VTS'yi kullanarak aşağıdakileri doğrulayabilirsiniz:

  • Çekirdek komut satırı parametresinin varlığı androidboot.dtbo_idx (Init'nin ilgili 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 resmi dizini belirtip belirtmediği kontrol edilerek).
  • DTBO bölümünün geçerliliği (DTBO bölümündeki, temel DT'ye uygulanan katmanlar da doğrulanır).
  • Sonuçta elde edilen DT'deki ek düğümler veya özellik değişiklikleri Linux çekirdeğine sunulur.

Örneğin, aşağıdaki yer paylaşımlarında ve nihai DT'de, çekirdek komut satırına androidboot.dtbo_idx=5,3 eklenmesi doğrulama adımını geçer ancak çekirdek komut satırına androidboot.dtbo_idx=3,5 eklenmesi doğrulama adımını geçmez.

3. dizinde yer paylaşımlı DT 5. dizinde DT'yi yerleştir
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

&c { prop = <0xff>; };
Nihai GM

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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