メインコンテンツまでスキップ

デバイスツリーとオーバーレイ

デバイスツリーは、カーネルがドライバーをバインドできるように、ボード上のハードウェアを 記述するものです。Modalix ボードはベースのデバイスツリーで起動し、その後、カメラなど 接続したものに応じたオーバーレイを適用します。このページでは、リリースに含まれるオーバーレイの 選択方法、独自のオーバーレイの作成方法、結果の確認方法を説明します。

ハードウェアでは未検証

このページは、プラットフォームリリース 2.1.3 のカーネルおよび U-Boot のソースと、このサイトの ほかのガイドをもとに作成しています。ここに記載した手順そのものは、ボード上ではまだ 実行されていません。

ボードがデバイスツリーを読み込む仕組み​

  1. U-Boot は、アクティブなブートディレクトリ(boot-0 または boot-1)からボード用の ベースデバイスツリーを読み込みます。
  2. U-Boot は、dtbos 変数に指定された各オーバーレイを、記載された順に適用します。
  3. カーネルは、マージされたデバイスツリーで起動します。

デバイスツリーはハードウェアを記述するものであり、ドライバーを追加するものではありません。 デバイスのドライバーは、あらかじめカーネルに含まれているか、モジュールとしてインストール されている必要があります。カーネルドキュメントの デバイスツリーの使用モデルを参照してください。

リリースに含まれるオーバーレイを選択する​

リリースには、対応カメラ用のオーバーレイと、PCIe およびフラッシュの構成用のオーバーレイが 含まれています。ソースは、カーネルツリーの overlays ディレクトリ にあります。

  1. ボード上のオーバーレイを一覧表示します。

    sima@modalix:~$ ls /boot/boot-*/*.dtbo
  2. U-Boot を中断し、dtbos にオーバーレイを設定して起動します。

    sima$ setenv dtbos modalix-som-waveshare-ARDU-IMX477-1CAM.dtbo
    sima$ saveenv
    sima$ 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 インターフェースに接続します。

オーバーレイのビルドとインストール​

  1. BSP をソースからビルドするの説明に従って、オーバーレイのソースを .dtbo ファイルにコンパイルします。

  2. .dtbo ファイルを、ボードのアクティブなブートディレクトリにコピーします。

  3. U-Boot で、すでに指定されているオーバーレイの後ろに、このファイルを dtbos へ 追加します。

    sima$ env set dtbos $dtbos my-device.dtbo
    sima$ saveenv
    sima$ boot

結果を確認する​

次の順に確認します。各ステップは、その前のステップが成功していることが前提です。

  1. オーバーレイが適用されている。 カーネルが使用しているデバイスツリーの中から、 新しいノードを探します。

    root@modalix:~# find /proc/device-tree -name "gpio@27"
  2. ドライバーがデバイスにバインドされている。 カーネルログでドライバーを探します。

    root@modalix:~# dmesg | grep -i pcf857x
  3. デバイスが動作している。 そのデバイスの種類に合ったツールを使用します。GPIO エクスパンダーの場合、gpiodetect に新しいチップが表示されます。カメラの場合、 cam -l にカメラが表示されます。

うまくいかない場合​

症状考えられる原因確認する項目
ノードが /proc/device-tree にないU-Boot がオーバーレイを適用していないU-Boot での printenv dtbos、アクティブなブートディレクトリ内のファイル、U-Boot コンソールのエラー
ノードはあるが、ドライバーがバインドされないカーネルに compatible 文字列に対応するドライバーがないカーネルの構成と dmesg
ドライバーがエラーを報告するバスまたはアドレスが誤っている、あるいはクロック、電源、リセット、GPIO が不足しているdmesg、および I2C デバイスの場合は i2cdetect
ほかのデバイスが動作しなくなる2 つのオーバーレイが同じノードまたは同じピンを変更しているオーバーレイを 1 つずつ適用する

次のステップ​