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での方法はざっくり以下のような感じ。
- /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
- ラベルをて定義したオーバーレイファイルを作り、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"
};
};
};
- dtcでオーバーレイファイルをコンパイルし、コンパイル結果を/boot/overlay-user/に出力する
sudo dtc -I dts -O dtb -o /boot/overlay-user/gpio-line-names.dtbo gpio-line-names.dts
- /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ピンを指定出来るようになり、プログラムの可読性が高くなるメリットがあるようだ。方法は別途まとめて記事にしたいと思う。
コメント