ブログ

Armadillo-640・Armadillo-IoT A6:USB電源を制御する

at_takuma.fukuda
2019年11月29日 11時17分

2022/8/15追記

Armadillo-IoT ゲートウェイA6でも同様の手順でUSBポートの電源を制御出来る事を確認しました。

Armadillo-IoTゲートウェイG3のUSBインタフェースの電源をGPIOで制御する方法について下記記事でご紹介しております。
https://users.atmark-techno.com/blog/615/3882
Armadillo-640やArmadillo-IoT A6のUSBインタフェースの電源も、上記記事と同様にデバイスツリーを変更してGPIOで制御することが出来ます。
しかし上記記事の手順はそのまま適用することは出来ないため、
改めてArmadillo-640/Armadillo-IoT A6での実行手順をご紹介させていただきます。

*注意

USB_OTG2_VBUS2(上側のUSBポート)の電源OFFはLinuxカーネルv4.14-at8から対応しております。
v4.14-at7以前のカーネルではこの手順を行っても上側のUSBポートの電源OFFは出来ませんのでご注意ください。

デバイスツリーの変更

Armadillo-640のデバイスツリーの定義ファイルはLinuxカーネルのソース内の以下のファイルです。

arch/arm/boot/dts/armadillo-640.dts

こちらを下記のように編集してください。
Armadillo-IoT A6でも上記ファイルを参照しているため、同じファイルが編集対象となります。

①reg_usb_otg1_vbus,reg_usb_otg2_vbusの記述を削除

以下を全て削除する
reg_usbotg1_vbus: regulator-usbotg1vbus{
(中略)
};
reg_usbotg2_vbus: regulator-usbotg1vbus{
(中略)
};

②vbus_selを下記のように修正

vbus_sel: vbus-sel {
compatible =  "imx6-vbus-sel";
otg1-vbus-reg-supply = <&pinctrl_usbotg1_vbus>; *修正
otg2-vbus-reg-supply = <&pinctrl_usbotg2_vbus>; *修正
};

③usbotg1,usbotg2を下記のように修正

&usbotg1 {
vbus-supply = <&reg_usbotg1_vbus>; *削除
    pinctrl-names = "default"; *追加
    dr_mode = "host";
    disable-over-current; *削除
    status = "okay";
};
&usbotg2 {
vbus-supply = <&reg_usbotg2_vbus>; *削除
    pinctrl-names = "default"; *追加
    dr_mode = "host";
    disable-over-current; *削除
    status = "okay";
};

以上編集の上、Linuxカーネルをビルドします。
ビルドしたarmadillo-640.dtb/armadillo-iotg-a6.dtbをArmadillo-640に書き込んで使用してください。
dtbの書き換えについては以下をご参照ください。
Armadillo-640製品マニュアル DTBの書き換え
Armadillo-IoT A6製品マニュアル DTBの書き換え

GPIOの操作

上記dtbを書き込んだArmadillo-640で、以下のようにGPIOを操作してUSBの電源を制御できます。

GPIOのエクスポート

GPIOをコマンド操作できるようにエクスポートします。
usbotg1(下側のUSBポート) GPIO1のIO19を使用するので、GPIO番号は19となります。

echo 19 > /sys/class/gpio/export

usbotg2(上側のUSBポート) GPIO4のIO17を使用するので、GPIO番号は113となります。

echo 113 > /sys/class/gpio/export

エクスポートしたことで、/sys/class/gpioディレクトリの下に
gpio19ディレクトリとGPIO113ディレクトリが作成されます。

電源制御操作

GPIOに値を書き込んで電源のON/OFFを行います。
エクスポートで作成されたディレクトリ内にあるvalueファイルに値を書き込むことで操作することが出来ます。
例えば上側のUSBポートの電源をONする際は、以下のように入力します。

echo 1 > /sys/class/gpio/gpio19/value

同様に下側のUSBポートの電源をOFFする際は、以下のように入力します。

echo 0 > /sys/class/gpio/gpio113/value

このようにUSBインタフェースの電源を制御することで不要な消費電力を削減することが出来ます。