The Digi I/O Expander provides up to 39 GPIOs that can be used to control external peripherals and read digital signals.
Kernel configuration
You can manage the I/O Expander GPIO driver support through the following kernel configuration option:
-
Digi ConnectCore SOMs Micro Controller Assist GPIO support (
CONFIG_GPIO_MCA
)
This option is enabled as built-in on the default ConnectCore 6UL kernel configuration file.
Kernel driver
The I/O Expander GPIO driver is located at:
File | Description |
---|---|
ConnectCore 6UL MCA GPIO driver |
Device tree bindings and customization
The MCA GPIO device tree binding is documented at Documentation/devicetree/bindings/gpio/digi,mca-gpio.txt
.
GPIO controller inside the I/O Expander
mca_ioexp: mca_io@6e {
...
mca_ioexp_gpio: gpio {
compatible = "digi,mca-ioexp-gpio";
gpio-controller;
#gpio-cells = <2>;
interrupt-parent = <&mca_cc6ul>;
interrupt-controller;
#interrupt-cells = <2>;
};
};
Using the I/O Expander GPIOs
Some of the I/O Expander GPIO pins can be configured as ADC channels. When configured as ADC channel, a GPIO cannot be used as a standard GPIO. For information about configuring an I/O Expander pin as ADC channel, see Analog-to-Digital Converter (ADC). |
The package libgpiod (added by packagegroup-dey-core) provides a set of tools (gpioset
, gpioget
…) for controlling the GPIOs from user space.
You can still control the GPIOs from the sysfs, but this ABI is not recommended. See https://www.kernel.org/doc/html/latest/admin-guide/gpio/sysfs.html. |
Detect GPIO ports
Use gpiodetect
to list the GPIO ports detected by the kernel:
# gpiodetect
gpiochip0 [gpio1] (32 lines)
gpiochip1 [gpio2] (32 lines)
gpiochip2 [gpio3] (32 lines)
gpiochip3 [gpio4] (32 lines)
gpiochip4 [gpio5] (32 lines)
gpiochip5 [mca-gpio] (8 lines)
gpiochip6 [ioexp-gpio] (39 lines)
Actual output may differ depending on your platform. |
Information about a GPIO port
Use gpioinfo
to list the lines of a given port:
# gpioinfo ioexp-gpio
gpiochip6 - 39 lines:
line 0: unnamed unused input active-high
line 1: unnamed unused input active-high
line 2: unnamed unused input active-high
line 3: unnamed unused input active-high
line 4: unnamed unused input active-high
line 5: unnamed unused input active-high
line 6: unnamed unused input active-high
line 7: unnamed unused output active-high
line 8: unnamed unused input active-high
line 9: unnamed unused input active-high
line 10: unnamed unused input active-high
line 11: unnamed unused input active-high
line 12: unnamed unused input active-high
line 13: unnamed unused input active-high
line 14: unnamed unused input active-high
line 15: unnamed unused input active-high
line 16: unnamed unused input active-high
line 17: unnamed unused input active-high
line 18: unnamed unused input active-high
line 19: unnamed unused input active-high
line 20: unnamed unused input active-high
line 21: unnamed unused input active-high
line 22: unnamed unused input active-high
line 23: unnamed unused input active-high
line 24: unnamed unused input active-high
line 25: unnamed unused input active-high
line 26: unnamed unused input active-high
line 27: unnamed unused input active-high
line 28: unnamed unused input active-high
line 29: unnamed unused input active-high
line 30: unnamed unused input active-high
line 31: unnamed unused input active-high
line 32: unnamed unused input active-high
line 33: unnamed unused input active-high
line 34: unnamed unused input active-high
line 35: unnamed unused input active-high
line 36: unnamed unused input active-high
line 37: unnamed unused input active-high
line 38: unnamed unused input active-high
Actual output may differ depending on your platform. |
Set an output high/low
Use gpioset
to set a {cpu-family} GPIO as output, such as IOEXP_IO3.
Use =1
to set it high, or =0
to set it low:
# gpioset ioexp-gpio 3=1
# gpioset ioexp-gpio 3=0
Read an input
Use gpioget
to read the value of a {cpu-family} GPIO input, such as IOEXP_IO3:
# gpioget ioexp-gpio 3
0
Use a GPIO as interrupt
The following I/O Expander GPIO pins can be configured as IRQ pins:
-
IOEXP_I11
-
IOEXP_I12
-
IOEXP_I14
-
IOEXP_I15
-
IOEXP_I31
-
IOEXP_I32
-
IOEXP_I33
-
IOEXP_I34
-
IOEXP_I35
-
IOEXP_I37
-
IOEXP_I38
Use gpiomon
to wait for an event on a given GPIO, such as IOEXP_I11:
# gpiomon --num-events 1 --rising-edge ioexp-gpio 3
See the README of libgpiod for more information on the usage of 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 meta-digi layer.
This application shows how to manage GPIO lines using the Digi APIx library on the ConnectCore 6UL platform.
Go to GitHub to see the application instructions and source code.
See GPIO API for more information about the GPIO APIx.
See General Purpose Input/Output (GPIO) for additional information on CPU GPIOs.