Objective
Use a Linux system to run Garmin's proprietary POI Loader to add custom Points Of Interest to a Garmin GPS device over a USB connection, without the need for Windows.
My setup as tested
GPS: Garmin Streetpilot 2820, USB, 2GB internal memory
Laptop: HP Pavilion DV2000 running OpenSUSE 10.3, Linux kernel 2.6.22, wine version 0.9.44-15, all stock
Desktop: 3GHz Pentium 4 running CentOS 4, Linux kernel 2.6.9, wine version 1.0.1 (from RPMForge), all stock
POI Loader version: 2.5.3
Configure Wine
As your regular user, rune "winecfg".
On the "Drives" tab, make sure you have a Windows-style drive letter to correspond with the mount point where you intend to mount the GPS device's USB drive. I use "E:" to access "/mnt". Under the advanced options, set it as a removeable/floppy drive, not "autodetect."
Download the POI Loader software for Windows from Garmin's website.
Create a temporary directory into which you can extract files.
Extract the downloaded .exe file using "unzip".
Inside the directory with the extracted files, run:
user@localhost$ wine msiexec /i POI_MAIN.msi
There will be no graphical windows or useful console output, but the POI Loader should now be installed under ~/.wine/drive_c/Program\ Files/Garmin.
Load POIs
Obtain a list of Points Of Interest in CSV format. (GPX may also work, I have not tried it.) Multiple files can be used. All custom POIs you wish to have on the GPS, including those you may already have loaded, need to be in a common directory on the computer, as POI Loader overwrites the default custom POI file on the GPS device.
Power off the GPS.
Connect a USB cable between the GPS and the computer.
Power on the GPS.
The GPS will come up to a prompt asking whether you want to use "Garmin Mode" or "USB Mass Storage Mode". Select "USB Mass Storage."
Mount the GPS's USB share using the configuration entered into winecfg above. It must be done as a regular user, so add a line to /etc/fstab such as:
/dev/sdb /mnt vfat rw,user,noauto 0 0
Then as a regular user you can simply "mount /mnt" and "umount /mnt" as needed, assuming the USB share shows up as /dev/sdb.
Launch POI Loader:
user@localhost$ wine ~/.wine/drive_c/Program\ Files/Garmin/POILoader.exe
A Windows-looking GUI app will appear. Save POIs to Garmin Device. It should show up as the drive letter configured earlier in winecfg.
Browse to the directory containing your custom POI CSV files. All files in this directory will be loaded, overwriting the current poi.gpi file on the GPS device.
Select "Express" or "Manual" for any proximity alerts, and if using "Manual" set the alerts based on the speed or distance you want.
Once the POIs have been loaded, POI Loader will automatically exit.
Verify the file /mnt/garmin/poi/poi.gpi has been updated and bears a current timestamp.
Sync all filesystems.
Unmount the GPS from /mnt.
Disconnect the USB cable. Do not use the "eject" command, and do not power off the GPS, or else the updated custom POI file will not be correctly loaded.
Allow the GPS to finish booting up.
Verify your new custom POIs are in place: FIND -> Extras -> Custom POIs
It is now safe to turn off the GPS.
Other observations
I have an aftermarket JVC stereo system installed in my car, which has a built in USB port for plugging in little flash drives. However, whenever this port is in use, it creates some sort of interference that dramatically reduces satellite coverage on both my Garmin GPS and the GPS built into my Blackberry 8830 cellphone, sometimes to the extent of losing its fix completely.