GPS Support#


I have a Garmin GPSMap 60 CSX that I use for both Geocaching and as a Car navigation system.
Unfortunately, Garmin is reluctant to supply proper software for the linux platform, and now Garmin MapSource is the only reason for me to keep a Windows environment at hand.

I also needed a more convenient way to transfer waypoints to my Garmin device with Linux. Here a log of actions done in order to achieve that :

Install software#

GPSBabel#

This comes standard in the Ubuntu distribution and can be installed the usual way.

Garmin USB driver#

Some more info on http://www.gpsbabel.org/os/Linux_Hotplug.html

To allow the USB devices to be read and written by a non-privileged user, create a file called /etc/udev/rules.d/51-garmin.rules with the following contents:

SYSFS{idVendor}=="091e", SYSFS{idProduct}=="0003", MODE="666"

This driver (garmin_gps) is also included in the kernel, but in order for GPSBabel to work properly, it must be uninstalled: sudo rmmod garmin_gps
To make sure it doesn't get loaded after the next reboot, add the following to /etc/modprobe.d/blacklist:

# this driver is in the way for GPSBabel
blacklist garmin_gps

After plugging in my USB-connector, the following is displayed by lsusb:
root@bismarck:~/gc# lsusb
Bus 005 Device 003: ID 05e1:0501 Syntek Semiconductor Co., Ltd 
Bus 005 Device 001: ID 0000:0000  
Bus 003 Device 001: ID 0000:0000  
Bus 001 Device 001: ID 0000:0000  
Bus 002 Device 004: ID 091e:0003 Garmin International GPSmap (various models)
Bus 002 Device 003: ID 046d:c03e Logitech, Inc. Premium Optical Wheel Mouse
Bus 002 Device 001: ID 0000:0000  
Bus 004 Device 001: ID 0000:0000  

Now I can transfer waypoints, for example : gpsbabel -i garmin -f usb: -o geo -F test.loc copies all the waypoints from the Garmin device to the file test.loc. Nice !
However, only when you're root, if you're not root, you get :

metskem@bismarck:~/gc$ gpsbabel -i garmin -f usb: -o geo -F waypoints.loc
usb_set_configuration failed, probably because kernel driver ''
 is blocking our access to the USB device.
For more information see http://www.gpsbabel.org/os/Linux_Hotplug.html

So I first rebooted, to make sure that the garmin_gps driver is not loaded, and that the permissions for the usb device files are correct. After that I can also transfer waypoints to/from my Garmin device without the need to use root privileges.

A few examples#

  • Send (just downloaded) .loc file to usb device gpsbabel -i geo -o garmin gcjpq0.loc usb:
  • Download (backup) all WP's from usb device to local file gpsbabel -i garmin -o geo usb: allwaypoints.loc
  • Download (backup) all WP's, tracks and routes from usb device to local file (with some debugging) gpsbabel -r -t -D1 -i garmin -o geo usb: allstuff.loc
metskem@bismarck:~/gc$ gpsbabel -r -t -D1 -i garmin -o geo usb: allstuff.loc
GPSBabel Version: 1.3.3 
Unit:   GPSMap60CSX Software Version 3.30
ID:     292
Version:        3.30
Capability A10:
Capability A100: D110
Capability A201: D202 D110 D210
Capability A301: D312 D302
Capability A400: D110
Capability A500: D501
Capability A600: D600
Capability A601: D601
Capability A700: D700
Capability A800: D800
Capability A801: D801
Capability A900:
Capability A902:
Capability A903:
Capability A904:
Capability A907: D907 D908 D909 D910
Capability A908: D911
Capability A914:
Capability A916:
Capability A917: D917
Capability A918: D918
Capability A1010:
Capability A1011:
Link_type 1  Device_command 0
Waypoint: Transfer 100 Type 110
Route:    Transfer 201 Header 202 Type 110
Track:    Transfer 301 Type 302
Waypoint type: 110
Chosen waypoint length 14
cet_util: Converting from "CP1252" to "UTF-8", done.

Script gc.sh#

To make it a little easier I created a simple shell scipt, which can take either a filename as parameter, or read from stdin:

#/bin/sh
#
# convert a geocaching format (.loc) file that comes from stdin, or from a file indicated by parm1, to your usb attached GPS unit
#
aplay /usr/share/sounds/info.wav
if [ $# == 0 ]
then
  tmpfile=/tmp/gc2usb-tempfile.xml
  if [ -f $tmpfile ] 
  then
    rm $tmpfile
  fi
  tee $tmpfile <&0  >/tmp/gc2usb.stdout
  gpsbabel -D1 -i geo -f $tmpfile -o garmin -F usb:
fi
if [ $# == 1 ]
  then
    gpsbabel -D1 -i geo -f $1 -o garmin -F usb:
  fi
aplay /usr/share/sounds/error.wav

Man page GPSBabel#

gpsbabel-manpage.txt(info)

How to quickly get WP's from cache to GPS device#

First go to the cache page and scroll down to the section "Additional Waypoints", there should be all WP's in the correct format.
For eacht WP cut the coordinates and paste them into Google Earth search section "Fly To" and press enter. This should navigate you to the position. Then rename this location to the proper name, i.e. GC15YBN 03.
Repeat this for all WP's. Now you should see them all on your Google Earth, and you should get an idea of how your route will be like.
Now they have te be transferred to your GPS device, do the following:

  • right click on WP and save them in My places, do this for every WP
  • goto My places, and create a folder (by the name of the cache)
  • drag all WP's to this Map
  • right click on the Map and choose Save as, choose the kml format and choose a file name like gc15ybn.kml
  • now you have an xml file that containts all wp's that can be transferred to your GPS device by :
  • gpsbabel -i kml -o garmin gc10vj0.kml usb:
  • all WP's should be in your GPS device now