Blog:
Yocto Projectで使用しない機能をGPIOに変更する例

Monday, January 16, 2023
Yocto
Yocto

使用しない機能を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の場合それぞれの意味は下記になります。

  1. モード設定レジスタのオフセットアドレス 0x1B4 (MUX Control Register)
  2. 端子設定レジスタのオフセットアドレス0x414 (PAD Control Register)/li>
  3. 入力DAISY設定レジスタのオフセットアドレス0x000/li>
  4. モード設定レジスタの設定値0x5/li>
  5. 入力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



Authors:
桐川篤史
・岡本無線電機
ガルシアアルバロ・Toradex(トラデックス)
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?