GPIO-Ärger auf dem Raspberry Pi 5
(Aktualisiert 13.9.2024) Mit der Auslieferung des Raspberry Pi 5 im Herbst 2024 hat sich bei einigen Low-Level-Tools der GPIO-Zugriff geändert: Für die Modelle bis einschließlich Raspberry Pi 4 erfolgt der GPIO-Zugriff über chip0
bzw. /dev/gpiochip0
. Beim Raspberry Pi musste dagegen chip4
bzw. /dev/gpiochip4
verwendet werden. Scripts, die universell auf alten und neuen Geräten laufen sollten, brauchten eine entsprechende Fallunterscheidung.
Mit Kernel 6.6.47, der mittlerweile standardmäßig als Update unter Raspberry Pi OS installiert wird, ändert sich wieder alles! Auch beim Raspberry Pi 5 muss nun /dev/gpiochip0
verwendet werden. Eine Referenz aller internen GPIO-Nummern gibt cat /sys/kernel/debug/gpio
.
Die Änderung betrifft unter anderem:
- Python: gpiozero, lgpio, gpiod
- Bash: gpioset, gpioget
- C: lgpio, libgpiod, wiringpi
Scripts, die mit diesen Modulen bzw. Bibliotheken verfasst wurden, müssen geändert werden (Umstellung von GPIO-Chip 4 auf GPIO-Chip 0). Im Folgenden habe ich diesbezüglich Anleitungen für diverse Fälle zusammengefasst.
13.9.2024: Mit dem neuesten Update von Raspberry Pi OS wird ein Link von /dev/gpiochip4
auf /dev/gpiochip0
eingerichtet, wodurch die Auswirkungen des veränderten Kernels in den meisten Fällen nicht mehr spürbar sind.
ls -l /dev/gpiochip*
crw-rw---- 1 root gpio 254, 0 13. Sep 08:39 /dev/gpiochip0
crw-rw---- 1 root gpio 254, 10 13. Sep 08:39 /dev/gpiochip10
crw-rw---- 1 root gpio 254, 11 13. Sep 08:39 /dev/gpiochip11
crw-rw---- 1 root gpio 254, 12 13. Sep 08:39 /dev/gpiochip12
crw-rw---- 1 root gpio 254, 13 13. Sep 08:39 /dev/gpiochip13
lrwxrwxrwx 1 root root 9 13. Sep 08:39 /dev/gpiochip4 -> gpiochip0
Von gpiozero gibt es mittlerweile eine aktualisierte Version, die das richtige Chip-Device erkennt.
Python-Scripts mit gpiozero
Beim Start derartiger Scripts auf dem Raspberry Pi 5 mit dem aktuellen Kernel (>= 6.6.47) tritt die Fehlermeldung can not open gpiochip auf. Das Script bricht ab. Der Fehler ist bekannt, es wird demnächst eine neue Version des Python-Modules geben. Bis dahin ist es am einfachsten, das Script wie folgt zu starten:
RPI_LGPIO_CHIP=0 ./gpiozero-led.py
Alternativ führen Sie export RPI_LGPIO_CHIP=0
aus und fügen diese Anweisung auch in /home/your-account/.bashrc
ein. Eine weitere Möglichkeit ohne die externe Definition von Umgebungsvariablen besteht darin, am Beginn Ihres Python-Scripts die folgende Zeile einzubauen:
import os
os.environ['RPI_LGPIO_CHIP']='0'
Im gpiozero-Issue ist auch von PWM-Problemen zu lesen, die sich selbst mit RPI_LGPIO_CHIP=0
nicht lösen lassen. Das kann ich nicht bestätigen. Mein PWM-Test-Script gibt zwar eine Warnung aus, funktioniert aber.
Python-Scripts mit lgpio
Wenn Sie in Ihrem Python-Script das lgpio
-Modul verwenden, müssen Sie den Handle nun IMMER mit gpiochip_open(0)
öffnen, also:
# alle Raspberry-Pi-Modelle mit aktuellen Kernel >= 6.6.45
handle = lgpio.gpiochip_open(0)
# Raspberry Pi 5 mit Kernel < 6.6.45
# handle = lgpio.gpiochip_open(4)
Python-Scripts mit gpiod
Wenn Sie in Ihrem Python-Script das gpiod
-Modul verwenden, müssen Sie die Initialisierung nun IMMER mit 'gpiochip0'
durchführen, also:
chip = gpiod.Chip('gpiochip0') # alle Modelle mit Kernel >= 6.6.45
# chip = gpiod.Chip('gpiochip4') # Raspberry Pi 5 mit Kernel < 6.6.45
pinout-Kommando
Auch das Kommando pinout
liefert zur Zeit Fehlermeldungen (can’t connect to pigpio at localhost sowie Unable to initialize GPIO Zero). Hinter den Kulissen handelt es sich bei dem Kommando um ein Python-Script, das gpiozero
verwendet. Bis dieses Modul aktualisiert wird, hilft der oben schon erwähnte Trick mit RPI_LGPIO_CHIP=0
weiter, also:
RPI_LGPIO_CHIP=0 pinout
bash-Scripts mit gpioset, gpioget und gpiomon
Bei den genannten Kommandos übergeben Sie als ersten Parameter die Chip-Nummer. Ab Kernel 6.6.45 lautet diese IMMER 0, also z.B.:
chip=0
gpioset $chip 7=1 # GPIO 7 (Pin 26) auf "high" stellen
gpioset $chip 7=0 # GPIO 7 (Pin 26) auf "low" stellen
bash-Scripts mit pinctrl
Hier ändert sich nichts. pinctrl
war schon in der Vergangenheit in der Lage, die richtige Chip-Nummer selbst zu erkennen, und das funktioniert weiterhin. Großartig!
pinctrl set 7 op dh # LED an Pin 26 ein
pinctrl set 7 op dl # LED an Pin 26 aus
C-Programme mit lgpio
Ab Kernel 6.6.45 müssen Sie IMMER die Chip-Nummer 0 verwenden, also:
#define CHIP 0
...
h = lgGpiochipOpen(CHIP); // open connection to I/O chip
C-Programme mit gpiod
Ab Kernel 6.6.45 müssen Sie IMMER "gpiochip0"
verwenden, also:
char *chipname = "gpiochip0";
chip = gpiod_chip_open_by_name(chipname);
...
wiringpi
Die von Gordon Drogon entwickelte wiringpi-Bibliothek ist seit vielen Jahren veraltet (gilt bis Version 2.5).
2024 hat der Grazer Computer Club die Wartung der Bibliothek übernommen. Damit ist diese Bibliothek (jetzt in Version 3.0) wieder verwendbar! Weitere Informationen sowie Installationshinweise gibt es auf der GitHub-Projektseite:
https://github.com/WiringPi/WiringPi
Persönliche Anmerkung
Diese ganze Angelegenheit ist ein einziges Trauerspiel. Dass beim Raspberry Pi 5 anfänglich /dev/gpiochip4
als interne GPIO-Schnittstelle verwendet wurde (und nicht von Anfang an /dev/gpiochip0
wie bei früheren Raspberry-Pi-Modellen), war schon eine äußerst fragwürdige Entscheidung. Aber die Schnittstelle jetzt, fast ein Jahr nach dem Release des Raspberry Pi 5 und Raspberry Pi OS Bookworm, zu ändern, ist einfach irrsinnig.
Mit dem Kernel-Update funktionieren unzählige GPIO-Scripts von einen Tag auf den anderen nicht mehr. So etwas muss von vorne herein vermieden werden, und, wenn es denn gar nicht anders geht, viel viel besser kommuniziert werden. Die Maintainer der GPIO-Bibliotheken waren offenbar allesamt überrascht von der Änderung. Unprofessioneller geht’s nicht.
Hintergründe / Links
- https://forums.raspberrypi.com/viewtopic.php?t=359302
- https://forums.raspberrypi.com/viewtopic.php?t=361116
- https://github.com/domoticz/domoticz/issues/6040
- https://github.com/WiringPi/WiringPi/issues/280
- https://stackoverflow.com/questions/78452048/not-able-to-access-gpio-pins-on-my-raspberry-pi-5
- https://github.com/raspberrypi/linux/pull/6144
- https://github.com/gpiozero/gpiozero/issues/1166
Dieser Blog-Beitrag ist ursprünglich unter https://pi-buch.info/low-level-gpio-zugriff-geaendert-mit-kernel-6-6/ erschienen. Danke an Hr. Strohmayer, der mich als erster auf dieses Problem aufmerksam gemacht hat.