はじめに
i.MX 8M Plus を搭載した ADLINK社 SMARC LEC-IMX8MP で GPIO の制御をしてみました。
その手順をまとめてみましたのでぜひお試しください。
<今回使用した主な製品>
-
LEC-IMX8MP
最大 2.3TOPS で動作する NPU を搭載したNXP i.MX8M Plus プロセッサをベースにした、SMARC モジュールです
-
I-Pi SMARC Plus
M.2 拡張付き SMARC 2.1 リファレンスキャリアボードです
- HTS-sIMX8MP
LEC-IMX8MP のヒートスプレッダです
(他に LEC-IMX8MP のヒートシンクの THS-sIMX8MP もあります)
その他に今回用意したもの:
- HDMI ケーブル / モニター
- USB マウス・キーボード
- LAN ケーブル
- GPIO ループバック用ジャンパもしくはケーブル
事前準備
下記記事を参考にして SMARC で Yocto が起動する SD カード をあらかじめ用意します。
参考:
- I-Pi SMARC IMX8M Plus / Boot From SD Card
- 小型 Edge-AIシステムの構築(I-Pi SMARC IMX8M Plus + Hailo-8 M.2 Module):Yocto 編
HTS-sIMX8MP(ヒートスプレッダ)、LEC-IMX8MP (SMARC モジュール) と I-Pi SMARC Plus (SMARC キャリアボード)を写真のように組み上げます。
一番上が ヒートスプレッダ、一番下がキャリアボード、その間に SMARC モジュールを挟む形です。
以下の設定/接続を実施します。
・イメージ書き込み済みのmicroSDカードのスロットへの挿入
・ブートデバイスをmicroSDカードに設定
以下左の写真のようにDIP SWを"0110"に設定ください。
・HDMIケーブルでモニターと接続
・USBマウス/キーボードの接続
※今回使用のSMARCモジュールではUSBポートが一つしか使えません。
下の写真のように、左下のコネクターにUSB Hubをつなげてご使用ください。
最後に電源アダプターを接続し起動します。
事前準備がうまくいけば以下のようにADLINK社のロゴの入った yocto の画面がHDMIモニターに表示されます。
GPIO 制御
今回、仮想ファイル /sys/class/gpio を使用して GPIO 制御をします。
SMARC 規格での GPIO は GPIO00~GPIO13 まで14ピンありますが、今回使用するキャリアボード I-Pi SMARC Plus の Header 1 : 40-Pin RPI Compatible Expansion に接続されているピンの GPIO Pin マッピングは下記のようになっています。
SMARC Funtion | MRAA Number / キャリアボード Header 1 | /sys/class/gpio |
GPIO 4 | pin7 | 497 |
GPIO 6 | pin11 | 499 |
GPIO 5 | pin12 | 498 |
GPIO 7 | pin13 | 500 |
GPIO 8 | pin15 | 501 |
GPIO 9 | pin16 | 502 |
GPIO 10 | pin18 | 503 |
GPIO 11 | pin22 | 504 |
他に、SMARC モジュールからは I2Cとして出力されていますが (I2C_GP_DAT:S49, I2C_GP_CK:S48) 、このキャリアボード上に搭載している I2C to GPIO Expander IC によって GPIO として Header 1 : 40-Pin RPI Compatible Expansion に接続されているピンの GPIO Pin マッピングは下記のようになっています。
SMARC Function | MRAA Number / キャリアボード Header 1 | /sys/class/gpio |
EGPIO GPIO1_0 | pin29 | 461 |
EGPIO GPIO1_1 | pin31 | 462 |
EGPIO GPIO1_2 | pin32 | 463 |
EGPIO GPIO1_3 | pin33 | 464 |
EGPIO GPIO1_4 | pin35 | 465 |
EGPIO GPIO1_5 | pin36 | 466 |
EGPIO GPIO1_6 | pin37 | 467 |
EGPIO GPIO1_7 | pin38 | 468 |
EGPIO GPIO1_8 | pin40 | 469 |
参考:
- 40-Pin I/O Headers Utility on I-Pi SAMRC IMX8M Plus
- キャリアボード I-Pi SMARC Plus の Header 1 ピン情報
今回、下記5ピンに対して GPIO 制御をしてみます。
SMARC Funtion | MRAA Number / キャリアボード Header 1 | /sys/class/gpio |
GPIO 4 | pin7 | 497 |
EGPIO GPIO1_0 | pin29 | 461 |
EGPIO GPIO1_1 | pin31 | 462 |
EGPIO GPIO1_2 | pin32 | 463 |
EGPIO GPIO1_3 | pin33 | 464 |
ターミナルで下記コマンドを実行します。
cd /sys/class/gpio
制御したい GPIO 番号に対して export コマンドを実行して仮想ディレクトリを作成します。これにより制御ができるようになります。
echo "GPIO番号" > export
echo 497 > export
echo 461 > export
echo 462 > export
echo 463 > export
echo 464 > export
GPIO の Direction を確認します。
cat /sys/class/gpio/gpio"GPIO番号"/direction
cat /sys/class/gpio/gpio497/direction
cat /sys/class/gpio/gpio461/direction
cat /sys/class/gpio/gpio462/direction
cat /sys/class/gpio/gpio463/direction
cat /sys/class/gpio/gpio464/direction
5つのピン全て in でしたので、デフォルトで入力となっていることが確認しました。
gpio462 の direction を出力に変更してみます。
echo out > /sys/class/gpio/gpio"GPIO番号"/direction
echo out > /sys/class/gpio/gpio462/direction
gpio462 の direction を確認します。
cat /sys/class/gpio/gpio462/direction
out と出力されたので、direction が出力に変更されたことを確認出来ました。
なお、direction を入力に変更するには下記コマンドを使用します。
echo in > /sys/class/gpio/gpio"GPIO番号"/direction
gpio462 と gpio463 を ループバックで接続して、出力の gpio462 の値を変更することで 入力の gpio463 の値が変化するか確認してみます。
まず、キャリアボード Header 1 の pin31 (gpio462) と pin32 (gpio463)をジャンパやケーブルを使用してループバックさせます。
gpio462 の値として 0 をライトします。
echo 0 > gpio"GPIO番号"/value
echo 0 > gpio462/value
gpio462 に 0 が設定されたかどうかを確認できます。
cat gpio462/value
期待通りに 0 になっています。
gpio463 の値をリードします。gpio463 は入力でしたので 0 が期待値になります。
cat gpio463/value
期待通りに 0 になっていることを確認できました。
gpio462 の値として 1 をライトします。
echo 1 > gpio462/value
gpio462 に 1 が設定されたかどうかを確認します。
cat gpio462/value
期待通りに 1 になっていることを確認できました。
gpio463 の値をリードします。gpio463 は入力でしたので 1 が期待値になります。
cat gpio463/value
期待通りに 1 になっていることを確認できました。
まとめ
SMARC コネクタ直結の GPIO ピンだけでなく、キャリアボード上の I2C to GPIO Expander で SMARC コネクタの I2C から GPIO へ拡張したピンに対しても GPIO 制御できることも確認できました。
標準の BSP でドライバの追加などのインストールは必要なくそのまま操作できますので、ぜひお試しください。