DE:USB Garmin on GNU/Linux

From OpenStreetMap Wiki
Jump to navigation Jump to search

Garmins GPS-Geräte mit USB-Anschluss werden inzwischen auf GNU/Linux-Systemen gut unterstützt. Aber wie fast überall gibt es kleine Probleme zusätzlich zu lösen. Hier sollen Lösungsansätze dargestellt werden.

Es gibt zwei Hauptprobleme mit den USB-Garmin-Geräten unter GNU/Linux:

  • die Device-Berechtigungen
  • eventuell Probleme mit dem Kernelmodul garmin_gps

Beide Probleme werden unter GPSBabel website und Hotplug vs. Garmin USB on Linux diskutiert.

Inbetriebnahme/Kommunikation

Überprüfung ob das Garmingerät erkannt wird

Alle Konsolenbefehle sind, wenn nicht anders angegeben, als normaler Benutzer auszuführen. Rootrechte sind nicht nötig!
Schließ das Gerät an einen USB-Port an und rufe dann dmesg auf. Es sollte folgendes als einer der letzten Einträge zu sehen sein:

[87294.953486] usb 5-6.4: new full speed USB device using ehci_hcd and address 10
[87295.141611] usb 5-6.4: configuration #1 chosen from 1 choice
[87295.141611] usb 5-6.4: New USB device found, idVendor=091e, idProduct=0003
[87295.141611] usb 5-6.4: New USB device strings: Mfr=0, Product=0, SerialNumber=0

Wenn keine Ausgabe im Terminal zu sehen ist, kann es sein, dass das Gerät ausgeschaltet ist. Manche Geräte müssen nicht eingeschaltet sein (z.B. die Edge Serie), andere Geräte müssen sehr wohl eingeschaltet sein (die eTrex Legend-Serie z.B.). Ist keine solche Ausgabe zu sehen, kann je nach verwendeten Kernel trotzdem das Garmin-Gerät angesprochen werden. Siehe Absatz tiefer, Verwendung von lsusb

Wenn obige Ausgabe zu sehen ist, dann kann man mit lsusb | grep Garmin zusätzlich prüfen, ob ein Garmin-Gerät erkannt wurde:

Bus 005 Device 010: ID 091e:0003 Garmin International GPSmap (various models)

Die Ausgabe müsste so aussehen. Wenn die Ausgabe nicht kommt dann hat das Gerät vermutlich eine andere VendorID/ProductID (nicht 091e:0003).

Device-Berechtigungen

Heutige moderne GNU/Linux Distributionen benutzen das udev-Devicesystem um dynamisch Device Files in /dev/ zu erstellen. Per default hat nur der Benutzer root die Lese-und Schreibberechtigungen, um auf die darauf abgebildeten Geräte zuzugreifen zu können. Um als normaler Benutzer auf diese Geräte zugreifen zu können, müssen Anpassungen an den udev-Einstellungen gemacht werden.

Überprüfen der Device-Berechtigungen

Erinnern wir uns an die Ausgabe von lsusb oder dmesg. Im Beispiel von oben ist die Busnummer 5 und die Devicenummer ist 10 (fett hervorgehoben):

Bus 005 Device 010: ID 091e:0003 Garmin International GPSmap (various models)

Aus diesen Nummern wird der Verzeichnisbaum unter /dev/ zusammengesetzt. Für USB-Geräte nach folgendem Muster

/dev/usbdevBUS_NUMBER.DEVICE_NUMBER* 

(ohne führende Nullen), und auch

/dev/bus/usb/BUS_NUMBER/DEVICE_NUMBER (mit führenden Nullen):
$ ls -l /dev/usbdev5.10*
crw-rw---- 1 root root 252, 17 2008-12-28 20:43 /dev/usbdev5.10_ep00
crw-rw---- 1 root root 252, 15 2008-12-28 20:43 /dev/usbdev5.10_ep02
crw-rw---- 1 root root 252, 14 2008-12-28 20:43 /dev/usbdev5.10_ep81
crw-rw---- 1 root root 252, 16 2008-12-28 20:43 /dev/usbdev5.10_ep83
$ ls -l /dev/bus/usb/005/010
crw-rw-r-- 1 root root 189, 523 2008-12-28 20:43 /dev/bus/usb/005/010

