原文:A Tutorial on the Device Tree(Zynq)--Part I

3564 ワード

A Tutorial on the Device Tree (Zynq) -- Part I
このチュートリアルの目的
このチュートリアルはXilinx'Zynq-7000 EPPデバイス(FPGAを統合したARM Cotex-A 9)について書かれていますが、その概念はデバイスツリーを使用したLinuxカーネルすべてに適用されます.本明細書では、Zedboardハードウェア上で実行されるXillinuxリリースを例に挙げます.
設備ツリーのメリット
想像してみてください:bootloaderはLinuxカーネルをメモリにコピーしたばかりで、カーネルのエントリポイントにジャンプし、,[1],,.カーネルは、プロセッサ上で実行されるヌードマシンプログラムのようなものです.プロセッサを構成し、仮想メモリを設定し、コンソールに情報を印刷する必要があります.しかし、これらのことはどのように完成しますか?これらの操作はすべてレジスタを書くことで実現されますが、Linuxカーネルはどのようにこれらのレジスタのアドレスを知っていますか?現在使用できるCPUコアの数を知るにはどうすればいいですか?アクセスできるメモリはどれくらいありますか?
最も直接的な方法は、カーネルコードに指定されたプラットフォームのためにこれらのコードを書き、カーネル構成パラメータによってどのプラットフォームコードが有効になるかを決定することです.x 86プロセッサ上の内部レジスタやBIOSへのアクセスなど、すべてが固定されている場合、この方法は悪くありません.しかし、PCI/PCIe周辺機器などの変化量については、カーネルがこれらの変化の詳細を明確に理解する必要があります.
ARMアーキテクチャはLinuxコミュニティの厄介なものになっています.プロセッサが同じコンパイラと関数を使用しても、特定のチップには独自のレジスタアドレスと異なる構成方法があります.それだけでなく、どの板にも独自の外付けがあります.その結果、カーネルには大量のヘッダファイル、パッチ、特殊な構成パラメータがあり、それらの組み合わせはチップの特殊な板型に対応しています.要するに、これは多くの醜さとメンテナンス不可能なコードをもたらした.
また、コンパイルされたカーネルbinファイルは、あるチップのプレートであり、市場のあるPCマザーボードのためにカーネルをコンパイルしているように見えます.したがって、すべてのARMプロセッサにカーネルをコンパイルするときに、カーネルが何らかの方法でハードウェアを認識し、PCのように正しい駆動を使用することを望んでいます.
どうやって実現しますか?PCでは、レジスタ初期化はハードコーディングであり、その他の情報はBIOSによって提供される.したがって、他のソフトウェアがこれらの情報を提供する場合、ハードウェアの自動検出も容易である.ARMプロセッサにはBIOSがなく、Linuxカーネルは自分に頼るしかありません.
解決策はデバイスツリーdevice treeであり、Open Firmware(OF)またはFlattened Device Tree(FDT)とも呼ばれる.本質的には、カーネルの起動時に非常に役立つ情報を含むバイトコードフォーマットのデータ構造です.bootloaderは、カーネルエントリポイントにジャンプする前に、このデータをRAM内の既知のアドレスにコピーする.
設備ツリーの厳格な仕様ですが、その中に置くことができる内容や置く場所は規定されていません.カーネルは、デバイスツリー内の任意のパスとパラメータを検索できます.プログラマは、どの構成をパラメータとしてデバイスツリーに入れるか、どこに置くかを決定します.
標準的なツリー構造を採用すると、便利なAPIセットで操作できます.例えば、バス上の周辺機器をどのように定義するかが規定されている場合、APIは、アドレス、割り込み、およびカスタム変数の駆動に必要な基本情報を取得することができる.後でもっと紹介します.
多くの人にとって、デバイスツリーを使用してハードウェアの追加または削除操作をカーネルに説明します.これに応答して、カーネルは対応するドライバをロードまたはアンインストールできます.ハードウェアの特殊な情報は、デバイスツリーを介してカーネルに伝達することもできる.
デバイスツリーのコンパイル
デバイスツリーには、*テキストファイル(.dts)-ソースバイナリオブジェクト(.dtb)-ターゲットコードLinuxシステム/proc/device-treeディレクトリ-デバッグと逆情報の3つの形式があります.
/proc/device-treeディレクトリを有効にするには、コンフィギュレーションCONFIGを開く必要があります.PROC_DEVICETREE:
Device Drivers ---> Device Tree and Open Firmware support ---> [*] Support for device tree in/proc
デバイスツリーの一般的な使用方法は、DTSファイルを編集し、Linuxカーネルソースscripts/dtc/ディレクトリの下にあるツールでDTBファイルにコンパイルすることです.
デバイスツリーコンパイラは、以下のようにダウンロードしてコンパイルすることもできます.
$ git clone git://www.jdl.com/software/dtc.git dtc
$ cd dtc
$ make

しかし、以下の説明では、カーネル原コードのdtcツールを使用する.
デバイスツリーの構文はここで説明します.この言語はXMLのように実行操作を行わないことに注意してください.これはデータを組織する構文にすぎません.いくつかのアーキテクチャには、XPSプロジェクトからデバイスツリーを自動的に生成するツールがあります.しかし、Zynq EPPプラットフォームにはまだこのツールはありません.
DTSをDTBにコンパイル:
$ scripts/dtc/dtc -I dts -O dtb -o /path/to/my-tree.dtb /path/to/my-tree.dts

これでmy-treeが作成されました.dtbバイナリファイル.dtcはホスト上のプログラムです.カーネルがコンパイルされていない場合は、DTSコンパイラをコンパイルする必要があります.カーネルを構成するか、既存のプロファイルをカーネルルートディレクトリの下にコピーすることもできます.config.次のようになります.
$ make ARCH=arm digilent_zed_defconfig

DTSコンパイラの生成:
$ make ARCH=arm scripts

dtcは、DTBファイルまたは/proc/device-treeファイルシステムから逆コンパイルすることもできる.例えばDTBから逆コンパイル:
$ scripts/dtc/dtc -I dtb -O dts -o /path/to/fromdtb.dts /path/to/booted_with_this.dtb

生成されたdtsファイルは、dtbを生成するために使用されてもよい.ただし、一部の参照ラベルは、逆コンパイルされたDTSファイルに数字として表示されるため、最初のDTSファイルを使用することが望ましい.
実行中のカーネルからDTSファイルを生成するには:
# scripts/dtc/dtc -I fs -O dts -o ~/effective.dts /proc/device-tree/

コメント
[1]切り込みポイント、entry point
転載先:https://www.cnblogs.com/sammei/p/3978438.html