web-dev-qa-db-ja.com

カーネルDTBファイルを変更する方法

概要

現在、カスタムボード用のカスタムドライバーを使用して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ファイルをロードしません

7
Liam Kelly

新しい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

これを見てください ダミーのデバイスツリー

5
danglingpointer

この問題について2年以上の経験を積んでこれを更新したいだけです。

LinuxリポジトリのDTSファイルは、DTS and Cプリプロセッサディレクティブ(#include、#defineなど)の混合です。したがって、元のDTBがコンパイルされると、プリプロセッサは参照ファイルにリンクして、純粋なDTSファイルを作成します。 dtcは、単一のDTSファイルをDTBファイルに変換します。

したがって、カーネルDTSファイルを変更してコンパイルする場合は、2つのオプションがあります。

  1. これをすべて自動的に処理するmake dtbsを実行するだけです
  2. 手作業でプリプロセッサ(cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...)を実行し、dtcを使用して出力をコンパイルします。
0
Liam Kelly