In diesem Fall kann ein normaler Benutzer die USB-Geräte nicht benutzen.

Beheben der Device-Berechtigungen

Die Lösung für das Berechtigungsproblem ist dem System zu sagen, dass die Gerätedateien mit anderen Berechtigungen erstellt werden müssen. Die nötigen Berechtigungen müssen lesend und schreibend für alle anderen Benutzer sein. Beim Erstellen der Gerätedateien muss als Gruppe ´plugdev´ benutzt werden. Das Ganze erfolgt über die Datei /etc/udev/rules.d/51-garmin.rules die der [1] auswertet.

Debian Lenny/Squeeze/Sid und Ubuntu

Anlegen der Datei /etc/udev/rules.d/51-garmin.rules als user root:

# allow Garmin USB devices read and written by a non-privileged users
SUBSYSTEM!="usb", GOTO="garmin_rules_end"
ACTION!="add", GOTO="garmin_rules_end"
ATTRS{idVendor}=="091e", ATTRS{idProduct}=="0003", MODE="0660", GROUP="plugdev"
LABEL="garmin_rules_end"

Laden der neuen Regel (als Benutzer root)

udevadm control --reload-rules

bzw. unter Ubuntu

sudo udevadm control --reload-rules

Fedora 5 und Suse 10.x

In Fedora 5 oder älter und Suse 10.x lege die Datei /etc/udev/rules.d/51-garmin.rules [2] (als Benutzer root) an:

ATTRS{idVendor}=="091e", ATTRS{idProduct}=="0003", MODE="0666"

Laden der neuen Regel (als user root)

sudo udevadm control --reload-rules

Nun das GPS-Gerät ab- und wieder anstecken (die Bus und Devicenummern können sich geändert haben). Siehe auch prüfen der Deviceberechtigungen

OpenSuSE 11.x

In den aktuellen OpenSuSE-Distributionen muss keine udev-Regel mehr angepasst werden.

Firmware Version

Firmwareupdate

Unter Linux steht der Webupdater nicht zur Verfügung. Um ein Firmwareupdate [3]vorzunehmen lädt man sich die Firmware von Garmin Software Archives , GMapTool, Garmin Receivers Firmwares oder Garmin herunter.

Bei Garmin ist der Link nicht direkt zu ersehen. Er setzt sich aus der url http://download.garmin.com/software/ (ursprünglich http://www.garmin.com/software/), der Gerätebezeichnung (inkl. dem Zusatz WebUpdater), der Firmwareversion und der Dateiendung .gcd zusammen.

Für die Firmwareversion 4.90 beim eTrex 20/30 ergibt sich die folgende Adresse: http://download.garmin.com/software/eTrex20_30_Webupdater__490.gcd

Die .gcd-Datei im Anschluss nach GUPDATE.GCD umbenennen und in den Ordner Garmin des Geräts verschieben. Beim nächsten Gerätestart wird die aktuelle Firmware für das Gerät eingespielt. Dieser Vorgang dauert einige Minuten und das Gerät darf dabei nicht ausgeschaltet werden, da es ansonsten unbrauchbar werden kann. Im Vorfeld sollte der Akkustand überprüft werden. Abschließend das Gerät neu starten.

Verwendung auf eigene Gefahr! Es wird keine Haftung für eventuelle Schäden am Gerät übernommen. Bei Unsicherheiten die Software des Herstellers (Windows® XP / Mac® OSX) verwenden.

Benutzen von GPSBabel

GPSBabel ist ein Konsolenprogramm, welches unter anderem Daten von Garmin-Geräten (über USB oder seriell) auslesen kann, genaueres dazu unter Garmin serial/USB protocol (garmin). Es benutzt dabei eine direkte Implementierung des Garmin-eigenen Übertragungsprotokoll auf das von der udev-Regel erstellten Device.

