Roland's homepage

My random knot in the Web

Installing Openstreetmap data on a Garmin zūmo 340LM

This documents how you can install openstreetmap data on the Garmin zūmo 340 LM. This procedure probably also works on other Garmin devices, but I haven’t tested that. The commands listed in this article assumes you’re using a UNIX-like operating system. While most of the actions could be performed on ms-windows, I haven’t run that in decades, so I’m not the person to give advice about that

Why

Note

This is not about the costs of the map data from Garmin. I would have gladly paid for the map if it were not for the inconvenience of the process for me as someone who doesn’t use ms-windows.

Garmin basically only supports buying and installing updated maps via its “garmin express” software. This program is available for ms-windows and mac OS X. Since I use neither, I would have to;

  • Install an emulator like qemu, configuring it to use USB-redirection.
  • Install windows on it (which can only be used for 30 days, unless you activate it. It makes no sense to buy an ms-windows license for this.)
  • Download and install garmin express.
  • Create a garmin account.
  • Purchase a map.
  • Install the map.
  • Save the account data and purchased map data for the next time I need it.

This is just too much hassle.

There has to be an easier way. And it turns out that there is.

What

The img map format that Garmin uses has been largely reverse-engineered. There are several maps for garmin devices based on openstreetmap data available. After reading the relevant wiki page, and browsing the available alternatives, I chose to use Freizeitkarte.

I downloaded the Dutch language maps for the Netherlands and Belgium from this page.

Of note

These openstreetmap based map files do not contain the data that enables the zūmo to show lanes and traffic signs near an exit.

While that was a nice feature, the traffic sign information was the first thing to go stale. I started noticing differences between the real signs and what was shown on the zūmo almost immediately. It took much longer before new and changed roads and intersections became noticable.

Navigating without the traffic signs works fine for me so far.

Hardware preparations

By default, my zūmo 340LM starts up in MTP mode. This doesn’t work in combination with my computers using FreeBSD UNIX. I get a lot of errors like these:

uhub_reattach_port: could not allocate new device
usb_alloc_device: set address 6 failed (USB_ERR_IOERROR, ignored)
usbd_setup_device_desc: getting device descriptor at addr 6 failed, USB_ERR_IOERROR
usbd_req_re_enumerate: addr=6, set address failed! (USB_ERR_IOERROR, ignored)
usbd_setup_device_desc: getting device descriptor at addr 6 failed, USB_ERR_IOERROR
usbd_req_re_enumerate: addr=6, set address failed! (USB_ERR_IOERROR, ignored)
usbd_setup_device_desc: getting device descriptor at addr 6 failed, USB_ERR_IOERROR
usbd_req_re_enumerate: addr=6, set address failed! (USB_ERR_IOERROR, ignored)
usbd_setup_device_desc: getting device descriptor at addr 6 failed, USB_ERR_IOERROR
usbd_req_re_enumerate: addr=6, set address failed! (USB_ERR_IOERROR, ignored)
usbd_setup_device_desc: getting device descriptor at addr 6 failed, USB_ERR_IOERROR
ugen0.6: <Unknown > at usbus0 (disconnected)

After some online searching, it seems the device has to be put in mass-storage mode.

  • Go to the trip computer screen by pressing the menu key (“≡”) on the bottom right of the map.
  • Press the speed for about five seconds, until the “Diagnostics Page” menu appears.
  • Scroll down to “MTP settings”.
  • Choose “Mass Storage” and save the setting.

If you plug in the device to your computer after this, it should become visible as a direct access device that can be mounted.

The confusion about map locations

Sources often don’t agree where the Garmin device expects maps to be. It is likely that this has also changed over the different GPS models.

The sources often speak of placing additional maps in the Garmin folder on an SD card. However, my zūmo 340LM doesn’t contain an SD card. It doesn’t detect maps placed in the Garmin folder of the device itself. Incidentally, the maps that the device came with, called gmapbmap.img and gmapprom.img are in the (hidden) .System folder. But placing additional maps there also doesn’t work. We are however about to discover why.

The GerminDevice.xml file

In the Garmin directory on the device, there is a file called GarminDevice.xml. Knowing that XML files are plain text and are often used for configuration purposes made me have a look at it.

It contains an identifier for the device (presumably the serial number), a registration code, several unlock codes and other configuration data. One fragment of the XML file especially caught my eye.

<DataType>
  <Name>SupplementalMaps</Name>
  <File>
    <Specification>
      <Identifier>IMG</Identifier>
    </Specification>
    <Location>
      <Path>Map</Path>
      <BaseName>gmapsupp</BaseName>
      <FileExtension>img</FileExtension>
      <Extensions>
        <dtlx:DataTypeLocationExtension>
          <dtlx:ExternalPath>Garmin/</dtlx:ExternalPath>
        </dtlx:DataTypeLocationExtension>
      </Extensions>
    </Location>
    <TransferDirection>InputOutput</TransferDirection>
  </File>
</DataType>

From this I gather that for the zūmo 340LM:

  • Supplemental maps on the device should be in the directory Map. (This doesn’t exist; I had to create it.)
  • On an SD card, they should be in the directory Garmin.
  • The name of supplemental maps should contain or begin with gmapsupp, and end with .img.

Note that these values could be different for other Garmin devices! Look at the GarminDevice.xml file on your device, and adjust accordingly.

From one of the other sources I learned that newer devices can have more than one supplemental map.

Installing the maps on the device

First, we plug the device (on mass storage mode) into the computer. Then we mount the device that appears.

# mkdir /mnt/garmin
# mount_msdosfs -m 644 -M 755 -o noatime /dev/da1 /mnt/garmin

(This mount command is for FreeBSD; it could be different on Linux and other UNIX variants.)

Then we make a backup of the device data first, just to be sure. Below, a “#” in front of a command indicates that it should be executed as the root user. A “>” indicates that the command can be carried out by an unprivileged user.

# cd /mnt/garmin
# tar czf /tmp/zumo-backup-20211011.tar.gz .

Now we unpack the zip-files containing the map data, rename them because both the map data have the same name, and install them.

> cd ~/tmp/
> unzip NLD_nl_gmapsupp.img.zip
Archive:  NLD_nl_gmapsupp.img.zip
  extracting: gmapsupp.img
> mv gmapsupp.img gmapsupp_NLD.img
> unzip BEL_nl_gmapsupp.img.zip
Archive:  BEL_nl_gmapsupp.img.zip
  extracting: gmapsupp.img
> mv gmapsupp.img gmapsupp_BEL.img
# mkdir /mnt/garmin/Map
# cp gmapsupp_* /mnt/garmin/Map/
# sync
# umount /mnt/garmin
> rm *.img

After rebooting, the additional maps show up on the device, and can be selected. Note that the map is identified by the internal name from the map file. These are shown below:

> hd -s 0x49 -n 17 gmapsupp_NLD.img
00000049  46 72 65 69 7a 65 69 74  6b 61 72 74 65 5f 4e 4c  |Freizeitkarte_NL|
00000059  44                                                |D|
0000005a
> hd -s 0x49 -n 17 gmapsupp_BEL.img
00000049  46 72 65 69 7a 65 69 74  6b 61 72 74 65 5f 42 45  |Freizeitkarte_BE|
00000059  4c                                                |L|
0000005a

(The hd command is also known as hexdump.)


For comments, please send me an e-mail.


←  Add TeX macro around (visual) selections in Vim