Raspberry Pi Kernel Module erstellen

Neue Kernel-Module für den Raspberry Pi mit Crosscompiler erstellen

Nicht jede Hard­ware wird unter Linux von Haus aus unter­stützt. Bei neu­en Gerä­ten sind die erfor­der­li­chen Ker­nel-Modu­le (Trei­ber) noch nicht im Ker­nel ent­hal­ten. Wenn man den Quell­text des gewünsch­ten Trei­bers im Inter­net fin­det, kann man sich die Ker­nel-Modu­le jedoch selbst erstel­len.

Für neue Ker­nel-Modu­le sind meh­re­re Vor­aus­set­zun­gen zu erfül­len: Sie benö­ti­gen den Quell­code des Ker­nels, eini­ge Ent­wick­lungs-Tools, wie den Com­pi­ler gcc, und natür­lich den Quell­code des Trei­bers. Pro­gram­mier­kennt­nis­se sind dafür nicht erfor­der­lich, ledig­lich der sou­ve­rä­ne Umgang mit der Kom­man­do­zei­le.

Update 06.01.2019: Der Raspber­ry Pi 3 ist inzwi­schen schnell genug, um ein Ker­nel-Modul direkt auf dem Gerät zu erstel­len. Ein zusätz­li­ches Tool erleich­tert außer­dem den Down­load der Ker­nel-Quel­len. Die nöti­gen Schrit­te las­sen sich damit redu­zie­ren. Außer­dem gibt es eine neue Ver­si­on des mt76x0-Trei­bers, der für neue­re Ker­nel-Ver­sio­nen ange­passt ist. Bei die­sem ent­fällt die Kon­fi­gu­ra­ti­on über die Datei /etc/Wireless/RT2870STA.dat. Die Kon­fi­gu­ra­ti­on ist jetzt im Trei­ber selbst ent­hal­ten.

Eine gute Nach­richt für alle Eigen­tü­mer der genann­ten Hard­ware: Ab Ker­nel-Ver­si­on 4.19 ist der mt76x0-Trei­ber im Linux-Stan­dard-Ker­nel ent­hal­ten. Es wird jedoch noch eini­ge Zeit dau­ern, bis die­se Ver­si­on in den Linux-Dis­tri­bu­tio­nen ankommt. Ubun­tu 18.04 bei­spiels­wei­se ver­wen­det die Ker­nel-Ver­si­on 4.15 bei Raspbi­an ist es 4.14 (Stand Janu­ar 2019).

Update 04.04.2016: Ich habe den Trei­ber-Quell­code bei Git­hub aktua­li­siert und Ände­run­gen aus ver­schie­de­nen Quel­len ein­flie­ßen las­sen. Das erzeug­te Ker­nel-Modul heißt jetzt mt7610u_sta.ko. Die Kon­fi­gu­ra­ti­ons­da­tei /etc/Wireless/RT2870STA.dat wird jetzt auch unter neue­ren Ker­neln kor­rekt ein­ge­le­sen. Hier ist jetzt „WirelessMode=13“ kon­fi­gu­riert. Nach mei­nen Tests funk­tio­nie­ren damit jetzt 2,4 und 5 GHz. Bei 5 GHz wird jedoch die erwar­te­te Geschwin­dig­keit nicht erreicht (sie­he „Netz­werk­leis­tung mit iperf mes­sen“)

Erstellung von Kernel-Modulen am Beispiel mt76x0 (Ralink/Mediatek)

Ich erläu­te­re das Ver­fah­ren am Bei­spiel des Ker­nel Moduls für den WLAN-USB-Stick TP-Link AC900. Wie sich das Ker­nel-Modul dafür unter und für Ubun­tu erstel­len lässt, habe ich im Arti­kel TP-Link Archer T2U AC600 unter Linux nut­zen beschrie­ben.

Im Prin­zip funk­tio­niert es so oder ähn­lich für jeden Trei­ber, des­sen Quell­code ver­füg­bar ist.

Der Bei­spiel-Trei­ber eig­net sich (theo­re­tisch) für fol­gen­de Hard­ware:

USB_DEVICE (0x148F:0x7610) MT7610U
USB_DEVICE (0x13B1:0x003E) Link­sys AE6000
USB_DEVICE (0x0E8D:0x7610) Sab­rent NTWLAC
USB_DEVICE (0x7392:0xa711) Edi­max 7711mac
USB_DEVICE (0x7392:0xb711) Edi­max / Ele­com
USB_DEVICE (0x148f:0x761a) TP-Link TL-WDN5200
USB_DEVICE (0x148f:0x760a) TP-Link unknown
USB_DEVICE (0x0b05:0x17d1) Asus USB-AC51
USB_DEVICE (0x0b05:0x17db) Asus USB-AC50
USB_DEVICE (0x0df6:0x0075) Site­com WLA-3100
USB_DEVICE (0x2019:0xab31) Planex GW-450D
USB_DEVICE (0x2001:0x3d02) D‑LINK DWA-171 rev B1
USB_DEVICE (0x0586:0x3425) Zyxel NWD6505
USB_DEVICE (0x07b8:0x7610) Abo­Com AU7212
USB_DEVICE (0x04bb:0x0951) I‑O DATA WN-AC433UK
USB_DEVICE (0x057c:0x8502) AVM FRITZ!WLAN USB Stick AC 430 (not working)
USB_DEVICE (0x293c:0x5702) Com­cast Xfi­ni­ty KXW02AAA
USB_DEVICE (0x20f4:0x806b) TREND­net TEW-806UBH
USB_DEVICE (0x7392:0xc711) Devo­lo Wifi ac Stick
USB_DEVICE (0x0df6:0x0079) Site­com Euro­pe B.V. ac Stick
USB_DEVICE (0x2357:0x0105) TP-LINK Archer T1U

Die Funk­ti­on ist bei jedem der genann­ten USB-Wifi-Adap­ter garan­tiert. Ich selbst habe nur den WLAN-Adap­ter TP-Link TL-WDN5200 T2U aus­pro­biert (USB-ID 0x148f:0x761a). Der AVM FRITZ!WLAN USB Stick AC 430 ver­wen­det den glei­chen Chip­satz, funk­tio­niert jedoch mit die­sem Trei­ber nicht und auch sonst mit kei­nem bekann­ten Trei­ber. Die Ursa­che dafür ist bis­her nicht bekannt.

Variante 1: Module auf dem Raspberry Pi kompilieren

Ich gehe davon aus, dass auf dem Raspber­ry Pi die aktu­el­le Ver­si­on von Ras­pian instal­liert ist. Zur­zeit (Janu­ar 2019) ist das Ras­pian Stretch mit Ker­nel 4.14.

Sie benö­ti­gen zuerst den Quell­code des lau­fen­den Ker­nels. Aller erfor­der­li­chen Schrit­te füh­ren Sie in einem Ter­mi­nal­fens­ter durch.

Aktua­li­sie­ren Sie das Sys­tem mit

sudo apt update -y
sudo apt upgrade -y

Optio­nal lässt sich der Ker­nel auf die aktu­ells­te Ver­si­on brin­gen. Dazu ver­wen­den Sie im Ter­mi­nal­fens­ter die Befehls­zei­le

sudo rpi-update

Star­ten Sie den Raspber­ry Pi danach neu. Instal­lie­ren Sie vier erfor­der­li­che Pake­te:

sudo apt install git bc bison flex libproc-processtable-perl

