デバイスツリーオーバーレイをロードする方法

デバイスツリーオーバーレイをロードする方法

私はこれがトピックであり、それに関する他の投稿がいくつかあることを知っています。しかし、?それらのいくつかは承認された回答や有用なコメントを持っています。簡単に言えば、(カーネルを再コンパイルせずに)デバイスツリーモジュールをロードするにはどうすればよいですか?

これまで、次の方法があります。

  1. 実行時にロードされるすべてcat enI2C4.dtbo>/sys/kernel/config/device-tree/overlays
  2. .dtboおよび/またはでファイルを指定して、/boot/bootenv.txt起動プロセス中にロードします/boot/uEnv.txt。どちらの場合も、内容は次のとおりです(enI2C4.dtbo以下に保存されます/boot)。
overlays=enI2C4.dtbo

残念ながら、それらのどれも私のために働かなかった。

  1. ディレクトリdevice-treeは存在せず、mkdirはを返しますOperation not permitted。この質問に対するほとんどの解決策は独自のカーネルをコンパイルするようですが、実際には必要ではなく、私が望むものではありません。
  2. これらのファイルの1つを編集/作成しても効果がないようです。オーバーレイを見つけることも、特別なものを返すこともfind /proc/device-tree/ -type f -exec head {} + | grep I2Cできません。dmesg

それでは、私がここで何を見逃しているのでしょうか? 3番目のオプションはありますか?それともここで何か落ちましたか(おそらく愚かなことですか)?

背景と追加情報:

i.MX 8MでI2C4を有効にしようとしています。

$ lsb_release -a
Distributor ID: ampliPHY
Description:    ampliPHY GNU/Linux BSP-Yocto-NXP-i.MX8MP-PD22.1.0 (hardknott)
Release:        BSP-Yocto-NXP-i.MX8MP-PD22.1.0
Codename:       hardknott

ファイル.dtsは次のとおりです

/dts-v1/;

#include "imx8mp.dtsi" 

&i2c4 {
    clock-frequency = <400000>;
    pinctrl-names = "default", "gpio";
    status = "okay";
};

/boot/bootenv.txtこれは/boot/uEnv.txtファイルがあるbootpromp(/boot/マウント後)です。

[  OK  ] Mounted /boot.
[  OK  ] Reached target Local File Systems.
         Starting Create Volatile Files and Directories...
[  OK  ] Finished Create Volatile Files and Directories.
         Starting Network Name Resolution...
         Starting Network Time Synchronization...
[  OK  ] Started Network Name Resolution.
[  OK  ] Started Network Time Synchronization.
[  OK  ] Reached target Network.
[  OK  ] Reached target Host and Network Name Lookups.
[  OK  ] Reached target System Initialization.
[    6.550051] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[    6.557338] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[    6.564225] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[    6.570968] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[    6.577572] imx-sdma 30bd0000.dma-controller: sdma firmware not ready!
[    6.597437] imx-cdnhdmi sound-hdmi: snd_soc_register_card failed (-517)
[  OK  ] Started     6.605376] fsl-aud2htx 30cb0000.aud2htx: Unbalanced pm_runtime_enable!
;39mDaily Cleanup of Temporary Di[    6.613814] fsl-aud2htx 30cb0000.aud2htx: failed to init imx pcm dma: -517
rectories.
[  OK  ] Reached target System Time Set.
[  OK  ] Reached target System Time Synchronized.
[  OK  ] Reached target Timers.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on PC/SC Smart Card Daemon Activation Socket.
         Starting sshd.socket.
[  OK  ] Started NFS status monitor for NFSv2/3 locking..
[  OK  ] Listening on sshd.socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
         Starting Save/Restore Sound Card State...
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Started Start fan control, if configured.
[  OK  ] Started Linux Firmware Loader Daemon.
         Starting User Login Management...
         Starting Permit User Sessions...
[    6.927296] imx-sdma 30bd0000.dma-controller: firmware found.
         Starting OpenSS[    6.934041] imx-sdma 30bd0000.dma-controller: loaded firmware 4.6
H Key Generation...
[  OK  ] Finished Save/Restore Sound Card State.
[  OK  ] Finished Permit User Sessions.
[  OK  ] Finished OpenSSH Key Generation.
[  OK  ] Reached target Sound Card.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttymxc0.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started User Login Management.
[  OK  ] Reached target Multi-User System.
[    7.198435] IPv6: ADDRCONF(NETDEV_CHANGE): can0: link becomes ready
[    7.204785] IPv6: ADDRCONF(NETDEV_CHANGE): can1: link becomes ready

 ____   _   _ __   __ _____  _____   ____
