Kategorien
Linux

Huawei e161 USB Surfstick unter Linux / Debian

Fonic Huawei e161Der Huawei e161 USB Surfstick, wie er von Fonic in dem Tagesflat Angebot vertrieben wird, kann unter Linux mit dem derzeit aktuellen Linux Kernel (2.6.31) nicht ohne zusätzliche Konfiguration betrieben werden. Der Treiber für die Modemfunktionalität existiert in den aktuellen Linux Kerneln, kann jedoch nicht sofort genutzt werden. Das Problem ist, dass auch dieser Stick, wie die meisten Huawei Sticks zwei verschiedene Modi besitzt. Im ersten Modus wird der Stick als CD Rom Laufwerk erkannt und genutzt. Somit ist es für den Hersteller des Modems möglich den Treiber direkt mit auf dem Stick auszuliefern. Nach der Installation des Treibers bringt der Treiber den Stick in den zweiten Modus, in dem er als Modem genutzt werden kann. Da der Hersteller keinen Linux Treiber mit ausliefert, muss der Stick unter Linux erst einmal manuell in den zweiten Modus gebracht werden. Mit ein wenig Handarbeit kann man diesen und weitere Huawei Sticks auch unter Linux nutzen.


Vorbereitung

Fetstellen der Geräteidentifikation mit lsusb

Zuerst müssen wir feststellen mit welche Hardware erkannt wurde. Unter Linux nutzen wir dazu lsusb. lsusb ist ein Werkzeug zur Darstellung von Information über alle USB-Busse des Systems und aller dort angeschlossenen Geräte. Wir stecken dazu den USB Stick in ein laufendes Linux System und versuchen die Vendor ID und die Product ID mit lsusb festzustellen.

lsusb
 
Bus 001 Device 003: ID 12d1:1446 Huawei Technologies Co., Ltd.

Somit hat unsere Hardware die Hersteller ID 12d1 und die Produkt ID 1446. Wer hier die selben Werte stehen hat und nur seinen Stick zum laufen bringen will, der kann auch den nächsten Punkt überspringen und gleich mit der Konfiguration von usb_modeswitch fortfahren.

Feststellen was der Windows Treiber macht

Als nächstes müssen wir feststellen, was der Windows Treiber genau macht um den Modus zu wechseln. Dazu benötigen wir einen USB Monitor oder auch USB Sniffer wie z.B. UsbSnoop. Die Software installieren wir nach Anleitung und Installiern auf unserem Device (12d1:1446) einen Filter, damit nur die Kommunikation mit dieser Hardware protokolliert wird.
Als Ergebnis erhalten wir eine Logdatei die für uns wichtige Informationen enthält:

# auf das Wesentliche reduziert
...
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
  PipeHandle           = 85184c34 [endpoint 0x00000001]
  TransferFlags        = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
  TransferBufferLength = 0000001f
  TransferBuffer       = 85046398
  TransferBufferMDL    = 00000000
    00000000: 55 53 42 43 00 00 00 00 00 00 00 00 00 00 00 11
    00000010: 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  UrbLink              = 00000000
...
...

Der Treiber sendet an das Device folgenden Informationen 55534243000000000000000000000011060000000000000000000000000000 bevor sich der USB Stick in einen anderen Modus schaltet.

Modus unter Linux umschalten mit usb_modeswitch

Den Modeswitch können wir mit usb_modeswitch durchführen. Derzeit existieren leider keine offiziellen Debian Pakete für Lenny. Somit muss man die selber bauen. Die von mir gebauten Pakete sind im Downloadbereich zu finden.

usb_modeswitch konfigurieren

Nach der Installation müssen wir noch die Konfigurationsdatei /etc/usb_modeswitch.conf anpassen und folgende Zeilen ergänzen:

######################################################
# Huawei E161
DefaultVendor=  0x12d1
DefaultProduct= 0x1446
 
TargetVendor=   0x12d1
TargetProduct=  0x1001
 
