Mehr als ein HAT

On this page
BE-IIS-HPP-LAN

Worum geht es bei diesem Projekt?

Das Raspberry-Pi-HAT-Konzept ist eine sehr praktische Möglichkeit, einen Raspberry Pi um eine Hardwarefunktion zu erweitern.

Viele reale Anwendungen benötigen jedoch mehrere Schnittstellen gleichzeitig. Ein System kann CAN FD, RS-485, 10BASE-T1S, 10BASE-T1L, UART oder Ethernet in einem gemeinsamen Aufbau benötigen.

Sobald mehrere HATs kombiniert werden, können Ressourcenkonflikte entstehen. GPIO-Pins, SPI-Chip-Selects, I²C-Adressen, Interrupt-Leitungen und Device-Tree-Overlays können sich überschneiden.

BE-IIS HAT++ verfolgt das Ziel, mehrere Raspberry-Pi-HATs in einem Stack gemeinsam zu betreiben, ohne Konflikte manuell lösen zu müssen.


Warum mehr als ein HAT?

Das Projekt begann mit der Idee, Raspberry-Pi-HATs für interessante industrielle Schnittstellentechnologien zu entwickeln.

Während der Konzeptphase gewann jedoch eine Frage immer mehr an Bedeutung:

Warum sollte ein Raspberry Pi nur ein HAT verwenden?

Der Raspberry Pi wird deutlich vielseitiger, wenn sich mehrere Funktionen kombinieren lassen. Ein Stack kann beispielsweise CAN-FD-, RS-485-, 10BASE-T1S-, 10BASE-T1L-, UART- oder Ethernet-Schnittstellen enthalten.

Daraus entstand die Idee, das normale Raspberry-Pi-HAT-Konzept um eine einfache Stacking-Ebene zu erweitern.

Das Ergebnis nenne ich HAT++.

Die ersten Boards auf Grundlage dieses Konzepts wurden inzwischen unter der Bezeichnung BE-IIS-HPP entwickelt.


Wie funktioniert es?

Die Grundidee besteht darin, jedem HAT im Stack eine definierte Instanz zuzuweisen.

Jeder Instanz sind Hardware-Ressourcen zugeordnet, beispielsweise SPI-Chip-Selects, Interrupt-Leitungen, I²C-Adressen und boardspezifische Steuersignale.

Dadurch werden typische Ressourcenkonflikte vermieden, die beim gemeinsamen Einsatz mehrerer Raspberry-Pi-HATs auftreten können.

Ein Stack benötigt ein Board, das als Instanz I konfiguriert ist. Weitere Boards können als Instanz II bis Instanz V eingerichtet werden.

Jedes Board kennt die Signale, die es im ausgewählten Instanzmodus verwenden darf. Dadurch bleibt der Stack vorhersehbar und Überschneidungen bei Chip-Select-, Interrupt- und Steuersignalen werden vermieden.


Zuordnung der Hardware-Ressourcen

Der Instanzmodus ist nicht nur eine Bezeichnung. Er legt fest, welche Hardware-Ressourcen ein Board verwendet.

Einige Ressourcen sind ausschließlich einer Instanz zugeordnet, etwa SPI-Chip-Select- und Interrupt-Signale. Andere Ressourcen werden von allen Boards im Stack oder von einer festgelegten Gruppe von Instanzen gemeinsam genutzt.

Exklusive Ressourcen je Instanz

Instanz Chip-Select Interrupt
Instanz I CSN0 auf GP8 IRQ0 auf GP6
Instanz II CSN1 auf GP7 IRQ1 auf GP5
Instanz III CSN2 auf GP16 IRQ2 auf GP12
Instanz IV IRQ3 auf GP14
Instanz V IRQ4 auf GP25

Gemeinsam genutzte Hardware-Ressourcen

Die SPI-Bussignale werden von Instanz I, Instanz II und Instanz III gemeinsam genutzt:

Signal GPIO
SCLK GP11
MISO GP9
MOSI GP10

Das Reset-Signal wird von allen Instanzmodi gemeinsam genutzt:

Signal GPIO
RESET GP13

Der erste I²C-Bus wird von allen Instanzmodi gemeinsam genutzt:

