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.