OpenWrtのgpio-export関連メモ

最近投げたPRでツッコミがあったり、GPIOのexport関連がちょっと込み入った状況なので自分用にメモ。
OpenWrtプロジェクトの中でもexportの用途(RESET等)によってはどれを使うかが明確に決まっていない状況なので、どれを使うべきというのは断言できない。
本来RESETを制御するGPIOは “reset-gpios” が使用されるべきながら、OpenWrtのRTL836xドライバ等ではreset-gpiosの実装が無い(?)などのため、代替としてGPIOをexportすることで対処。

gpio-export

固定でGPIOのexportが必要な場合、OpenWrtで従来から使用されていた方法。
ただしmainline (Linux Kernel)ではrejectされており、あくまでOpenWrt独自の実装方法。

コード例

/ {
...
	gpio-export {
		compatible = "gpio-export";
		#size-cells = <0>;

		gpio_switch_reset {
			gpio-export,name = "buffalo:usb-power";
			gpio-export,output = <1>;
			gpios = <&gpio 13 GPIO_ACTIVE_HIGH>;
		};
	};
};

  

fixed-regulator

電圧固定のレギュレータ。USB Vbus用にGPIOをexportする場合はもちろんのこと、SwitchチップのRESETラインも実態としては同じように特定の電圧を流すかどうかなので、fixed-regulatorを使用してRESETライン用のexportを定義したコードもある。
しかしながら、RESETラインの場合regulatorの本来の用途とは異なるので、今はあまり推奨されない(?)
USB VBusの場合はこれを使用。

コード例

/ {
...
	reg_usb_vbus: reg_usb_vbus {
		compatible = "regulator-fixed";
		regulator-name = "usb_vbus";
		regulator-min-microvolt = <5000000>;
		regulator-max-microvolt = <5000000>;
		gpio = <&gpio 8 GPIO_ACTIVE_HIGH>;
		enable-active-high;
	};
};
  

gpio-hog

OpenWrtのgpio-exportに似た実装で、mainlineに既に存在するもの。
Linux source code: Documentation/devicetree/bindings/gpio/gpio.txt (v4.14.106) – Bootlin
最近投げたPRで、前述の状況からOpenWrtでの実装が定まっていないため、DTS内で記述する方法としてこちらを提案された。

コード例

&gpio {
	rtl8367rb_reset {
		gpio-hog;
		gpios = <0 GPIO_ACTIVE_HIGH>;
		output-high;
		line-name = "rtl8367rb-reset";
	};
};
  

ath9kノード内の場合

&pcie {
	status = "okay";

	ath9k: wifi@0,0 {
		compatible = "pci168c,0030";
		reg = <0x0000 0 0 0 0>;
		qca,no-eeprom;
		#gpio-cells = <2>;
		gpio-controller;

		usb-hub-reset {
			gpio-hog;
			gpios = <10 GPIO_ACTIVE_HIGH>;
			output-high;
		};
	};
};
  

gpio-hog関連ログ(WN-AC733GR3の例)

[    0.489851] rt2880_gpio 10000600.gpio: registering 24 gpios
[    0.500886] rt2880_gpio 10000600.gpio: registering 24 irq handlers
[    0.513143] GPIO line 0 (rtl8367rb-reset) hogged as output/high
  

ユーザースペースでの実装

これまで書いたDeviceTree方面の実装とは別に、ブート時に実行されるスクリプトでGPIOのexportを設定するもの。正直なところ、この方法はあまり正確に把握していないので詳細は割愛。
target/linux/ramips/base-files/etc/board.d/03_gpio_switches
などが例らしい(?)。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中