Signal GPIO
SCL0 GP1
SDA0 GP0

Der zweite I²C-Bus wird von Instanz I, Instanz IV und Instanz V gemeinsam genutzt:

Signal GPIO
SCL1 GP3
SDA1 GP2

Mit dieser Zuordnung sind gemischte Stacks möglich. Beispielsweise kann ein Stack aus drei SPI-basierten und zwei I²C-basierten Boards oder aus zwei SPI-basierten und drei I²C-basierten Boards aufgebaut werden.


Standardinstanz und HAT+-Kompatibilität

Instanz I ist die Standardkonfiguration.

In diesem Modus folgt das Board dem Standardkonzept von Raspberry Pi HAT+ und kann während des Bootvorgangs vom Raspberry Pi erkannt werden.

Dazu stellt das Board HAT-Identifikationsdaten auf dem Raspberry-Pi-HAT-Identifikationsbus bereit.

Dadurch verhält sich das erste Board im Stack wie ein normales Raspberry-Pi-HAT. Die zusätzlichen Instanzmodi werden verwendet, sobald weitere Boards zum Stack hinzukommen.

Details zum HAT-EEPROM und zum Identifikationsprozess sind in der offiziellen Raspberry-Pi-HAT+-Spezifikation beschrieben.


Instanzmodus auswählen

Zusätzliche stapelbare Raspberry-Pi-HATs müssen auf einen anderen Instanzmodus eingestellt werden.

Dafür besitzt jedes Board einen Taster und Status-LEDs. Die LEDs zeigen den aktuell ausgewählten Instanzmodus an.

Jedes Board in einem Stack muss einen anderen Instanzmodus verwenden. Mindestens ein Board im Stack muss als Instanz I konfiguriert sein.

Ein wichtiges Detail ist, dass der HAT-Identifikationsspeicher nicht als einfaches I²C-EEPROM mit fester Adresse ausgeführt ist. Diese Funktion übernimmt stattdessen ein kleiner Mikrocontroller auf dem Board.

Beim Drücken des Tasters ändert der Mikrocontroller den ausgewählten Instanzmodus. Gleichzeitig ändert sich die I²C-Adresse für die HAT-Identifikationsdaten.

Nur Instanz I verwendet die standardmäßige Raspberry-Pi-HAT-EEPROM-Adresse.

Instanz Identifikationsadresse
Instanz I 0x50
Instanz II 0x60
Instanz III 0x70
Instanz IV 0x74
Instanz V 0x76

Neben der Identifikationsadresse steuert der Mikrocontroller auch die boardspezifischen Konfigurationssignale.

Abhängig vom ausgewählten Instanzmodus wählt er den erforderlichen SPI-Chip-Select, die Interrupt-Leitung oder die I²C-Adresskonfiguration für die Controller-ICs auf dem Board aus.

Dadurch kann dasselbe Boarddesign an unterschiedlichen Positionen im Stack eingesetzt werden, ohne Lötbrücken zu verändern oder die Hardware manuell umzuverdrahten.


Zusätzliche Stack-Overlays laden

Der Raspberry-Pi-Bootloader erkennt das erste Board im Stack über die standardmäßige HAT-Identifikationsadresse.

Weitere Boards verwenden andere Identifikationsadressen. Deshalb werden sie nach dem normalen Bootvorgang von einem kleinen systemd-Dienst verarbeitet.

Dieser Dienst wird einmal nach dem Booten ausgeführt. Er durchläuft die zusätzlichen HAT-Identifikationsadressen, beispielsweise 0x60, 0x70, 0x74 und 0x76, und liest die gespeicherten HAT-Daten mit den Raspberry-Pi-HAT-EEPROM-Werkzeugen aus.

Werden gültige HAT-Daten gefunden, liest der Dienst den Overlay-Namen aus dem EEPROM-Inhalt und lädt das erforderliche Device-Tree-Overlay mit dtoverlay.

Damit bleibt das normale Raspberry-Pi-HAT-Verhalten für das erste Board erhalten, während die weiteren Stack-Boards beim Systemstart automatisch ergänzt werden.

Beispiel für das Integrationsprotokoll:

