LinuxのlibgpiodでGPIOを制御する

sysfs経由でのGPIO制御が非推奨となり、代わりにGPIOはキャラクタデバイス(/dev/gpiochip?)経由で制御することが推奨されるようになった。GPIOキャラクタデバイスはlibgpiodを介して叩くことが可能。今回は、Linuxキャラクタデバイス経由でGPIOを使う方法について簡単にまとめる。

スポンサーリンク

sysfs経由のGPIO制御は非推奨に

下記ドキュメントにGPIO sysfsインタフェースは”DEPRECATED”と書かれている。すぐに廃止はされないようだが開発は既にストップされた模様。

https://www.kernel.org/doc/Documentation/gpio/sysfs.txt

コマンドラインツールで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のプログラミングインタフェースも用意されているが、それについては別記事で書くことにする。

コメント