Ohne Treiber taugt die schönste Hardware nichts. Linux unterstützt viele Komponenten, stellt aber nicht immer auch Treiber bereit. Mit etwas Wissen und wenigen Befehlen installieren Sie den Treiber selbst.
Treiber, die bei Linux Module oder genauer Kernel-Module heißen, regeln den Zugriff von Anwendungsprogrammen auf die Hardware. Sowohl Windows als auch Linux liefern Treiber für viele, aber nicht alle Hardware-Komponenten mit. Bei Linux gestaltet sich die Situation aber komplizierter als bei Windows, denn jede Distribution hat ihre eigene Vorstellung davon, was zur Standardausstattung gehört.
So wurde auch ein kleines Missgeschick des Autors zum Ausgangspunkt für diesen Artikel. Auf der Suche nach einem Ersatz für die Echtzeituhr DS3231 stieß er bei Reichelt auf die RX8010SJ. Die Real-Time Clock (RTC) DS3231 ist bei RasPi- und Arduino-Nutzern sehr beliebt, entsprechende Breakouts gibt es wie Sand am Meer und für wenig Geld bei den üblichen Versendern (Abbildung 1).
Wer aber nicht ein sperriges Breakout möchte, sondern nur den Chip, der zahlt satte 10 Euro. Produktpiraten auf chinesischen Marktplätzen bieten den IC zwar deutlich günstiger an, aber die Qualität ist dann Glückssache. Unabhängig von diesem Beschaffungsproblem fällt der Chip groß und sperrig aus (SO-16W, Abbildung 2).
Die Epson-RTC RX8010SJ kommt mit 2 Euro deutlich billiger und ist im SO-8-Format auch viel kleiner. Eine kurze Recherche im Internet förderte auch ein entsprechendes Kernel-Modul im Mainline-Kernel hervor. Flugs war der Chip bestellt, gelötet und an den RasPi angeschlossen. Es folgte die Enttäuschung: Der Chip wurde am I2C-Bus erkannt, doch nichts passierte, weil Pi OS schlicht das notwendige Kernel-Modul nicht ausliefert. Das weckte prompt den Forschergeist des Autors.
Vorarbeiten
Im Falle der RTC ist der Quellcode ein Teil des offiziellen Kernels, man spricht hier auch von “in-tree”. Viele Hardware-Hersteller stellen für ihre Chips zwar ebenfalls die Quellen bereit, verzichten aber auf die oft mühsame Integration in den Mainline-Kernel (“out-of-tree” genannt). Bei Änderungen an internen Kernel-Strukturen muss der Hersteller dann selbstständig nachziehen, was nicht immer geschieht.
Ob innerhalb der Kernel-Quellen oder nicht, der Eigenbau fällt nicht schwer. Zuerst benötigen Sie die Kernel-Header zum aktuellen Kernel. Dabei handelt es sich um Include-Dateien für den C-Compiler, die die Schnittstellen der Kernel-internen Funktionen beschreiben. Normalerweise finden Sie diese Header im Paket raspberrypi-kernel-headers. Neben den eigentlichen Headern enthält das Paket auch die notwendige minimale Infrastruktur für den Bau eigener Module.
Nach der Installation des Pakets sollten Sie innerhalb von /usr/src/ ein Verzeichnis mit einem Namen wie linux-headers-5.4.51+/ finden. In aller Regel enthält es mehrere Unterverzeichnisse, denn zum einen unterstützt Pi OS verschiedene RasPi-Generationen mit leicht unterschiedlichen Kerneln, zum anderen gab es auf Ihrem System vielleicht schon das ein oder andere System-Upgrade.
Wichtig ist, dass die aktuelle Kernel-Version (Ausgabe des Befehls uname -r) mit vorliegt (Abbildung 3). Da die Foundation das Kernel-Paket samt Headern auch zwischen den veröffentlichten Releases ändert, ist es aber nicht ungewöhnlich, dass die Kernel-Header aus einem aktuelleren Kernel stammen als dem vom System verwendeten. In der Abbildung 3 läuft ein “Buster” Lite vom 20.08.2020 (Version 5.4.51+), die Kernel-Header gehören aber schon zur Kernel-Version vom 02.12.2020-Release (5.4.79+).
Passen die Header nicht zum Kernel, dann steht ein System-Upgrade mit den Befehlen aus Listing 1 an. Das Update ändert die Hauptversion des Betriebssystems nicht (etwas von “Stretch” auf “Buster”), sondern bringt lediglich alle Pakete auf den aktuellen Stand. Alternativ und etwas kürzer, aber nicht so sicher wäre die Installation des neuen Kernels aus dem Paket raspberrypi-kernel.
Listing 1
System-Upgrade
$ sudo apt update $ sudo apt full-upgrade
Es sprechen kaum Gründe gegen ein solches Upgrade, insbesondere, wenn es nur die letzte Stelle der Versionsnummer betrifft wie im Beispiel von Kernel 5.4.51 auf 5.4.79. Beim Umstieg von der Version 4.19 auf den Kernel 5.4 vor einigen Monaten war die Situation allerdings anders: Der 5.4er-Kernel unterstützt manche Hardware nicht mehr, die unter 4.19 einwandfrei lief.
In so einem Fall verzichten Sie auf das Update und suchen sich aus den Repositories [1] das passende Header-Paket. Es trägt ein Datum im Namen; Sie wählen das Paket, das in etwa dem Release-Datum des verwendeten Pi OS entspricht. Für das Release vom 20.08.2020 wäre das etwa das Paket raspberrypi-kernel-headers_1.20200819-1_armhf.deb.
Bauarbeiten
Die Quelldateien für ein Modul laden Sie von der Herstellerseite oder wie im Beispiel aus den offiziellen Kernel-Quellen [2] und legen sie in ein eigenes Unterverzeichnis. Die Quelldatei für die Epson-RTC war per Google-Suche schnell als drivers/rtc/rtc-rx8010.c identifiziert und landete im Verzeichnis ~/src/epson-rtc. Der Modulbau erfordert noch eine kleine Datei, die zwingend Kbuild heißen muss (Listing 2).









