デバイスツリーは、ARMデバイスで実行するときに正しいドライバとその設定を識別してロードするために使用されます。ところが、例えば携帯電話にロードされたDTを見ると、/proc/device-tree
実際のプラットフォームと全く関係のない構成がたくさんあります。たとえば、この特定のデバイスには一度も使用したことがなく、今後使用しない約15の異なるディスプレイ構成があります。これまでは、そのDTだけがカーネルに含まれてロードされると思いましたが、/arch
そのソースフォルダにあるDTSがすべてロードされるようです。カーネルはプラットフォームに適したカーネルをどのように選択しますか?これは少し重複しませんか?
答え1
ロードするデバイスツリーBLOB(DTB)ファイル(デバイスツリーソース(DTS)からコンパイルされたファイル)を決定する操作は、通常ブートローダによって処理されます。
多くのデバイスメーカーは、そのハードウェアにロードする DTB ファイルを決定する作業を自動化するために、メーカー固有のコードを追加するようにブートローダをカスタマイズします。
一例USBブート、一般的に使用されるブートローダzイメージカーネル image
fdt_file
SATA デバイスの FAT パーティションの DTB。これはloadaddr
指定されたメモリアドレスにロードされ、fdt_addr
U-Bootbootz
コマンドに渡されます。
fatload sata 0:1 ${loadaddr} ${image};
fatload sata 0:1 ${fdt_addr} ${fdt_file};
bootz ${loadaddr} - ${fdt_addr};
U-bootbootz
の使い方:
bootz [addr [initrd[:size]] [fdt]]
- boot Linux zImage stored in memory
The argument 'initrd' is optional and specifies the address
of the initrd in memory. The optional argument ':size' allows
specifying the size of RAW initrd.
When booting a Linux kernel which requires a flat device-tree
a third argument is required which is the address of the
device-tree blob. To boot that kernel without an initrd image,
use a '-' for the second argument. If you do not pass a third
a bd_info struct will be passed instead
U-Bootがこれを処理する方法の詳細については、fdt_file
ソースコードを参照してください。bootm_find_images、またboot_get_fdt。
U-Bootマニュアルでいくつかの情報を収集することもできます。https://www.denx.de/wiki/view/DULG/UBootCmdFDT
答え2
カーネルがすべてのDTSをロードするためではないようです。実際、ARMファームウェアイメージには複数のdtを含めることができますが、起動時にのみdtをロードします。/proc/device-tree
デバイスツリーで定義した冗長デバイス整数が表示されます。携帯電話にこれらのデバイスがない場合でも、これらのデバイスは機能せず、カーネルが破損する可能性があるため、デバイスを定義できます。
答え3
同じdtsディレクトリに
DTS/{manufacturer-name}/some-dts-evb.dts
Makefileがあり、それを開くと、どの.dtsファイルが使用されているかを確認できます。
dtb-$(CONFIG_ARCH_XXXXXX) += some-dts-evb.dtb