Armadillo-640のUSB電源を制御する

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

*注意

下記変更通知にある通り、USB_OTG2_VBUS2(上側のUSBポート)の電源OFFはLinuxカーネルv4.14-at8から対応しております。
https://users.atmark-techno.com/system/files/cn/2018-010-4.pdf
v4.14-at7以前のカーネルではこの手順を行っても上側のUSBポートの電源OFFは出来ませんのでご注意ください。

デバイスツリーの変更

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

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

こちらを下記のように編集してください。

①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";
};

以上編集の上、ビルドしたArmadillo-640.dtbをArmadillo-640に書き込んで使用してください。
dtbの書き換えについては以下をご参照ください。
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_manual_ja-1.12.1/ch10.html#idm4541
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_manual_ja-1.12.1/ch11.html#sct.update_image_simply_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インタフェースの電源を制御することで不要な消費電力を削減することが出来ます。

製品: 
Armadillo-640