Füh­ren Sie fol­gen­de vier Befehls­zei­len im Home-Ver­zeich­nis /home/pi aus:

cd ~
sudo wget https://raw.githubusercontent.com/notro/rpi-source/master/rpi-source -O /usr/bin/rpi-source
sudo chmod +x /usr/bin/rpi-source
/usr/bin/rpi-source -q --tag-update
rpi-source

Der zum lau­fen­den Ker­nel pas­sen­de Ker­nel-Quell­code liegt jetzt bei­spiels­wei­se im Ord­ner „/ho­me/pi/­li­nux-36612­d5­d7a88672a3e7d­d6c­b458dbbb­ca0­d75e­fe“. Der Hash-Wert entspicht dem vom Script in „Vari­an­te 2“ ermit­tel­ten Wert für den Ker­nel-Hash. Es gibt außer­dem den Sym­link „/home/pi/linux“ der auf den Ord­ner mit den Ker­nel-Quel­len ver­weist.

rpi-source hat die Ker­nel-Quel­len bereits für die Verr­wen­dung vor­be­rei­tet. Das ist dar­an zu erken­nen, dass die Datei­en „.con­fig“ und „Module.symvers“ vor­han­den sind. Es gibt außer­dem die Sym­links „/lib/modules/4.14.79-v7+/build“ und „/lib/modules/4.14.79-v7+/source“, die jeweils auf das Ver­zeich­nis „/home/pi/linux“ ver­wei­sen.

Trei­ber-Quell­code her­un­ter­la­den und kom­pi­lie­ren: Erstel­len Sie ein Arbeits­ver­zeich­nis, laden Sie den Quell­code des Trei­bers her­un­ter und kom­pi­lie­ren Sie ihn:

mkdir ~/src
cd ~/src
git clone https://github.com/Myria-de/mt7610u.git
cd mt7610u
ARCH=arm make -j4

Bit­te beach­ten Sie, dass die­se Arbei­ten ohne root-Rech­te durch­ge­führt wer­den, also ohne vor­an­ge­stell­tes „sudo“. Das ist siche­rer, falls ein Build-Script ver­su­chen soll­te, Sys­tem­da­tei­en  zu erset­zen.

Kernel-Modul kompilieren
Ker­nel-Modul für den Raspber­ry Pi kom­pi­lie­ren

Das Ker­nel-Modul „mt7610u.ko“ liegt danach im Ord­ner „/home/pi/src/mt7610u“. Instal­lie­ren Sie die Firm­ware-Datei „mt7610u.bin“ und laden Sie das Modul mit die­sen zwei Befehls­zei­len:

sudo ARCH=arm make installfw
sudo insmod mt7610u.ko

Ver­bin­den Sie den WLAN-Stick mit dem Raspber­ry Pi. Mit dem Befehl

dmesg

sehen Sie sich die Log-Aus­ga­ben an. Es erschei­nen Ein­trä­ge, die auf die kor­rek­te Funk­ti­on des Gerä­tes hin­wei­se. Auch ein paar Feh­ler­mel­dun­gen sind dabei, die sind aber unkri­tisch.

Log mit dmesg anzeigen
Log-Aus­ga­be (dmesg) nach Anschluss des WLAN-Sticks.

Wenn alles zufrie­den­stel­lend läuft instal­lie­ren Sie das neue Ker­nel-Modul mit

sudo ARCH=arm make install

Star­ten Sie den Raspber­ry Pi neu. Das Modul „mt7610u.ko“ wird jetzt auto­ma­tisch gela­den.

Die WLAN-Ver­bin­dung lässt sich über das Netz­werk-Icon in der Leis­te am obe­ren Bild­schirm­rand her­stel­len.

WLAN-Verbindung herstellen
Raspbi­an: WLAN-Ver­bin­dung über den Desk­top her­stel­len.

Variante 2: Cross-Compile-Script zum Erstellen der Kernel-Module verwenden

Ker­nel-Modu­le für den Raspber­ry Pi las­sen sich auch auf einem ande­ren Linux-PC erstel­len. Am ein­fachs­ten ist es, Ubun­tu 14.04 oder 18.04 (nur 64-Bit) zu ver­wen­den. Die Ent­wick­lung ist auch in einer vir­tu­el­len Maschi­ne mög­lich, etwa in Vir­tu­al­box. Alle nöti­gen Down­loads und Schrit­te habe ich in einem Script zusam­men­ge­fasst. Das Script eig­net sich für den Raspber­ry Pi 2/3 (armv71).

Beim Cross-kom­pi­lie­ren ist ein gewis­ser Auf­wand nötig, denn der etwa bei Ubun­tu instal­lier­te Com­pi­ler kann stan­dard­mä­ßig kei­ne Pro­gram­me oder Trei­ber für die ARM-Plat­form des Raspber­ry Pi erzeu­gen. Es ist daher zusätz­lich Soft­ware nötig. Dafür läuft der Build-Vor­gang auf einen durch­schnitt­li­chen PC unter Linux aber deut­lich schnel­ler ab, als direkt auf dem Raspber­ry Pi.

Ich erläu­te­re das Ver­fah­ren am Bei­spiel des Ker­nel Moduls für den WLAN-USB-Stick TP-Link AC900. Wie sich das Ker­nel-Modul dafür unter und für Ubun­tu erstel­len lässt, habe ich im Arti­kel TP-Link Archer T2U AC600 unter Linux nut­zen beschrie­ben.

Im Prin­zip funk­tio­niert es so oder ähn­lich für jeden Trei­ber, des­sen Quell­code ver­füg­bar ist.

Ker­nel und GCC-Ver­si­on ermit­teln: Ker­nel-Quell­code und gcc-Ver­si­on soll­ten für das ver­wen­de­te Script zur Ver­si­on des auf dem Raspber­ry Pi lau­fen­den Linux-Ker­nels pas­sen. Infor­ma­tio­nen dazu fin­den Sie über die bei­den Befehls­zei­len

cat /proc/version
gcc --version

Die ers­te Zei­le gibt bei­spiels­wei­se fol­gen­des aus:

Linux ver­si­on 4.14.79-v7+ (dc4@dc4-XPS13-9333) (gcc ver­si­on 4.9.3 (cross­tool-NG crosstool-ng‑1.22.0–88-g8460611)) #1159 SMP Sun Nov 4 17:50:20 GMT 2018

Die Ker­nel-Ver­si­on ist hier „4.14.79-v7+“. Außer­dem sehen Sie, dass der Ker­nel mit dem Com­pi­ler GCC Ver­si­on 4.9.3 und cross­tool-NG crosstool-ng‑1.22.0–88-g8460611 erstellt wur­de. Die Aus­ga­be von „gcc –ver­si­on“ lau­tet bei­spiels­wei­se „gcc‑7.3.0“, was dann nicht zum instal­lier­ten Ker­nel pas­sen wür­de.

Die Aus­ga­be „cross­tool-NG“ weist dar­auf hin, dass der Ker­nel nicht auf einem Raspber­ry Pi kom­pi­liert wur­de. Statt­des­sen kam eine Cross­com­pi­le-Umge­bung zum Ein­satz, die sich auf jedem belie­bi­gen Linux-PC ein­rich­ten lässt.

Wel­cher Ker­nel genau instal­liert ist, lässt sich über die Datei „/usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz“ ermit­teln. Dar­in steht ein Firm­ware-Hash-Wert aus dem sich der Ker­nel-Hash und damit die Down­load-URL bei https://github.com/raspberrypi/linux.git für die­sen Ker­nel ergibt.

