デバイスツリーとオーバーレイ
デバイスツリーは、カーネルがドライバーをバインドできるように、ボード上のハードウェアを 記述するものです。Modalix ボードはベースのデバイスツリーで起動し、その後、カメラなど 接続したものに応じたオーバーレイを適用します。このページでは、リリースに含まれるオーバーレイの 選択方法、独自のオーバーレイの作成方法、結果の確認方法を説明します。
このページは、プラットフォームリリース 2.1.3 のカーネルおよび U-Boot のソースと、このサイトの ほかのガイドをもとに作成しています。ここに記載した手順そのも のは、ボード上ではまだ 実行されていません。
ボードがデバイスツリーを読み込む仕組み
- U-Boot は、アクティブなブートディレクトリ(
boot-0またはboot-1)からボード用の ベースデバイスツリーを読み込みます。 - U-Boot は、
dtbos変数に指定された各オーバーレイを、記載された順に適用します。 - カーネルは、マージされたデバイスツリーで起動します。
デバイスツリーはハードウェアを記述するものであり、ドライバーを追加するものではありません。 デバイスのドライバーは、あらかじめカーネルに含まれているか、モジュールとしてインストール されている必要があります。カーネルドキュメントの デバイスツリーの使用モデルを参照してください。
リリースに含まれるオーバーレイを選択する
リリースには、対応カメラ用のオーバーレイと、PCIe およびフラッシュの構成用のオーバーレイが 含まれています。ソースは、カーネルツリーの overlays ディレクトリ にあります。
-
ボード上のオーバーレイを一覧表示します。
sima@modalix:~$ ls /boot/boot-*/*.dtbo -
U-Boot を中断し、
dtbosにオーバーレイを設定して起動します。sima$ setenv dtbos modalix-som-waveshare-ARDU-IMX477-1CAM.dtbosima$ saveenvsima$ boot
複数のオーバーレイを適用するには、名前をスペースで区切ります。カメラ用オーバーレイに ついては、対応 MIPI カメラを参照してください。
独自のオーバーレイを作成する
リリースにオーバーレイがないデバイスを接続する場合は、オーバーレイを作成します。
次の例では、I2C バス 0 のアドレス 0x27 に I2C GPIO エクスパンダーを追加します。
/dts-v1/;
/plugin/;
&i2c00 {
status = "okay";
clock-frequency = <400000>;
#address-cells = <1>;
#size-cells = <0>;
pcf8574: gpio@27 {
compatible = "nxp,pcf8574";
reg = <0x27>;
gpio-controller;
#gpio-cells = <2>;
};
};
&i2c00は、ベースデバイスツリー内のラベルによって、変更するノードを選択します。status = "okay"は、ベースデバイスツリーで無効になっているノードを有効にします。#address-cellsと#size-cellsは、ベースデバイスツリー内のバスの値を繰り返したものです。 これらがないと、dtcはregを検査できないという警告を出します。- 子ノードがデバイスです。
compatibleでドライバーが選択され、regはバス上の デバイスのアドレスです。
オーバーレイを作成する前に、カーネルにドライバーがあることを確認してください。
compatible 文字列は、
simaai_modalix_defconfig
で有効になっているドライバー、または自分でビルドしてインストールするモジュールのものである必要があります。
より大きな例としては、カーネルツリーにあるカメラ用オーバーレイ、たとえば
modalix-som-waveshare-ARDU-IMX477-1CAM.dtso
を参照してください。このオーバーレイは、センサー用のクロックを追加し、I2C バスとパワーダウンピンを
設定し、CSI インターフェースとそのビデオノードを有効にして、センサーを 2 本のデータレーンで
CSI インターフェースに接続します。
オーバーレイのビルドとインストール
-
BSP をソースからビルドするの説明に従って、オーバーレイのソースを
.dtboファイルにコンパイルします。 -
.dtboファイルを、ボードのアクティブなブートディレクトリにコピーします。 -
U-Boot で、すでに指定されているオーバーレイの後ろに、このファイルを
dtbosへ 追加します。sima$ env set dtbos $dtbos my-device.dtbosima$ saveenvsima$ boot
結果を確認する
次の順に確認します。各ステップは、その前のステップが成功していることが前提です。
-
オーバーレイが適用されている。 カーネルが使用しているデバイスツリーの中から、 新しいノードを探します。
root@modalix:~# find /proc/device-tree -name "gpio@27" -
ドライバーがデバイスにバインドされている。 カーネルログでドライバーを探します。
root@modalix:~# dmesg | grep -i pcf857x -
デバイスが動作している。 そのデバイスの種類に合ったツールを使用します。GPIO エクスパンダ ーの場合、
gpiodetectに新しいチップが表示されます。カメラの場合、cam -lにカメラが表示されます。
うまくいかない場合
| 症状 | 考えられる原因 | 確認する項目 |
|---|---|---|
ノードが /proc/device-tree にない | U-Boot がオーバーレイを適用していない | U-Boot での printenv dtbos、アクティブなブートディレクトリ内のファイル、U-Boot コンソールのエラー |
| ノードはあるが、ドライバーがバインドされない | カーネルに compatible 文字列に対応するドライバーがない | カーネルの構成と dmesg |
| ドライバーがエラーを報告する | バスまたはアドレスが誤っている、あるいはクロック、電源、リセット、GPIO が不足している | dmesg、および I2C デバイスの場合は i2cdetect |
| ほかのデバイスが動作しなくなる | 2 つのオーバーレイが同じノードまたは同じピンを変更している | オーバーレイを 1 つずつ適用する |
次のステップ
- BSP をソースからビルドする:カーネル、デバイスツリー、オーバー レイの ビルド。
- 低速 I/O:GPIO、UART、I2C、SPI の ピン割り当てとデバイスツリーノード。
- Modalix DevKit のインターフェース対応状況: リリースのデバイスツリーで有効になっているインターフェース。