Armadillo-IoT(G3):USB(CON7)の電源(CON7_USB_VBUS)をGPIOで制御する方法

Armadillo-IoT(G3)で、USB(CON7)の電源(CON7_USB_VBUS)をGPIOで制御する方法です。

(2019.5.23:電源ON時にUSBデバイスを認識するように修正)

参考)
Armadillo-IoT ゲートウェイ G3製品マニュアル
17.6. CON7 USBホストインターフェース


1.デバイスツリーの変更

カーネルのソースコード
Linux 3.14版:linux-3.14-x1-at[version]
Linux 4.9版:linux-4.9-x1-at[version]

arch/arm/boot/dts
ディレクトリにあるデバイスツリー
armadillo_iotg_g3.dts
armadillo_iotg_g3_m1.dts
の、下記のpinctrl_hog、reg_usb_otg1_vbus、usbotg1の記述を変更します。

pinctrl_hog(/* 追加 */の2行を追加)

     pinctrl_hog: hoggrp {
            fsl,pins = <
                /* USDHC1 */
                MX7D_PAD_GPIO1_IO08__SD1_VSELECT    0x59 /* VSELECT */
 
                /* PDS6-J */
                MX7D_PAD_ECSPI1_MOSI__GPIO4_IO17    0x00 /* GPIO_3G_IGT_3.3 */
                MX7D_PAD_ECSPI1_MISO__GPIO4_IO18    0x00 /* GPIO_3G_EMERG_OFF_3.3 */
                MX7D_PAD_LCD_DATA16__GPIO3_IO21     0x00 /* GPIO_3G_VUSB_IN */
 
                /* USB3503 */
                MX7D_PAD_EPDC_DATA13__GPIO2_IO13    0x00 /* GPIO_USB_HUB_RESET_N */
                MX7D_PAD_EPDC_DATA14__GPIO2_IO14    0x04 /* GPIO_USB_HUB_INT_N */
                MX7D_PAD_EPDC_DATA15__GPIO2_IO15    0x00 /* GPIO_USB_HUB_CON */
 
                /* MCU */
                MX7D_PAD_GPIO1_IO13__GPIO1_IO13     0x40000000 /* MCU_INTB */
 
                /* USB OTG1 VBUS EN */ /* 追加 */
                MX7D_PAD_I2C4_SDA__GPIO4_IO15 0x00 /* 追加 */
            >;
        };


reg_usb_otg1_vbus(下記のreg_usb_otg1_vbusの記述をすべて削除)

     reg_usb_otg1_vbus: regulator@0 {
            compatible = "regulator-fixed";
            reg = <0>;
            regulator-name = "USB_OTG1_VBUS";
            regulator-min-microvolt = <5000000>;
            regulator-max-microvolt = <5000000>;
            gpio = <&gpio4 15 GPIO_ACTIVE_HIGH>;
            enable-active-high;
        };


usbotg1(下記のように修正)

&usbotg1 {
    pinctrl-names = "default";
    dr_mode = "host";
    status = "okay";
};


上記修正を施したカーネルをビルドして、Armadillo-IoT(G3)のデバイスツリーを変更します。
参考)デバイスツリーの変更方法
Armadillo-IoT ゲートウェイ G3製品マニュアル
11.2.3. DTBの書き換え


2.USB(CON7)の電源(CON7_USB_VBUS)をGPIOで制御

上記1の修正を施したデバイスツリーを使用すると、
USB(CON7)の電源(CON7_USB_VBUS)のON/OFFは、GPIO4_IO15(gpio番号は111)で制御可能になります。

当該のGPIOをエクスポートします。

root@armadillo:~# cd /sys/class/gpio
root@armadillo:/sys/class/gpio# echo 111 > export
root@armadillo:/sys/class/gpio# cd gpio111


上記1で作成したデバイスツリーの場合、デフォルトは入力端子になっています。

root@armadillo:/sys/class/gpio/gpio111# cat direction
in
root@armadillo:/sys/class/gpio/gpio111# cat value
0


GPIO4_IO15(gpio番号は111)を出力に設定します。

root@armadillo:/sys/class/gpio/gpio111# echo out > direction


電源(CON7_USB_VBUS)をONにするには、

root@armadillo:/sys/class/gpio/gpio111# echo 1 > value

電源(CON7_USB_VBUS)をOFFにするには、

root@armadillo:/sys/class/gpio/gpio111# echo 0 > value

で制御できます。