デバイスツリーとデバイスツリーblobとは正確には何ですか?特定のLinuxバージョンのソースコードはどこで入手できますか?ザイリンクスチップ上でLinuxを実行しているときにこのような名前を見つけました(ARM 9)です)。例: here
ザイリンクスのwikiを調べてみましたか?
このハウツーには、必要なものを入手するために必要なものがすべて揃っているように見えます。コードのあるgitリポジトリへのリンクと、ビルド方法の説明があります。デバイスツリーソースをダウンロードするコマンドは次のとおりです。
$ git clone git://github.com/Xilinx/device-tree.git
ザイリンクスのWebサイトには、ツールチェーンワークフローを初めて使用する場合に、優れた はじめに リソースも用意されています。これは、デバイスツリーが収まる場所を示す図です。
これらの詳細はザイリンクスプラットフォーム用のLinuxのバリエーションに非常に固有であるため、そのwikiはそのバージョンをサポートするハードウェアベンダーであるザイリンクスによって管理されているため、上記以外の詳細はU&Lに含めません。使用するハードウェア製品のカーネル。
Google は Wikipedia を参照し、これは www.devicetree.org を参照し、「デバイスツリー」を次のように説明します。
デバイスツリーは、ハードウェアを記述するためのデータ構造です。デバイスのすべての詳細をオペレーティングシステムにハードコーディングするのではなく、ハードウェアの多くの側面を、起動時にオペレーティングシステムに渡されるデータ構造で記述することができます。デバイスツリーは、Open Firmwareと、スタンドアロンのFlattened Device Tree(FDT)フォームの両方で使用されます。
これは、/dev/
の下の「デバイスツリー」とは完全に異なる「デバイスツリー」のようです。
QEMU仮想デバイスを使用した最小限のreg
+ interrupt
の例
他の人が言ったように、デバイスツリーはハードウェアベンダーによって提供され、Linuxカーネルにデバイスとの通信方法を指示します。
Linuxカーネルが必要とする2つの最も注目すべき情報は次のとおりです。
この例では、QEMUが-M versatilepb
のために使用するversatilepb
デバイスツリーに次のデバイスツリーノードを追加します。
lkmc_platform_device@101e9000 {
compatible = "lkmc_platform_device";
reg = <0x101e9000 0x1000>;
interrupts = <18>;
interrupt-controller;
#interrupt-cells = <2>;
clocks = <&pclk>;
clock-names = "apb_pclk";
lkmc-asdf = <0x12345678>;
};
次に、Linuxカーネルモジュールを使用してデバイスと対話することにより、次のDTS機能をテストします。
これらは、例の主要なコンポーネントです。
.dts
Linuxフォークのパッチreg
とinterrupt
は、QEMU汎用マシン(SoCを表す)にハードコードされた番号と一致しますcompatible
はカーネルモジュールのplatform_driver.name
と一致し、どのモジュールがこのデバイスを処理するかをカーネルに通知しますlkmc-asdf = <0x12345678>;
、これはof_property_read_u32
で読み取られます-dtb
引数を使用してQEMUのファームウェアに渡されます-M versatilepb
に挿入デバイスツリーには、まだ説明していない機能が他にもたくさんありますが、この例を参考にして、新しい機能を簡単に試してみることができます。
その他のリソース:
dtc
をいじってみてください。たとえば、ノードがパスによって単純にマージされる方法を示しています: https://unix.stackexchange.com/a/375923/32558