Derleyin ve doğrulayın

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

DTC ile derleme

.dts'u derlemek için dtc'ü kullanırken, elde edilen .dtbo'e __symbols__ düğümü eklemek için -@ seçeneğini eklemeniz gerekir. __symbols__ düğümü, etiketle işaretlenmiş tüm düğümlerin listesini içerir. Bu liste, DTO kitaplığının referans olarak kullanabileceği bir listedir.

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

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

Yer paylaşımı DT'sini .dts oluşturmak için örnek komut:

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

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

Doğrulama, yer paylaşımı DT'sini ana DT'ye yerleştirirken oluşabilecek hataları belirlemenize yardımcı olabilir. Hedefi güncellemeden önce, .dts içinde /include/ kullanarak DTO'nun 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ırdaki üstbilgeyi kaldırın. Örnek:
    /dts-v1/;
    /plugin/;
    
    Dosyayı my_overlay_dt_wo_header.dts (veya istediğiniz 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. Örnek:
    /include/ "my_overlay_dt_wo_header.dts"
    
    Dosyayı my_main_dt_with_include.dts (veya istediğiniz bir dosya adı) olarak kaydedin.
  3. Birleştirilmiş DT'yi almak için dtc'yi derlemek amacıyla my_main_dt_with_include.dts'yi kullanın. Bu sonuç, DTO ile aynı olmalıdır. Örnek:
    dtc -@ -O dtb -o my_merged_dt.dtb my_main_dt_with_include.dts
    
  4. my_merged_dt.dto'u dökmek 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 için cihaz ağacı blob yer paylaşımı (DTBO) bölümü gerekir. SoC DT'sinde düğüm eklemek veya özelliklerde değişiklik yapmak için önyükleyicinin, SoC DT'sinin üzerine cihaza özgü bir DT'yi dinamik olarak yerleştirmesi gerekir.

Uygulanan yer paylaşımlarını belirtme

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

Yer paylaşımları, ana DT'deki düğümlere uygulanabilir veya yeni düğümler ekleyebilir ancak önceki bir yer paylaşımına eklenen bir düğümü referans alamaz. Yer paylaşımı uygulaması, yer paylaşımı simge tablosunu ana DT simge tablosuyla birleştirmediğinden bu kısıtlama gereklidir (birleştirmemek, simge 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, overlay_2 sonucun DT'sine uygulanmaya çalışılırsa yer paylaşımı uygulaması, e sembolünün temel DT'nin sembol tablosunda bulunmadığıyla ilgili 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 b düğümünü ifade eder. overlay_1, temel DT'ye uygulandıktan sonra overlay_2 uygulaması uygulandığında, e düğümündeki prop mülkünün değeri (overlay_1.dts tarafından ayarlanır) overlay_2.dts tarafından ayarlanan değerle 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 yapabileceğinden emin olun:

  1. Çalıştığı kartı tanımlayın ve uygulanacak ilgili yer paylaşımlarını seçin.
  2. androidboot.dtbo_idx parametresini çekirdek komut satırına ekleyin.
    • Parametre, temel DT'ye uyguladığı DTBO bölüm resmindeki DTO'ların sıfır tabanlı dizinlerini (aynı sırada) belirtmelidir.
    • Dizinler, yer paylaşımının DTBO bölümündeki konumunu belirtmelidir.

DTBO bölümünün yapısıyla ilgili ayrıntılar için Cihaz ağacı yer paylaşımları 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 androidboot.dtbo_idx varlığı (Init'ın ilgili ro.boot.dtbo_idx sistem mülkünü otomatik olarak ayarladığı kontrol edilerek).
  • ro.boot.dtbo_idx sistem özelliğinin geçerliliği (mülkün en az bir geçerli DTBO resim dizini belirtmesini kontrol ederek).
  • DTBO bölümünün geçerliliği (DTBO bölümündeki ve temel DT'ye uygulanan yer paylaşımlarını da doğrular).
  • Ortaya çıkan DT'deki ek düğümler veya mülk 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 eklemek doğrulama işlemini geçer ancak çekirdek komut satırına androidboot.dtbo_idx=3,5 eklemek doğrulama işlemini geçemez.

3. dizinde yer paylaşımlı DT 5. dizinde DT yer paylaşımı
[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";
	};
};