Auslesen eines Tracks

gpsbabel -t -i garmin  -f usb: -o gpx -F ausgabe-datei.gpx

Auslesen Wegpunkte

gpsbabel -w -i garmin  -f usb: -o gpx -F ausgabe-datei.gpx

oder alles zusammen kombiniert

gpsbabel -t -w -i garmin  -f usb: -o gpx -F ausgabe-datei.gpx

Wenn es Probleme gibt beim Auslesen kann man über den Debuglevel schauen was für Daten ausgelesen werden, z.B. mit dem höchsten Level D9

gpsbabel -D9 -i garmin  -f usb: -o gpx -F ausgabe-datei.gpx

Wenn man den gpsd benutzen muss oder will, kann man nicht mehr die Option -f usb: benutzen, sondern muss das entsprechende serielle Device angeben, was aus dem Kernelmodul garmin_gps beim Einstecken des Garmin-Gerätes erzeugt worden ist. Dies lässt sich an der Ausgabe von dmesg | grep Garmin erkennen. Wichtig ist das greppen nach Garmin (Garmin mit G, nicht garmin)!

[ 7314.733961] USB Serial support registered for Garmin GPS usb/tty
[ 7314.734001] garmin_gps 7-1:1.0: Garmin GPS usb/tty converter detected
[ 7314.734107] usb 7-1: Garmin GPS usb/tty converter now attached to ttyUSB0

Im Auszug wurde das serielle Device unter /dev/ttyUSB0 erstellt, ergo muss dieses Filedevice beim Benutzen von gpsbabel benutzt werden. Zum Auslesen von Tracks, Wegpunkten und Routen müsste folgender Befehl benutzt werden:

gpsbabel -t -w -r -i garmin  -f /dev/ttyUSB0 -o gpx -F ausgabe-datei.gpx
Siehe für weitere Erklärungen auch: Fixing USB permissions for Garmins in GPSBabel: Hotplug vs. Garmin USB on Linux

Probleme mit dem usb-storage Kernelmodul

Wenn gpsbabel folgende Fehlermeldung hervorbringt:

usb_set_configuration failed, probably because
kernel driver 'usb-storage' is blocking our access to the USB device.
For more information see http://www.gpsbabel.org/os/Linux_Hotplug.html

dann wird, wie aus der Fehlermeldung zu erkennen, das Kernelmodul usb-storage daran Schuld sein. Dies hängt mit den Abhängigkeiten vom Modul garmin_gps zusammen, so das dieses Modul eher das Problem ist. Siehe folgenden Abschnitt.

Probleme mit dem garmin_gps Kernelmodul

Bei folgender Fehlermeldung in Verbindung mit der Option gpsbabel ... -f usb: ...:

Claim interfaced failed: could not claim interface 0: Device or resource busy

wird das Kernelmodul garmin_gps die Kommunikation verhindern, da es eine serielle Schnittstelle auf den USB Anschluss vom Garmin generiert. Um die Kommunikation direkt per USB zu ermöglichen muss das Kernelmodul garmin_gps entladen werden.

Wer auf das Kernelmodul garmin_gps angewiesen ist kann wegen den eben genannten Gründen nicht mit der Option -f usb: arbeiten sondern muss das serielle Device angeben welches durch das Modul garmin_gps erzeugt wird. Wenn man also das das Devive /dev/ttyUSB0 erstellt bekommen hat (siehe Ausgabe von dmesg) sieht die Kommandozeile zum Auslesen von Wegpunkten und Track so aus:

gpsbabel -w -t -i garmin  -f /dev/ttyUSB0 -o gpx -F ausgabe-datei.gpx
Siehe auch einen Absatz höher!

Entfernen und Blacklisting des Moduls garmin_gps

Wer trotzdem Probleme wegen dem Kernelmodul garmin_gps hat muss auf dieses Modul verzichten. Um das Modul zu entladen führe folgendes (als Benutzer root) aus:

