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

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

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

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

DTO sonuçlarını ana makinede doğrula

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 ana makineye DT yerleştirmenin sonucunu doğrulayabilirsiniz.

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

  1. Yer paylaşımı .dts'ü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 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 bir dosya adı) olarak kaydedin.
  3. Birleştirilmiş DT'yi almak için dtc'yi derlemek üzere my_main_dt_with_include.dts'yi kullanın. Bu sonuç, DTO ile aynı olmalıdır. Örneğin:
    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 firmaların, yer paylaşımlı uygulamanın doğruluğunu değerlendirmek üzere Tedarikçi Test Paketi (VTS)'yi etkinleştirmek için DTBO bölümünde seçilen yer paylaşımlarını belirten yeni bir çekirdek komut satırı parametresi androidboot.dtbo_idx eklemesi gerekir. 5.10 veya daha yeni bir çekirdek sürümü kullanan Android 12'de bu parametre bootconfig üzerinden iletilir. Örneğin androidboot.dtbo_idx=x,y,z parametresi x, y ve z değerlerini bootloader tarafından temel DT'ye uygulanan (bu sırayla) DTBO bölümünde yer alan DTO'ların sıfır tabanlı dizinleri olarak 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. Ana DT'ye overlay_1 uygulandıktan sonra, sonuçta elde edilen DT'ye overlay_2 uygulanmaya çalışılırsa yer paylaşımlı uygulama başarısız olur ve temel DT'nin sembol tablosunda e simgesinin bulunmadığına dair bir hata gösterilir.

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.

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ü 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 (özelliğin en az bir geçerli DTBO resim dizini belirtip belirtmediğini kontrol ederek).
  • DTBO bölümünün geçerliliği (DTBO bölümünde temel DT'ye uygulanan yer paylaşımlarını da doğrular).
  • Ortaya çıkan DT'deki ek düğüm 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 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>; };
Final DT

/dts-v1/;
/ {

 a {
 phandle = <0x1>;
 };

 b {
 phandle = <0x2>;
 };

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