NXP i.MX9352 の GPIO を構成するにはどうすればよいですか?

この記事では、i.MX9 ファミリの新しいメンバーである i.MX9352 の GPIO を処理する方法と、i.MX6ULL との類似点と相違点について詳しく学びます。

www.forlinx.net

01 ハードウェア原理解析

LEDライトとボタンを例に挙げてみましょう。 SoM 図を参照すると、

MX93_PAD_CCM_CLKO4 によって制御される LED ライトが 1 つあることがわかります。

この GPIO の電気レベルは 1.8V であるため、キャリア ボード上の LED には直接接続さ

れていません。 しかし、別の方法では、GPIO が 1 つの MOSFET を制御し、次に

MOSFET が LED ライトを制御します。GPIO の電気レベルが高い場合、MOS が接続さ

れ、LED ライトがオンになります。 GPIO の電気レベルが低い場合、MOS が切断され、

LED が消灯します。

i.MX9352 Hardware Principle Analysis

i.MX9352 Hardware Principle Analysis

02 DTS(デバイスツリー)ピン代替機能

Forlinx Embedded OK-MX9352-C DTS を開きます。

www.forlinx.net

OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/OK-MX93-C.dts

iomuxc ノードの下に代替ピンの新しいセットを作成します。2 つの GPIO は、キャリア ボード上の LED ライト D6 とボタン K1 です。

 

Device Tree Pin Alternate Function

次に、次のように新しい GPIO ノードを作成します。

OK-MX9352-C DTS

交互の競合を避けるために、LED パーツと KEY パーツに注釈を付けます。

OK-MX9352-C DTS

保存して終了した後に 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ライブラリについて紹介し

ます。

Execute Command to Test It

3.1 gpiodetect

すべての GPIO デバイスを確認します。

Check all GPIO devices

上記の 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 に対応します。

address of GPIO3 and GPIO4

その他の GPIO の対応関係は以下の通りですのでご参照ください。

other GPIO corresponding relationship

3.2 gpioinfo

3.1 から、LED ライトが GPIO4 -- gpiochip2 に対応し、ボタンが GPIO3 -- gpiochip1 に対応していることがわかります。 gpiochip2 コントローラーのピンのステータスをリストします。

gpioinfo

3.3  gpioset

GPIO 電気レベルの設定に使用されます。 gpiochip2--GPIO4 の場合は 2、GPIO ピンの場合は 28、GPIO を 1 に設定すると、キャリア ボードの D6 が点灯します。

GPIO electrical level

3.4  gpioget

GPIOピンのステータスを取得するために使用されます。 たとえば、ボタンは GPIO3-27--gpiochip1 27 に対応し、押されていないときのボタンのステータスは 1 になり、押されたときのボタンのステータスは 0 になります。

gpioget

3.5  gpiomon

GPIO の変更ステータスを監視するために使用されます。 ボタンを押すときの例として、次のようにします。

gpiomon

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 上のライブラリ ファイル:

Source Code Obtaining

上の図から、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 を開発環境にコピーします。

Compile Test Demo

lib.tar.bz2 と gpiod をこのディレクトリに抽出します。 h ファイルと Libgpiod ライブラリ ファイルはコンパイル中に使用されます。

例 1: 制御 LED のオンとオフを 1 秒の間隔で繰り返します。

gpio-toggle.c

gpio-toggle.c をクロスコンパイルします。

環境変数を設定します(注: 後ろにスペースがあります)

Cross-compile gpio-toggle.c

クロスコンパイル

Cross-compile

実行可能ファイル gpio toggle を SoM にコピーして実行します。 LED (D6) ライトが 1 秒間点灯し、1 秒間消灯していることがわかります。 入力パラメータ 2 および 28 は、gpiochip2 line28 です。

toggle to OK-MX9352-C SoM

例 2: ボタンを押して LED (オンとオフ) を制御し、押すたびにステータスが変化します。

gpio-toggle.c

gpio-toggle.c をクロスコンパイルします。

環境変数を設定します(注: 後ろにスペースがあります)

Cross-compile gpio-toggle.c

クロスコンパイル

Cross-compile

実行ファイル gpio toggle を OK-MX9352-C SoM にコピーして実行します。 押すたびに LED のステータスが変化することがわかります。 入力パラメータ 1 および 27 は、gpiochip2 line28 です。

toggle to OK-MX9352-C SoM

これが OK-MX9352-C SBC の GPIO 構成プロセスです。

元は www.forlinx.net で公開されています。

www.forlinx.net