SSH-Ver­bin­dung tes­ten: Stel­len Sie sicher, dass Sie Ihren Raspber­ry Pi über ssh errei­chen kön­nen:

ssh pi@192.168.0.17

Erset­zen Sie die IP-Num­mer durch die IP Ihres Raspber­ry Pi. Bestä­ti­gen Sie den Schlüs­sel mit yes und geben Sie das Pass­wort ein. Prü­fen Sie bei der Gele­gen­heit, ob die Datei „/proc/config.gz“ vor­han­den ist:

zcat /proc/config.gz

Wenn Sie die Feh­ler­mel­dun­gen „gzip: /proc/config.gz: No such file or direc­to­ry“ erhal­ten. Star­ten Sie

sudo modprobe configs

Danach ist „/proc/config.gz“ vor­han­den. Been­den Sie die SSH-Ver­bin­dung mit exit.

Script vor­be­rei­ten: Laden Sie „raspi_crosstools.sh“ her­un­ter (sie­he unten auf die­ser Sei­te) und spei­chern bezie­hungs­wei­se ent­pa­cken Sie die Datei in Ihr Home-Ver­zeich­nis auf dem (Ubuntu-)PC. Machen Sie die Datei mit fol­gen­dem Befehl aus­führ­bar:

chmod 755 raspi_crosstools.sh

Öff­nen Sie raspi_crosstools.sh in einem Edi­tor. Pas­sen Sie den Abschnitt unter­halb von „Kon­fi­gu­ra­ti­on“ an. Tra­gen Sie hin­ter die Varia­blen den Benut­zer­na­men („RASPI_USER=“), das Pass­wort („RASPI_PWD=“) und die IP-Adres­se ein („RASPI_IP=“).

Der hin­ter „USE_THREADS=“ ein­ge­tra­ge­ne Wert „-j4“ bestimmt die Anzahl der Threads, die der Com­pi­ler ver­wen­den soll. Bei einem Intel Core i7 kön­nen Sie auch „-j8“ ein­tra­gen. Das Com­pi­lie­ren geht dann schnel­ler. Bei lang­sa­me­ren CPUs las­sen Sie den Wert leer
Star­ten Sie das Script dann mit

./raspi_crosstools.sh
Script raspberry_cross
In der Regel genügt es hier „Mini­mal“ zu wäh­len. Bei Pro­ble­men ent­schei­den Sie sich für „Voll“.

