Blog:
Yocto Projectで使用しない機能をGPIOに変更する例
使用しない機能をGPIOに変更する例
(この記事は、この他の記事の続きです)
実行環境
本マニュアルの実行環境は下記です。
仮想化ソフト:VMWARE Player v15.5.7
Host OS: Windows 10 21H2
Guest OS: Ubuntu Desktop 20.04LTS 64bit(英語版)
BSP:v5.7
CPUモジュール:Verdin-iMX8M Plus Quad 4GB Wi-Fi / Bluetooth IT V1.1A
キャリアボード:Verdin開発ボードRev 1.1C + アクセサリーキット
ディスプレイ:10.1インチディスプレイ1.0A 静電式タッチパネル付き+ DSI to LVDSアダプタ1.1
本文
カーネルのカスタムではデバイスツリーの修正を行うケースが多々あるためデバイスツリーの修正例についても記載します。
デバイスツリーはピンのコンフィグやドライバーの指定や設定などを設定するものです。
デバイスツリーはLinuxの基本的な仕組みのため詳細な説明については省きます。
GPIOの端子を増やしたい場合には使用しない機能の端子をGPIOに変えて使用することがよくあります。
例えば24、26番ピンはCAN2に割り当てられています。CAN2を使用しない場合GPIOに変えて使用することができます。
CAN2に限らず他の機能でも同様です。ToradexのCPUモジュールはシリーズごとに互換性がありますが互換性がある端子をGPI
Oに変更する場合に限り、互換性を維持することができます。互換性の維持に関して詳しくはデザインガイドをご参照ください。
デバイスツリーを修正するためにカーネルのdevshellを行います。
[Ubuntu]$ bitbake -c devshell virtual/kernel
パッチファイルの作成
[Ubuntu]$ quilt new CAN2_GPIO.patch
デバイスツリーを修正します。
[Ubuntu]$ EDITOR=gedit quilt edit ./arch/arm64/boot/dts/freescale/imx8mp-verdin.dtsi
226行目辺りにあるCAN2の設定&flexcan2をコメントアウトします。
1006行目辺りにあるCAN2の設定pinctrl_flexcan2の端子設定を変更します。
MX8MP_IOMUXC_SAI2_MCLK__CAN2_RX 0x154 /* SODIMM 26 */ MX8MP_IOMUXC_SAI2_TXD0__CAN2_TX 0x154 /* SODIMM 24 */ -> MX8MP_IOMUXC_SAI2_MCLK__GPIO4_IO27 0x184 /* SODIMM 26 */ MX8MP_IOMUXC_SAI2_TXD0__GPIO4_IO26 0x184 /* SODIMM 24 */
p>
端子設定の説明をします。
./arch/arm64/boot/dts/freescale/imx8mp-pinfunc.hに各端子のピンコンフィグ設定が定義されています。
SODIMM 26の端子は572~578行目のMX8MP_IOMUXC_SAI2_MCLK__で始まる定義になります。
この定義は各端子のモード設定の数だけ存在します。上から順に0~6のモード設定になります。
設定値が5つ羅列されていますがMX8MP_IOMUXC_SAI2_MCLK__GPIO4_IO27の場合それぞれの意味は下記になります。
- モード設定レジスタのオフセットアドレス 0x1B4 (MUX Control Register)
- 端子設定レジスタのオフセットアドレス0x414 (PAD Control Register)/li>
- 入力DAISY設定レジスタのオフセットアドレス0x000/li>
- モード設定レジスタの設定値0x5/li>
- 入力DAISY設定レジスタの設定値 0x0/li>
これらの定義は変更する必要なくモード0~6のどれを使うかを定義を使って選択するだけです。
各モードに対してどのような値を入力するか考える必要なく、定義を選択するだけで使用できるようになっています。
NXPのリファレンスマニュアルの下記にあたります。(リファレンスマニュアルはNXPにアカウント登録して入手してください)
8.2.4.105 SW_MUX_CTL_PAD_SAI2_MCLK SW MUX Control Register MX8MP_IOMUXC_SAI2_MCLK__GPIO4_IO27 0x184 /* SODIMM 26 */
上記のMX8MP_IOMUXC_SAI2_MCLK__GPIO4_IO27でモード5のGPIO設定を選んでいます。
0x184の部分は端子設定レジスタの設定値になります。
NXPのリファレンスマニュアルの下記にあたります。
8.2.4.257 SW_PAD_CTL_PAD_SAI2_MCLK SW PAD Control Register
0x184はプルダウン設定になります。
GPIOの設定として使う端子は&iomuxcに入れる必要があります。
[Ubuntu]$ EDITOR=gedit quilt edit ./arch/arm64/boot/dts/freescale/imx8mp-verdin-wifi.dtsi
58行目に下記を追記します。
<&pinctrl_flexcan2>,
修正内容に対するパッチを作成します。
[Ubuntu]$ quilt refresh
CAN2_GPIO.patchというファイル名でパッチファイルが出力されます。
パッチファイルをカーネルのレシピに反映するために移動します
[Ubuntu]$ mv ./patches/CAN2_GPIO.patch /work/oe-core/layers/meta-toradex-nxp/recipes-kernel/linux/linux-toradex-5.4-2.3.x/verdin-imx8mp/
devshellを終了します。
[Ubuntu]$ exit
パッチファイルを追記します。
[Ubuntu]$ gedit /work/oe core/layers/meta toradex oe-meta-toradex-nxp/recipes-kernel/linux/linux-toradex_5.4-2.3.x.bbappend
追記内容(verdin-imx8mpのみに適用します。)
SRC_URI_append_verdin-imx8mp = " file://CAN2_GPIO.patch"
イメージの作成
[Ubuntu]$ bitbake -c cleansstate virtual/kernel && bitbake tdx-reference-multimedia-image
出力されたファイルからOSイメージを作成してモジュールに書き込みます。
[Ubuntu]$ cd /work/oe-core/image/ [Ubuntu]$ sudo tar -xf ../build/deploy/images/apalis-imx8/Verdin-iMX8MP_Reference-Multimedia-Image-Tezi_.tar
OSの書き込み方法に関してはTEZIのマニュアルをご参照ください。
書き込み後Linuxを起動してGPIOの動作確認をします。
CAN2 TXは24番ピン、CAN2 RXは26番ピンです。
gpiofindコマンドで端子を検索します。
[Module]# gpiofind SODIMM_24 [Module]# gpiofind SODIMM_26
gpiochip3 26はGPIOバンク3の26ラインという意味になります。
このバンクとラインはGPIOを指定するときに使用する値になります。
GPIOの出力を試します。
Verdin開発ボードのX2のSODIMM24(7番目)とX4のCAN2_TXを接続しているX3のジャンパーを外してください。
X2のSODIMM26(8番目)とX4のCAN2_RXを接続しているX3のジャンパーも同様に外してください。
X2のSODIMM24とX38のLED21(2番目)に接続します。
gpiosetコマンドでLEDのON/OFFを確認します。
LED ON [Module]# gpioset 3 26=1 LED OFF [Module]# gpioset 3 26=0
X2のSODIMM26も同様にX38のLED22(3番目)に接続して確認します。
LED ON [Module]# gpioset 3 27=1 LED OFF [Module]# gpioset 3 27=0
GPIOの入力を試します。
Verdin開発ボードのX2のSODIMM24とX4のCAN2_TXを接続しているX3のジャンパーを外してください。
X2のSODIMM26とX4のCAN2_RXを接続しているX3のジャンパーも同様に外してください。
X2のSODIMM24とX23のSW4に接続します。
gpiogetコマンドでSWの入力を確認します。
[Module]# gpioget 3 26
X2のSODIMM26も同様にX24のSW5に接続して確認します。
[Module]# gpioget 3 27
桐川篤史・岡本無線電機
ガルシアアルバロ・Toradex(トラデックス)