sysfs経由でのGPIO制御が非推奨となり、代わりにGPIOはキャラクタデバイス(/dev/gpiochip?)経由で制御することが推奨されるようになった。GPIOキャラクタデバイスはlibgpiodを介して叩くことが可能。今回は、Linuxキャラクタデバイス経由でGPIOを使う方法について簡単にまとめる。
sysfs経由のGPIO制御は非推奨に
下記ドキュメントにGPIO sysfsインタフェースは”DEPRECATED”と書かれている。すぐに廃止はされないようだが開発は既にストップされた模様。
コマンドラインツールでGPIOを制御する方法
キャラクタデバイス対応のコマンドラインツールでGPIOピンの状態を確認したり、On/Off制御が出来る。
Buildrootでのツールのインストール方法
必要な物はlibgpiodの付属ツールとしてインストールされるので、パッケージ管理ツールからlibgpiodをインストールすれば基本OK。Buildrootならmenuconfigでlibgpiodを探し、以下のように”install tools”にチェックを入れればインストールされる。
Armbianでのツールのインストール方法
コマンドラインツールを使うだけなら、gpiodのパッケージさえインストールすればOK。
sudo apt install gpiod
プログラミングを行いたい場合は、CやPythonなどのライブラリが用意されており、別途インストールが必要。
コマンドラインツールの使い方
/dev/gpiochip?を介してGPIOにアクセスするため、予めパーミッションを空けておく。(システムブート時にパーミッションを空けておくには後述のようにudevやmdevの設定をすると良い)
sudo chmod a+rw /dev/gpiochip?
以下は、とあるAllwinner製SoC(H5)搭載SBCで操作した例。
- gpiodetect : GPIOキャラクタデバイスの検出。
$ gpiodetect
gpiochip0 [1f02c00.pinctrl] (32 lines)
gpiochip1 [1c20800.pinctrl] (224 lines)
- gpioinfo : GPIOの状態取得
$ gpioinfo gpiochip1
gpiochip1 - 224 lines:
line 0: "PA0" unused output active-high
line 1: "PA1" unused output active-high
line 2: "PA2" unused output active-high
line 3: "PA3" unused input active-high
line 4: "PA4" unused input active-high
:
- gpioset : GPIOのピン出力制御。以下を実行するとピン番号0(PA0)をHighにする。
$ gpioset gpiochip1 0=1
- Lowにしたい時
$ gpioset gpiochip1 0=0
一般ユーザにGPIOアクセスを開放
キャラクタデバイス/dev/gpiochip*のアクセス権限によって、GPIOのアクセスを制御することが出来る。
udev対応のシステム
Ubuntu系(Armbianなど)のOSなど、udev対応のシステムでは、/etc/udev/rules.dに設定ファイルを追加して設定する。例えば、60-gpiod.rulesというファイル名で以下のような内容で追加する。
SUBSYSTEM=="gpio", KERNEL=="gpiochip[0-1]", GROUP="plugdev", MODE="0660"
システム再起動後、以下のようになる。
$ ls -l /dev/gpiochip*
crw-rw---- 1 root plugdev 254, 0 Feb 5 19:00 /dev/gpiochip0
crw-rw---- 1 root plugdev 254, 1 Feb 5 19:00 /dev/gpiochip1
mdev対応のシステム
/etc/mdev.confに以下の一行を加えておくと、wheelグループの入っているユーザは/dev/gpiochip*にアクセス出来るようになる。
gpiochip([0-9]+) root:wheel 660
システム再起動後、以下のようになる。
$ ls -l /dev/gpiochip*
crw-rw---- 1 root wheel 254, 0 Jan 1 00:00 /dev/gpiochip0
crw-rw---- 1 root wheel 254, 1 Jan 1 00:03 /dev/gpiochip1
まとめ
sysfs経由の方法でもコマンドラインツールからGPIO操作が簡単に出来て悪くはなかったのだが、ファイルシステム上のディレクトリにツリー構造が作られるため、デバイスのアクセス権限の制御が難しかった。
これに対して新しいlibgpiodの方法はGPIOコントローラとキャラクタデバイスが対応付けられ、パーミッションの設定が簡単になったのは良かったと思う。
libgpiodにはPythonのプログラミングインタフェースも用意されているが、それについては別記事で書くことにする。
コメント