Linux Kernel-Module kompilieren

So erstellen Sie Treiber für den Raspberry Pi selbst

Nicht jede Hardware funktioniert von Haus aus unter Linux. Ein passender Treiber lässt sich jedoch auch für den Raspberry Pi erstellen, wenn der Quelltext vorhanden ist, lässt sich das fehlende Kernel-Modul nachrüsten.

Der Raspberry Pi lässt sich über die USB-Ports erweitern, etwa um Festplatten, Drucker oder WLAN-Adapter zu nutzen. Aber nicht alle USB-Geräte funktionieren auf Anhieb. Voraussetzung ist ein passendes Modul für den Linux-Kernel, und gerade für neuere Geräte fehlt manchmal die Unterstützung. Wenn der Treiber-Quellcode für Linux verfügbar ist, lässt sich das fehlende Kernel-Modul nachrüsten. Im Unterschied zum PC mit Intel/AMD-Prozessor gelten beim Raspberry allerdings einige Besonderheiten.

Der Artikel bezieht sich auf Raspbian, ein Debian-basiertes Linux für Raspberry Pi, Pi Modell B+ und Pi 2 Modell B. Das Prinzip gilt aber für jedes Linux-System, gleich ob auf Raspberry Pi oder PC. Der Artikel erklärt exemplarisch die Installation des Kernel-Moduls für den verbreiteten WLAN-USB-Stick TP-Link AC600 T2U (TL-WDN5200). Die Vorgehensweise ist jedoch für alle Kernel-Module ähnlich.

1. Linux-Kernel, Geräte & Module

Der Linux-Kernel stellt Schnittstellen zur Hardware zur Verfügung, koordiniert den Start von Programmen und die Zuweisung von Prozessorzeit. Er bildet das eigentliche Betriebssystem. Alles andere sind letztlich nur Hilfsprogramme etwa zur Darstellung der grafischen Oberfläche.

In den Kernel direkt integriert sind wichtige Treiber etwa für Festplattenadapter und Dateisysteme. Was sonst noch nötig ist, wird als Modul nachgeladen. Das geschieht zuerst beim Linux-Start über eine Datei mit dem Basissystem, die der Kernel in eine Ramdisk lädt. Weitere Module, etwa für USB-Geräte, lädt der Kernel automatisch, sobald er ein neues Gerät erkennt. Dazu ermittelt er die eindeutige Geräte-ID und sieht nach, ob ein Modul dafür zuständig ist. Das Modul wird dann initialisiert, und die neue Hardware ist einsatzbereit.

Wenn kein passendes Modul im Linux-Kernel enthalten ist, lässt es sich nachinstallieren. In der Regel steht dafür der Quelltext zur Verfügung, mit dem Sie selbst das Modul kompilieren müssen. Wer Kernel-Module aus dem Quelltext erzeugen möchte, benötigt keine Programmierkenntnisse, jedoch ist ein souveräner Umgang mit der Kommandozeile und den nötigen Tools erforderlich.

Bei Quelltextmodulen handelt sich oft um Treiber, die relativ neu und noch nicht ausreichend getestet sind. Es gibt also keine Garantie, dass ein selbst erstelltes Modul auch einwandfrei arbeitet.

2. Informationen zum USB-Gerät ermitteln

Manchmal liegt es gar nicht am Treiber – für den AVM-WLAN-Stick fehlt nur die Firmware.
Manchmal liegt es gar nicht am Treiber – für den AVM-WLAN-Stick fehlt nur die Firmware.

WLAN-USB-Adapter und TV-Sticks funktionieren manchmal nicht, weil die nötige Firmware-Datei fehlt. Sehen Sie sich daher die letzten Protokolleinträge an, direkt nachdem Sie das USB-Gerät verbunden haben:

dmesg

Wiederholen Sie dmesg mehrmals, weil es manchmal etwas dauert, bis der Kernel das Gerät entdeckt hat. Erscheinen nur Infos wie „new high-speed USB device“, ist kein passendes Modul vorhanden. Erscheint hingegen „Direct firmware load failed“, dann fehlt nur die Firmware. In der Regel findet sich auch ein Hinweis, wie die Firmware-Datei heißt, etwa „carl9170-1.fw“ für einen Fritz WLAN-N-Adapter von AVM. In diesem Fall suchen Sie über die folgende Befehlszeile nach Firmware-Paketen:

apt-cache search firmware

Installieren Sie dann beispielsweise ein Paket nach, das viele Firmware-Dateien für verbreitete WLAN-Adapter enthält:

apt-get install firmware-linux

Weitere Firmware-Pakete finden Sie etwa unter den Namen „firmware-brcm80211“, „firmware-realtek“ und „firmware-ralink“.

Suche nach Kernel-Modulen: Wenn das Kernel-Modul fehlt, ermitteln Sie zuerst die Geräte-ID:

lsub

In der Ausgabe sehen Sie die eindeutigen USB-IDs und die Bezeichnungen. Letztere müssen nicht unbedingt mit der Modellbezeichnung übereinstimmen. Oft stehen hier nur die Namen der Chipsatz-Hersteller, etwa „Ralink Technology, Corp.“ oder „Atheros Communications“.

Hardware-Datenbanken helfen, den Chipsatz eines WLAN-USB-Sticks zu ermitteln.
Hardware-Datenbanken helfen, den Chipsatz eines WLAN-USB-Sticks zu ermitteln.

Die Internet-Suche nach einer USB-ID wie „148f:761a“ führt dann meist auf Seiten mit weiteren Informationen und Erfahrungen anderer Linux-Nutzer. Sie können auch direkt in Linux-Hardware-Datenbanken wie https://wikidevi.com, https://de.opensuse.org/Portal:Hardware oder http://wiki.ubuntuusers.de suchen. Auf diese Weise bekommen Sie den verwendeten Chipsatz und den Hersteller heraus.

Es ist möglich, dass bisher noch niemand das gewünschte Gerät unter Linux zur Mitarbeit überreden konnte. Oder Sie finden Erfolgsgeschichten mit konkreten Anleitungen.

Für unsere Beispiel-Hardware TP-Link AC600 T2U stoßen Sie auf die Software-Quellen vom taiwanischen Chiphersteller Mediatek, der 2011 den Hersteller Ralink übernommen hat. Der Original-Quelltext lässt sich jedoch nicht ohne Weiteres für aktuelle Kernel-Versionen kompilieren.

Außerdem enthält die Konfiguration keine USB-IDs für Geräte, die man in Deutschland kaufen kann. Der Treiber funktioniert auch mit den WLAN-Sticks Cisco Linksys AE6000 und Asus AC600, nicht jedoch mit dem AVM-Stick AC 430, obwohl in diesem der gleiche Chipsatz steckt (MT7610U).