modprobe -r garmin_gps

Um nun ein automatisches Neuladen beim Reconnect des Garmin GPS Gerätes zu unterbinden muss in den Blacklist Dateien geprüft werden ob das Modul gegebenenfalls nicht geblacklistet ist.

Debian Lenny/Squeeze/Sid

Die aktuellen Versionen von Debian benutzen die Datei /etc/modprobe.d/blacklist-extra um das automatische Laden von garmin_gps zu steuern. Wenn Ihr den Eintrag wie folgt vorfindet:

# most apps now use garmin usb driver directly (Ubuntu: #114565)
#blacklist garmin_gps

dann ist der zu folgenden zu ändern:

# most apps now use garmin usb driver directly (Ubuntu: #114565)
blacklist garmin_gps

Open Suse 10.x, 11.x

Unter Suse wird die Datei /etc/modprobe.d/99-local.conf verwendet um das Blacklisting durchzuführen.

Fedora

Fedora spezifika eintragen

Damit wird das Modul bei Booten ausgelassen und nicht geladen.

Benutzen von gpsd

Die überwiegende Anzahl von Software die Positionsdaten aus GPS Geräten ausliest benutzt dazu gpsd. gpsd ist ein Daemon welcher unsterschiedliche herstellerspezifische Datenübertragungsprotokolle von GPS Geräten bedienen kann und stellt somit eine vereinheilichte Schnittstelle dar über die andere Applikationen wie Gpsdrive, Foxtrotgps und TangoGPS Daten aus GPS Geräten in Echtzeit lesen können. Die Kommunikation zwischen gpsd und den GPS Geräten erfolgt dabei immer über eine serielle Schnittstelle. Damit die Garmingeräte vom gpsd Deamon angesprochen werden können muss das kernelmodul garmin_gps geladen sein, welches eine Schnittstelle per /dev/ttyUSB[x] bereit stellt.

Laden des garmin_gps Moduls

Da das Modul schon geladen sein könnte prüft ob dies schon geschehen ist:

lsmod | grep garmin_gps

Wenn dabei keine Ausgabe erfolgt laded das Modul (als Benutzer root) mit modprobe:

modprobe garmin_gps

oder wenn Ihr sudo benutzt als normaler Benutzer

sudo modprobe garmin_gps

Nach dem erfolgreiche Laden des Kernelmoduls solltet Ihr folgende ähnliche Ausgaben in der Ausgabe von dmesg finden:

[96273.677562] usbserial: USB Serial support registered for Garmin GPS usb/tty
[96273.677605] garmin_gps 5-6.4:1.0: Garmin GPS usb/tty converter detected
[96273.678093] usb 5-6.4: Garmin GPS usb/tty converter now attached to ttyUSB0
[96273.678118] usbcore: registered new interface driver garmin_gps
[96273.678123] garmin_gps: garmin gps driver v0.31

ttyUSB0 (highlighted) is the USB‐serial device that you need to use with gpsd.

Wenn Ihr gpsd sehr oft benutzen wollt/müsst und GPSBabel eher selten dann ist diese Methode das Kernelmodul immer vorher laden zu müssen etwas umständig. Es macht dann eher Sinn das Kernelmodul direkt beim Booten laden zu lassen. Dazu muss das Kernelmodul aus der Blacklist ausgetragen werden.

Debian Lenny/Squeeze/Sid

In den aktuellen Debian Varianten ist der nötige Eintrag in /etc/modprobe.d/blacklist-extra zu finden. Verändert folgenden Eintrag (als Benutzer root):

# most apps now use garmin usb driver directly (Ubuntu: #114565)
blacklist garmin_gps

zu:

# most apps now use garmin usb driver directly (Ubuntu: #114565)
#blacklist garmin_gps

Open Suse 10.x, 11.x

SUSE spezifika eintragen

Fedora

Fedora spezifika eintragen

Damit wird das Modul bei Booten nicht mehr ausgelassen sondern direkt geladen.

References