In this lesson, you will learn the basics of GPIO usage on Linux, being able to read or write to a GPIO pin from command-line, as well as by developing a minimal C application.
In this lesson you will:
The Colibri Evaluation Board already has buttons and LEDs available for debugging purposes, therefore only jumper wires are required.
To find out which GPIO number to use in the Linux sysfs interface, you have to know the correspondence between available pins in the carrier board, number of the correspondent pins on the SODIMM connector of the Colibri computer on module and number of the pins on Linux.
Download or open in a web browser the Colibri Evaluation Board and the Colibri T20 datasheets from the respective products pages of the developer website:
For this introduction guide, some pins configured by default as GPIO in the Toradex BSP were chosen. The choice of pins was made based on their availability on all the carrier boards covered by the getting-started guide. This module will not go through the configuration of other pins as GPIO, although it is possible.
First of all, you need to find the correspondence between the SODIMM and the connectors exposed for the developer on the Colibri Evaluation Board V3.2. Consult the Colibri Evaluation Board datasheet and fill the table below based in the example provided:
Note: The notation CONNECTOR.PIN will be employed in this lesson, e.g. X12.5 means pin 5 of the X12 connector.
|Colibri Evaluation Board (connector.pin)||SODIMM pins|
Warning: The pinout of the Camera Interface connector (X22) has been updated from Colibri Evaluation Board V3.1 to V3.2. Please consult the datasheet if you are using the older version.
Have a look at the table available in the "List Functions" chapter of the Colibri T20 datasheet. It provides a list of most of the Tegra pins available on the SODIMM connector.
The SODIMM pins we are interested at are connected to the Tegra SoC and have names defined by the Tegra Pin Name function. Each pin is multiplexed to have a specific function - among them GPIO, therefore the GPIO function is the column that we are interested at.
Having a look at the GPIO Alphanumeric to GPIO Numeric Assignment article, the correspondence between GPIO and the Linux numeric representation of the GPIO pins is provided as a table. To find it from the GPIO it is possible to use the formula below:
GPIO-(Character).DigitLinux numeric representation = 8 x (Character - 'A') + Digit
Either by consulting the table from the article pointed above or calculating it, the previous table with the correspondence between Colibri Evaluation Board pins and SODIMM pins can be extended to have the Tegra pin name (GPIO), formed by GPIO character and digit, as example GPIO-T.02, and the Linux numeric representation. Fill the table below based in the example provided:
|Colibri Evaluation Board (connector.pin)||SODIMM pins||Tegra pin name (GPIO)||Linux GPIO number|
Choose two of the GPIO pins from the list above to toggle an LED and read the value of a switch. This lesson will use the following pins (Linux GPIO number):
Use jumper wires to connect Linux GPIO 14 to the slide switch SW4 on the connector X21.7, and Linux GPIO 73 to the LED1 on the connector X21.2.
Note: For more informations about pins schematic, please access the Colibri Evaluation Board schematics here.
Note: You may use any other of the LEDs/switches available. Please refer to the section 126.96.36.199 LED / Switches (X21) of the Colibri Evaluation Board datasheet.
The Toradex Linux pre-built image comes with a tool named Toradex GPIO tool meant for debugging pins configuration. It can also be used to determine the correspondences found in the previous step. We will use it to test the hardware connections.
Note: You need a display and a mouse connected to the system in order to use the GPIO tool. Please go to the beginning of the getting-started guide for more information about assembling the peripherals.
Run the GPIO tool from the target Linux desktop:
Locate the pins 14 and 73 in the table. Right click the direction of each of them and configure pin 14 as INPUT and pin 73 as OUTPUT. See the changes reflected in the application.
Toggle the switch SW4 and see the Logic checkbox of the pin 14 change its state. Click the Logic checkbox of pin 73 and see the LED switch on/off.
The Linux sysfs interface provides an abstraction to access the GPIO, as well as many other hardware features, from the Linux user-space.
The pin has to be exported first, which guarantees that it is not being used by other kernel drivers nor allow other drivers to use it. It also has to be configured as input or output.
From the Linux terminal, export the pins 14 and 73:
echo 14 > /sys/class/gpio/exportecho 73 > /sys/class/gpio/export
Configure the pins as input and output, respectively:
echo "in" > /sys/class/gpio/gpio14/directionecho "out" > /sys/class/gpio/gpio73/direction
Read the switch value as you toggle it:
Toggle the LED GPIO:
echo 1 > /sys/class/gpio/gpio73/valueecho 0 > /sys/class/gpio/gpio73/value
There is a debug interface provided by the kernel debugfs for GPIO, which holds information about GPIO pins already reserved for drivers, as well as pin configuration and state. See the example below for the Colibri T20, and try it yourself:
root@colibri-t20:~# cat /sys/kernel/debug/gpioGPIOs 0-255, tegra-gpio:gpio-10 (SODIMM pin 154 ) in logpio-14 (sysfs ) in higpio-15 (sysfs ) out higpio-17 (SODIMM pin 81 ) in logpio-23 (sdhci_cd ) in logpio-26 (THERMD_ALERT ) in higpio-32 (sysfs ) out logpio-33 (sysfs ) out logpio-34 (sysfs ) in logpio-35 (sysfs ) in logpio-67 (SODIMM pin 130 ) in logpio-70 (SODIMM pin 132 ) in logpio-73 (sysfs ) out logpio-85 (USBC_DET ) in logpio-86 (KEY_MENU ) in higpio-110 (SODIMM pin 162 ) in logpio-111 (hdmi_hpd ) in logpio-144 (SODIMM pin 73 ) in logpio-153 (EN_MIC_GND ) out higpio-157 (KEY_BACK ) in higpio-158 (KEY_HOME ) in higpio-168 (TOUCH_PEN_INT ) in higpio-169 (KEY_POWER ) in logpio-170 (BL_ON ) out higpio-171 (SODI-85, Iris X16-18) in logpio-178 (usb_host_vbus ) out logpio-181 (SODIMM pin 75 ) in logpio-188 (SODIMM pin 134 ) in logpio-189 (sysfs ) out logpio-190 (102, I X13 ForceOFF#) in logpio-191 (104, I X14 ForceOFF#) in logpio-220 (SODIMM pin 166 ) in logpio-221 (SODIMM pin 168 ) in logpio-222 (SODIMM pin 170 ) in logpio-223 (SODIMM pin 172 ) in logpio-226 (KEY_FIND ) in logpio-230 (KEY_VOLUMEDOWN ) in higpio-231 (SODIMM pin 94 ) in logpio-232 (LAN_RESET ) out higpio-234 (LAN_V_BUS ) out higpio-237 (SODIMM pin 69 ) in higpio-238 (SODIMM pin 65 ) in higpio-239 (KEY_VOLUMEUP ) in hiGPIOs 256-264, i2c/4-002d, tps6591x, can sleep:gpio-262 (fixed_reg_en_hdmi ) out lo
See that the pins 14 and 73, configured as input and output in the previous steps, are the only ones taken by sysfs and are correctly configured as in and out respectively.
Export, unexport, configure and toggle the GPIO pins as you read the debugfs information to see the changes.
Note: If you want additional pin configuration debug, explore the */sys/kernel/debug/tegra_pinctrl/ directory.
Write a small C application that toggles the LED GPIO. A small source-code is given below for reference and you may copy-paste it to your previously configured Eclipse environment.
Warning: The source-codes provided in this guide are distributed under the 3-clause BSD license terms. See below:
Write a small C application that reads the switch GPIO. A small source-code is given below for reference and you may copy-paste it to your previously configured Eclipse environment.
The GPIO sysfs interface enables the use of interrupts from user space, as long as it is supported by the underlying hardware. Read the sysfs GPIO documentation, have a look at the poll system call and try to implement an application that handles the interrupt. Have a look at the source code below for reference:
To prevent the main loop from blocking, run the GPIO IRQ handling in a separate thread. Try to implement it.
Improve the code from the previous steps to handle errors and add other functionality you want. The code below implements a frequency meter by measuring the elapsed time between GPIO interruptions:
This lesson only covers the basics of GPIO usage on Linux. Since there are other important topics that were not discussed, this FAQ section is meant as an information complement.