|  _ \ | | | |\ \ / /|_   _|| ____| / ___|
| |_) || |_| | \ V /   | |  |  _|  | |
|  __/ |  _  |  | |    | |  | |___ | |___
|_|    |_| |_|  |_|    |_|  |_____| \____|

    _     __  __  ____   _      ___  ____   _   _ __   __
   / \   |  \/  ||  _ \ | |    |_ _||  _ \ | | | |\ \ / /
  / _ \  | |\/| || |_) || |     | | | |_) || |_| | \ V /
 / ___ \ | |  | ||  __/ | |___  | | |  __/ |  _  |  | |
/_/   \_\|_|  |_||_|    |_____||___||_|    |_| |_|  |_|

答え1

他の回答で説明したように、ランタイム時に(再起動せずに)オーバーレイをロードするには、カスタムLinuxカーネルが必要です。つまり、カーネルソースコードにパッチを適用して設定を調整し、Linuxディストリビューションがすでに存在しない限り、カスタムLinuxカーネルをコンパイルしてインストールする必要があります。これらの修正されたカーネルを提供します。

通常、オーバーライドは実行時には適用されず、通常は u-boot ブートローダに適用されます。 u-bootでカーネルデバイスツリーにオーバーレイを追加する方法はいくつかあります。最も一般的な方法は、さまざまなu-bootコマンドを使用してデバイスツリーとすべてのオーバーレイをメモリに「手動で」ロードし、各オーバーレイを使用して更新することです。デバイスツリーの回転、そして最後に作成されたデバイスツリーでLinuxカーネルが起動します。これらの手順は通常、起動スクリプト(u-boot起動時に実行されるスクリプト)に配置されます。このスクリプトは通常、boot.scrと呼ばれ、人間が読み取ることができず、変更できないバイナリイメージ形式です。 (boot.scrは、boot.cmdというスクリプトソースコードファイルをコンパイルして生成できます)。

しかし、ほとんどの人はこれらの詳細を扱う必要はありません。使用しているLinuxディストリビューションによっては、これらすべてが処理され、u-boot環境変数にリストされているオーバーライドをロードして適用するブートスクリプト(またはいくつかの代替メカニズム)があります。名前は「overlays」です。通常、/boot/uEnv.txt というファイルを編集して変更できます。

繰り返しますが、これらすべては、デプロイメント設計者がu-boot、ブートスクリプト、カーネル、およびLinuxシステムを設定した方法によって異なります。たとえば、u-boot環境は、eepromやspi nvramなどのハードウェアチップ、ハードドライブの特別なパーティションまたはセクタ、またはその他の秘密の場所に保存できます。 u-boot環境変数やブートスクリプトの変更はセキュリティ上の脆弱性があるため、root権限があってもユーザーが変更できないことがよくあります。 u-boot環境を変更できますが、ブートスクリプトにオーバーライドを追加する機能が含まれていない可能性があります。ディストリビューションが提供する内容によって異なります。

最後の例:Armbianを使用していて、Armbianがオーバーレイをサポートするプラットフォームを持っているなら、幸運です。 /boot/armbianEnv.txtに保存されている「overlays」変数を変更するだけです。この変数は、Linuxカーネルを起動する前にu-bootが追加しようとするスペースで区切られたオーバーライドのリストです。 .dtbo サフィックスなしで目的のオーバーレイのファイル名を追加します。ここに追加するオーバーライドは/boot/dtb/XXXの下にある必要があります。ここで、XXXはプラットフォームのサブディレクトリです。機能しないオーバーレイを追加すると、システムが起動しなくなる可能性がありますが、通常、u-bootは誤ったオーバーレイをスキップしてエラーメッセージを表示します。

.dtsオーバーレイソースコードファイルからカスタムオーバーレイ.dtboファイルをコンパイルするための「armbian-add-overlay」ツールもあります。生成された.dtboは/boot/overlay_user/に自動的にコピーされ、/boot/armbianEnv.txtのuser_overlays u-boot環境変数に参照が追加されます。整頓された!

たとえば、参照してください。https://docs.armbian.com/User-Guide_Allwinner_overlays/

答え2

/sys/kernel/config/device-tree/overlays/ビルドされたカーネルがあるはずですCONFIG_OF_CONFIGFS=y(これはアップストリーム機能ではありませんが、一部のカーネルで利用可能です)。

関連情報