The STMicroelectronics STM32MP25 CPU has 12 GPIO ports:

  • 8 GPIO ports (named A, B, D to G, I, J) with 16 I/Os

  • 2 GPIO ports (named C, H) with 14 I/Os

  • 1 GPIO port (named K) with 8 I/Os

  • 1 GPIO port (named Z) with 10 I/Os

GPIO naming

STM32MP25 GPIO signals are named on the schematics and hardware reference manual in the form Pxn where:

  • P stands for "port"

  • x is the GPIO port

  • n is the GPIO number within the port

For instance, PA12 refers to GPIOA 12.

GPIOs on the ConnectCore MP25

  • On the ConnectCore MP25 system-on-module:

    • Many of the STM32MP25 GPIOs are available on the system-on-module, multiplexed with other functions.

  • On the ConnectCore MP25 Development Kit:

    • The GPIO connector allows direct access to the following STM32MP25 GPIOs:

      • GPIOA 2

      • GPIOA 3

      • GPIOA 5

      • GPIOA 6

      • GPIOA 7

      • GPIOA 9

      • GPIOA 10

      • GPIOD 8

      • GPIOH 2

      • GPIOH 3

      • GPIOH 6

      • GPIOH 7

      • GPIOH 8

    • GPIOF 5 is connected to ULED

    • GPIOF 10 is connected to User button and LED 1

    • GPIOF 12 is connected to User button and LED 2

See Hardware reference manuals for information about GPIO pins and their multiplexed functionality.

GPIOs on the SOM and carrier board are used for many purposes, such as:

  • Power enable line for transceivers

  • Reset line for controllers

  • LCD backlight control

  • Interrupt line

  • User LED

  • User button

Kernel configuration

Support for STM32MP25 GPIOs is automatically provided through CONFIG_PINCTRL_STM32MP257}, automatically enabled for this CPU.

Kernel driver

The driver for the STM32MP25 GPIO is located at:

File Description

drivers/pinctrl/stm32/pinctrl-stm32.c

STM32MP25 Pinctrl driver to control GPIOs

drivers/pinctrl/stm32/pinctrl-stm32mp257.c

STM32MP157 Pinctrl driver

Device tree bindings and customization

The STM32MP25 GPIO device tree binding is documented at Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml.

One GPIO controller is defined for each STM32MP25 GPIO port in the common STM32MP25 device tree file:

STM32MP25 device tree
pinctrl: pinctrl@44240000 {
	#address-cells = <1>;
	#size-cells = <1>;
	compatible = "st,stm32mp257-pinctrl";
	ranges = <0 0x44240000 0xa0400>;
	interrupt-parent = <&exti1>;
	pins-are-numbered;
	interrupts-extended =
		<&exti1  0 0>, <&exti1  1 0>, <&exti1  2 0>, <&exti1  3 0>,
		<&exti1  4 0>, <&exti1  5 0>, <&exti1  6 0>, <&exti1  7 0>,
		<&exti1  8 0>, <&exti1  9 0>, <&exti1 10 0>, <&exti1 11 0>,
		<&exti1 12 0>, <&exti1 13 0>, <&exti1 14 0>, <&exti1 15 0>,
		<&exti2  0 0>, <&exti2  1 0>, <&exti2  2 0>, <&exti2  3 0>,
		<&exti2  4 0>, <&exti2  5 0>, <&exti2  6 0>, <&exti2  7 0>,
		<&exti2  8 0>, <&exti2  9 0>, <&exti2 10 0>, <&exti2 11 0>,
		<&exti2 12 0>, <&exti2 13 0>, <&exti2 14 0>, <&exti2 15 0>;

	gpioa: gpio@44240000 {
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-controller;
		#interrupt-cells = <2>;
		reg = <0x0 0x400>;
		clocks = <&scmi_clk CK_SCMI_GPIOA>;
		st,bank-name = "GPIOA";
		status = "disabled";
	};
};

The ConnectCore MP25 device tree include file and the carrier board device tree files use the STM32MP25 GPIOs.

For example, on the ConnectCore MP25 Development Kit, Port B GPIO 6 is used to reset the PHY of Ethernet interface:

