Blog:
デバイスツリーオーバーレイの利用

Tuesday, July 13, 2021

現在の新しいLinuxカーネルはデバイスツリーに対応しており、組み込みデバイスにとって非常に重要な周辺機器管理に利用できます。異なるデバイスツリーファイルを介することで、周辺機器の変更にあわせてLinuxカーネルをリコンパイルする作業を効果的に削減できます。SoCの複雑化が進むなか、デバイスツリーそのものも複雑化しています。デバイスツリーオーバーレイ(DTO)は、デバイスツリー変更のシンプルな方法を提供します。以下では、Apalis iMX8QMコンピューターモジュール上のToradex Linux BSP v5.0で、デバイスツリーオーバーレイを設定する方法について説明します。

まずは、必要なコンパイルのツールとLinuxカーネルのソースコードをダウンロードしなければなりません。この方法については、Developer Centerのウェブページを参照してください。

gitを利用してLinuxカーネルのソースコードをダウンロードします。

git clone -b toradex_5.4-2.1.x-imx git://git.toradex.com/linux-toradex.git

など一部の周辺機器に適した既成のデバイスツリーオーバーレイファイルも提供しています。これは、デバイスツリーオーバーレイについて学ぶのに利用できます。

git clone -b toradex_5.4-2.1.x-imx git://git.toradex.com/device-tree-overlays.git

デバイスツリーオーバーレイの利用は3つのステップに分けられます。デバイスツリーオーバーレイファイルdtsの作成、dtsファイルのコンパイルによるdtboファイルの生成、dtboファイルの導入です。ここではApalis iMX8QMのSDインターフェースを利用して、SD_DATA0とSD_DATA1をGPIとして設定する例を示します。

まず、Apalis iMX8QMデータシートを参照して、利用されているピンを見つけます。これは、MXM3_186およびMXM3_188で、それらに該当するGPIOは、LSIO.GPIO5.IO26とLSIO.GPIO5.IO27です。

 

次にtest_overlay.dtsファイルを作成します。

/dts-v1/;
/plugin/;
/ {
       compatible = "toradex,apalis-imx8";
};


compatible属性はデバイスツリーオーバーレイファイルが適用されるハードウェアを特定します。これは、imx8qm-apalis-eval.dtsに相当します。

デフォルト設定では、MXM3_186およびMXM3_188は4ビットのSDチャネルに利用されているため、この機能を無効にする必要があります。デバイスツリーでは、4ビットSDチャネルに相当する名前はusdhc3です。

&usdhc3 {
       status = "disabled";
};


iOMuxcユニットが、iMX8QMでのピン多重化の設定を管理します。Apalis iMX8QMは、デフォルト設定では8つのGPIOがありますが、その一部はファン電力制御などのほかのデバイス用に利用されます。ここでは、2つの新しいGPIO、pinctrl_gpio9およびpinctrl_gpio10を追加します。test_overlay.dtsに追加されたiomuxc/pinctrl-0の属性は、デフォルト設定を上書きします。

次に、MXM3_186およびMXM3_188をGPIOモードに設定する必要があります。先述のとおり、MXM3_186およびMXM3_188に該当するGPIOはLSIO.GPIO5.IO26およびLSIO.GPIO5.IO27で、Ball名はUSDHC2_DATA0およびUSDHC2_DATA1であることが分かっています。この情報に基づいて、imx8qm.hで該当するピン名、IMX8QM_USDHC2_DATA0_LSIO_GPIO5_IO26とIMX8QM_USDHC2_DATA1_LSIO_GPIO5_IO27を見つけます。test_overlay.dtsのiomuxcノードに追加します。

 

これで、test_overlay.dtsファイルは完成です。ダウンロードしたtest_overlay.dtsをdevice-tree-overlays/overlaysディレクトリーにコピーします。

$ tree -L 2
.
├── device-tree-overlays
│   └── overlays
└── linux-toradex


次に、下の2つのコマンドを実行してtest_overlay.dtboファイルを生成します。ここでは、Linuxカーネルソースコードの関連ディレクトリーを指定するのに-lおよび-iパラメーターを利用します。

cpp -nostdinc -I ../../linux-toradex/arch/arm64/boot/dts/freescale -I ../../linux-toradex/include -undef \
-x assembler-with-cpp test_overlay.dts test_overlay.dts.preprocessed

dtc -@ -Hepapr -I dts -O dtb -i ../../linux-toradex/arch/arm64/boot/dts/freescale/ -o test_overlay.dtbo test_overlay.dts.preprocessed


最後に、test_overlay.dtboをApalis iMX8QMに導入します。ファイルを/media/mmcblk0p1/overlaysディレクトリーにコピーし、さらに/media/mmcblk0p1/overlays.txtファイルを変更します。再起動コマンドを実行してシステムを再起動します。

fdt_overlays=overlays/test_overlay.dtbo

起動後にシリアルポートログを確認すると、overlays/test_overlay.dtboが読み込まれてシステムに適用されたことがわかります。

## Executing script at 83100000
102464 bytes read in 19 ms (5.1 MiB/s)
Loading hdp firmware from 0x000000009c000000 offset 0x0000000000002000
Loading hdp firmware Complete
162517 bytes read in 23 ms (6.7 MiB/s)
40 bytes read in 16 ms (2 KiB/s)
Applying Overlay: overlays/test_overlay.dtbo
272 bytes read in 29 ms (8.8 KiB/s)
9805442 bytes read in 316 ms (29.6 MiB/s)
Uncompressed size: 23144960 = 0x1612A00
## Flattened Device Tree blob at 83000000
 Booting using the fdt blob at 0x83000000
 Loading Device Tree to 00000000fd603000, end 00000000fd64dfff ... OK


ここでシステムに入るとこれらの2つのピンを操作できます。Linuxシステムでは、ピンへのアクセスに該当するGPIO番号を利用します。該当する関係についてはこちらで参照できます。LSIO.GPIO05.IO26(MXM3_186)およびLSIO.GPIO05.IO27(MXM3_188)は346と347にそれぞれ相当します。次にこれを出力モードとして設定するため下記を実行します。

root@apalis-imx8:~# echo 346 > /sys/class/gpio/export
root@apalis-imx8:~# echo 347 > /sys/class/gpio/export
root@apalis-imx8:~# echo "out" > /sys/class/gpio/gpio346/direction
root@apalis-imx8:~# echo "out" > /sys/class/gpio/gpio347/direction

root@apalis-imx8:~# cat /sys/kernel/debug/gpio 
gpio-346 (MXM3_186            |sysfs               ) out lo
gpio-347 (MXM3_188            |sysfs               ) out lo


下記のコマンドは、該当するピンの高/低レベルを設定できます。

root@apalis-imx8:~# echo 1 > /sys/class/gpio/gpio346/value
root@apalis-imx8:~# echo 1 > /sys/class/gpio/gpio347/value
root@apalis-imx8:~# echo 0 > /sys/class/gpio/gpio346/value
root@apalis-imx8:~# echo 0 > /sys/class/gpio/gpio347/value

デバイスツリーは、Linuxカーネルの重要なファイルです。不適切に設定すると、システムの起動に障害を起こす可能性があります。障害が発生した場合は、Apalis iMX8QMのUSB OTGをコンピューターに接続して次のコマンドをU-bootで実行します。これにより、Apalis iMX8QM起動ファイルをコンピューターにマウントし、overlays.txtファイルで設定したパラメーターを削除できます。保存したら、デフォルトのデバイスツリーを利用してシステムを起動します。

ums 0 mmc 0


まとめ

デバイスツリーを利用すると、ユーザーは大幅な設定の変更をせずに新しい周辺機器を利用することができ、デバイスツリー全体をコンパイルする必要がなくなります。

リファレンス:

https://developer.toradex.com/knowledge-base/device-tree-overlays-linux#Deploying_a_Device_Tree_Overlay
https://developer.toradex.com/knowledge-base/device-tree-overlays
https://developer.toradex.com/knowledge-base/build-u-boot-and-linux-kernel-from-source-code#Device_Tree_Overlays
https://www.raspberrypi.org/documentation/configuration/device-tree.md


Author: Shanfeng Hu, FAE, Toradex
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?