journalctl -b | grep BE-IIS
BE-IIS Instance I   (0-0050): HAT detected -> BE-IIS-HPP-T1S-I
BE-IIS Instance II  (0-0060): HAT detected -> BE-IIS-HPP-CAN-SIC-II
BE-IIS Instance III (0-0070): HAT detected -> BE-IIS-HPP-LAN-III
BE-IIS Instance IV  (0-0074): HAT detected -> BE-IIS-HPP-UART-II
BE-IIS Instance V   (0-0076): HAT detected -> BE-IIS-HPP-MODBUS-III
BE-IIS HAT++ system integration complete.

Anforderungen an die Overlays

Damit dies funktioniert, müssen auch die Device-Tree-Overlays für den gestapelten Betrieb vorbereitet sein.

Das Overlay jedes Boards liegt für die unterstützten Instanzmodi vor. Dies ist erforderlich, weil der gewählte Instanzmodus bestimmt, welche Hardware-Ressourcen das Board verwendet.

Eine wichtige Regel lautet, dass Ressourcen nicht bereits von anderen Linux-Treibern belegt sein dürfen, bevor die Stack-Overlays geladen werden.

Wird ein SPI-Chip-Select bereits von spidev belegt, kann dieselbe Ressource später nicht sauber von einem anderen Treiber verwendet werden.

Aus diesem Grund deaktiviert das Overlay für Instanz I ungenutzte spidev-Geräte, die andernfalls für den Stack benötigte Chip-Select-Leitungen blockieren würden:

/* Disable spidev on CE1 to keep the second chip-select free for HAT++ use */
fragment@3 {
    target = <&spidev1>;
    __overlay__ {
        status = "disabled";
    };
};

Das Overlay für Instanz I macht außerdem die zusätzlichen HAT-Identifikationsspeicher auf dem Raspberry-Pi-HAT-Identifikationsbus sichtbar.

Diese EEPROM-kompatiblen Geräte werden vom Startdienst verwendet, um weitere Boards im Stack zu erkennen.

fragment@9 {
    target = <&i2c0>;
    __overlay__ {
        #address-cells = <1>;
        #size-cells = <0>;

        ee50: eeprom@50 {
            compatible = "atmel,24c32";
            reg = <0x50>;
            status = "okay";
        };

        ee60: eeprom@60 {
            compatible = "atmel,24c32";
            reg = <0x60>;
            status = "okay";
        };

        ee70: eeprom@70 {
            compatible = "atmel,24c32";
            reg = <0x70>;
            status = "okay";
        };

        ee74: eeprom@74 {
            compatible = "atmel,24c32";
            reg = <0x74>;
            status = "okay";
        };

        ee76: eeprom@76 {
            compatible = "atmel,24c32";
            reg = <0x76>;
            status = "okay";
        };
    };
};

Mit dieser Vorbereitung folgt das erste Board weiterhin dem normalen Raspberry-Pi-HAT-Bootablauf.

Nach dem Booten kann der Stack-Integrationsdienst auf die zusätzlichen Identifikationsspeicher zugreifen, deren Overlay-Strings lesen und die passenden Overlays für die weiteren Boards im Stack laden.

An dieser Stelle greifen Hardware-Instanzauswahl, EEPROM-kompatibler Identifikationsspeicher und Linux-Overlay-Verwaltung ineinander.


Installer und Systemintegration

Der grundlegende Mechanismus ist einfach:

  • Ein HAT-kompatibles I²C-EEPROM emulieren
  • Die benötigten Overlay-Informationen darin speichern
  • Nach dem Booten die zusätzlichen EEPROM-Adressen durchsuchen
  • Die erkannten Device-Tree-Overlays mit Raspberry-Pi-Werkzeugen laden

Das vollständige System benötigt jedoch mehr als nur die EEPROM-Logik.

Auf dem Raspberry Pi müssen die erforderlichen Overlays installiert sein. Der systemd-Dienst muss konfiguriert und die udev-Regeln müssen vorhanden sein. Auch benötigte Kernel-Module oder Schritte zur Treibereinrichtung müssen vorbereitet werden.

