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şturmak için örnek komut .dts:

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

Yer paylaşımı DT'yi oluşturmak için ö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, yer paylaşımı DT'yi ana DT'ye yerleştirirken oluşabilecek hataları belirlemenize yardımcı olabilir. Hedefi güncellemeden önce, .dts içindeki /include/ kullanarak DTO'nun davranışını simüle ederek ana makineye DT yerleştirme sonucunu doğrulayabilirsiniz.

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

  1. Yer paylaşımının kopyasını oluşturun .dts. 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 kullanarak 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ü 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 yerleşimi (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

Yer paylaşımı uygulamasının doğruluğunu değerlendirmek için Tedarikçi Test Paketi (VTS)'ni etkinleştirmek isteyen tedarikçiler, DTBO bölümünden seçilen yer paylaşımlarını belirten yeni bir çekirdek komut satırı parametresi androidboot.dtbo_idx eklemelidir. Ç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 (bu sırayla) bildirir.

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ı önler ve yer paylaşımları arasındaki bağımlılıkların karmaşıklaşmasını engeller).

Ö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 uygulamaya çalışılırsa yer paylaşımı uygulaması, sembol tablosunda temel DT için e sembolünün bulunmadığı hatasıyla 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ı kullanıldığı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, temel DT'ye uygulandığı sıfır tabanlı dizinlerini (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

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

  • Ç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 kaplamalarda ve nihai DT'de, çekirdek komut satırına androidboot.dtbo_idx=5,3 eklenmesi doğrulamayı geçer ancak çekirdek komut satırına androidboot.dtbo_idx=3,5 eklenmesi doğrulamayı geçmez.

3. dizinde yer paylaşımlı DT 5. indekste yer paylaşımlı DT
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

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

/dts-v1/;
/ {

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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