ConnectCore MP25 Development Kit device tree
&eth2 {
        status = "okay";
        pinctrl-0 = <&eth2_rgmii_pins_a>;
        pinctrl-names = "default";
        phy-mode = "rgmii-id";
        max-speed = <1000>;
        phy-handle = <&phy1_eth2>;
        st,eth-ptp-from-rcc;

        mdio1 {
                #address-cells = <1>;
                #size-cells = <0>;
                compatible = "snps,dwmac-mdio";

                phy1_eth2: ethernet-phy@1 {
                        compatible = "ethernet-phy-id0141.0dd0";
                        reset-gpios =  <&gpiob 6 GPIO_ACTIVE_LOW>;
                        reset-assert-us = <1000>;
                        reset-deassert-us = <2000>;
                        reg = <1>;
                };
        };
};

IOMUX configuration

For GPIOs that are managed by other drivers, you must define the port, GPIO number, and polarity.

ConnectCore MP25 device tree
&spi3 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&spi3_pins_a>;
        pinctrl-1 = <&spi3_sleep_pins_a>;
        cs-gpios = <&gpiob 1 0>;
        status = "okay";
};

Using the GPIOs

The package libgpiod (added by packagegroup-dey-core) provides a set of tools (such as gpioset, gpioget, etc.) to control the GPIOs from user space.

You can still control the GPIOs from the sysfs, but this API is not recommended. See https://www.kernel.org/doc/html/latest/userspace-api/gpio/sysfs.html.

Detect GPIO ports

Use gpiodetect to list the GPIO ports detected by the kernel:

# gpiodetect
gpiochip0 [GPIOA] (16 lines)
gpiochip1 [GPIOB] (16 lines)
gpiochip10 [GPIOK] (8 lines)
gpiochip11 [GPIOZ] (10 lines)
gpiochip2 [GPIOC] (14 lines)
gpiochip3 [GPIOD] (16 lines)
gpiochip4 [GPIOE] (16 lines)
gpiochip5 [GPIOF] (16 lines)
gpiochip6 [GPIOG] (16 lines)
gpiochip7 [GPIOH] (14 lines)
gpiochip8 [GPIOI] (16 lines)
gpiochip9 [GPIOJ] (16 lines)

where:

  • Ports GPIOA to GPIOJ are the STM32MP25 GPIO ports.

Information about a GPIO port

Use gpioinfo to list the lines of a given port:

# gpioinfo GPIOB
gpiochip1 - 16 lines:
        line   0:        "PB0"       kernel   input  active-high [used]
        line   1:        "PB1"   "spi0 CS0"  output   active-low [used]
        line   2:        "PB2" "regulators:regulator-board@2" output active-high [used]
        line   3:        "PB3"  "PHY reset"  output   active-low [used]
        line   4:        "PB4"       kernel   input  active-high [used]
        line   5:        "PB5"       kernel   input  active-high [used]
        line   6:        "PB6"  "PHY reset"  output   active-low [used]
        line   7:        "PB7"       kernel   input  active-high [used]
        line   8:        "PB8"       kernel   input  active-high [used]
        line   9:        "PB9"       kernel   input  active-high [used]
        line  10:       "PB10"       kernel   input  active-high [used]
        line  11:       "PB11"       kernel   input  active-high [used]
        line  12:       "PB12"       kernel   input  active-high [used]
        line  13:       "PB13"       kernel   input  active-high [used]
        line  14:       "PB14"       kernel   input  active-high [used]
        line  15:       "PB15"  "PHY reset"  output   active-low [used]

Set an output high/low

Use gpioset to set a STM32MP25 GPIO as output, such as GPIOF 5 (ULED). Use =1 to set it high, or =0 to set it low:

# gpioset GPIOF 5=1
# gpioset GPIOF 5=0

Read an input

Use gpioget to read the value of a STM32MP25 GPIO input, such as GPIOF 5:

# gpioget GPIOF 5
0

Use a GPIO as interrupt

Use gpiomon to wait for an event on a given GPIO, such as PortA GPIO14 (User 2 button):

# gpiomon --num-events 1 --rising-edge GPIOA 14

See the README of libgpiod for more information on these tools.

Sample application

An example application called apix-gpio-example is included in the dey-examples-digiapix recipe (part of dey-examples package) of the meta-digi layer. This application shows how to manage GPIO lines using the Digi APIx library on the ConnectCore MP25 platform.

By default, the Get Started with ConnectCore Cloud Services demo application seizes the user button. To use the example, stop the cccs-gs-demo with the following command:

# systemctl stop cccs-gs-demo

Go to GitHub to see the application instructions and source code.

See GPIO API for more information about the GPIO APIx.