LinuxでGPIOピンにラベルを付ける

sysfs経由でのGPIO制御が非推奨となり、代わりにlibgpiodによるキャラクタデバイス(/dev/gpiochip?)経由のGPIO制御が推奨となった事は別記事にまとめた。

関連して、GPIOにカーネルレベルでラベルを付ける仕組みが提供されている。使い方をまとめた。

スポンサーリンク

GPIOピンのラベルをデバイスツリーに記述する

GPIOコントローラーのデバイスツリーにgpio-line-namesプロパティを記述することで、GPIOピンにラベルを付けることが出来る。

例えばi2c接続のIOエキスパンダPCF8574をGPIOとして使いたい時のデバイスツリーは以下のような記述を行う。

    pcf8574a: pcf8574a@20 {
        compatible = "nxp,pcf8574a";
        reg = <0x20>;
        gpio-controller;            
        #gpio-cells = <2>;
    };

これに、以下のようなgpio-line-namesプロパティを追加する。

    pcf8574a: pcf8574a@20 {
        compatible = "nxp,pcf8574a";
        reg = <0x20>;
        gpio-controller;            
        #gpio-cells = <2>;
        gpio-line-names = "LED_A", "LED_B", "LED_C", "LED_D", "LED_E", "LED_F", "LED_G", "LED_H";
    };

GPIOラベルの使い方

gpioinfoはラベル名を一覧表示出来る。

$ gpioinfo pcf8574a
gpiochip1 - 8 lines:
    line   0:      "LED_A"       unused  output  active-high 
    line   1:      "LED_B"       unused   input  active-high 
    line   2:      "LED_C"       unused   input  active-high 
    line   3:      "LED_D"       unused   input  active-high 
:
    line   7:      "LED_H"       unused   input  active-high 

gpiofindコマンドを使うと、ラベル名がどのピン番号に対応するかが検索出来る。

$ gpiofind LED_F
gpiochip1 5

デバイスツリーオーバーレイの場合

Armbianなどバイナリ配布システムの場合、デバイスツリーオーバーレイの仕組みを利用する。デバイスツリーオーバーレイでPCF8574をGPIOにする方法は以下の記事で取り上げた。

オーバーレイでgpio-line-namesプロパティを追加する手順

詳しい手順は省くが、Nano Pi Neo2での方法はざっくり以下のような感じ。

  1. /boot/dtb/allwinner/overlay/の下にGPIOのオーバーレイファイルを探し(sun50i-h5-pps-gpio.dtboが見つかった)、dtcの逆コンパイルでドライバのラベルを確認する
dtc -I dtb -O dts /boot/dtb/allwinner/overlay/sun50i-h5-pps-gpio.dtbo
  1. ラベルをて定義したオーバーレイファイルを作り、gpio-line-names.dtsに保存する(“allwinner,sun50i-h5″のドライバ名は逆コンパイル結果から拾う)
/dts-v1/;
/plugin/;

/ {
    compatible = "allwinner,sun50i-h5";

    fragment@0 {
        target = <&pio>;
        __overlay__ {
            gpio-line-names =
                "PA0","PA1","PA2","PA3","PA4","PA5","PA6","PA7",
                "PA8","PA9","PA10","PA11","PA12","PA13","PA14","PA15"
        };
    };
};
  1. dtcでオーバーレイファイルをコンパイルし、コンパイル結果を/boot/overlay-user/に出力する
sudo dtc -I dts -O dtb -o /boot/overlay-user/gpio-line-names.dtbo gpio-line-names.dts
  1. /boot/armbianEnv.txtに以下の一行を追加
user_overlays=gpio-line-names

確認

$ gpioinfo
gpiochip1 - 224 lines:
        line   0:        "PA0"       unused   input  active-high 
        line   1:        "PA1"       unused   input  active-high 
        line   2:        "PA2"       unused   input  active-high 
        line   3:        "PA3"       unused   input  active-high 
        line   4:        "PA4"       unused   input  active-high 
        line   5:        "PA5"       unused   input  active-high 
        line   6:        "PA6"       unused   input  active-high 

まとめ

今回はGPIOピンにラベルを付ける方法をまとめた。

Buildrootなど、カーネルのビルドが前提となっているシステムの場合はデバイスツリーへの記述を追加するだけでGPIOへのラベル付けは簡単に出来てしまう。バイナリ配布のディストリビューションでカスタムカーネルを準備しようとすると大変だが、デバイスツリーオーバーレイの仕組みを使えばArmbianでも割と簡単に出来た。

GPIOピンにラベルを付けておくと、プログラム中ラベル名でGPIOピンを指定出来るようになり、プログラムの可読性が高くなるメリットがあるようだ。方法は別途まとめて記事にしたいと思う。

コメント