Damit dieser Ablauf reproduzierbar bleibt, stellt der BE-IIS Installer die benötigten Linux-Integrationsdateien bereit.

Der Installer kann auf unterstützten Raspberry-Pi-Systemen vom Raspberry Pi 1 bis zum Raspberry Pi 5 ausgeführt werden.

# install git
sudo apt install -y git

# clone installer
git clone https://github.com/be-iis/be-iis-installer.git

# enter directory
cd be-iis-installer

# run installer
./scripts/install/install-all.sh

Eine erfolgreiche Installation sieht beispielsweise so aus:

[ INFO ] Installation complete.
[ INFO ] Total scripts : 6
[ INFO ] Successful     : 6
[ INFO ] Failed         : 0
[ INFO ] Changes active after reboot:
[ INFO ] - systemd service
[ INFO ] - udev rules
[ INFO ] - module autoload / runtime setup

Press ENTER to reboot now or CTRL+C to cancel ...

Nach dem Neustart steht der Stack-Integrationsdienst zur Verfügung. Er kann die zusätzlichen HAT-Identifikationsadressen durchsuchen, die gespeicherten Overlay-Strings lesen und die passenden Overlays automatisch anwenden.


Offen und reproduzierbar

Alle für die Linux-Integration des HAT++-Systems benötigten Quelldateien sind offen und im Installer-Repository verfügbar.

Dazu gehören:

  • Installationsskripte
  • systemd-Dienst
  • udev-Regeln
  • Device-Tree-Overlays
  • Integrationsdateien für die Board-Instanzen

Ziel ist ein transparentes und reproduzierbares System.

Interessierte können die Implementierungsdetails in den Quellen nachvollziehen, Teile des Integrationskonzepts wiederverwenden oder für eigene Versuche anpassen.


Status der Boards

Aktuelle und geplante Boards im BE-IIS-HAT++-Ökosystem:

Bild Board Status Produktseite DigiKey
BE-IIS-HPP-T1L BE-IIS-HPP-T1L verfügbar Produkt DigiKey
BE-IIS-HPP-T1S BE-IIS-HPP-T1S verfügbar Produkt DigiKey
BE-IIS-HPP-CAN-FD-SIC BE-IIS-HPP-CAN-FD-SIC verfügbar Produkt DigiKey
BE-IIS-HPP-MODBUS BE-IIS-HPP-MODBUS verfügbar Produkt DigiKey
BE-IIS-HPP-LAN BE-IIS-HPP-LAN in Vorbereitung Produkt
BE-IIS-HPP-UART BE-IIS-HPP-UART in Vorbereitung Produkt
BE-IIS-HPP-PoSPE BE-IIS-HPP-PoSPE in Vorbereitung Produkt

Das Stacking-Konzept ist ein wichtiger Teil des Projekts. Ebenso wichtig ist jedoch die individuelle Funktion jedes einzelnen Boards.

Jedes Board besitzt ein eigenes Hardwaredesign, eine eigene Schnittstellentechnologie und einen eigenen Anwendungsbereich, beispielsweise CAN FD, RS-485, 10BASE-T1S, 10BASE-T1L, UART, Ethernet oder Power over Single Pair Ethernet.


Projektressourcen

Alle Linux-Integrationsquellen, Skripte und Device-Tree-Overlays sind offen und können im Installer-Repository eingesehen werden:

Weitere Produktressourcen wie Schaltpläne, Datenblätter, Layoutdateien und 3D-Modelle sind auf der Projektwebseite verfügbar:

Ausgewählte Boards sind über DigiKey erhältlich, wenn der Aufbau mit fertiger Hardware nachvollzogen werden soll:

Sie können sich außerdem auf LinkedIn mit mir vernetzen:


Zusammenfassung

BE-IIS HAT++ ist mehr als eine einzelne Raspberry-Pi-Erweiterungskarte.

Es ist ein stapelbares Hardware- und Linux-Integrationskonzept zur Kombination mehrerer industrieller Schnittstellenkarten auf einem Raspberry Pi.

Das Ziel ist einfach: Hardware-Stacking soll vorhersehbar, die Linux-Integration reproduzierbar und das System offen genug sein, um es zu verstehen, zu verändern und zu erweitern.