The NXP i.MX8QXP CPU has eight GPIO ports. Each port can generate and control 32 signals.
The MCA also features a number of GPIO pins (multiplexed with Analog-to-Digital Converter (ADC) functionality). See MCA I/O pads for a list of all available MCA IOs and their capabilities.
GPIOs on the ConnectCore 8X platforms
- 
On the ConnectCore 8X system-on-module: - 
Many of the i.MX8QXP GPIOs are available at the system-on-module, multiplexed with other functions (labeled GPIOx_IOy where x is the port and y is the GPIO pin). See Hardware reference manuals for information about GPIO pins and their multiplexed functionality. 
- 
19 MCA GPIO pins are available (labeled MCA_IOx where x is the GPIO pin). 
 
- 
- 
On the ConnectCore 8X SBC Pro, the expansion connector allows direct access to several i.MX8QXP GPIOs and MCA GPIOs. 
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
You can manage the user space interface with GPIOs through the kernel configuration options:
- 
/sys/class/gpio/… (sysfs interface) (CONFIG_GPIO_SYSFS) 
This option is enabled as built-in on the default ConnectCore 8X kernel configuration file.
Support for i.MX8QXP GPIOs is automatically provided through the non-visible option CONFIG_GPIO_MXC.
Kernel driver
The driver for the i.MX8QXP GPIO is located at:
| File | Description | 
|---|---|
| i.MX8QXP GPIO driver | 
Device tree bindings and customization
The i.MX8QXP GPIO device tree binding is documented at Documentation/devicetree/bindings/gpio/fsl-imx-gpio.txt.
One GPIO controller is defined for each i.MX8QXP GPIO port in the common i.MX8QXP device tree file:
	gpio0: gpio@5d080000 {
		compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";
		reg = <0x0 0x5d080000 0x0 0x10000>;
		interrupts = <GIC_SPI 136 IRQ_TYPE_LEVEL_HIGH>;
		gpio-controller;
		#gpio-cells = <2>;
		power-domains = <&pd_lsio_gpio0>;
		interrupt-controller;
		#interrupt-cells = <2>;
	};
 
[...]
 
	gpio7: gpio@5d0f0000 {
		compatible = "fsl,imx8qm-gpio", "fsl,imx35-gpio";
		reg = <0x0 0x5d0f0000 0x0 0x10000>;
		interrupts = <GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
		gpio-controller;
		#gpio-cells = <2>;
		power-domains = <&pd_lsio_gpio7>;
		interrupt-controller;
		#interrupt-cells = <2>;
	};The ConnectCore 8X device tree include file and the carrier board device tree files use the i.MX8QXP GPIOs.
