ブログ

Armadillo-640:デバイスツリーで、GPIOのデフォルトを出力に設定する(その2)

at_kazutaka.bito
2019年8月27日 10時58分

Armadillo-640で、デバイスツリーで、GPIOのデフォルトを出力に設定する方法です。
備考)
Armadillo-640:デバイスツリーで、GPIOのデフォルトを出力に設定する(その1)
の方法では、ユーザー領域からは、Low/High出力を切り替えることができません。
ここでは、簡易的にGPIO 接続用LED ドライバ (leds-gpio)を活用して、
ユーザー領域から、Low/High出力を切り替えれるようにします。

Armadillo-640 製品マニュアル
6.7. GPIO
には、GPIOクラスディレクトリで、GPIOの入出力を切り替える方法が表記されています。

デフォルトは、GPIO入力になっていますので、GPIO出力にするには、上記の方法で切り替える必要があります。

ここでは、例として、GPIO 接続用LED ドライバ (leds-gpio)を活用して、
Armadillo-640のCON9の2ピン(GPIO1_IO23)を簡易的にGPIOのデフォルトを出力(Low)に設定する方法を検討してみました。

参考)
Armadillo-640 製品マニュアル
表6.9 CON9 ピンとGPIO番号の対応

デバイスツリーの設定

linux-v4.14-at[version]/arch/arm/boot/dts/armadillo-640.dts
で、下記2つの変更を行います。
gpio-leds
を、

    gpio-leds {
        compatible = "gpio-leds";
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_gpio_leds>;
 
        red {
            label = "red";
            gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "default-on";
        };
        green {
            label = "green";
            gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "default-on";
        };
        yellow {
            label = "yellow";
            gpios = <&gpio1 18 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "none";
        };
        /* CON9_2: GPIO */
        con9_2 {
            label = "con9_2";
            gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
            linux,default-trigger = "none";
            default-state = "off";
        };
    };

のように修正します。
(/* CON9_2: GPIO */以降が、追加した記述です。)

pinctrl_gpio_leds: gpioledsgrp
を、

    pinctrl_gpio_leds: gpioledsgrp {
        fsl,pins = <
            MX6UL_PAD_GPIO1_IO05__GPIO1_IO05   0x00008
            MX6UL_PAD_GPIO1_IO08__GPIO1_IO08   0x00008
            MX6UL_PAD_UART1_CTS_B__GPIO1_IO18  0x00008
            /* CON9_2: GPIO */
            MX6UL_PAD_UART2_RTS_B__GPIO1_IO23    0x00008 // CON9_2
        >;
    };

のように修正します。
(/* CON9_2: GPIO */以降が、追加した記述です。)

補足)
GPIOのデフォルトをHigh出力にするには、default-state = "off"の箇所をdefault-state = "on"にします。

上記の設定後、ビルドして生成されたデバイスツリー
linux-v4.14-at[version]/arch/arm/boot/dts/armadillo-640.dtb
をArmadillo-640に書き込みます。

Armadillo-640を再起動すると、CON9_2のデフォルトはLow出力になります。

Low/High出力を切り替えるには、LEDのクラスディレクトリのbrightnessで設定します。
上記のデバイスツリーの場合、CON9の2ピンは、

root@armadillo:~# cd /sys/class/leds/
root@armadillo:/sys/class/leds# ls
con9_2  green  mmc0::  mmc1::  red  yellow

のように、con9_2という名前で見えます。
Low出力にするには、brightnessに0を設定します。

root@armadillo:/sys/class/leds# echo 0 > con9_2/brightness

High出力にするには、brightnessに1を設定します。

root@armadillo:/sys/class/leds# echo 1 > con9_2/brightness