General purpose input/output (GPIO)

Note This section contains Linux BSP documentation for kernel v4.1. Click here for v4.9 BSP documentation.

The NXP i.MX6UL CPU has five GPIO ports. Each port can generate and control 32 signals.

The MCA features eight GPIO pins (multiplexed with Analog-to-Digital Converter (ADC) functionality). See MCA general purpose input/output (GPIO) for additional information on MCA GPIOs.

GPIO functionality by ConnectCore 6UL platform

Kernel configuration

You can manage the user space interface with GPIOs through the kernel configuration option:

This option is enabled as built-in on the default ConnectCore 6UL SBC Pro kernel configuration file.

Support for i.MX6UL GPIOs is automatically provided through the non-visible option CONFIG_GPIO_MXC.

Platform driver mapping

The driver for the i.MX6UL GPIO is located at:

File

Description

drivers/gpio/gpio-mxc.c

i.MX6UL GPIO driver

Device tree bindings and customization

The i.MX6UL GPIO device tree binding is documented at Documentation/devicetree/bindings/gpio/fsl-imx-gpio.txt.

One GPIO controller is defined for each i.MX6UL GPIO port in the common i.MX6UL device tree file:

Common i.MX6UL device tree include file 
gpio1: gpio@0209c000 {
                                compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
                                reg = <0x0209c000 0x4000>;
                                interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                        };
 
[...]
 
                        gpio5: gpio@020ac000 {
                                compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
                                reg = <0x020ac000 0x4000>;
                                interrupts = <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
                                             <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>;
                                gpio-controller;
                                #gpio-cells = <2>;
                                interrupt-controller;
                                #interrupt-cells = <2>;
                        };

The ConnectCore 6UL device tree include file and the carrier board device tree files use the i.MX6UL GPIOs.

For example, on the ConnectCore 6UL, GPIO5_IO04 is used as interrupt line from the MCA, and GPIO4_IO14 is used to activate internal circuitry during the MCA firmware update:

Common ConnectCore 6UL SOM device tree include file 
        mca_cc6ul: mca@7e {
                compatible = "digi,mca_cc6ul_dt_ids";
                reg = <0x7e>;
                interrupt-parent = <&gpio5>;
                interrupts = <4 IRQ_TYPE_EDGE_FALLING>;
                interrupt-controller;
                #interrupt-cells = <2>;
                fw-update-gpio = <&gpio4 14 GPIO_ACTIVE_LOW>;
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_mca_cc6ul>;
 
[...]
};

On the ConnectCore 6UL SBC Pro, GPIO5_IO06 is used to reset the PHY of ENET2 Ethernet interface:

Common ConnectCore 6UL SBC Pro device tree include file 
&fec2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet2 &pinctrl_enet2_mdio>;
        phy-mode = "rmii";
        phy-handle = <&ethphy1>;
        phy-reset-gpios = <&gpio5 6 GPIO_ACTIVE_LOW>;
        phy-reset-duration = <26>;
        digi,phy-reset-in-suspend;
        status = "disabled";
 
[...]
};

IOMUX configuration

Pads that are to be used as GPIOs must be configured as such. See Pin multiplexing (IOMUX).

When GPIOs are managed by other drivers, pinctrl-0 configures a set of pads to work according to the specified interface functionalities. In the example below, pinctrl_usdhc2 sets the first six pins for CMD, CLK, and DATA0-DATA3, and also configures GPIO5_IO01 as a GPIO to toggle the hardware multiplexer that selects between the eMMC and microSD card:

Common ConnectCore 6UL device tree include file 
pinctrl_usdhc2: usdhc2grp {
            fsl,pins = <
                MX6UL_PAD_CSI_HSYNC__USDHC2_CMD        0x17059
                MX6UL_PAD_CSI_VSYNC__USDHC2_CLK        0x10039
                MX6UL_PAD_CSI_DATA00__USDHC2_DATA0    0x17059
                MX6UL_PAD_CSI_DATA01__USDHC2_DATA1    0x17059
                MX6UL_PAD_CSI_DATA02__USDHC2_DATA2    0x17059
                MX6UL_PAD_CSI_DATA03__USDHC2_DATA3    0x17059
                /* Mux selector between eMMC/SD# */
                MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01    0x79
            >;
};

For GPIOs that are not associated with any interface or that can't be handled by a driver, you can define the IOMUX in the pinctrl_hog node of the device tree IOMUX section. For example, GPIO3_IO04 is available at the expansion connector of the ConnectCore 6UL SBC Express:

Common ConnectCore 6UL SBC Express device tree include file 
&iomuxc {
        pinctrl-names = "default";
 
        imx6ul-ccimx6ul {
 
[...]
 
                pinctrl_hog: hoggrp {
                        fsl,pins = <
                                /* GPIO3_IO04 on Expansion connector */
                                MX6UL_PAD_LCD_RESET__GPIO3_IO04         0xf030
                        >;
                };
        };
};

SION bit

It is not possible to read the real signal level of a GPIO pin that is configured as an output. You can use the software input on (SION) bit to read the value of an output GPIO.

Note SION bit mode increases the power consumption of the module, so it is disabled by default.

To enable the SION bit, set the bit 30 (special value). For example, to enable the SION bit for GPIO3_IO04, do an OR mask of your previous value with 0x40000000:

Common ConnectCore 6UL SBC Express device tree include file 
                pinctrl_hog: hoggrp {
                        fsl,pins = <
                                /* GPIO3_IO04 on Expansion connector (SION enabled)*/
                                MX6UL_PAD_LCD_RESET__GPIO3_IO04         0x4000f030
                        >;
                };

For more information, see the NXP Application Note AN5078.

GPIO usage from user space

You can access the GPIOs from the sysfs. See the Linux kernel documentation at Documentation/gpio/sysfs.txt.

Calculate the Linux GPIO number of a GPIO pin

For each GPIO controller entry on the device tree, Linux creates an entry /sys/class/gpio/gpiochipN, where N is an integer number starting at 0, with the following read-only attributes:

GPIOs on the ConnectCore 6UL system-on-module

Every GPIO port of the i.MX6UL CPU is a different GPIO controller and thus has its own /sys/class/gpio/gpiochipN entry on the sysfs.

On the default ConnectCore 6UL system-on-module device tree, the i.MX6UL CPU's GPIO ports are probed first:

Calculate the Linux GPIO number for a certain GPIO pin by adding the GPIO pin index to the port base index. For instance:

Since the i.MX6UL CPU has five ports, all of which have 32 pins, the following formula also applies to i.MX6UL CPU GPIOs (without requiring the user to know the GPIO base of each port):

LinuxGPIO_num = (<imx6ul_gpio_port> - 1) * 32 + <imx6ul_gpio_pin>

For example, i.MX6UL GPIO2_IO4 (port 2, pin 4) translates to: (2 - 1) * 32 + 4 = 36

Example: write from sysfs

The ConnectCore 6UL SBC Express exposes GPIO3_IO04 on the expansion connector. To drive this as an ouput:

  1. Calculate the Linux GPIO number:
    GPIO3_IO04: (3 -1) * 32 + 4 = 68
  2. Request the GPIO:
~# echo 68 > /sys/class/gpio/export
  1. Configure the GPIO as output:
~# echo out > /sys/class/gpio/gpio68/direction
  1. Drive the GPIO high:
~# echo 1 > /sys/class/gpio/gpio68/value
  1. Drive the GPIO low:
~# echo 0 > /sys/class/gpio/gpio68/value
  1. When you are done using the GPIO, free it with:
~# echo 68 > /sys/class/gpio/unexport

Example application for sysfs access

Digi Embedded Yocto provides the example application gpio_sysfs_test for accessing the GPIOs via sysfs through the package dey-examples-gpio-sysfs.

The gpio_sysfs_test application configures an input pin (preferably a push button) and output pin (preferably an LED) and toggles the output on each press of the push button. It also configures the input as interrupt to toggle the output on interrupt events.

Syntax

~# gpio_sysfs_test
Usage: gpio-sysfs-test <gpio_in> [gpio_out]
  
Where gpio_in is a pushbutton and gpio_out an optional LED

On the ConnectCore 6UL SBC Express:

On the ConnectCore 6UL SBC Pro:

 

© 2018 Digi International Inc. All rights reserved.
General purpose input/output (GPIO) updated on 22 January 2018 02:43:37 PM