I have had a problem with the gpio
command on Raspberry Pi 4. Checking
it's version with gpio -v
produced the following output:
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Unknown17, Revision: 04, Memory: 0MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.4
* This Raspberry Pi supports user-level GPIO access
It could not detect the board as can be seen by Type: Unknown17
. Another
problem was that it was sitting at 2.50 refusing to update higher even with
the full upgrade:
sudo apt update && sudo apt full-upgrade
I have start solving this all, because trying to read the GPIO state was unsuccessful:
gpio readall
And resulted in the following error:
Oops - unable to determine board type... model: 17
I am not sure what the number 17 stands for right now, but it coincides with the above unknown board type.
Manual upgrade#
One of the ways to solve the situation is to upgrade the package manually:
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
We can receive a more sensible output out of gpio -v
now:
gpio version: 2.52
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 4B, Revision: 04, Memory: 8192MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.4
* This Raspberry Pi supports user-level GPIO access.
The version was updated, the type is now recognized and the memory is correctly displayed as well.
Checking state of GPIOs#
Getting the GPIO state via gpio readall
works as well:
For the sake of SEO and completeness, the table is split out into the left and right sections below as well.
Left side#
BCM | wPi | Name | Mode | V | Physical |
---|---|---|---|---|---|
3.3v | 1 | ||||
2 | 8 | SDA.1 | ALT0 | 1 | 3 |
3 | 9 | SCL.1 | ALT0 | 1 | 5 |
4 | 7 | GPIO. 7 | IN | 1 | 7 |
0v | 9 | ||||
17 | 0 | GPIO. 0 | IN | 0 | 11 |
27 | 2 | GPIO. 2 | IN | 0 | 13 |
22 | 3 | GPIO. 3 | IN | 0 | 15 |
3.3v | 17 | ||||
10 | 12 | MOSI | ALT0 | 0 | 19 |
9 | 13 | MISO | ALT0 | 0 | 21 |
11 | 14 | SCLK | ALT0 | 0 | 23 |
0v | 25 | ||||
0 | 30 | SDA.0 | IN | 1 | 27 |
5 | 21 | GPIO.21 | IN | 1 | 29 |
6 | 22 | GPIO.22 | IN | 1 | 31 |
13 | 23 | GPIO.23 | IN | 0 | 33 |
19 | 24 | GPIO.24 | IN | 0 | 35 |
26 | 25 | GPIO.25 | IN | 0 | 37 |
0v | 39 |
Right side#
Physical | V | Mode | Name | wPi | BCM |
---|---|---|---|---|---|
2 | 5v | ||||
4 | 5v | ||||
6 | 0v | ||||
8 | 1 | ALT5 | TxD | 15 | 14 |
10 | 1 | ALT5 | RxD | 16 | 15 |
12 | 0 | IN | GPIO. 1 | 1 | 18 |
14 | 0v | ||||
16 | 1 | OUT | GPIO. 4 | 4 | 23 |
18 | 1 | OUT | GPIO. 5 | 5 | 24 |
20 | 0v | ||||
22 | 0 | IN | GPIO. 6 | 6 | 25 |
24 | 1 | OUT | CE0 | 10 | 8 |
26 | 1 | OUT | CE1 | 11 | 7 |
28 | 1 | IN | SCL.0 | 31 | 1 |
30 | 0v | ||||
32 | 0 | IN | GPIO.26 | 26 | 12 |
34 | 0v | ||||
36 | 0 | IN | GPIO.27 | 27 | 16 |
38 | 0 | IN | GPIO.28 | 28 | 20 |
40 | 0 | IN | GPIO.29 | 29 | 21 |
There is still a problem however.
Alternate function for a GPIO#
Trying to change the pin alternate function:
sudo pigs m 17 3
Fails with socket connect failed
error. But this can be solved easily by
restarting the pigpio
daemon, so it can pick up the upgraded files:
sudo systemctl restart pigpiod.service
Running the sudo pigs m 17 3
produces no error. Verifying the state can
be done for example as follows:
gpio readall | grep -e BCM -e ALT3 -e + | head -5
Yeah, quite obtrusive, I know. I could not find a way to run gpio readall
for a single pin. The above outputs the following:
Instead of IN, the mode for the pin 17 is now ALT3, which stands for RTS0.
A note for ArchLinux ARM#
In case you fin yourself using ArchLinux ARM and need to manipulate GPIOs,
it should be less of a trouble. ArchLinux ARM has another repository baked
in called alarm
, which is a shorthand for, you guessed it, ArchLinux ARM.
This repository is enabled by default and is there among official
repositories, in Arch named core
, extra
, community
and multilib
,
where the latter needs to be enabled first.
Getting hold of the GPIO related software is achievable like this:
yay gpio
The result can be understood easily with the following screenshot:
The alarm
repository can is present among the relevant results like
community/gpio-utils,
alarm/wiringpi
or aur/pigpio
.
This is a 94th post of #100daystooffload.