Aus Raspberry Pi Geek 06/2021

Treiber als Kernel-Module kompilieren

© Marcin Jucha / 123RF.com

Kerngeschäft

Bernhard Bablok

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).

Abbildung 1: DS3231-Breakouts bei eBay.

Abbildung 1: DS3231-Breakouts bei eBay.

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).

Abbildung 2: Der DS3231-Chip im Vergleich zum RX8010SJ.

Abbildung 2: Der DS3231-Chip im Vergleich zum RX8010SJ.

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+).

Abbildung 3: Kernel-Version und Header-Dateien.

Abbildung 3: Kernel-Version und Header-Dateien.

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).

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben