Mit Einführung des Kernels 3.18.3 wird nun auch das für Linux (im Linix-Kernel-Handbuch) empfohlene Device-Model (Gerätemodel) für den Raspberry Pi genutzt. Dies ist eine Umsetzung der so genannten objektorientierten Programmierung (ooP), wodurch sich, richtig angewendet, sowohl die Effektivität der Programmierung erhöhen lässt, als auch die Verständlichkeit des Codes verbessert wird. Geräte werden Klassen zugeordnet und können angesprochen werden, ohne ihren genauen physischen Aufbau zu kennen. Der Kernel kann nun durch einen Gerätebaum (device tree) effektiv ergänzt werden, ohne dabei den Kernel selbst verändern zu müssen. Das embedded Linux des Arietta G25 Boards nutzt diese Technik ebenfalls. Sie ist also nicht auf den Raspberry Pi beschränkt sondern der Standard bei komplexen Geräten, welche z.B. die SoC-Technologie (System on a Chip) nutzen. Ich möchte hier am Beispiel des Raspberry Pi und des Betriebssystem Raspian die Nutzung des device tree erläutern. Dabei greife ich auf die readme-Datei auf der Bootpartition und auf die Dokumentation für den Raspberry Pi zurück.
Der Gerätebaum (device tree)
Der device tree, abgekürzt auch DT, wird beim Raspberry Pi in der /boot/config.txt angesprochen. Der DT ist bei Raspbian standardmäßig aktiviert. Um Geräte auf die bisherige Weise, also über das Laden von Modulen und das Aktivieren über das auskommentieren in der Blacklist nutzen zu können, ist es möglich, jedoch nicht empfohlen den DT zu deaktivieren. Dazu ist in der /boot/config.txt folgende Zeile anzugeben.
Nach jeder Änderung der Datei ist ein Neustart erforderlich, um diese wirksam werden zu lassen.
Geräte aktivieren
Der device tree dient grundsätzlich dazu, dass Geräte, welche DT unterstützen, in der Lage sind, beim Startvorgang des Betriebssystems erkannt zu werden und die Treiber automatisch geladen werden. In den Spezifikationen für Erweiterungen für die "+"-Modelle des Raspberry Pi wie z.B. neue Austeckplatinen als HAT (Hardware on Top), ist dazu ein EEPROM vorgesehen, der die entsprechenden Informationen enthält, um den DT zu steuern. Fehlen diese Informationen kann man Geräte auch manuell in der /boot/config.txt aktivieren. Dazu gibt es auf der Bootpartition einige Dateien, die die Informationen für die jeweiligen Standardgeräte beinhalten. Die Informationen werden in einem C-ähnlichen Format als so genannte Device Tree Sources (.dts) bereitgestellt. Kompiliert und damit nutzbar werden sie als Device Tree Blob bezeichnet und haben die Dateiendung .dtb. Soll ein Gerät aktiviert werden müssen diese Daten in den Arbeitsspeicher geladen werden.
Standardmäßig sind z.B. die optionalen Schnittstellen wie I²C, I²S und SPI. Befindet sich kein EEPROM mit den notwendigen Informationen auf der Erweiterung kann man diese Schnittstellen manuell mit der Richtlinie dtparam aktivieren.
dtparam=i2c=on #aktiviert die I²C-Schnittstelle
dtparam=i2s=on #aktiviert die I²S-Schnittstelle
dtparam=spi=on #aktiviert die SPI-Schnittstelle
Überlagerungen (overlays)
Overlays werden mit der "dtoverlay"-Richtlinie geladen. Als Beispiel nutze ich hier das für (IR)-Fernbedienungen benötigte lirc-pi Modul. Durch folgenden Eintrag in der config.txt wird das Modul mit seinen Standardeinstellungen geladen.
Die Datei /boot/overlays/lirc-rpi-overlay.dtb wird in den Speicher geladen und das Modul ist dadurch verfügbar. Standardmäßig liegt nun auf Pin 17 der Ausgang und auf Pin 18 der Eingang für eine Fernbedienung. Jetz kommt ein weiterer Vorteil vom DT zur Geltung. Über Parameter können die Pins geändert werden.
sorgt z.B. dafür, dass die Ausgabe über den Pin 13 erfolgt. Die Benutzung von Parametern kann auch bei anderen Overlays genutzt werden.
Parameterreferenz für Overlays
(Übersetzung in Bearbeitung)
File: <The base DTB>
Info: Describes the base Raspberry Pi hardware
Load: <loaded automatically>
Params:
i2c_arm (default "off") Set to "on" to enable the ARM's i2c interface
i2c_vc (default "off") Set to "on" to enable the i2c interface usually reserved for the VideoCore processor
i2c An alias for i2c_arm
i2s (default "off") Set to "on" to enable the i2s interface
spi (default "off") Set to "on" to enable the spi interfaces
act_led_trigger (default "mmc")
Choose which activity the LED tracks.
Use "heartbeat" for a nice load indicator.
act_led_activelow (default "off")
Set to "on" to invert the sense of the LED
act_led_gpio (default "16" on a non-Plus board, "47" on a Plus)
Set which GPIO pin to use for the activity LED
(in case you want to connect it to an external
device)
Es wird empfohlen, nur die Schnittstellen und Treiber zu laden, die gebraucht werden, da sich je nach Revision und Version des Raspberry Pi einige davon gegenseitig behindern können.
File: hifiberry-amp-overlay.dtb
Info: Describes the HifiBerry Amp and Amp+ audio cards
Load: dtoverlay=hifiberry-amp
Params: <None>
File: hifiberry-dac-overlay.dtb
Info: Describes the HifiBerry DAC audio card
Load: dtoverlay=hifiberry-dac
Params: <None>
File: hifiberry-dacplus-overlay.dtb
Info: Describes the HifiBerry DAC+ audio card
Load: dtoverlay=hifiberry-dacplus
Params: <None>
File: hifiberry-digi-overlay.dtb
Info: Describes the HifiBerry Digi audio card
Load: dtoverlay=hifiberry-digi
Params: <None>
File: iqaudio-dac-overlay.dtb
Info: Describes the IQaudio DAC audio card
Load: dtoverlay=iqaudio-dac
Params: <None>
File: iqaudio-dacplus-overlay.dtb
Info: Describes the IQaudio DAC+ audio card
Load: dtoverlay=iqaudio-dacplus
Params: <None>
File: lirc-rpi-overlay.dtb
Info: Configures lirc-rpi (Linux Infrared Remote Control for Raspberry Pi)
Consult the module documentation for more details.
Load: dtoverlay=lirc-rpi,<param>=<val>,...
Params: gpio_out_pin (default "17") GPIO pin for output
gpio_in_pin (default "18") GPIO pin for input
gpio_in_pull (default "down") Pull up/down/off on the input pin
sense (defaults to "-1") Override the IR receive auto-detection
logic:
"1" = force active high
"0" = force active low
"-1" = use auto-detection
softcarrier (default "on") Turn the software carrier "on" or "off".
invert (default "off") "on" = invert the output pin.
debug (default "off") "on" = enable additional debug messages.
File: pfc8523-rtc-overlay.dtb
Info: Configures the pfc8523 Real Time Clock
Load: dtoverlay=pfc8523-rtc
Params: <none>
File: pps-gpio-overlay.dtb
Info: Configures the pps-gpio (pulse-per-second time signal via GPIO).
Load: dtoverlay=pps-gpio,<param>=<val>
Params: gpiopin (default "18") GPIO input pin
File: w1-gpio-overlay.dtb
Info: Configures the w1-gpio Onewire interface module.
Use this overlay if you *don't* need a pin to drive an external pullup.
N.B. The parasitic power feature is not yet functional using DT.
Load: dtoverlay=w1-gpio,<param>=<val>
Params: gpiopin (default "4") GPIO pin for I/O
File: w1-gpio-pullup-overlay.dtb
Info: Configures the w1-gpio Onewire interface module.
Use this overlay if you *do* need a pin to drive an external pullup.
N.B. The parasitic power feature is not yet functional using DT.
Load: dtoverlay=w1-gpio-pullup,<param>=<val>,...
Params: gpiopin (default "4") GPIO pin for I/O
pullup (default "5") GPIO pin for external pullup
Fehlerbehebung
Treten Probleme bei der Verwendung des DT auf kann durch folgenden Eintrag in die /boot/config.txt ein Protokoll erstellt werden:
Nach einem Neustart kann das Protokoll mit
aufgerufen werden.
Weiterführende Literatur
Dies soll nur eine kurze Einführung in das Thema des DT auf dem Raspberry Pi sein. Eine ausführliche englische Beschreibung findet Ihr unter folgendem Link:
http://www.raspberrypi.org/documentation/…/device-tree.md
Habt Ihr weiter Fragen, scheut Euch nicht, die im Forum zu stellen!