MessageContent="55534243000000000000000000000011060000000000000000000000000000"
 
CheckSuccess=5

Unter Default stehen die Daten Geräteidentifikationsdaten, die wir direkt nach dem einstecken festgestellt haben. Nach dem Modeswitch sollen die Target Geräteidentifikationsdaten vorhanden sein. Der Message Content sind die Daten die der Treiber unter Windows an das Gerät gesendet hat. Unter CheckSuccess geben wir dem System 5 Sekunden Zeit die neue Hardware zu erkennen, bevor nach den Target* Daten geprüft wird.
Mit dem Befehl usb_modeswitch können wir die Hardware umschalten. Ob die Umschaltung erfolgt ist, prüfen wir mit lsusb:

lsusb
 
Bus 001 Device 005: ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem

Der Befehl dmesg sollte uns weitere Informationen zu der Einbindung liefern.

dmesg
 
...
USB Serial support registered for GSM modem (1-port)
option 1-3:1.0: GSM modem (1-port) converter detected
usb 1-3: GSM modem (1-port) converter now attached to ttyUSB0
option 1-3:1.1: GSM modem (1-port) converter detected
usb 1-3: GSM modem (1-port) converter now attached to ttyUSB1
option 1-3:1.2: GSM modem (1-port) converter detected
usb 1-3: GSM modem (1-port) converter now attached to ttyUSB2
...

Somit hat der Treiber unter /dev neue devices ttyUSB0, ttyUSB1 und ttyUSB2 generiert. Das Modem kann nun von unseren Einwahlprogrammen verwendet werden.

Automatisch umschalten beim Einstecken

Damit wir nicht jedes mal beim Einstecken des USB Sticks den Modeswitch manuell durchführen müssen, lassen wir das udev übernehmen.
Dazu legen wir noch eine zusätzliche Konfigurationsdatei /etc/udev/rules.d/50-huawei.rules mit folgendem Inhalt an:

SUBSYSTEM=="usb", SYSFS{idProduct}=="1446", SYSFS{idVendor}=="12d1", RUN+="/usr/sbin/usb_modeswitch"

Somit weisen wir udevd an, den Befehl /usr/sbin/usb_modeswitch auszuführen, sobald das USB Subsystem die Hersteller Daten 12d1:1446 erkennt.
Damit die Änderungen wirksam werden, laden wir die udev Regeln mit dem Befehl udevadm neu:

udevadm control --reload_rules

Nun wird automatisch nach dem Einstecken des USB Sticks der Modus umgeschaltet und der Linux Kernel lädt den entsprechenden Modem Treiber.

Dauerhafte Umstellung des USB Sticks

Eine weitere Möglichkeit den USB Stick unter Linux betreiben, ist die dauerhafte Deaktivierung des virtuellen CD Laufwerks. Der USB Stick befindet sich dadurch sofort in dem richtigen Modus und kann ohne zusätzliche Tools genutzt werden.
Die Umstellung werden AT Befehle zum Modem gesendet. Die Änderung muss allerdings auf einem System durchgeführt werden, welches den Stick bereits als Modem erkennt.

AT^u2diag=0

Die Einstellung kann mit folgendem Befehl wieder rückgängig gemacht werden.

AT^u2diag=1

Eine Antwort auf „Huawei e161 USB Surfstick unter Linux / Debian“

Vielen Dank für dieses gute HOWTO. Hat mir wirklich geholfen, mal die Zusammenhänge der UMTS-Sticks zu verstehen, die neben der UMTS-Funktion auch einen Datenspeicher für die Treiber haben.

Einen kleinen Fehler habe ich wahrscheinlich gefunden:
Oben heisst es:

udevadm control --reload_rules

richtig ist aber

udevadm control --reload-rules

also kein Unter- sondern ein Bindestrich bei –reload-rules

Vielen Dank nochmal!

Schreibe einen Kommentar

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