Controlling GPIO from Linux User Space
This application note shows how to control the STM32H7 GPIOs from the user level using the standard Linux GPIOLIB interface.
1. Linux GPIOLIB Interface
The generic GPIO interface is controlled by the CONFIG_GPIOLIB kernel option enabled by default in the rootfs
project. Most of the STM32H7 GPIO pins can be used in different multiplexed I/O roles (for instance, some GPIO pins can be also configured as an SPI interface, etc). Depending on the requirements of your application, you need to configure the pins that you want to use as GPIO for the GPIO role and other pins for an alternative I/O function.
2. Linux LED and Keys Interfaces
The device driver for the STM32H7 GPIO controller is enabled in the kernel config. The gpio-leds
and gpio-keys
drivers will be enabled and configured in the DTS file, in order to support the USER LED 1/2 and USER BUTTON 1/2 of the STM32H7 SOM.
Verify that the USER LED and USER BUTTON interfaces are functional via the standard gpio-leds
and gpio-keys
interfaces:
Use the following command to turn on the USER LED 1:
# echo 1 > /sys/class/leds/user-led-1/brightness
Use the following command to turn off the USER LED 1:
# echo 0 > /sys/class/leds/user-led-1/brightness
From the Linux shell, start the
evtest
utility. Then press the USER BUTTON 1 and make sure theevtest
has reported the events correctly:/ # evtest /dev/input/event0 Event: time 14.575120, type EV_KEY, code KEY_A, value 1 Event: time 14.575120, type EV_SYN, code SYN_REPORT, value 0 Event: time 14.728753, type EV_KEY, code KEY_A, value 0 Event: time 14.728753, type EV_SYN, code SYN_REPORT, value 0
3. Linux Raw GPIO Interface
In order to test raw GPIO functions, disable definition of the USER BUTTON 1 in the kernel DTS file, then rebuild and reinstall the project:
Proceed with the testing:
Export PH2 and configure it as an input:
Make sure the value of PH2 is 1 when the USER BUTTON 1 is untouched (due to the internal PULL-UP being enabled):
Press and hold the USER BUTTON 1 and make sure the PH2 value has changed to 0:
4. Alternative Ways to Access GPIO
In Linux, you may access GPIOs using different approaches, not only the ones described in this application note above. Here are some external links that might be useful if you decide to try an alternative approach.
The following article describes accessing GPIOs from the kernel context:
https://lwn.net/Articles/532714/
To work with GPIOs from the user space, there are the following possibilities:
Using the GPIOLIB interface (described in this application note):
https://www.kernel.org/doc/Documentation/gpio/sysfs.txtUsing the drivers of the Linux LED/Input subsystems:
https://www.kernel.org/doc/Documentation/leds/leds-class.txt
https://www.kernel.org/doc/Documentation/input/input.txt
These drivers allow to use different GPIO-related mechanisms already implemented in Linux. For example, you may simply force a LED connected to GPIO output to blink with the specified frequency, or simply force input subsystem to generate a some-button-pressed event on changing GPIO input.