DeTeWe ISDN Gerätetreiber 0.1.2 =============================== Über das Projekt ================ Seit Jahren schon verteilt u.a. die Deutsche Telekom fleißig Beta-Telefonanlagen von DeTeWe günstig im Paket mit ISDN-Anschlüssen. Dem entsprechend verbreitet sind diese Anlagen, insbesondere die der Eumex x04 Baureihe. Das Problem war nur, das es dafür nie Linuxtreiber gab. Nachdem dann ordentlich Druck bei DeTeWe gemacht wurde, gab es dann tatsächlich mal kurz einen Binärtreiber für den Kernel 2.2.14 und 2.2.16. Dabei blieb es dann aber leider auch, da die Telekom alles unternimmt, um die Linux-Unterstützung für "ihre" Produkte zu verhindern. Das Projekt wurde im Jahre 2001 von Fabian Melzow gestartet und diente erst mal nur der öffentlichen Dokumentation der verwendeten Anlagenprotokolle, da es überall nur hieß, es sein nicht möglich, dafür einen Treiber zu schreiben, da das verwendete Protokoll zu kompliziert sei. Nachdem das USB und das serielle Protokoll der Eumex 504 reverse engineered war, wurde das Projekt dann bei Sourceforge angemeldet, um erst mal nur ein Konfigurationsprogramm für die Eumex/OpenCom Anlagen zu schreiben. Nachdem dann die Paketbehandlung für die Eumex 504 fertig war, stieß 2004 Micheal Krupka zu dem Projekt dazu und schrieb das Konfigurationsprogramm weiter, analysierte das Eumex 604 USB-Protokoll und entwickelte, auf dessen Grundlage, diesen USB-Kerneltreiber. In zwischen stellte sich dann heraus, das immer mehr DeTeWe-Hardware diese Protokolle, zum Teil in leicht abgewandelter Form zu verwenden scheint, jedenfalls sieht es so aus, nachdem das erste DECT-Telefon gesichtet wurde, das eine ziemlich kaputte Version des seriellen Eumex 504 Protokolls benutzt. Also wurde das Projekt mal kurzer Hand von "Eumex/OpenCom Gerätetreiber" in "DeTeWe ISDN Gerätetreiber" umbenannt. Der Treiber, die zugehörigen Programme, etc. stehen unter der GNU General Public Licence v2 oder höher. Der genaue Lizenztext kann in COPYING nach- gelesen werden. Die jeweils neuste Version des Treibers bekommt man über die Projekthomepage unter http://eumex.sourceforge.net. Die Autoren können über die Entwicklermailingliste oder über folgende Mailadressen erreicht werden: Fabian Melzow Michael Krupka Treiberstuktur ============== Der Treiber besteht zur Zeit aus zwei Kernelmodulen, namentlich "eumex" und "eumex_i4l". Zur hardwarenahen Kommunikation wird zudem ein Gerät namens /dev/eumex angelegt über das die Hilfsprogramme emxconf, emxrouter und emxflash auf die Hardware zugreifen. Die Funktion der beiden Module ist wie folgt: * eumex: Das ist der eigentliche Treiber. Dieses Modul muß also immer geladen werden! Es bietet Unterstützung für die "Netzwerk über USB"-Fuktionalität sowie das /dev/eumex-Interface und damit für die Konfiguration, die Routersteuerung und den Firmwareupload. * eumex_i4l: Dieses Modul stellt die Anbindung der Anlage an das ISDN4Linux- Subsystem im Kernel her und wird benötigt, wenn man sich z.B. mit der Anlage ins Internet einwählen will. Außerdem gibt es noch die Hilfsprogramme emxrouter, emxconf und emxflash. Mit emxrouter kann man den Router der Anlage steuern, mit emxconf die Anlage konfigurieren und mit emxflash die Firmware upgraden oder wieder uploaden, wenn die Anlage rumspinnen sollte (die blinkt dann z.B. munter auf 6 LEDs bzw. auf einer LED schnell und wird im vom Treiber im raw-Modus erkannt). emxflash hat auch nicht die Beschränkung des Windows-Flashloads, welches bei Anlagen mit doppelter Firmwaredatei immer nur die 2. Kopie benutzt, so das man die Anlage unter Windows nicht mehr so leicht ans Laufen bekommt. In dem Fall kann man jetzt einfach "emxflash -1 firmwaredatei.efw" machen und braucht nicht umständlich die Firmware per Hand zu splitten und upzuloaden. Voraussetzungen =============== Software: --------- * Ein funktionierendes Kenelbuildsystem sowie die Kernelheader von Linux 2.6.5 oder höher. Unter Debian sollte das Kernelheaderpaket genügen. * Kenelunterstützung zumindest für euren USB-Hostcontroller und für ISDN4Linux mit dem SyncPPP-Protokoll wenn das eumex_i4l-Modul verwendet werden soll. * optional die libusb für die alten Userspace-Dispatcher * gcc 3.x oder höher zum compilieren und die module-init-tools zum laden der Module Hardware: --------- * Geräte, die sich zumindest mit der passenden Herstellerkennung (Vendor ID) 0x086c, auf dem USB-Bus melden. Das kann kann durch einen Blick in /proc/bus/usb/devices oder mit "lsusb" aus den usbutils herausgefunden werden. Die Ausgabe von "lsusb" sollte dann eine Zeile enthalten, die in etwa wie folgt aussieht: Bus 0XX Device 0XX: ID 086c:YYYY DeTeWe - Deutsche Telephonwerke AG & Co. Dabei sind X beliebige Ziffern und YYYY ist eine der folgenden hexadezimalen Produktkennungen (Product ID oder PID), die der Treiber zur Zeit erkennt: PID uns bekannte Gerätebezeichnungen ------------------------------------------------------------------------ 1001 Eumex 504PC USB oder Euracom 140 USB 1002 " " im raw-Modus (6 LEDs blinken, die für ISDN nicht) 1003 TA33 USB 1004 " " im raw-Modus 1005 Eumex 604PC HomeNet 1006 " " im raw-Modus 1007 Eumex 704PC DSL 1008 " " im raw-Modus 1009 Eumex 724PC DSL oder Swisscom TOP C503 100a " " im raw-Modus 100b OpenCom 30 100c " " im raw-Modus 100d BeeTel Home 100 100e " " im raw-Modus 1013 Eumex 704PC LAN 1014 " " im raw-Modus (ISDN LED blinkt schnell) 1019 Eumex 504 SE 101a " " im raw-Modus (6 LEDs blinken, die für ISDN nicht) 1021 OpenCom 40dsl 1022 " " im raw-Modus 1023 OpenCom 45dsl 1024 " " im raw-Modus 102c Eumex 604PC HomeNet im raw-Modus 1030 Eumex 704PC DSL im raw-Modus 1032 OpenCom 40dsl im raw-Modus 1033 OpenCom 30plus 1034 " " im raw-Modus 1037 Eumex 620 LAN 1038 " " im raw-Modus 1039 TA33 USB 103a " " im raw-Modus 103b TA44dsl 103c " " im raw-Modus 103f OpenCom 36lan 1040 " " im raw-Modus 1041 Eumex 220PC 1042 " " im raw-Modus 1047 hoch experimentelle, versuchsweise Unterstützung der Eumex 520 1055 Eumex 220PC 1056 " " im raw-Modus 105b TA33 USB 105c " " im raw-Modus 1067 Eumex 200 1068 " " im raw-Modus Was funtionieren sollte ======================= Komplett unterstützt werden sollten bisher folgende Geräte: Eumex 504PC USB, OpenCom 30, TA33 USB, BeeTel Home 100, Eumex 604 und die Eumex 704 DSL. Die ISDN4Linux-Unterstützung (Interneteinwahl) sollte überall laufen, wenn wir sie auch nicht für alle Anlagen testen konnten. Der Treiber unterstützt die L2-Protokolle HDLC und transparent. Für die Interneteinwahl wird in der Regel HDLC zusammen mit syncPPP benutzt, für Audio-Daten L2=transparent. Die Routersteuerung sollte auch bei allen betroffenen Anlagen funktionieren, die oben nicht als experimentell gelistet sind. Beim Rest ist die Konfigurationsunterstützung nur partiell, und es liegt mit an euch, ob sie in Zukunft besser wird. Das Firmwareupdate sollte funktionieren mit der Eumex 504 USB, Eumex 604, Eumex 704 LAN/DSL, Eumex 220, Eumex 200, TA33 USB, BeeTel Home 100, OpenCom 30 und OpenCom 40. bei der Eumex 504 SE bzw. OpenCom 30plus geht er nur, wenn die Firmwaredatei maximal 232 kb groß ist. Installation ============ Überprüfen, ob die benötigten Kernelmodule geladen sind ------------------------------------------------------- Überprüft zuerst mit "lsmod", ob der Kernel USB-Unterstützung bietet. Dazu müssen die Module usbcore sowie mindestens eines der Module uhci_hcd oder ohci_hcd geladen sein. Alternativ: Compiliere die USB-Unterstützung, zusammen mit dem passenden USB-Hostcontroller-Treiber in den Kernel ein. Wenn man vor hat, sich mit der Anlage z.B. ins Internet einzuwählen, wird zusätzlich ISDN4Linux benötigt. Dazu sollte überprüft werden, daß das isdn- Modul geladen ist und die Module capi, capifs und kernelcapi enladen sind, bzw. das die I4l-Unterstützung in den Kernel eincompiliert wurde. Compilieren und installieren ---------------------------- Nach dem Entpacken des Quelltextes mit tar -xvzf eumex-0.1.1.tar.gz bzw. mit tar -xvjf eumex-0.1.1.tar.bz2 kannst du mit cd eumex-0.1.1 in das Verzeichnis wecheln, in dem der Paketinhalt entpackt wurde und die übliche Standardinstallation wie folgt durchführen: ./configure make su make install Das sollte ausreichen, um den Treiber zu compilieren und installieren. Sollten die Kernelquellen nicht gefunden werden, kann man mit --with-kernel-dir= das passende Verzeichnis angeben. Danach sollten sich die Module mit "modprobe eumex" und optional "modprobe eumex_i4l" laden lassen. Automatisches Laden der Module beim Systemstart ----------------------------------------------- Hier werden absichtlich immer die distributionsunabhängigen Lösungen beschrieben, denn auch die Scripte der Distributionen basieren letztendlich nur darauf. Wie das genau bei deiner Distribution funktioniert, sollte im mitgelieferten Handbuch stehen. Prinzipiell gibt es zwei Möglichkeiten, die Module laden zu lassen, die erste ist, sie einfach immer beim Start zu laden, egal ob ein passendes Gerät angeschlossen ist. Die zweite und bessere Variante ist, die Module über den Hotplug-Mechanismus automatisch bei Bedarf laden zu lassen. Wenn man nur das eumex-Modul verwenden will, braucht man, bei funktionierendem Hotplug-Mechanismus, nichts weiter zu machen, es sollte automatisch geladen werden. Braucht man auch das eumex_i4l-Modul, so sollte man dafür sorgen, daß modprobe es zusammen mit dem eumex-Modul lädt, indem man z.B.: install eumex /sbin/modprobe --ignore-install eumex;/sbin/modprobe eumex_i4l in /etc/modprobe.conf bzw. bei Debian in eine neue Datei unter /etc/modprobe.d einträgt. USB-Netzwerkunterstützung einrichten ------------------------------------ Bei Anlagen mit Netzwerk(Ethernet)-über-USB Unterstützung, sollte nach dem Laden des eumex-Modules, ein neues Netzwerkinterface namens ethemx angelegt werden, sobald die Anlage mit dem USB-Bus verbunden wird. Dieses kann man dann mit ifconfig/route oder ip konfigurieren, sofern man nicht den standardmaßig aktivierten DHCP-Server der Anlage verwenden will. Beispiel für die Verwendung statisches IP-Addressen: ifconfig ethemx 192.168.69.1/24 up route add default gw 192.168.69.254 Beispiel für die Verwendung von DHCP: dhclient ethemx oder alternativ, je nach dem, was auf dem System installiert ist: pump -i ethemx Der integrierte Router der Anlage kann mit dem Programm emxrouter gesteuert werden. Um die Verbindung sofort zu trennen, wenn der Router gesperrt wird, muß "emxrouter -tl" aufrufen werden, bei "emxrouter -l" wird eine bestehende Verbindung erst mit eintreten des Timeout getrennt. ISDN-Einwahlunterstützung einrichten ------------------------------------ Dieses Beispiel zeigt die Einrichtung zu Interneteinwahl mit den gängigen Protokollen (L2: HDLC und L3: syncPPP). Benötigt wird dazu isdnctrl aus den isdnutils und der ipppd. Je nach verwendetem Authentifikationsverfahren (PAP oder CHAP), solltet ihr die entsprechende Datei, bzw. beide, wenn ihr nicht wißt, was benutzt wird, entsprechend editieren. Für PAP fügt man die folgende Zeile zur Datei /etc/ppp/pap-secrets hinzu, für CHAP bearbeitet man /etc/ppp/chap-secrets. "USERNAME" "*" "PASSWORD" USERNAME ist dort und nachfolgend euer Benutzername für die Einwahl und PASSWORD ist eurer Einwahlpasswort. Anschließend tragt ihr in /etc/ppp/ioptions z.B. folgendes ein: debug name USERNAME -bsdcomp -pc -ac -vj -vjccomp noipdefault defaultroute ms-get-dns ipcp-accept-local ipcp-accept-remote Genaueres zur Bedeutung der einzelnen Optionen kann in der manpage zu ipppd nachgelesen werden. Jetzt müßt ihr noch noch dafür sorgen, daß die Nameserver bei der Einwahl automatisch übernommen werden. Dafür erstellt ihr zuerst ein Script unter /etc/ppp/ip-up das z.B. folgenden Inhalt hat: #!/bin/bash /bin/mv /etc/resolv.conf /etc/resolv.conf.old echo search `/bin/hostname -d` > /etc/resolv.conf echo nameserver $MS_DNS1 >> /etc/resolv.conf echo nameserver $MS_DNS2 >> /etc/resolv.conf Um die alten Nameserver aus /etc/resolv.conf wieder herzustellen kann man folgendes Script benutzen, das man in die Datei /etc/ppp/ip-down schreibt: #!/bin/bash /bin/mv /etc/resolv.conf.old /etc/resolv.conf Nach dem Speichern nicht vergessen, die Dateien mit "chmod a+x /etc/ppp/ip-up" und "chmod a+x /etc/ppp/ip-up" ausführbar zu machen. Um die Wählverbindung einzurichten, müssen jetzt noch folgende Befehle ausgeführt werden: # alle vorhandenen ISDN-Netzwerkinterfaces entfernen isdnctrl reset # neues ippp0 Interface anlegen isdnctrl addif ippp0 # Layer 2 Protokoll auf HDLC stellen isdnctrl l2_prot ippp0 hdlc # Layer 3 Protokoll ist transparent isdnctrl l3_prot ippp0 trans # Datenpakete in SyncPPP einpacken isdnctrl encap ippp0 syncppp # abgehende MSN auf 1111 einstellen isdnctrl eaz ippp0 1111 # nach 1 min toten B-Kanal auflegen isdnctrl huptimeout ippp0 60 # manuelle Einwahl einstellen isdnctrl dialmode ippp0 manual # Nummer die angewählt werden soll auf 2222 einstellen isdnctrl addphone ippp0 out 2222 # ipppd starten ipppd ippp0 Zum Aufbau der Verbindung macht man dann: isdnctrl dial ippp0 und um dann wieder aufzulegen: isdnctrl hangup ippp0 Für mehr Informationen zu ISDN4Linux sei hier mal die FAQ unter http://www.mhessler.de/i4lfaq/ empfohlen. Problembehebung =============== Problem: Bei der Konfiguration mit isdnctrl tritt der Fehler "Inappropriate ioctl for device" auf. Vermutlich sind neben I4L die CAPI-Kernelmodule geladen. Der Treiber braucht nur das I4L-Subsystem (isdn-Kernelmodul). Die Lösung ist hier, die Module capi, capifs und kernelcapi zu entladen. Problem: Beim Laden des eumex_i4l Moduls tritt ein Fehler auf und im syslog steht "eumex_i4l: Unknown symbol register_isdn". Der Kernel beinhaltet keine Unterstützung für ISDN4Linux. Prüfe ob das isdn Modul geladen ist bzw. ob die passende ISDN4Linux in den Kernel eincompiliert wurde. Fehler melden ------------- Da keine offizielle Spezifikation der Protokolle bzw. Kommandos verfügbar ist und wir zudem auch nur Menschen sind, können Fehler durchaus jederzeit auftreten. Bereits bekannte Probleme finden sich in der Datei TODO, wenn das Problem dort noch nicht stehen sollte, würden wir uns freuen, wenn du es unter http://sourceforge.net/tracker/?group_id=66803&atid=515801 an uns meldest, dann kann das Problem in späteren Versionen behoben werden. Bitte poste offensichtliche Fehler nicht ins Forum, dort gehen sie sehr schnell unter! Damit wir das Problem möglichst gut nachvollziehen können, sollte eure Fehlerbeschreibung nach Möglichkeit die folgenden Daten beinhalten: - die genaue Hardwarebezeichnung und Firmwareversion bzw., noch besser, die Logausgabe vom Anschließen des Gerätes, sofern es erkannt wird, oder alternativ die Ausgabe von "emxflash -D" - alle relevanten Meldungen aus dem syslog, welches normalerweise unter /var/log/* zu finden ist. Die Sammellogdatei heißt meistens /var/log/messages oder unter Debian /var/log/syslog. - gcc Version ("gcc --version"), inbesondere bei Compilierungsproblemen - die Kernelversion ("uname -r") und evtl. installierte Patches - die Distribution, wenn deren Kernel oder gcc verwendet wird - bei Problemen im Zusammenhang mit USB: der Inhalt der Datei /proc/bus/usb/devices - die Hardwarearchitektur ("uname -m"), sofern sie nicht Intel x86 ist Weiterentwicklung ================= alte Userspace Dispatcher ------------------------- Solte auf dem System die libusb zusmamnen mit dem passenden Headerfile gefunden werden, wird auch der Code unterhalb des Verzeichnisses userspace gebaut, der die alten Userspace Dispatcher für USB und seriell enthält. Diese Programme werden als disp_usb und disp_serial installiert und sind eine rudimentäre Implementierung des Anlagenprotokolls im Userspace. Natürlich wird die libusb nicht für die serielle Version des Dispatchers benötigt, diese Anforderung soll jedoch verhindern, das der eher für Entwickler und erfahrenen Nutzer interessante Code bei Anfängern gebaut wird, die damit dann nichts anzufangen wissen. In der Anfangszeit lief das Konfigurationsprogramm damit und wenn man seine Analge nur über die serielle Schnittstelle konfigurieren will, ist disp_serial immer noch nützlich, so lange, bis der serielle Treiber diesen Code vollständig ersetzt hat. Der USB-Dispatcher ist lange vom Kernelcode überholt und sollte nicht mehr verwendet werden, schon gar nicht als Protokollreferenz, außer vielleicht, um das USB-Protokoll leichter zu verstehen, weil der Code leichter zu überschauen ist. Um den seriellen Dispatcher zu verwenden muß zuerst disp_serial mit der Schnittstelle als Parameter (z.B. "disp_serial /dev/ttyS0 &") gestartet werden. Anschließend kann dann "eumexconf -us" aufgerufen werden, um die Anlage (Eumex 404, 504, 604 und Opencom 20, 30(plus), QuickNet ISDN, etc.) zu konfigurieren. fehlende Konfigurationsoptionen ------------------------------- Dei manchen Anlagen werden noch nicht alle Konfigurationsoptionen unterstützt oder es gibt andere kleinere Protokollfehler. Das liegt in der Regel daran, das uns noch die betreffenden Daten fehlen. Wir freuen uns in diesem Fall über aufschlußreiche Protokolldumps oder Patches. Potenziell ist alles mit 0x086c als VID verdächtig und könnte evtl. kompatibel sein. Zum loggen der USB-Daten hat sich SnoopyPro unter Windows 2k/XP bewährt, das man über http://sourceforge.net/projects/usbsnoop/ bekommen kann. Entwicklermailingliste ---------------------- Patches oder technische Anfragen sollten vorzugsweise über die Entwickler- mailingliste gepostet werden, die unter der URL http://lists.sourceforge.net/lists/listinfo/eumex-devel abonniert werden kann. Debugoptionen des Treibers -------------------------- Das eumex-Modul bietet folgende Debugoptionen, die man oder-verknüpft mit der Option Debug beim Laden angeben kann (modprobe eumex Debug=xxxx) oder aber z.B. mit "echo" nach /sys/module/eumex/parameters/Debug schreiben kann: 0x0001 B1-Kanal auf Hardwarebene 0x0002 B2-Kanal auf Hardwarebene 0x0004 Kommandokanal auf Hardwarebene (alles außer die B-Kanäle!) 0x0008 Kommandos von/zum Userspace 0x0010 Netzwerkdaten (Ethetnetframes) 0x0020 Daten von und für eumex_i4l CVS --- Wie man an die aktuelle Entwicklerversion des Treibers kommt, kann man unter http://sourceforge.net/cvs/?group_id=66803 nachlesen. Das CVS-selbst kann per Web über http://cvs.sf.net/viewcvs.py/eumex/ eingesehen werden. Unsere Sourceforge-Projektseite befindet sich unter http://sf.net/projects/eumex/. Danksagungen ============ Dank geht an folgende Projekte, deren Tools echt hilfreich sind: * USBSnoop (http://sf.net/projects/usbsnoop/) für usbsnoop und SnoopyPro * SynCE (http://synce.sourceforge.net/synce/) für unshield * cabextract (http://www.kyz.uklinux.net/cabextract.php) * Wine (http://winehq.org) * diverse andere, die ich hier jetzt mal noch nicht aufliste... ...sowie an folgende Leute: * Andreas Ruhmich (hat das Sicherungsproblem gefunden) * Martin Weissbach (Anmeldung der PCs an der Eumex 620 LAN) * Michael Rauscher (lesende Routerkonfigurationskomnmandos b. d. 704 LAN) * Andreas Bierfert (initiale autotools Unterstützung) * Michael Heide (mem leak und Fehler in der devfs Unterstützung gefunden) * die ganzen Leute deren Namen jetzt ich gerade nicht griffbereit habe und die z.B. in der Anfangszeit Protokolldumps vom USB-Bus geschickt haben, als sie dringend gebraucht wurden