So arbei­tet das Script: Das Bash-Script prüft zunächst, ob die nöti­gen Ent­wick­ler­pa­ke­te auf dem Linux-Sys­tem instal­liert sind und instal­liert sie bei Bedarf. Danach haben Sie die Wahl, ob Sie eine mini­ma­le (schnel­ler) oder vol­le (lang­sa­mer) Kom­pi­la­ti­on des Ker­nels wün­schen. In der Regel soll­te eigent­lich eine mini­ma­le Kon­fi­gu­ra­ti­on des Ker­nels genü­gen. Als Cross-Com­pi­ler kommt die glei­che Ver­si­on zum Ein­satz, die die Ent­wick­ler des Raspbi­an-Ker­nels ver­wen­det haben (https://github.com/raspberrypi/tools).

Das Pro­blem dabei: Sie benö­ti­gen die Datei „Module.symvers“ von github.com/raspberrypi/firmware. Als ich das Script geschrie­ben habe, lag hier für den Ker­nel 4.1.6‑v7+ noch eine ver­al­te­te Ver­si­on. In die­sem Fall müs­sen Sie „Voll“ wäh­len. Dabei wird die Datei „Module.symvers“ neu erstellt. Das ist also der siche­re­re Weg. Mit der fal­schen „Module.symvers“ ver­wei­gert der Ker­nel des Raspber­ry Pi spä­ter das Modul zu laden. Es erscheint dann eine Feh­ler­mel­dung wie „mt7650u_sta: dis­agrees about ver­si­on of sym­bol module_layout“.

Im nächs­ten Schritt ermit­telt das Script, wel­cher Ker­nel auf dem Raspber­ry Pi instal­liert ist und lädt dann den Quell­code des Ker­nels her­un­ter. Außer­dem wer­den die Tools für den Cross-Com­pi­ler und die Quel­len des Trei­bers her­un­ter­ge­la­den. Alle Datei­en lan­den im Ver­zeich­nis „~/raspi_cross“.

Ker­nel-Modul auf dem Raspber­ry Pi instal­lie­ren: Der Ker­nel und die Modu­le wer­den dann kom­pi­liert. Nach Abschluss kopiert das Script das Modul und zwei Bash-Scrip­te in das Home-Ver­zeich­nis „/home/pi“ auf den Raspber­ry Pi. Machen Sie „install_driver.sh“ und „un-install_driver.sh“ jeweils mit chmod 755 aus­führ­bar. Mit

sudo ./install_driver.sh

instal­lie­ren Sie das Modul und mit sudo ./un-install_driver.sh ent­fer­nen Sie es wie­der. Mit dmesg prü­fen Sie, ob der Ker­nel das Modul kor­rekt gela­den hat.

Script anpas­sen: Wenn Sie ein ande­res Ker­nel-Modul für den Raspber­ry Pi erstel­len möch­ten, sind eini­ge Anpas­sun­gen im Script nötig. Ändern Sie die Down­load-Adres­se unter dem Kom­men­tar „Trei­ber her­un­ter­la­den“ und die Anwei­sun­gen unter „Ker­nel-Modul com­pi­lie­ren“. Pas­sen Sie außer­dem den Abschnitt „Datei­en auf den Raspi kopie­ren“ an.

Hin­wei­se: Das Script fragt nicht ab, ober Ker­nel oder Modul bereits zuvor com­pi­liert wur­den. Es star­tet immer mit einer fri­schen Kon­fi­gu­ra­ti­on („make clean“). So ist es siche­rer aber es kos­tet mehr Zeit. Wenn Sie das nicht wün­schen, kom­men­tie­ren Sie bei­spiels­wei­se den Block unter „Ker­nel vorbereiten/compilieren“ aus. Dann wird nur das Modul neu erstellt.

Soll­te nach einem Update einer neu­er Ker­nel auf dem Raspber­ry Pi instal­liert wer­den, müs­sen Sie den kom­plet­ten Vor­gang wie­der­ho­len. In die­sem Fall löschen Sie das Ver­zeich­nis „raspi_cross“ und star­ten wie­der das Script raspi_crosstools.sh. Es lädt dann die aktu­el­len, bezie­hungs­wei­se pas­sen­den, Ker­nel-Quel­len her­un­ter und erzeugt ein neu­es Ker­nel-Modul.

WLAN auf dem Raspberry Pi manuell einrichten (optional)

Prü­fen Sie nach erfolg­ter Modu­l­in­stal­la­ti­on auf dem Raspber­ry Pi mit dem Befehl ap addr in einem Ter­mi­nal­fens­ter, ob das Netz­werk­ge­rät vor­han­den ist. Im der Aus­ga­be soll­te das Gerät wlan0 oder ra0 auf­tau­chen (je nach Trei­ber). Suchen Sie nach WLAN-Netz­wer­ken mit fol­gen­der Befehls­zei­le:

sudo iwlist wlan0 scan

Tau­chen hier Netz­wer­ke mit der Anga­be etwa von „Frequency:5.22 GHz“ auf, funk­tio­niert auch 5 GHz.

Mit iwlist nach WLANs suchen
Nach WLAN-Netz­wer­ken suchen.

Die WLAN-Kon­fi­gu­ra­ti­on erfolgt am ein­fachs­ten und zuver­läs­sigs­ten auf der Kom­man­do­zei­le in einem Ter­mi­nal­fens­ter. Ändern sie zunächst mit sudo nano /etc/network/interfaces die Kon­fi­gu­ra­ti­on der Netz­werk-Gerä­te. Die Datei kann danach so aus­se­hen:

auto lo
iface lo inet loopback
iface eth0 inet manual
allow-hotplug wlan0
iface ra0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Ver­wen­den Sie den Befehl

sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

Hier tra­gen Sie zusätz­lich bei­spiels­wei­se fol­gen­des ein:

network={
        ssid="Meine_SSID"
        psk="1234567890"
        key_mgmt=WPA-PSK
}

Die Anga­ben hin­ter „ssid=“ und „psk=“ ändern Sie pas­send für Ihr Netz­werk.

Star­ten Sie den Raspber­ry Pi neu (sudo reboot). Die Ver­bin­dung zum WLAN-Netz­werk erfolgt jetzt auto­ma­tisch.

Crosscompile-Script für Raspberry-Pi-Module

Und hier das Script. Fah­ren Sie mit der Maus in den Script-Block und kli­cken Sie auf das ers­te Icon, um das Script im Text­mo­dus zu sehen. Oder laden Sie das Script raspi_crosstools.sh als ZIP-Datei her­un­ter.

#!/bin/bash

#########################
##    Konfiguration    ##
#########################
#
# IP-Adresse, Benutzername und Passwort des Raspberry Pi
# Das Gerät muss über ssh erreichbar sein
# Testen Sie das zuerst mit ssh pi@IP-Adresse
#
RASPI_USER=pi
RASPI_PWD=geheim
RASPI_IP=192.168.178.XX
# beispielsweise 192.168.0.17

# USE_THREADS= #langsame/ältere CPUs
# Beschleunigt das Compilieren bei Multicore-CPUs deutlich
USE_THREADS=-j4 # schnelle/neuere CPUs oder -j8 (mehr threads, schneller)
#
#DRIVERDIR=mt7610u-linksys-ae6000-wifi-fixes
#  Kernel 4.1
#DRIVERDIR=mt7610u_wifi_sta_v3002_dpo_20130916
#DRIVERFILE=mt7610u_sta.ko
#DRIVERNAME=mt7610u_sta
#GITCLONE=" -b raspberry https://github.com/Myria-de/$DRIVERDIR.git"
#NEWCONFIG=0

#Kernel 4.14
DRIVERDIR=mt7610u
DRIVERFILE=mt7610u.ko
DRIVERNAME=mt7610u
NEWCONFIG=1
GITCLONE=" -b raspberry https://github.com/Myria-de/$DRIVERDIR.git"
#GCCDIR="/home/te/raspi_cross/tools/arm-bcm2708/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"
#GCCDIR="/home/te/raspi_cross/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/#bin/arm-linux-gnueabihf- bcm2709_defconfig"

#########################
## Konfiguration Ende ##
#########################

KERNEL_HASH=
FIRMWARE_HASH=

HOMEDIR=`pwd`
WORKDIR=$HOMEDIR/raspi_cross
DRIVERBIN=$WORKDIR/$DRIVERDIR/$DRIVERFILE

# Pfad zum 64-Bit-Cross-Compiler, 32 Bit wird nicht unterstützt
export PATH=$WORKDIR/tools/arm-bcm2708/arm-linux-gnueabihf/bin:$PATH

if [ `getconf LONG_BIT` = "64" ]
then
    HOSTARCH=64
else
    HOSTARCH=32
fi

if [ $HOSTARCH = 32 ]
then
echo
echo "Das Script funktioniert nur unter einem 64-Bit-System"
echo "Abbruch."
echo
exit 1
fi


#####################################
## Dateien auf den Raspi kopieren ###
#####################################
put_file_to_raspi() {
#cd $WORKDIR/$DRIVERDIR/os/linux
if [ -e $DRIVERBIN ]
then
echo Kopiere Datei auf den Raspberry Pi
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put $DRIVERBIN; bye"
cd $WORKDIR/$DRIVERDIR
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put RT2870STA.dat; bye"
else
echo Fehler. Nicht gefunden: $DRIVERBIN
exit 1 
fi
cd $WORKDIR
cat<<EOF>${WORKDIR}/un-install_driver.sh
#!/bin/bash
[ \$UID -ne 0 ] && { 
    echo "Fehler: Das Script benötigt root-Rechte."
    echo "Aufruf mit mit sudo $0"
    exit 1
}
OSVERSION=\`uname -r\`
echo Entlade Modul $DRIVERFILE
rmmod $DRIVERNAME
echo Lösche Modul /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
rm /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
echo Lösche Konfiguration /etc/Wireless/RT2870STA/RT2870STA.dat
rm /etc/Wireless/RT2870STA/RT2870STA.dat
echo Aktualisiere Module...
depmod -a
echo Sie können das Verzeichnis /etc/Wireless jetzt komplett löschen
echo Fertig!
EOF

cat<<EOF>${WORKDIR}/install_driver.sh
#!/bin/bash
[ \$UID -ne 0 ] && { 
    echo "Fehler: Das Script benötigt root-Rechte."
    echo "Aufruf mit mit sudo \$0"
    exit 1
}
OSVERSION=\`uname -r\`
NEWCONFIG=$NEWCONFIG

mkdir -p /etc/Wireless/RT2870STA
mkdir -p /lib/modules/\$OSVERSION/extra
echo Kopiere Modul nach /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
cp $DRIVERFILE /lib/modules/\${OSVERSION}/extra/$DRIVERFILE
if [ \$NEWCONFIG = 0 ]
then
echo Kopiere Konfigration nach /etc/Wireless/RT2870STA/RT2870STA.dat
cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
fi
echo Aktualisiere Module...
depmod -a
echo lade Modul $DRIVERFILE
modprobe $DRIVERNAME
echo Fertig!
EOF
chmod 755 install_driver.sh
chmod 755 un-install_driver.sh

# Datei uebertragen
echo Kopiere Datei install_driver.sh auf $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put install_driver.sh; bye"
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "put un-install_driver.sh; bye"
}

# Konfigurations-Dateien vom Raspberry Pi holen
get_files_from_raspi() {
cd $WORKDIR

# Alte Dateien löschen
if [ -e changelog.Debian.gz ]
then
rm changelog.Debian.gz
fi

if [ -e config.gz ]
then
rm config.gz
fi

if [ -e Module.symvers ]
then
rm Module.symvers
fi

echo Download changelog.Debian.gz vom Raspberry Pi $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "get -e /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz; bye"
FIRMWARE_HASH=$(zgrep "* firmware as of" changelog.Debian.gz | head -1 | awk '{ print $5 }')
echo Firmware-Hash: $FIRMWARE_HASH
#
# hier bei Bedarf einen eigenen Hash-Wert eintragen
# wenn nicht der Standard-Kernel, wie in raspberrypi-bootloader/changelog.Debian.gz
# abgelegt, zum Einsatz kommmt.
# die Hash-Werte sind unter https://github.com/raspberrypi/firmware/commits/ zu finden
# Beispielsweise "kernel: Bump to 4.1.15" unter
# https://github.com/raspberrypi/firmware/commit/22d8c910f4c53118f9cf85c038d7d8e307efc110 
# 
#4.1.15
#FIRMWARE_HASH=c22d8c910f4c53118f9cf85c038d7d8e307efc110
#4.1.20
#FIRMWARE_HASH=37f187cd887f67235f3b84e0a2cd67807196c70f
#7f30737678023b5becaf0e2e012665f71b886a7d

#c37f187cd887f67235f3b84e0a2cd67807196c70f
#FIRMWARE_HASH=4bf906cdd221c4f6815d0da7dda0cd59d25d945b

#3.18.13
#FIRMWARE_HASH=9354845ea5a961f267bcf440f92c9bd21be29b35
#git hash
#3.18.11
#8362c08dfc8dd9e54745b3f1e5e4ff0a1fb30614

echo Hole $FIRMWARE_HASH/
KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
echo Kernel-Hash ist: $KERNEL_HASH

echo Download config.gz vom Raspberry Pi $RASPI_IP
lftp sftp://$RASPI_USER:$RASPI_PWD@$RASPI_IP -e "get -e /proc/config.gz; bye"

# Version des Kernels ermittlen (für PI/PI2)
STR=$(zgrep "CONFIG_LOCALVERSION" config.gz | head -1)
LOCALVERSION=${STR#*=} #string part after =
LOCALVERSION="${LOCALVERSION//\"}" #remove quotes
if [ "$LOCALVERSION" == "-v7" ]
then
echo "Raspberry PI 2 gefunden (armv71)"
RASPI_MODEL=armv71
else
echo "Raspberry PI gefunden (armv61)"
RASPI_MODEL=armv61
fi

# hier sollte die Datei Module.symvers für den aktuellen Kernel liegen 
if [ $RASPI_MODEL = armv71 ]
then
echo Download Module7.symvers
wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module7.symvers -O Module.symvers 
else
echo Download Module.symvers
wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module.symvers -O Module.symvers 
fi

if [ ! -e changelog.Debian.gz ]
then
echo "Fehler: changelog.Debian.gz nicht gefunden"
return 0
fi

if [ ! -e config.gz ]
then
echo "Fehler: config.gz nicht gefunden"
return 0
fi

return 1
}

##############################
## Das Script startet hier ###
##############################

echo "Prüfe Voraussetzungen..."
if [ ! -d /usr/share/build-essential ]
then
sudo apt-get update
sudo apt-get build-essential
echo "OK" > prep_ok
fi 

#git ?
if [ -z $(which git) ]
then
echo "Installiere git"
sudo apt-get -y install git
fi

# dialog?
if [ -z $(which dialog) ]
then
echo "Installiere dialog"
sudo apt-get -y install dialog
fi

# lftp?
if [ -z $(which lftp) ]
then
echo "Installiere lftp"
sudo apt-get -y install lftp
fi

if [ -z ${RASPI_IP} ]
then
MSG="Die IP-Adresse des Raspberry Pi ist nicht konfiguriert.\n"\
"Bitte öffnen Sie dieses Script zuerste in einem Editor"\
" und passen Sie die Konfiguration an.\n"\
"Abbruch!"

dialog --title "Konfiguration" --msgbox "${MSG}" 10 50
exit 1
fi	

MSG="Dises Script erstellt ein Kernel Modul für den Raspberry Pi.\n"\
"Als Beispiel wird ein Modul für den USB-WLAN-Stick TP-Link AC900 erstellt."\
" Passen Sie zuerst im Script den Abschitt Konfiguration an."\
" Wenn das noch nicht erledigt ist, gehen Sie auf 'Abbrechen'\n"\
"Bei 'Weiter' lädt das Script den zu Ihrem Raspberry Pi passenden Kernel,"\
"einige Tools und den Treiber-Quellcode herunter. Das kann einige Zeit dauern..."

dialog --title "Module erstellen" --yes-label "Weiter" --no-label "Abbrechen" --yesno "${MSG}" 13 60

if [ "$?" != "0" ]
then
echo "Abbruch!"
exit 0
fi	

MSG="Für die Kernel-Module ist die Datei 'Module.symvers' nötig.\n"\
"Die Datei ist auf 'raw.github.com/raspberrypi/firmware' verfügbar."\
" Wenn die Datei heruntergeladen werden soll, wählen Sie 'Minimal'.\n"\
"Manchmal liegt hier aber nicht die aktuelle Datei."\
" Dann schlägt das Laden des Moduls auf dem Rapberry Pi fehl."\
" In diesem Fall müssen Sie Kernel und Module komplett erstellen, wobei die Datei erzeugt wird."\
" Das dauert länger, sollte aber in jedem Fall ein passendes Modul erzeugen."

dialog --title "Modus wählen" --yes-label "Minimal" --no-label "Voll" --yesno "${MSG}" 15 60
if [ "$?" != "0" ]
then
MODE=full
else
MODE=min
fi	

if [ ! -d $WORKDIR ]
then
mkdir $WORKDIR
fi
cd $WORKDIR

# Konfigurations-Dateien vom Raspberry Pi holen
get_files_from_raspi

if [ ! -e config.gz ]
then
MSG="config.gz nicht auf dem Rapberry Pi gefunden\n"\
"oder es konnte keine SSH-Verbindung hergestellt werden.\n"\
"Testen Sie ssh pi@$RASPI_IP.\n"\
"Führen Sie aßerdem auf dem Gerät zuerst 'sudo modeprobe configs' aus.\n"\
"Prüfen Sie, ob zcat /proc/config.gz den Inhalt der Datei ausgibt.\n"\
"Abbruch!"

dialog --title "config.gz" --msgbox "${MSG}" 10 50
exit 1
fi
echo Kernel-Hash: $KERNEL_HASH

if [ ! -d $WORKDIR/kernel ]
then
echo "Lade Kernel herunter"
git clone https://github.com/raspberrypi/linux.git kernel
echo Checkout Kernel ${KERNEL_HASH}
cd $WORKDIR/kernel
git checkout $KERNEL_HASH
fi
cd $WORKDIR
if [ ! -e kernel/.config ]
then
echo Kopiere .config
gunzip -c config.gz > kernel/.config
fi

if [ ! -d $WORKDIR/tools ]
then
echo "Lade Tools herunter"
git clone https://github.com/raspberrypi/tools
fi 
#########################
# Treiber herunterladen #
#########################
if [ ! -d $WORKDIR/$DRIVERDIR ]
then
echo "Lade Treiber herunter"
git clone $GITCLONE
#git clone -b raspberry https://github.com/Myria-de/$DRIVERDIR.git
fi 

# Crosscompile-Umgebung vorbereiten
if [ $HOSTARCH = 64 ]
then
export CCPREFIX=arm-linux-gnueabihf- bcm2709_defconfig
else
# nicht mehr unterstützt
export CCPREFIX=$WORKDIR/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-
fi
echo
echo "Verwende Compiler $CCPREFIX"
echo
 
export ARCH=arm
export CROSS_COMPILE=${CCPREFIX}
export KERNEL_SRC=$WORKDIR/kernel
echo "Erstelle Kernel..."
cd $WORKDIR/kernel

if [ -e $WORKDIR/config.gz ]
then
if [ ! -e $WORKDIR/config.gz ] 
then
zcat $WORKDIR/config.gz > $WORKDIR/kernel/.config
fi
else
echo $WORKDIR/config.gz ist nicht vorhanden. Abbruch.
exit 1
fi

if [ -e $WORKDIR/Module.symvers ]
then
cp $WORKDIR/Module.symvers $WORKDIR/kernel/Module.symvers
else
echo $WORKDIR/Module.symvers ist nicht vorhanden. Abbruch.
exit 1
fi

####################################
## Kernel vorbereiten/compilieren ##
####################################
if [ $MODE = "min" ]
then
make oldconfig
make prepare
make scripts
else
make clean
make oldconfig
make prepare
make $USE_THREADS
fi

##############################
## Kernel-Modul compilieren ##
##############################
echo Erstelle Treiber
cd $WORKDIR/$DRIVERDIR
make clean
make $USE_THREADS

if [ -e $DRIVERBIN ]
then
put_file_to_raspi
else
echo
echo $DRIVERBIN
echo ist nicht vorhanden.
echo Die Compilation ist fehlgeschlagen.
echo Bitte prüfen Sie Ihre Konfiguration.
fi
echo
echo Fertig!
echo
echo Zusammenfassung/Summary
echo Firmware-Hash: $FIRMWARE_HASH
echo Kernel-Hash: $KERNEL_HASH
echo Raspberry-Modell:$RASPI_MODEL
echo Modul: $DRIVERFILE

Netzwerkleistung mit iperf messen

Zuver­läs­sig­keit und Geschwin­dig­keit Ihres Netz­wer­kes ermit­teln Sie mit Tool iperf. Instal­lie­ren Sie es auf dem Raspber­ry Pi und einem ande­ren PC im Netz­werk in einem Ter­mi­nal­fens­ter mit

 sudo apt-get install iperf

Star­ten Sie auf dem Raspber­ry Pi

iperf -s

Das Tool lauscht nun auf dem TCP-Port 5001. Star­ten Sie auf einem ande­ren PC den Test mit die­ser Befehls­zei­le:

iperf -c Server-IP -d 

Erset­zen Sie Ser­ver-IP durch die tat­säch­li­che IP-Adres­se des Ser­vers. Iperf sen­det und emp­fängt nun zehn Sekun­den lang Daten und zeigt anschlie­ßend das Ergeb­nis im Ter­mi­nal. Der Para­me­ter „-d“ tes­tet simul­tan den Daten­durch­satz in bei­den Rich­tun­gen. In der Aus­wer­tung zeigt der ers­te Wert die Ver­bin­dung vom Cli­ent zum Ser­ver (Uplink), der zwei­te den Durch­satz vom Ser­ver zum Cli­ent.

Die Bedie­nung von Iperf wird durch das gra­fi­sche Front­end Jperf erleich­tert. Es zeigt die Mess­ergeb­nis­se in einem Dia­gramm und ver­mit­telt so einen bes­se­ren Ein­druck von der Trans­fer­ra­te. Jperf benö­tigt eine Java-Lauf­zeit­um­ge­bung. Instal­lie­ren Sie die­se bei­spiels­wei­se unter Ubun­tu mit fol­gen­der Befehls­zei­le:

sudo apt install default-jre

Laden Sie Jperf über https://www.pcwelt.de/1735757 her­un­ter. Ent­pa­cken Sie das ZIP-Archiv und wech­seln Sie im Ter­mi­nal­fens­ter mit cd in das Ver­zeich­nis, in das Sie Jperf ent­packt haben. Star­ten Sie das Tool mit

sh jperf.sh

Wäh­len Sie die Opti­on „Ser­ver“, und kli­cken Sie auf „Run Iperf!“. Auf einem ande­ren PC im Netz­werk rich­ten Sie Jperf eben­falls ein. Hier wäh­len Sie die Opti­on „Cli­ent“ und geben dahin­ter die IP-Adres­se des Ser­vers ein. Hin­ter „Out­put For­mat“ stel­len Sie „MBits“ ein. Kli­cken Sie auf „Run Iperf!“. Das Tool zeigt Ihnen die Text-Aus­ga­be von iperf an und stellt die Daten in einem Dia­gramm dar.

Die fol­gen­den Mes­sun­gen stam­men aus einen 2,4- und 5 GHz-WLAN (802.11n), also nicht aus einem Netz­werk mit 802.11ac-Router (zur­zeit ist kei­ner ver­füg­bar).

iperf Ergebnis TP-Link T2U
Über­tra­gungs­ra­te WLAN TP-Link T2U zwi­schen Raspber­ry Pi und einem Linux-PC (2,4 GHz, in einem 802.11n-Netzwerk).
jperf TP-Link
Über­tra­gungs­ra­te WLAN TP-Link T2U zwi­schen Raspber­ry Pi und einem Linux-PC (5 Ghz, in einem 802.11n-Netzwerk).

Schlagwörter:


Kommentare

20 Antworten zu „Neue Kernel-Module für den Raspberry Pi mit Crosscompiler erstellen“

  1. Hal­lo Thors­ten.
    Das hab ich schon lan­ge gesucht.
    Hab nen ac-Don­gle, den ich gern am pi ein­set­zen möch­te.
    Dein Script läuft durch bis zu dem Punkt „config.gz“.
    Ddort stoppt es lei­der mit dem Hin­weis, auf dem Raspi wür­de dise Datei nicht gefun­den. Sie ist aber vor­han­den und liegt im Ver­zeich­nis /proc/config.gz.
    Sie ist auch aus­les­bar. Trotz­dem scheint das Script sie nicht zu erken­nen.
    Was kann ich tun?

    Vie­le Grü­ße

    1. Das Pro­blem liegt wahr­schein­lich an ande­rer Stel­le.
      Soll­te das Pro­blem nur bei der config.gz lie­gen, ein­fach die Datei in das Arbeits­ver­zeich­nis „raspi_cross“ kopie­ren. Dann soll­te es erst ein­mal wei­ter­ge­hen.

  2. Avatar von Falko

    Hal­lo. Ich bekom­me beim Kom­pi­lie­ren fol­gen­den Aus­ga­be.

    make ‑C ~/raspi_cross/kernel SUBDIRS=/home/falko/pi_crosstool/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux modu­les
    make[1]: *** /root/raspi_cross/kernel: Datei oder Ver­zeich­nis nicht gefun­den. Schluss.
    Makefile:403: die Regel für Ziel „LINUX“ schei­ter­te
    make: *** [LINUX] Feh­ler 2
    make: *** Auf noch nicht been­de­te Pro­zes­se wird gewar­tet …
    make[1]: Ver­zeich­nis „/home/falko/pi_crosstool/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/tools“ wird ver­las­sen
    /home/falko/pi_crosstool/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/tools/bin2h
    chip­set = mt7610u

    /home/falko/pi_crosstool/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/mt7610u_sta.ko
    ist nicht vor­han­den.
    Die Com­pi­la­ti­on ist fehl­ge­schla­gen.
    Bit­te prü­fen Sie Ihre Kon­fi­gu­ra­ti­on.

    Fer­tig!

    Zusammenfassung/Summary
    Firm­ware-Hash: 6ba0dabbe76ce02d261cc4658c3484fa12b10385
    Ker­nel-Hash: be2540e540f5442d7b372208787fb64100af0c54
    Raspberry-Modell:armv61
    Modul: mt7610u_sta.ko

    Gibt es dazu ein Work­around?

    Vie­le Grü­ße Fal­ko

  3. Avatar von Jürgen

    Vie­len Dank für die tol­le Anlei­tung!
    Beim aktu­el­len Ker­nel (zumin­dest für RP2) wur­de aller­dings ein ande­rer Com­pi­ler genutzt, daher muss Zei­le 330 ange­passt wer­den:
    export CCPREFIX=$WORKDIR/tools/arm-bcm2708/gcc-rpi‑4.9.3‑linux-gnueabihf/bin/arm-linux-gnueabihf-

    Aus irgend­ei­nem Grund hat bei mir die install-dri­ver-scripts nicht mit exe­cu­te-Rech­ten ver­se­hen, daher kei­ne auto­ma­ti­sche Instal­la­ti­on. Ich habe das dann per Hand nach­ge­holt und schon ging alles.

    Super!
    Dan­ke!

  4. Avatar von Jörg Kohlschmidt
    Jörg Kohlschmidt

    Hal­lo,
    Vie­len Dank für das Script. Ich habe es pro­biert, bekom­me aber fol­gen­den Feh­ler:
    Erstel­le Ker­nel…
    /ho­me/­koh­li/­sour­ce/raspber­ry­/ker­nel_­mo­du­le/ra­spi_cross/­tools/arm-bcm2708/gcc-lin­a­ro-arm-linux-gnuea­bihf-raspbi­an-x64/­bin/arm-linux-gnuea­bihf-gcc: /lib/x86_64-linux-gnu/libc.so.6: ver­si­on ‚GLIBC_2.14′ not found (requi­red by /ho­me/­koh­li/­sour­ce/raspber­ry­/ker­nel_­mo­du­le/ra­spi_cross/­tools/arm-bcm2708/gcc-lin­a­ro-arm-linux-gnuea­bihf-raspbi­an-x64/­bin/arm-linux-gnuea­bihf-gcc)
    Was könn­te die Ursa­che sein?
    Ich neh­me an, dass die GLIBC 2.14 bei den Cross­tools dabei ist, oder? Was kann ich machen, damit es funk­tio­niert?
    Vie­len Dank im vor­aus für Hil­fe
    Jörg

  5. Ich habe den Trei­ber für Archer T2U AC600 mit der „Voll“ Ver­si­on kom­pi­liert. Das Aus­füh­ren des intall Skripts ergab Fol­gen­des:
    #########
    sudo ./install_driver.sh
    Kopie­re Modul nach /lib/modules/4.1.17-v7+/extra/mt7650u_sta.ko
    Kopie­re Kon­fig­ra­ti­on nach /etc/Wireless/RT2870STA/RT2870STA.dat
    Aktua­li­sie­re Modu­le…
    lade Modul mt7650u_sta.ko
    Fer­tig!
    #########

    dmesg lie­fert nun aber einen Ver­si­ons-Error:
    #########
    [23941.408726] no file read method
    [23941.408740] Read file „/etc/Wireless/RT2870STA/RT2870STA.dat“ failed(errCode=-1)!
    [23941.408792] 1. Phy Mode = 6
    [23941.408803] 2. Phy Mode = 6
    [23941.408816] NVM is Efu­se and its size =1d[1e0-1fc]
    [23941.428533] /home/kim/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/../../chips/mt76x0.c:2114 assert (pAd->TxPower[choffset].Channel == 36)failed
    [23941.443084] ERROR!!! E2PROM: WRONG VERSION 0x2, should be 1
    [23941.448659] mt76x0_read_tx_alc_info_from_eeprom: EEPROM_MT76x0_TEMPERATURE_OFFSET (0xD1) = 0xf8
    [23941.448678] mt76x0_read_tx_alc_info_from_eeprom: Tem­pe­ra­tu­re­Off­set = 0xfffffff8
    #########
    Wor­an könn­te das lie­gen? Ich habe davon lei­der gar kei­ne Ahnung und füh­le mich momen­tan etwas ver­lo­ren. 🙁

    1. „Read file „/etc/Wireless/RT2870STA/RT2870STA.dat“ failed(errCode=-1)!“

      Ist die Datei denn an die­sem Ort vor­han­den?

      „ERROR!!! E2PROM: WRONG VERSION 0x2, should be 1“

      Die­se Feh­ler­mel­dung taucht immer auf, und ist kein Hin­weis auf Fehl­funk­tio­nen des Trei­bers.

      1. Hal­lo Thors­ten,
        vie­len Dank für dei­ne schnel­le Ant­wort und natür­lich auch für die Res­sour­cen, die du hier bereit­stellst.

        Die Datei ist vor­han­den und hat fol­gen­den Inhalt (gekürzt):
        ######
        #The word of „Default“ must not be remo­ved
        Default
        CountryRegion=5
        CountryRegionABand=7
        CountryCode=DE
        ChannelGeography=1
        SSID=11n-AP
        NetworkType=Infra
        WirelessMode=5
        EfuseBufferMode=0
        Channel=0
        BeaconPeriod=100
        TxPower=100
        (…)
        PMFMFPC=0
        PMFMFPR=0
        PMFSHA256=0
        ######

    2. Es gab eini­ge Updates im Quell­code des Trei­bers, die das Pro­blem bei neue­ren Ker­neln besei­ti­gen soll­ten. Bit­te die aktu­el­le Ver­si­on des Scripts von die­ser Sei­te ver­wen­den und dar­über den Trei­ber-Quell­code erneut her­un­ter­la­den.

  6. Thanks for the dri­ver modi­fi­ca­ti­ons and this post, very hel­pful!
    Loo­se­ly fol­lo­wing the­se, I mana­ged to make the Wifi don­gle work on FC22.

    Minor cor­rec­tion:
    The comm­ents for install-script and unin­stall-script should exch­an­ge their places; of cour­se, no impact, but does ease under­stan­ding. Excel­lent exam­p­le for bash pro­gramming btw.

  7. Hal­lo Thors­ten Egge­ling

    Dan­ke für die Ant­wort. Nach lan­gem suchen habe ich im Netz kei­ne so kla­re Anlei­tung gefun­den, wie Ihre, um Modu­le für neue Hard­ware in den Raspi ein­zu­fü­gen. Daher habe ich mir das Scrip ein­mal genau­er ange­se­hen, um es zum lau­fen zu brin­gen.

    Dabei sind mir ein paar klei­ne Feh­ler auf­ge­fal­len. Ich bin noch beim über­ar­bei­ten, möch­te aber fra­gen ob ich Ihnen mei­ne Ver­bes­se­rungs­vor­schlä­ge sen­den darf?

    Bei­spiel:
    Zei­le 147 : if [ $LOCALVERSION = „-v7“ ]
    muss eigent­lich hei­ßen:
    Zei­le 147 : if [ $LOCALVERSION = ‚„-v7“’ ]
    , sonnst wird immer eine RPI und nie­mals ein RPI2 erkannt, da die Varia­ble bereits „-Zei­chen beinhal­tet („-v7“).

    Gern sen­de ich in den nächs­ten Tagen mei­ne Vor­schlä­ge.

    Grü­ße Eddy

    1. Hal­lo Eddy,
      Ver­bes­se­rungs­vor­schlä­ge sind immer will­kom­men.
      Vie­le Grü­ße
      Thors­ten

  8. Hal­lo
    Die Pro­ze­dur ist bis zum Ende feh­ler­frei durch­ge­lau­fen. Bein laden des Ker­nel­mo­du­les gab es jedoch einen Feh­ler:
    ERROR: could not insert ‚mt7650u_sta’: Exec for­mat error
    in dmesg sieht das dann so aus:
    mt7650u_sta: dis­agrees about ver­si­on of sym­bol module_layout

    Ich benut­ze auf dem Raspi Ker­nel: 4.1.15-v7+
    Cross-com­pi­led wur­de auf einen: Ubun­tu 14.04.3 LTS

    Was kann da schief gelau­fen sein?

    Viel Glück fürs neue Jahr wünscht Eddy

    1. Das Script hofft dar­auf, das sowohl im Git­hub-Repo­si­to­ry als auch beim Raspi-Ker­nel alles zusam­men­passt. Dem ist aber zur­zeit wohl nicht so. In der Datei changelog.Debian.gz steht ein ande­rer Wert, als er für den Ker­nel 4.1.15 müss­te.

      Die Hash-Wer­te der Firm­ware sind unter https://github.com/raspberrypi/firmware/commits/ zu fin­den. In die­sem Fall bei „ker­nel: Bump to 4.1.15“ und hier der Wert hin­ter „Com­mit“.

      Das Pro­blem lässt sich für Ker­nel 4.1.15 wie folgt lösen (zuerst das bis­he­ri­ge Ver­zeich­nis „raspi_cross“ löschen):

      Im Script über „echo Firm­ware-Hash: $FIRMWARE_HASH“ fol­gen­de Zei­le ein­fü­gen:

      FIRMWARE_HASH=22d8c910f4c53118f9cf85c038d7d8e307efc110

      Dann das Script star­ten und nicht „Mini­mal“ son­dern „Voll“ wäh­len.

      Mit fol­gen­der Zei­le lässt sich auf dem Raspber­ry Pi prü­fen, für wel­chen Ker­nel das Modul kom­pi­liert wur­de:

      modinfo mt7650u_sta.ko

      Auch wenn hier der rich­ti­ge Wert, in die­sem Fall „ver­ma­gic: 4.1.15-v7+ SMP mod_unload mod­ver­si­ons ARMv7“ ange­zeigt wird, kann das Laden des Moduls trotz­dem fehl­schla­gen. Das wie­der­um liegt dann an der fal­schen „Module.symvers“ von Git­hub. Im Modus „Voll“ wird der Ker­nel kom­plett kom­pi­liert und dann einen pas­sen­de „Module.symvers“ erstellt. Das dau­ert aber etwas län­ger.

      Ich wün­sche eben­falls ein schö­nes neu­es Jahr.

  9. Vie­len Dank!
    Nun geht es! Super!!!
    Gibt es Hoff­nung auf 5 GHz Unter­stüt­zung?

    Gruß
    Mar­tin

    1. 5 GHz? Das ist merk­wür­dig. Auf einem Raspber­ry Pi 2 mit Ker­nel 4.1.6‑v7+ gibt iwlist chan nur 2,4‑GHz-Kanäle aus. Auf einem Raspber­ry Pi mit Ker­nel 3.18.11 sowie unter Ubun­tu (Ker­nel 3.19.0) funk­tio­niert auch 5 GHz. Da sind wohl län­ge­re For­schungs­ar­bei­ten nötig. Wahr­schein­lich sind zusätz­li­che Anpas­sun­gen für neue­re Ker­nel erfor­der­lich. Mal sehen, was sich da machen lässt. Das kann jedoch eini­ge Zeit dau­ern, da ich gera­de mit ande­ren Pro­jek­ten beschäf­tigt bin.

      Ein Spaß am Ran­de: Bei einem ande­ren Stick mit Real­tek/­Me­dia­tek-Chip­satz und Ori­gi­nal-Trei­ber funk­tio­niert unter Win­dows 5 GHz nicht, unter Linux dage­gen 2,4 und 5 GHz. Man kann wohl grund­sätz­lich sagen, dass Hard­ware bezie­hungs­wei­se Trei­ber von Media­tek mehr als frag­wür­dig sind. Ande­rer­seits gibt es immer­hin einen Quell­code der Trei­bers und damit eine poten­ti­el­le Linux-Unter­stüt­zung.

  10. Dan­ke!
    Ich habe den­noch 2 errors :
    Nr. 1
    ————————-
    LD [M] drivers/media/media.o
    LD drivers/media/usb/built-in.o
    LD drivers/media/built-in.o
    Makefile:947: reci­pe for tar­get ‚dri­vers’ fai­led
    make: *** [dri­vers] Error 2
    ———
    wie­so fin­det er das auf ein­mal nicht?

    und Nr.2
    ————-
    Erstel­le Trei­ber
    cp ‑f os/linux/Makefile.clean os/linux/Makefile
    make ‑C os/linux clean
    make[1]: Ente­ring direc­to­ry ‚/home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux’
    rm ‑f ../../common/.*.cmd .*.flags .*.d
    rm ‑f ../../os/linux/*.o *.ko *.mod.o *.mod.c



    rm ‑f ../../sta/*.o
    rm ‑f ../../sta/.*.cmd .*.flags .*.d
    make[1]: Lea­ving direc­to­ry ‚/home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux’
    rm ‑rf os/linux/Makefile
    make ‑C tools
    make[1]: Ente­ring direc­to­ry ‚/home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/tools’
    gcc ‑g bin2h.c ‑o bin2h
    cp ‑f os/linux/Makefile.6 /home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux/Makefile
    make ‑C SUBDIRS=/home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux modu­les
    make[1]: *** SUBDIRS=/home/martin/src/raspi_cross/mt7610u_wifi_sta_v3002_dpo_20130916/os/linux: Datei oder Ver­zeich­nis nicht gefun­den. Schluss.
    Makefile:406: reci­pe for tar­get ‚LINUX’ fai­led
    .….…

    Was ist hier pas­siert?

    Dan­ke für Ant­wor­ten!
    Gruß

    Mar­tin

    1. Mir ist da ein klei­ner Feh­ler unter­lau­fen. Ich habe Pfad­an­ga­ben aus dem Make­file ent­fernt, damit es uni­ver­sell für unter­schied­li­che Ver­zeich­nis­se passt. Die Umge­bungs­va­ria­blen LINUX_SRC und CROSS_COMPILE_INCLUDE müs­sen im Script gesetzt wer­den. Das habe ich ver­ges­sen. Jetzt müss­te das Script aber funk­tio­nie­ren (wenn ich kei­ne wei­te­ren Feh­ler ein­ge­baut habe).

      Für den Ker­nel bei einem Raspber­ry Pi 2 mit Ker­nel 4.1.6‑v7+ bit­te „Voll“ wäh­len. Die Datei Module.symvers bei github.com zeigt stammt immer noch von Ver­si­on 4.1.5. Das repa­riert wohl auch nie­mand mehr, weil die inzwi­schen schon ein paar Ver­sio­nen wei­ter sind.

  11. Hal­lo,
    vie­len Dank für script!

    ist die Zei­le 62 so kor­rekt?

    Gruss

    Mar­tin

    1. Zei­le 62 ist in Ord­nung. Es muss „\$UID“ hei­ßen, damit $UID im über „cat“ gene­rier­ten Script ankommt und nicht der Inhalt von $UID. Aber Zei­le 60 und ein paar ande­re hat­ten Feh­ler. Da hat Word­Press die For­ma­tie­rung geän­dert. Aber jetzt müss­te alles stim­men.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Neueste Kommentare


Die Website durchsuchen