For example, on the ConnectCore 8X, GPIO3_IO09 is used to activate internal circuitry during the MCA firmware update:
	mca_cc8x: mca@63 {
		compatible = "digi,mca-cc8x";
		reg = <0x63>;
		interrupt-parent = <&wu>;
		interrupts = <GIC_SPI 177 IRQ_TYPE_LEVEL_HIGH>;
		interrupt-controller;
		#interrupt-cells = <2>;
		fw-update-gpio = <&gpio3 9 GPIO_ACTIVE_LOW>;
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_mca_cc8x>;
 
		[...]
};For example, on the ConnectCore 8X SBC Pro, GPIO3_IO18 is used to reset the PHY of ENET1 Ethernet interface:
&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_fec_mdio>,
		    <&pinctrl_fec_gpio>,
		    <&pinctrl_fec1_gpio>,
		    <&pinctrl_fec1>;
	clocks = <&clk IMX8QXP_ENET0_IPG_CLK>,
		 <&clk IMX8QXP_ENET0_AHB_CLK>,
		 <&clk IMX8QXP_ENET0_REF_50MHZ_CLK>,
		 <&clk IMX8QXP_ENET0_PTP_CLK>,
		 <&clk IMX8QXP_ENET0_TX_CLK>;
	phy-mode = "rgmii-id";
	phy-handle = <ðphy1>;
	phy-supply = <®_3v3_eth0>;
	phy-reset-gpios = <&gpio3 18 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <1>;
	fsl,magic-packet;
 
	[...]
};IOMUX configuration
You must configure the pads that are to be used as i.MX8QXP GPIOs. See Pin multiplexing (IOMUX).
For GPIOs that are managed by other drivers, you must configure their pad IOMUX inside the driver node specific pinctrl-0 to work according to the specified interface functionalities.
On the ConnectCore 8X example from above, mca_cc8x node configures pinctrl_mca_cc8x:
pinctrl_mca_cc8x: mcagrp {
	fsl,pins = <
		[...]
		/* MCA_FW_UPDATE */
		SC_P_QSPI0A_DATA0_LSIO_GPIO3_IO09	0x06000021
	>;
};For GPIOs that are not associated with any interface or that can’t be handled by a driver, see Configure independent pin IOMUX and pad control. The following external pads are configured as GPIOs on the default device tree:
- 
On the ConnectCore 8X SBC Pro expansion connector: Pad Signal GPIO A7 GPIO4_21 GPIO4_IO21 B7 GPIO4_20 GPIO4_IO20 C4 SPI0_IRQ_N GPIO1_IO01 C7 EXP_I2C_IRQ_N GPIO3_IO15 C8 EXP_I2C_GPIO GPIO3_IO14 C13 ADC_IN4 GPIO1_IO14 C14 ADC_IN5 GPIO1_IO13 C15 GPIO4_19 GPIO4_IO19 C18 GPIO0_12 GPIO0_IO12 D11 M40_UART_TX GPIO1_IO11 D12 M40_UART_RX GPIO1_IO12 D14 ADC_IN1 GPIO1_IO09 D19 GPIO5_09 GPIO5_IO09 
Using the GPIOs
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 calculated as per the formula:
N = (512 - <n_gpios>) - (<n_gpios> * <port_index>)
Each entry has the following read-only attributes:
- 
base: same as N, the first GPIO managed by this chip 
- 
label: provided for diagnostics (not always unique) 
- 
ngpio: the number of GPIOs this controller manages (from N to N + ngpio - 1) 
GPIOs on the ConnectCore 8X system-on-module
Every GPIO port of the i.MX8QXP CPU is a different GPIO controller and thus has its own /sys/class/gpio/gpiochipN entry on the sysfs.
On the default ConnectCore 8X system-on-module device tree, the i.MX8QXP CPU’s GPIO ports are probed first. Considering each one has 32 GPIOs, the formula results:
N = 480 - (32 * <port_index>)
- 
GPIO0: /sys/class/gpio/gpiochip480 
- 
GPIO1: /sys/class/gpio/gpiochip448 
- 
GPIO2: /sys/class/gpio/gpiochip416 
- 
GPIO3: /sys/class/gpio/gpiochip384 
- 
GPIO4: /sys/class/gpio/gpiochip352 
- 
GPIO5: /sys/class/gpio/gpiochip320 
- 
GPIO6: /sys/class/gpio/gpiochip288 
- 
GPIO7: /sys/class/gpio/gpiochip256 
Calculate the Linux GPIO number for a certain GPIO pin by adding the GPIO pin index to the port base index. For instance:
i.MX8QXP GPIO2_IO4 (port 2, pin 4) is: 416 + 4 = 420.
The following formula applies to i.MX8QXP CPU GPIOs (without requiring the user to know the GPIO base of each port):
\$"LinuxGPIO_num" = 480 - (32 * "<port_index>") + "<gpio_pin>"\$
For instance, i.MX8QXP GPIO2_IO4 (port 2, pin 4) is:
\$480 - (32 * color(red)(2)) + color(red)(4) = 420\$
Example: write from sysfs
The ConnectCore 8X SBC Pro has GPIO4_IO20 on the expansion connector. To drive this GPIO as an ouput:
- 
Calculate the Linux GPIO number: \$"GPIO4_IO20" -> 480 - (32 * color(red)(4)) + color(red)(20) = 372\$ 
- 
Request the GPIO: ~# echo 372 > /sys/class/gpio/export 
- 
Configure the GPIO as output: ~# echo out > /sys/class/gpio/gpio372/direction 
- 
Drive the GPIO high: ~# echo 1 > /sys/class/gpio/gpio372/value 
- 
Drive the GPIO low: ~# echo 0 > /sys/class/gpio/gpio372/value 
- 
When you are done using the GPIO, free it with: ~# echo 372 > /sys/class/gpio/unexport 
Sample application
An example application called apix-gpio-example is included in the dey-examples-digiapix recipe (part of dey-examples package) of meta-digi layer. This application shows how to manage GPIO lines using the Digi APIx library on the ConnectCore 8X platform.
Go to GitHub to see the application instructions and source code.
See GPIO API for more information about the GPIO APIx.
See MCA General Purpose Input/Output (GPIO) for additional information on MCA GPIOs.
 
         
   
   
        