Mit dem Release des Raspberry Pi 2 im Januar 2015 haben sich die Raspberry Pi Kernel Entwickler entschieden auf die neuere Version Linux 3.18.x zu setzen. Mit dieser Version ist nun eine neue Methode enthalten wie Treiber und Kernel Module im System geladen werden, diese nennt sich Device Tree (Geräte Baum).
Das Device Tree Modell ermöglicht zum Beispiel eine automatische Konfiguration von Raspberry Pi Addon Boards welche nach dem HAT Standard entwickelt wurden und soll die Programmierung vereinfachen, ein Nachteil ist allerdings das viele vorhandene Geräte und Erweiterungen unter Umständen nicht mehr wie gewohnt funktionieren.
Daher möchte ich euch heute das Thema Device Tree näher bringen und erklären was ihr tun könnt wenn eure Geräte und Addon Boards mit neuem Betriebssystem bzw. am Raspberry Pi 2 nicht mehr funktionieren.
Wer detaillierte Informationen zum DT sucht findet diese in der Readme auf dem Raspberry Pi in /boot/overlays/README oder in der Raspberry Pi Anleitung http://www.raspberrypi.org/documentation/configuration/device-tree.md
Änderungen durch das Device Tree Modell
Im aktuellen Kernel von Raspbian und Noobs wurde das Device Tree Modell (DT) aktiviert, zum Teil wird noch das alte Modell verwendet, für i2c, i2s, spi und die Audio Geräte muss allerdings schon das neue Device Tree Modell Verwendet werden.
Geräte können zwar weiterhin über das klassische Modell, durch entfernen des Moduls aus der Blacklist und hinzufügen zur /etc/modules, aktiviert werden, das ist aber nicht empfohlen da es durch den DT nun zu Konflikten kommen kann.
Die Version des Kernels eures Raspberry Pi könnt ihr übrigens so anzeigen um Herauszufinden ob ihr schon die Kernelversion 3.18.x verwendet, bei mir ist es momentan 3.18.9-v7:
uname -a Linux raspberrypi2 3.18.9-v7+ #767 SMP PREEMPT Sat Mar 7 21:52:35 GMT 2015 armv7l GNU/Linu
Wie werden Geräte nun Geladen?
Der Einsatz von Device Tree hat zur Folge das erstmal, entgegen des bisherigen Blacklist-Ansatzes, alle Geräte ausgeschalten sind solange bis sie vom Kernel anhand einer Gerätedatei (.dtb – Device Tree Blob) geladen werden.
Die zentrale Steuerdatei für das Laden von Geräten über den Device Tree ist nun die Datei /boot/config.txt innerhalb der config.txt werden Parameter für die zu ladenden DTB Dateien eingetragen.
# Auskommentieren um die optionalen Raspberry Pi Geräte zu aktivieren (I2C, I2S und SPI) #dtparam=i2c_arm=on #dtparam=i2s=on #dtparam=spi=on
Neben dem Laden eines kompletten Geräte Baums durch dtparam gibt es noch so genannte Device Overlays, diese sind notwendig um z.B. Addon Boards, die an verschiedensten GPIO Pins betrieben werden können, einzubinden ohne für jede Anschlussmöglichkeit eine dtb bereithalten zu müssen. Unter anderem verhindert das System eine Doppelbelegung von Abhängigen Ressourcen (zum Beispiel GPIO Pins), ermöglicht es aber auch spezifische Konfigurationen vorzunehmen.
Ein Beispiel für ein Overlay Eintrag in der config.txt, dieser Bewirkt dass der “device tree blob” aus /boot/overlays/lirc-rpi-overlay.dtb geladen wird.
dtoverlay=lirc-rpi
Im Standard sind inenrhalb der DTB die GPIO Pins 17 und 18 definiert welche wir über einen DT Parameter ändern können indem wir zusätzlich folgende Zeile zur config.txt hinzufügen.
dtoverlay=lirc-rpi,gpio_out_pin=17,gpio_in_pin=13
In den FAQs findet ihr weitere Beispiele welche das Prinzip hoffentlich noch besser verdeutlichen.
Häufig gestellte Fragen
Mein I2C Interface ist verschwunden?
Der Parameter “dtparam=i2c_arm=on” muss zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden. Alternativ kann sudo raspi-config zum Aktivieren verwendet werden.
Mein SPI Interface ist verschwunden?
Der Parameter “dtparam=spi=on” muss zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden. Alternativ kann sudo raspi-config zum Aktivieren verwendet werden.
Mein I2S Interface ist verschwunden?
Der Parameter “dtparam=i2s=on” muss zu /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Mein lirc-rpi Modul wird nicht mehr geladen?
Der Parameter “dtoverlay=lirc-rpi” muss zu /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Wie kann ich die LIRC Parameter jetzt einstellen?
Hinter der vorheringen Zeile “dtoverlay=lirc-rpi” können folgende LIRC Parameter gesetzt werden “dtoverlay=lirc-rpi,gpio_in_pin=16,gpio_in_pull=high“. Es ist ein Neustart notwendig.
Mein 1-Wire Temperatursensor funktioniert nicht mehr (w1-gpio)?
Falls ein Pullup verwendet wird muss der Parameter “dtoverlay=w1-gpio-pullup,gpiopin=<x>,extpullup=<y>” zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Falls kein Pullup verwendet wird muss der Parameter “dtoverlay=w1-gpio,gpiopin=<x>” zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Wenn euer Sensor Strom über die Datenleitung bezieht muss ans Ende der oben genannten Zeile entsprechend “,pullup=1” oder “,pullup=on” hinzugefügt werden.
Meine PPS (Pulse Per Second) Geräte funktionieren nicht mehr (pps-gpio)?
Der Parameter “dtoverlay=pps-gpio,gpiopin=<x>” muss zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Mein Audio Karte funktioniert nicht mehr (Hifiberry)?
Die Folgenden Parameter müssen zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
dtoverlay=hifiberry-dac
dtoverlay=hifiberry-dacplus
dtoverlay=hifiberry-digi
dtoverlay=hifiberry-amp
dtoverlay=iqaudio-dac
dtoverlay=iqaudio-dacplus
Meine Echtzeituhr (Real Time Clock) funktioniert nicht mehr (rtc-i2c)?
Der Parameter “dtoverlay=rtc-i2c,<RTC Modell>” muss zur /boot/config.txt hinzugefügt und dann der Raspberry Pi neugestartet werden.
Hierbei kann der Parameter <RTC Modell> folgendes sein: ds1307, ds3231, pcf2127 oder pcf8523
Protokoll bei Problemen erstellen
Es gibt für das Laden und entladen von Device Tree Blobs ein Logging und Debugging Mechanismus, dieser muss allerdings erst in der Datei /boot/config.txt aktiviert werden. Hierzu öffnen wir die Datei mit Nano.
sudo nano /boot/config.txt
Am Ende der Datei fügen wir den Parameter für die Erstellung des Device Tree Protokolls ein
dtdebug=on
Gespeichert wird die Datei im Editor Nano mit der Tastenkombination STRG+X, Y und Enter.
Nach einem Neustart des Raspberry Pi könnt ihr die Ausgabe von dtdebug mit folgendem Befehl einsehen
sudo vcdbg log msg
Hier kann man nachvollziehen was genau passiert oder wo Probleme auftauchen, an meinem Raspberry Pi 2 wird zum Beispiel das SPI Interface aktiviert das ich via Parameter “dtparam=spi=on” in der config.txt aktiviert habe.
Device Tree deaktivieren
Falls ihr mit eurem Raspberry Pi nun Probleme habt ältere Geräte zu verwenden, wie zum Beispiel HifiBerry, One Wire Temperatur Sensoren oder ähnliches und es nach Kontaktaufnahme mit dem Hersteller und der Community keine Lösung zum Aktivieren des Geräts via DT gibt könnt ihr die Verwendung des Device Tree Modells komplett deaktivieren und auf die klassische Einbindung von Geräten zurückgreifen.
Das abschalten des Device Tree funktioniert über einen Parameter in der Datei /boot/config.txt, hierzu öffnen wir die Datei mit Nano.
sudo nano /boot/config.txt
Am Ende der Datei fügen wir den Parameter “device_tree=” ein um das Laden von DT Modulen zu deaktivieren.
device_tree=
Gespeichert wird mit STRG+X, Y und Enter.