この記事では、i.MX9 ファミリの新しいメンバーである i.MX9352 の GPIO を処理する方法と、i.MX6ULL との類似点と相違点について詳しく学びます。
01 ハードウェア原理解析
LEDライトとボタンを例に挙げてみましょう。 SoM 図を参照すると、
MX93_PAD_CCM_CLKO4 によって制御される LED ライトが 1 つあることがわかります。
この GPIO の電気レベルは 1.8V であるため、キャリア ボード上の LED には直接接続さ
れていません。 しかし、別の方法では、GPIO が 1 つの MOSFET を制御し、次に
MOSFET が LED ライトを制御します。GPIO の電気レベルが高い場合、MOS が接続さ
れ、LED ライトがオンになります。 GPIO の電気レベルが低い場合、MOS が切断され、
LED が消灯します。
02 DTS(デバイスツリー)ピン代替機能
Forlinx Embedded OK-MX9352-C DTS を開きます。
OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/OK-MX93-C.dts
iomuxc ノードの下に代替ピンの新しいセットを作成します。2 つの GPIO は、キャリア ボード上の LED ライト D6 とボタン K1 です。
次に、次のように新しい GPIO ノードを作成します。
交互の競合を避けるために、LED パーツと KEY パーツに注釈を付けます。
保存して終了した後に DTS をコンパイルする
実行時環境変数:
forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ . environment-setup-aarch64-toolchain
DTS を個別にコンパイルします。
forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- dtbs
コンパイル後、DTS を別途更新します。 まず、USB ドライブを仮想マシンに挿入し、生成された DTS ファイルを USB ドライブにコピーします。
forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ cp arch/arm64/boot/dts/freescale/OK-MX93-C.dtb /media/forlinx/2075-A0A7/
生成された dtb ファイルを USB ドライブを備えた OK-MX9352-C SoM にコピーし、/run/media/Boot-mmcblk0p1/OK-MX93-C.dtb に置き換えます。
root@ok-mx93:/run/media/Boot-mmcblk0p1# cp /run/media/sda/OK-MX93-C.dtb ./
OK-MX9352-C SoM を再起動します
03 コマンドを実行してテストする
OKMX6ULL-S SoM の GPIO の動作方法は、/sys/class/gpio 配下のファイルによって実現
されます。 ただし、OK-MX9352-C には新しい Lingpiod 方式があり、以前の sysfs ベー
スの動作方式はサポートできなくなりました。
Libgpiod はキャラクターデバイスです。 GPIO はキャラクター デバイス
(例:/dev/gpiodchip0) によって制御されます。OK-MX9352-C には 4 セットの GPIO があ
り、GPIO デバイス ファイルは /dev で確認できます。
Libgpiod には、シェルターミナルと C ライブラリという 2 つの使用方法があります。
この章ではシェルターミナルについて紹介し、次の章ではCライブラリについて紹介し
ます。
3.1 gpiodetect
すべての GPIO デバイスを確認します。
上記の gpiochip0 ~ gpiochip4 は、それぞれ DTS の GPIO1 ~ GPIO4 と一致します。 ただし、対応するレジスタアドレスの順序の問題により、1 対 1 の順序ではありません。 それでは、goiochip0 はどのようにして DTS と一致するのでしょうか? デバイスツリーでdtsiファイルを開くことができます。
path:OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi
forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ vi OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi
GPIO3 のレジスタ アドレス: gpio@43820080 が確認できます。これは gpiochip1 に対応し、GPIO4 は gpiochip2 に対応します。
その他の GPIO の対応関係は以下の通りですのでご参照ください。
3.2 gpioinfo
3.1 から、LED ライトが GPIO4 -- gpiochip2 に対応し、ボタンが GPIO3 -- gpiochip1 に対応していることがわかります。 gpiochip2 コントローラーのピンのステータスをリストします。
3.3 gpioset
GPIO 電気レベルの設定に使用されます。 gpiochip2--GPIO4 の場合は 2、GPIO ピンの場合は 28、GPIO を 1 に設定すると、キャリア ボードの D6 が点灯します。
3.4 gpioget
GPIOピンのステータスを取得するために使用されます。 たとえば、ボタンは GPIO3-27--gpiochip1 27 に対応し、押されていないときのボタンのステータスは 1 になり、押されたときのボタンのステータスは 0 になります。
3.5 gpiomon
GPIO の変更ステータスを監視するために使用されます。 ボタンを押すときの例として、次のようにします。
04 Libgpiod ライブラリ
Libgpiod は、Linux GPIO と対話するために使用される C ライブラリおよびツールです。 Linux 公式では、Linux 4.8 以降 Libgpiod 関数が実装されています。
OK-MX9352-C SoM にインストールされている Linux 5.15 カーネル バージョンでは、GPIO 操作の sysfs はサポートされなくなりました。 sysfs と比較して、Libgpiod は信頼性が高く、複数の GPIO 値を一度に読み書きできる機能など、より多くの機能を備えています。
4.1 ソースコードの入手
SoM 上で実行できるアプリケーションを PC 上でクロスコンパイルする場合、クロスコンパイル中にリンクされるライブラリ ファイルは SoM 上のライブラリ ファイルと一致する必要があります。 SoM 上のライブラリを開発環境に直接コピーして使用できます。 SoM 上のライブラリ ファイル:
上の図から、Libgpiod ライブラリのバージョンが libgpiod.so.2.2.2 であり、ソフトウェアが libgpiod.so.2 にリンクされていることがわかります。
Folinx Embedded が提供する OK-MX9352-C マテリアルでは、ユーザーが直接使用できるように、必要なライブラリ ファイル、ヘッダー ファイル、および関連ルーチンがパッケージ化されています。 データ パスは次のとおりです。ユーザー プロファイル/アプリケーション ノート/OK-MX9352-C-GPIO インターフェイス_Linux アプリケーション ノート/Libgpiod テスト ソース コード。情報を入手するには、オンライン カスタマー サービスにお問い合わせください。
4.2 コンパイルテストデモ
Libgpiod テスト ソース ディレクトリ内の gpiotest.c、gpio-toggle.c、lib.tar.bz2 を開発環境にコピーします。
lib.tar.bz2 と gpiod をこのディレクトリに抽出します。 h ファイルと Libgpiod ライブラリ ファイルはコンパイル中に使用されます。
例 1: 制御 LED のオンとオフを 1 秒の間隔で繰り返します。
gpio-toggle.c
gpio-toggle.c をクロスコンパイルします。
環境変数を設定します(注: 後ろにスペースがあります)
クロスコンパイル
実行可能ファイル gpio toggle を SoM にコピーして実行します。 LED (D6) ライトが 1 秒間点灯し、1 秒間消灯していることがわかります。 入力パラメータ 2 および 28 は、gpiochip2 line28 です。
例 2: ボタンを押して LED (オンとオフ) を制御し、押すたびにステータスが変化します。
gpio-toggle.c
gpio-toggle.c をクロスコンパイルします。
環境変数を設定します(注: 後ろにスペースがあります)
クロスコンパイル
実行ファイル gpio toggle を OK-MX9352-C SoM にコピーして実行します。 押すたびに LED のステータスが変化することがわかります。 入力パラメータ 1 および 27 は、gpiochip2 line28 です。
これが OK-MX9352-C SBC の GPIO 構成プロセスです。
元は www.forlinx.net で公開されています。