概要
現在、カスタムボード用のカスタムドライバーを使用してLinuxカーネル(カーネル、モジュール、DTB)をコンパイルしています。たまにカーネルをコンパイルして、DTBファイルの互換性文字列がカスタムドライバーが探しているものではないことに気づきます。現時点でこれを修正できる唯一の方法は、DTSまたはカーネルドライバーを変更して、文字列を一致させてからカーネルを再コンパイルすることです。DTBファイルを編集して更新する方法はありますか?互換性文字列?
失敗した試行
次のコマンドを使用して、DTBファイルをDTSファイルに逆コンパイルできます。
dtc -I dtb -o <filename>.dts -<filename>.dtb
ただし、DTSファイルを変更し、次のコマンドを使用して再コンパイルした場合:
dtc -I dts -o <filename>.dtb -<filename>.dts
カーネルは再コンパイルされたDTBファイルをロードしません
新しいdtbを生成しませんか?
DTB(デバイスツリーblob /バイナリ)は、ボードのハードウェアコンポーネントを表すハードウェアデータベースです。
U-Bootは、U-Bootのヘッダーファイルから派生したボード情報構造体をカーネルに渡します。
DTBは、U-BootとLinuxが理解できる適切な形式でバイナリを生成する特別なコンパイラによってコンパイルされます。
DTC(デバイスツリーコンパイラ)は、デバイスツリーファイルをU-BootおよびLinuxカーネルが理解できる機械可読バイナリに変換します。
DTCを使用する簡単な方法。
$ dtc -O dtb -o arm_board.dtb -b 0 arm_board.dts
dtbからデバイスツリーをテキストで取得します。
dtc -I dtb -O dts arm_board.dtb
board.dtsは、上記のコマンドで作成されたバイナリです。 -O
は出力形式を指定します。 -o
フラグは出力ファイルです。 -b 0
は、物理ブートCPUを指定します。
それから
$ make Arch=arm arm_board.dtb
別のアプローチは単にmake dtbs
これはdtcを呼び出します。 Arch/arm/boot/dts/Makefile
ビルド時にどのDTBを生成するかをリストします。これは、コンパイルする別の方法です。 makeはそれをカーネルツリーのこの場所に置きます/Arch/arm/boot/dts
これを見てください ダミーのデバイスツリー
この問題について2年以上の経験を積んでこれを更新したいだけです。
LinuxリポジトリのDTSファイルは、DTS and Cプリプロセッサディレクティブ(#include、#defineなど)の混合です。したがって、元のDTBがコンパイルされると、プリプロセッサは参照ファイルにリンクして、純粋なDTSファイルを作成します。 dtc
は、単一のDTSファイルをDTBファイルに変換します。
したがって、カーネルDTSファイルを変更してコンパイルする場合は、2つのオプションがあります。
make dtbs
を実行するだけですcpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...
)を実行し、dtc
を使用して出力をコンパイルします。