So funktioniert BE-IIS HAT++

On this page

Einführung

Die klassische Aktivierung von Hardware auf ARM-basierten Linux-Systemen umfasst mehrere manuelle Schritte:

  • Erstellen eines geeigneten Device-Tree-Overlays für die Zielhardware
  • Bauen oder Aktivieren der benötigten Kernel-Treiber, entweder als Module oder fest im Kernel
  • Ablegen des Overlays am richtigen Ort in der Boot-Partition
  • Konfigurieren der Firmware, damit das Overlay beim Systemstart angewendet wird

Dieser Prozess erfordert fundierte Kenntnisse des Linux-Kernels, der Device-Tree-Struktur und der plattformspezifischen Boot-Mechanismen.

Beispielhafter Ablauf:

# Kernel-Modul bauen
make modules

# Overlay kopieren
cp my-overlay.dtbo /boot/firmware/overlays/

# Overlay aktivieren
echo "dtoverlay=my-overlay" >> /boot/firmware/config.txt

Raspberry Pi HAT+

Die Raspberry-Pi-HAT+-Spezifikation vereinfacht die Hardwareintegration deutlich.

Während des Bootvorgangs liest das System das EEPROM auf dem HAT über die I²C-Schnittstelle aus und ermittelt den Namen des zugehörigen Device-Tree-Overlays.
Ist das angegebene Overlay auf dem System vorhanden, wird es automatisch von der Firmware angewendet.

Das EEPROM ist an einen dedizierten I²C-Bus zur HAT-Identifikation angeschlossen. Dadurch kann das System die angeschlossene Hardware automatisch erkennen.

# Beispiel: EEPROM-Erkennung
i2cdetect -y 0

Der benötigte Treiber muss jedoch weiterhin im System verfügbar sein – entweder fest in den Kernel integriert oder als ladbares Kernel-Modul.

Umgang mit Overlays

Eine kurze Erläuterung zu Device-Tree-Overlays:

Der Device Tree beschreibt die Hardwarekonfiguration eines Systems einschließlich der Verbindungen zwischen Prozessor und angeschlossenen Peripheriegeräten.
Er liefert dem Linux-Kernel die Informationen, die zur Zuordnung von Geräten und passenden Treibern benötigt werden.

Ein Device-Tree-Overlay erweitert oder verändert den Basis-Device-Tree.
Damit kann zusätzliche oder optionale Hardware beschrieben werden, ohne die Basiskonfiguration des Systems zu verändern.

In vielen Systemen beschreibt der Basis-Device-Tree die zentrale Hardwareplattform aus SoC und Mainboard, während Overlays für Zusatzhardware wie HATs verwendet werden.

Aus Systemsicht muss ein HAT dem ARM-Linux-System beschrieben werden.
Dafür wird üblicherweise ein Device-Tree-Overlay verwendet, das die korrekte Treiberzuordnung und Hardwareinitialisierung ermöglicht.

Auf Raspberry-Pi-Systemen liegen Overlays normalerweise unter:

ls /boot/firmware/overlays/

Overlay anwenden

Am häufigsten wird ein Device-Tree-Overlay während des Systemstarts angewendet.

Die Raspberry-Pi-Firmware lädt den Basis-Device-Tree und ergänzt die in einer vordefinierten Konfiguration angegebenen Overlays.
Auf Raspberry-Pi-Systemen befindet sich diese Konfiguration üblicherweise in:

cat /boot/firmware/config.txt

Beispieleintrag:

dtoverlay=my-overlay

Zusätzlich können Overlays automatisch über den HAT-EEPROM-Mechanismus angewendet werden.

Ein Overlay lässt sich außerdem zur Laufzeit mit folgendem Befehl laden:

sudo dtoverlay my-overlay

Die zugehörige Overlay-Datei muss hier verfügbar sein:

ls /boot/firmware/overlays/

Das Werkzeug dtoverlay ist Bestandteil der Raspberry-Pi-Userland-Werkzeuge und auf Raspberry Pi OS normalerweise vorinstalliert.

Zur Laufzeit angewendete Overlays unterliegen jedoch Einschränkungen.
Sie können wirkungslos bleiben, wenn die Hardware bereits initialisiert und an einen Treiber gebunden wurde.

Beispiel:

lsmod | grep spi

Wurde ein Gerät bereits während des Bootvorgangs erzeugt und an einen Treiber gebunden, kann ein nachträglich geladenes Overlay diese bestehende Zuordnung nicht neu konfigurieren oder überschreiben.

HAT++

Ein HAT++ im Instanzmodus I verhält sich wie ein normales HAT+.
Es wird von der Raspberry-Pi-Firmware automatisch erkannt und das zugehörige Device-Tree-Overlay wird während des Bootvorgangs angewendet.

Im Unterschied zu HAT+ ermöglicht das HAT++-Konzept das Stapeln mehrerer Boards.

Konzept

Anstatt nur ein Overlay pro HAT bereitzustellen, definiert HAT++ mehrere Overlays – jeweils eines für jeden unterstützten Instanzmodus.

Jeder Instanzmodus steht für eine vordefinierte Hardwarekonfiguration, darunter:

  • Zuordnung des SPI-Chip-Select
  • IRQ-Zuordnung
  • I²C-Adressen, sofern erforderlich

Instanzmodus I als primäres HAT

Das Overlay für Instanzmodus I besitzt eine besondere Aufgabe:

  • Es beschreibt die vollständige Funktion des primären HAT
  • Es definiert und reserviert alle gemeinsam genutzten Systemressourcen des gesamten HAT++-Stacks
  • Es verhindert, dass generische Treiber an ungenutzte, aber reservierte Schnittstellen gebunden werden

Dadurch können später zusätzliche HAT++-Boards ohne Ressourcenkonflikte integriert werden.

Erweiterung zur Laufzeit

Nachdem der Kernel gestartet und das System initialisiert wurde, startet systemd einen eigenen Dienst.

systemctl status be-iis-hatpp.service

Dieser Dienst:

  • Sucht über die EEPROM-Adressen nach weiteren HAT++-Boards
  • Erkennt deren konfigurierte Instanzmodi
  • Lädt die zugehörigen Overlays dynamisch in das laufende System
sudo dtoverlay hatpp-instance-2

Da alle erforderlichen Ressourcen bereits durch Instanzmodus I reserviert wurden, können diese Overlays zur Laufzeit konfliktfrei angewendet werden.

Zusammenfassung

HAT++ führt keine neuen Kernel-Mechanismen ein.
Es kombiniert vorhandene Konzepte in einer strukturierten Architektur:

  • Identifikation über das HAT-EEPROM
  • Device-Tree-Overlays
  • Kontrollierte Ressourcenvergabe
  • Laden von Overlays zur Laufzeit aus dem Userspace

Dadurch können mehrere HATs zuverlässig und konfliktfrei auf einem System gestapelt werden.