2250242_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2250242_ja-JP

2250242_ja-JP

i.MX8Qを例に、gpioget/gpiosetでGPIO(libgpiod)を使用する方法

GPIO制御におけるgpiogetおよび「cat /sys/class/gpio」の違い。

  • gpioget:

    これは、libgpiodライブラリが提供するコマンドライン・ユーティリティです。最新のLinux GPIOキャラクタ・デバイス・インターフェース(/dev/gpiochipN)を介して、GPIOラインとやり取りするように設計されています。

  • /sys/class/gpio:

    これは、LinuxのGPIO制御のためのsysfsレガシー・インターフェースを指します。このインターフェースは、かつて広く使用されていましたが、Linuxカーネルバージョン6.0以降、libgpiodキャラクタ・デバイス・インターフェースが採用され、正式に非推奨になりました。


以下は、i.MX8Q-MEK、L6.12.3 BSPでテストされたlibgpiodの例です。

デバイスツリーの設定:

この例では、GPIO1-05およびGPIO1-06を使用します。GPIO pinctrlを「gpio_test」のような特定のグループ、または「gpio-keys」のようなドライバの下に置くことができます。

    gpio_test: gpio-test {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&pinctrl_gpio_test_default>;
        pinctrl-1 = <&pinctrl_gpio_test_sleep>;
        status = "okay";
    };

    gpio-keys {
        compatible = "gpio-keys";
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&pinctrl_gpio_example_default>;
        pinctrl-1 = <&pinctrl_gpio_example_sleep>;
        key_wakeup2{
            label = "wakeup_key";
            gpios = <&lsio_gpio2 1 GPIO_ACTIVE_LOW>;
            linux,code = ;
            wakeup-source;
        };

    pinctrl_gpio_test_default: gpiotestgrp_default {
        fsl,pins = <
            IMX8QM_LVDS0_I2C0_SDA_LSIO_GPIO1_IO07       0x06000061
            IMX8QM_QSPI1A_DATA0_LSIO_GPIO4_IO26         0x06000041
            IMX8QM_MIPI_CSI1_I2C0_SCL_LSIO_GPIO2_IO00   0x06000021
            IMX8QM_LVDS0_I2C0_SCL_LSIO_GPIO1_IO06       0x06000021
        >;
    };

    pinctrl_gpio_test_sleep: gpiotestgrp_sleep {
        fsl,pins = <
            IMX8QM_LVDS0_I2C0_SDA_LSIO_GPIO1_IO07       0x07800061
            IMX8QM_QSPI1A_DATA0_LSIO_GPIO4_IO26         0x07800041
            IMX8QM_MIPI_CSI1_I2C0_SCL_LSIO_GPIO2_IO00   0x07800021
            IMX8QM_LVDS0_I2C0_SCL_LSIO_GPIO1_IO06       0x07800021
        >;
    };

    pinctrl_gpio_example_default: gpioexamplegrp_default {
        fsl,pins = <
            IMX8QM_LVDS0_GPIO01_LSIO_GPIO1_IO05         0x06000021
            IMX8QM_MIPI_CSI1_I2C0_SDA_LSIO_GPIO2_IO01   0x06000021
        >;
    };

    pinctrl_gpio_example_sleep: gpioexamplegrp_sleep {
        fsl,pins = <
            IMX8QM_LVDS0_GPIO01_LSIO_GPIO1_IO05         0x07800021
            IMX8QM_MIPI_CSI1_I2C0_SDA_LSIO_GPIO2_IO01   0x07800021
         >;
    };

GPIO機能をテストするためのカーネル・コマンド:

gpiodetect および gpioinfo コマンド:

root@imx8qmmek:~# gpiodetect
gpiochip0 [5d080000.gpio] (32 lines)
gpiochip1 [5d090000.gpio] (32 lines)
gpiochip2 [5d0a0000.gpio] (32 lines)
gpiochip3 [5d0b0000.gpio] (32 lines)
gpiochip4 [5d0c0000.gpio] (32 lines)
gpiochip5 [5d0d0000.gpio] (32 lines)
gpiochip6 [5d0e0000.gpio] (32 lines)
gpiochip7 [5d0f0000.gpio] (32 lines)
root@imx8qmmek:~# gpioinfo -c 1
gpiochip1 - 32 lines:
        line   0:       unnamed                 input
        line   1:       unnamed                 input
        line   2:       unnamed                 input
        line   3:       unnamed                 input
        line   4:       unnamed                 input
        line   5:       unnamed                 input
        line   6:       unnamed                 output
        line   7:       unnamed                 output
        line   8:       unnamed                 input
        line   9:       unnamed                 input
        line  10:       unnamed                 input
        line  11:       unnamed                 input
        line  12:       unnamed                 input
        line  13:       unnamed                 output consumer=regulator-pcie
        line  14:       unnamed                 input
        line  15:       unnamed                 input
        line  16:       unnamed                 input
        line  17:       unnamed                 input
        line  18:       unnamed                 input
        line  19:       unnamed                 input
        line  20:       unnamed                 input
        line  21:       unnamed                 input
        line  22:       unnamed                 input
        line  23:       unnamed                 input
        line  24:       unnamed                 input
        line  25:       unnamed                 input
        line  26:       unnamed                 input
        line  27:       unnamed                 input
        line  28:       unnamed                 input
        line  29:       unnamed                 input
        line  30:       unnamed                 input
        line  31:       unnamed                 input

GPIO1-05およびGPIO1-06が設定される前の現在のGPIO設定を表示するには、cat /sys/kernel/debug/gpioを使用します。

root@imx8qmmek:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 512-543, parent: platform/5d080000.gpio, 5d080000.gpio:
 gpio-526 (                    |scl                 ) out lo
 gpio-527 (                    |sda                 ) in  lo

gpiochip1: GPIOs 544-575, parent: platform/5d090000.gpio, 5d090000.gpio:
 gpio-557 (                    |regulator-pcie      ) out hi

gpiochip2: GPIOs 576-607, parent: platform/5d0a0000.gpio, 5d0a0000.gpio:
 gpio-577 (                    |wakeup_key          ) in  hi ACTIVE LOW

gpiochip3: GPIOs 608-639, parent: platform/5d0b0000.gpio, 5d0b0000.gpio:
 gpio-618 (                    |spi1 CS0            ) out hi ACTIVE LOW

gpiochip4: GPIOs 640-671, parent: platform/5d0c0000.gpio, 5d0c0000.gpio:
 gpio-641 (                    |enable              ) out hi ACTIVE LOW
 gpio-643 (                    |regulator-usbotg1-vb) out lo
 gpio-647 (                    |usdhc2-vmmc         ) out hi
 gpio-667 (                    |enable              ) out lo ACTIVE LOW
 gpio-668 (                    |host-wake           ) in  hi ACTIVE LOW
 gpio-669 (                    |PCIe reset          ) out hi ACTIVE LOW

gpiochip5: GPIOs 672-703, parent: platform/5d0d0000.gpio, 5d0d0000.gpio:
 gpio-673 (                    |mux                 ) out hi
 gpio-693 (                    |wp                  ) in  lo
 gpio-694 (                    |cd                  ) in  lo ACTIVE LOW

gpiochip6: GPIOs 704-735, parent: platform/5d0e0000.gpio, 5d0e0000.gpio:

gpiochip7: GPIOs 736-767, parent: platform/5d0f0000.gpio, 5d0f0000.gpio:

gpiosetコマンドを使用してGPIO出力を設定します。また、GPIOの方向を変更することもできます(入力→出力)。

#set gpiochip1-5 and 1-6
root@imx8qmmek:~# gpioset -c gpiochip1 6=1 &
[1] 700
root@imx8qmmek:~# gpioset -c gpiochip1 5=1 &
[2] 702

上記のコマンドの変更点をcat /sys/kernel/debug/gpioおよび gpioinfo -c 1で確認してください。

root@imx8qmmek:~# cat /sys/kernel/debug/gpio
gpiochip0: GPIOs 512-543, parent: platform/5d080000.gpio, 5d080000.gpio:
 gpio-526 (                    |scl                 ) out lo
 gpio-527 (                    |sda                 ) in  lo

gpiochip1: GPIOs 544-575, parent: platform/5d090000.gpio, 5d090000.gpio:
 gpio-549 (                    |gpioset             ) out hi
 gpio-550 (                    |gpioset             ) out hi
 gpio-557 (                    |regulator-pcie      ) out hi

gpiochip2: GPIOs 576-607, parent: platform/5d0a0000.gpio, 5d0a0000.gpio:
 gpio-577 (                    |wakeup_key          ) in  hi ACTIVE LOW

gpiochip3: GPIOs 608-639, parent: platform/5d0b0000.gpio, 5d0b0000.gpio:
 gpio-618 (                    |spi1 CS0            ) out hi ACTIVE LOW

gpiochip4: GPIOs 640-671, parent: platform/5d0c0000.gpio, 5d0c0000.gpio:
 gpio-641 (                    |enable              ) out hi ACTIVE LOW
 gpio-643 (                    |regulator-usbotg1-vb) out lo
 gpio-647 (                    |usdhc2-vmmc         ) out hi
 gpio-667 (                    |enable              ) out lo ACTIVE LOW
 gpio-668 (                    |host-wake           ) in  hi ACTIVE LOW
 gpio-669 (                    |PCIe reset          ) out hi ACTIVE LOW

gpiochip5: GPIOs 672-703, parent: platform/5d0d0000.gpio, 5d0d0000.gpio:
 gpio-673 (                    |mux                 ) out hi
 gpio-693 (                    |wp                  ) in  lo
 gpio-694 (                    |cd                  ) in  lo ACTIVE LOW

gpiochip6: GPIOs 704-735, parent: platform/5d0e0000.gpio, 5d0e0000.gpio:

gpiochip7: GPIOs 736-767, parent: platform/5d0f0000.gpio, 5d0f0000.gpio:
root@imx8qmmek:~# gpioinfo -c 1
gpiochip1 - 32 lines:
        line   0:       unnamed                 input
        line   1:       unnamed                 input
        line   2:       unnamed                 input
        line   3:       unnamed                 input
        line   4:       unnamed                 input
        line   5:       unnamed                 output consumer=gpioset
        line   6:       unnamed                 output consumer=gpioset
        line   7:       unnamed                 output
        line   8:       unnamed                 input
        line   9:       unnamed                 input
        line  10:       unnamed                 input
        line  11:       unnamed                 input
        line  12:       unnamed                 input
        line  13:       unnamed                 output consumer=regulator-pcie

 


レガシーGPIO SYSFS(L6カーネル以上ではデフォルトで無効)を有効にする方法

このコミットのコメントを参照してください。

https://github.com/nxp-imx/linux-imx/commit/3b4feb21158f873269ff3fbe2fe8d23a88d64b24

commit 3b4feb21158f873269ff3fbe2fe8d23a88d64b24
Author: Linus Walleij 
Date:   Tue Nov 10 15:27:24 2020 +0100

    gpio: sysfs: Enforce character device

    If users select sysfs support they get the character device
    as well so that end-users cannot complain that they
    "only have sysfs on my system". They should have the
    character device at all times.

    If someone is in so dire need of stripping out the
    character device while still enabling the sysfs ABI they
    can very well patch the kernel.

    Also only show this obsolete option to expert users.

    Signed-off-by: Linus Walleij 
    Link: <>

diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index 5d4de5cd6759..4dd566f7ea39 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -59,8 +59,9 @@ config DEBUG_GPIO
          that are most common when setting up new platforms or boards.

 config GPIO_SYSFS
-       bool "/sys/class/gpio/... (sysfs interface)"
+       bool "/sys/class/gpio/... (sysfs interface)" if EXPERT
        depends on SYSFS
+       select GPIO_CDEV # We need to encourage the new ABI
        help
          Say Y here to add the legacy sysfs interface for GPIOs.

パッチから、GPIO_SYSFSを有効にするための最良の方法は、CONFIG_EXPERT= y、次に、CONFIG_GPIO_SYSFS= Yを有効にします。パッチを元に戻す必要はありません。

SYSFSは、LinuxのGPIO制御のためのレガシー・インターフェースです。このインターフェースは、かつて広く使用されていましたが、Linuxカーネルバージョン6.0以降libgpiodキャラクタ・デバイス・インターフェースが採用され、正式に非推奨になりました。

i.MX Processors
Tags (1)
No ratings
Version history
Last update:
‎11-28-2025 02:00 AM
Updated by: