Derleme ve Doğrulama

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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

DTC ile derleme

.dts derlemek için dtc kullanırken, sonuçtaki .dtbo bir __symbols__ düğümü eklemek için -@ seçeneğini eklemelisiniz. __symbols__ düğümü, DTO kitaplığının referanslar için 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 bindirmesini oluşturmak için örnek komut:

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

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

Doğrulama, bindirmeli CE'yi ana CE'ye yerleştirirken oluşabilecek hataları belirlemenize yardımcı olabilir. Hedefi güncellemeden önce, .dts içinde /include/ kullanarak .dts davranışını simüle ederek ana bilgisayarda DT kaplamanın sonucunu doğrulayabilirsiniz.

Şekil 1. Ana bilgisayarda DTO'yu simüle etmek için /include/ sözdizimini kullanın
  1. .dts yer paylaşımı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 bir kopyasını oluşturun. Kopyada, son satırdan sonra 1. adımda oluşturduğunuz dosyanın içerme 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. DTO ile aynı sonuç olması gereken birleştirilmiş my_main_dt_with_include.dts almak üzere dtc derlemek için dtc'yi kullanın. Örneğin:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. dtc boşaltmak için my_merged_dt.dto 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üğümler eklemek veya özelliklerde değişiklik yapmak için, önyükleyicinin SoC DT'nin üzerine aygıta özel bir DT'yi dinamik olarak bindirmesi gerekir.

Uygulanan bindirmeleri gösteren

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

Kaplamalar, ana cihaz ağacındaki düğümlere uygulanabilir veya yeni düğümler ekleyebilir, ancak önceki bir kaplamaya eklenen bir düğüme atıfta bulunamaz . Bu kısıtlama, kaplama uygulaması kaplama simge tablosunu ana DT simge tablosuyla birleştirmediğinden gereklidir (birleştirme yapmamak, simge adlarındaki çakışmaları ve kaplamalar arasındaki bağımlılıkların karmaşıklığını önler).

Örnek: Geçersiz bindirmeler

Bu örnekte overlay_2.dts, overlay_2.dts tarafından eklenen e düğümüne atıfta overlay_1.dts . Ana overlay_1 uygulandıktan sonra, ortaya çıkan overlay_2 bindirme_2 uygulanmaya çalışılırsa, bindirme uygulaması, temel CE için sembol tablosunda 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 kaplamalar

Bu örnekte overlay_2.dts , yalnızca ana DTS'den b düğümüne atıfta bulunur. overlay_1 , temel DT'ye uygulandığında, ardından overlay_2 uygulaması geldiğinde, e düğümündeki prop özelliğinin değerinin (overlay_1.dts tarafından ayarlanan) overlay_1.dts tarafından ayarlanan değerin üzerine 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>;
      };
};

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ı/yer paylaşımları seçin.
  2. androidboot.dtbo_idx parametresini çekirdek komut satırına ekleyin.
    • Parametre, temel DT'ye uyguladığı DTBO bölümü görüntüsünden DTO'ların sıfır tabanlı endekslerini göstermelidir (aynı sırada).
    • Endeksler, DTBO bölümündeki bindirmenin konumuna başvurmalıdır.

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

DTBO bölümünün doğrulanması

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

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

Örneğin, aşağıdaki bindirmelerde ve son 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.

DT'yi dizin 3'e yerleştirin DT'yi indeks 5'e yerleştir
[overlay_1.dts]

/dts-v1/;
/plugin/;

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

/dts-v1/;
/plugin/;

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

	a {
		phandle = <0x1>;
	};

	b {
		phandle = <0x2>;
	};

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

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