This is an old revision of the document!
Universal GPIO 40 pins board header, used for communication between board and different external devices.
Current GPIO numbers valid for vendor kernel only. Mainline linux kernel GPIO numbers will be different…
| GPIO num | Name | Pin | Pin | Name | GPIO num |
|---|---|---|---|---|---|
| 5V | 1 | 21 | GND | ||
| 5V | 2 | 22 | PIN.Y17 | 501 | |
| HUB_D4N | 3 | 23 | PIN.Y18 | 502 | |
| HUB_D4P | 4 | 24 | GND | ||
| GND | 5 | 25 | PIN.T20 | 466 | |
| VCCMCU | 6 | 26 | PIN.T21 | 467 | |
| MCUBOOT0 | 7 | 27 | 3V3 | ||
| MCUSWDIO | 8 | 28 | GND | ||
| GND | 9 | 29 | PIN.T1 | 447 | |
| ADC_CH6 | 10 | 30 | PIN.T0 | 446 | |
| VDD1V8 | 11 | 31 | PIN.T3 | 449 | |
| ADC_CH3 | 12 | 32 | PIN.T2 | 448 | |
| 420 | SPDIFOUT | 13 | 33 | PIN.T4 | 450 |
| GND | 14 | 34 | GND | ||
| 491 | PIN.Y7 | 15 | 35 | PIN.Y8 | 492 |
| 490 | PIN.Y6 | 16 | 36 | PIN.T18 | 464 |
| GND | 17 | 37 | PIN.T19 | 465 | |
| UART_RX / PIN.D1 | 18 | 38 | PWR_EN1 | ||
| UART_TX / PIN.D2 | 19 | 39 | PIN.D15 | 417 | |
| 3V3 | 20 | 40 | GND |
Get GPIO number:
Calculation:
GPIO PIN number calculation method: Number = Range Base + Pin Index
Range Base refers to the base value of GPIO rangesPin Index refers to the sorting of the GPIO pins you need to calculate in the corresponding rangesExample:
1. Get Range Base:
# cat /sys/kernel/debug/pinctrl/fe000000.apb4\:pinctrl\@4000-pinctrl-meson/gpio-ranges GPIO ranges handled: 0: periphs-banks GPIOS [430 - 511] PINS [0 - 81]
2. Get Pin Index:
# cat /sys/kernel/debug/pinctrl/fe000000.apb4\:pinctrl\@4000-pinctrl-meson/pins registered pins: 82 pin 22 (GPIOE_0) fe000000.apb4:pinctrl@4000 pin 23 (GPIOE_1) fe000000.apb4:pinctrl@4000 pin 0 (GPIOB_0) fe000000.apb4:pinctrl@4000 pin 1 (GPIOB_1) fe000000.apb4:pinctrl@4000 pin 2 (GPIOB_2) fe000000.apb4:pinctrl@4000 pin 3 (GPIOB_3) fe000000.apb4:pinctrl@4000 pin 4 (GPIOB_4) fe000000.apb4:pinctrl@4000 ... pin 76 (GPIOZ_8) fe000000.apb4:pinctrl@4000 pin 77 (GPIOZ_9) fe000000.apb4:pinctrl@4000 pin 78 (GPIOZ_10) fe000000.apb4:pinctrl@4000 ...
3. Calculate Number:
Here is an example for GPIOZ_10:
GPIOZ_10 = Range Base + Pin Index = 430 + 78 = 508
Before using a GPIO, ensure it is not configured for another function (e.g., I2C, SPI). If it is, you can reconfigure it as a standard GPIO by applying a Device Tree Overlay.
Once you have identified the correct GPIO number (e.g., 465), follow these steps to control it via the sysfs interface.
Make the GPIO accessible to user space:
$ echo 465 | sudo tee /sys/class/gpio/export
Configure the GPIO as either an input or an output:
# Set GPIO output $ echo out | sudo tee /sys/class/gpio/gpio465/direction # Set GPIO input $ echo in | sudo tee /sys/class/gpio/gpio465/direction
If configured as an output, you can set its logic level:
# Set GPIO output high $ echo 1 | sudo tee /sys/class/gpio/gpio465/value # Set GPIO output low $ echo 0 | sudo tee /sys/class/gpio/gpio465/value
If configured as an input, read its current logic level:
$ cat /sys/class/gpio/gpio465/value
The command returns 0 (low) or 1 (high).
When finished, release the GPIO:
$ echo 465 | sudo tee /sys/class/gpio/unexport
If you encounter an error similar to the following when exporting, the GPIO pin is likely reserved for another function (e.g., by the device tree):
echo 465 | sudo tee /sys/class/gpio/export tee: /sys/class/gpio/export: Invalid argument
Solution: Modify the Device Tree Overlay configuration to free the pin and define it as a standard GPIO.