Garmin и Linux

Date April 25th, 2010 Author Vitaly Agapov

На полдороге нашей жизни трудной
В неведомый и тёмный лес вступил,
Утратив путь прямой в дремоте чудной.
— Данте Алигьери // «Божественная комедия»

Обладание навигатором Garmin требует иногда вспоминать о таких вещах как обновление прошивки, обновление карт, загрузка новых карт и так далее. Всё это делается с помощью набора программ, и единственная здесь проблема в том, что программы эти сплошь виндовые. Впрочем, и проблемой это можно назвать лишь номинально. В общем, выходы ясны – либо для обслуживания навигатора экспроприировать виндовый ноутбук жены, либо сделать всё по-нашему. Сразу скажу, что использовать нативные линуксовые приблуды вроде GPSBabel не буду, очень уж лень разбираться.

Подготовка

Для начала скачаем winetricks, который поможет решить кое-какие проблемы с кое-какими виндовыми библиотечками (если, конечно он ещё не скачан).

wget http://www.kegel.com/wine/winetricks

Поставим с его помощью необходимые виндовые библиотеки Visual C++ (MSVCR80.dll, VC80.CRT…)

sh winetricks vcrun2005

А ещё – библиотеку gdiplus.dll для корректного отображения в MapSource:

sh winetricks gdiplus

Следуем инструкциям, устанавливаем библиотеки.

Установка MapSource

Для начала MapSource нужно скачать. Распространяется он бесплатно, так что скачать его можно прямо с оф.сафта  Garmin:

http://www8.garmin.com/support/download_details.jsp?id=209

Запускаем:

wine MapSource_61511.exe

Есть шанс, что установится нормально. Но на самом деле почти наверняка скажет что-то вроде того, что “Обнаружено установленное приложение MapSource”. Верить этому не надо, смысл этого сообщения прямо противоположен: установщик искал уже установленный МапСурс, но не нашел. Решаем это так…

Нам надо этот установочный архив распаковать и добраться до инсталлятора MSI внутри, но в Linux с exe-шными самораспаковывающимися архивами так просто не поработаешь. Поэтому, запустив

wine MapSource_61511.exe

и не нажимая “далее” в приглашении, в другом терминале ищем временную директорию, куда это всё распаковалось. Я делаю это так:

$ find ~ -mmin -5 | grep tmp
./.wine/drive_c/windows/temp/7zS265.tmp

Вот эта директория 7zS265.tmp и есть наш искомый распакованный дистрибутив. Копируем его себе по-быстрому в безопасное место и запускаем:

wine Setup.exe

Вот тут почему-то нормально отрабатывает. Впрочем, если не отработает, то всегда можно попробовать сделать:

msiexec \i MSMAIN.MSI


Всё, приложение вроде как установилось. Проверить его работоспособность, не установив карт в систему, мы тем не менее, не сможем. Но мы можем посмотреть, что и куда положилось. При установке у нас создались две директории:
~/.wine/drive_c/Garmin  с приложением UnlockWizard, который нам понадобится для разблокировки карт в mapSource
~/.wine/drive_c/MapSource с самим приложением MapSource

Если может возникнуть необходимость сохранять IMG-файлы из MapSource не на прибор, а на диск дя дальнейшей обработки (например, склейки с другими картами), то нужно найти и скачать крякнутую версию файла MapSource.exe.

Установка карт в формате MapSource

Карты для MapSource поставляются в разном виде. Частенько там уже бывает некий исполняемый exe-файл для установки, и здесь всё просто. Некоторые сложности возникают, если установка предполагает запуск batch-файла (обычно это install.bat). Задача этих bat-ников – добавить несколько ключей в реестр.

Теоретически, выполнить bat-файл можно такоей командой:

wine start install.bat


И он вроде даже выполняется, но ключи в реестре не появляются. Кстати, редактор реестра можно открыть командой wine regedit.
Ломал над этим голову, но не придумал менее тупого решения, чем в лоб переделать bat-скрипт в reg-файл и выполнить его с помощью regedit. Идея в целом такова, что надо из bat-файла вроде такого:

@echo off

echo Adding registry keys.

set KEY=HKLM\SOFTWARE\Garmin\MapSource
reg QUERY %KEY% 2>NUL
if not errorlevel 1 goto key_ok
set KEY=HKLM\SOFTWARE\Garmin\MapSource
:key_ok

reg ADD %KEY%\Families\FAMILY_450 /v ID /t REG_BINARY /d C201 /f
reg ADD %KEY%\Families\FAMILY_450 /v IDX /t REG_SZ /d "%~dp0OSM.mdx" /f
reg ADD %KEY%\Families\FAMILY_450 /v MDR /t REG_SZ /d "%~dp0OSM_mdr.img" /f
reg ADD %KEY%\Families\FAMILY_450 /v TYP /t REG_SZ /d "%~dp0osm.typ" /f

reg ADD %KEY%\Families\FAMILY_450\1 /v Loc /t REG_SZ /d "%~dp0\" /f
reg ADD %KEY%\Families\FAMILY_450\1 /v Bmap /t REG_SZ /d "%~dp0OSM.img" /f
reg ADD %KEY%\Families\FAMILY_450\1 /v Tdb /t REG_SZ /d "%~dp0OSM.tdb" /f

сделать reg-файл:

[HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\MapSource\Families\FAMILY_450]
"ID"=hex:C2,01
"IDX"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\OSM.mdx"
"MDR"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\OSM_mdr.img"
"TYP"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\osm.typ"

[HKEY_LOCAL_MACHINE\SOFTWARE\Garmin\MapSource\Families\FAMILY_450\1]
"Loc"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\"
"Bma"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\OSM.img"
"Tdb"="c:\\MapSource\\Maps\\mosobl_2010-04-18\\OSM.tdb"

Вручную , естественно, делать это грустно, посему набросал на Перле скриптец, делающий это автоматически. Он же после создания reg-файла сразу и выполняет его:

wine regedit installreg.reg

Кому интересно, скрипт можно взять здесь – bat-to-reg.pl. Запускается как ./bat-to-reg.pl install.bat.

Проверяем в реестре наличие соответствующих ключей:

Вроде всё окей. Можно запускать MapSource. Однако, если карты заблокированы, то перед запуском их ещё надо бы разблокировать.

Разблокировка карт для MapSource

В более ранних версиях MapSource разблокировать карты можно было прямо из приложения MapSource, однако в версии 6.15.11 делать это надо с помощью UnlockWizard. Впрочем, сложностей это не добавляет.

Если карту покупали в магазине, то ключик для разблокировки у нас есть. Ежели ключика нет (потеряли…), но очень хочется (чисто в качестве эксперимента), то можем сделать такие пиратские действия:

1. Узнаём id прибора или id флэш-карточки, в зависимости от того, куда карта будет устанавливаться. ID прибора можно узнать в меню Настройки->Система->О приборе (или прямо в меню MapSource). ID карточки узнаём так: жмем 5-10 секунд на индикаторе заряда прибора, идём на страницу “Data Card Test Page” и смотрим поле serial.

2. Узнаём FID (Family ID) нашей карты. Если он нам неизвестен, то узнать его можно либо преобразованием поля ID в реестре в десятичную систему счисления (в примере выше значение C2,01 – то есть число 01C2 в хексе – в десятичной системе выглядит как 450), либо с помощью программы GMapTool, но об этом ниже.

3. Ищем в сети программку по ключевым словам Garmin и Keygen, вводим ID прибора или флэшки, FID карты (частенько надо ещё указывать PID, если он не равен 1), генерим код разблокировки и вуаля!

Далее идём туда, где у нас образовался UnlockWizard.exe и запускаем его:

wine UnlockWizard.exe

Говорим ему, что у нас есть код разблокировки и мы-де хотим его ввести, попадаем в форму и вводим ключик.

Теперь можно запускать MapSource и любоваться результатом.

Открытие IMG-файла в MapSource

Чаще всего готовые карты поставляются в виде скомпонованных и готовых для заливки в навигатор файлов GMAPSUPP.IMG. но может возникнуть надобность открыть карту в MapSource. Вариант надобности номер 1 – мы хотим прежде, чем заливать карту в прибор, проверить покрытие, детализацию или что-то ещё. Вариант надобности номер 2 – мы хотим уменьшить размер контейнера за счет удаления из него ненужных зон карты. Действительно, зачем хранить в приборе карту Европы на 2Гб, если ездить собираешься только по Финляндии? Или зачем хранить огромных размеров карту России, если точно знаешь, что никогда не поедешь на Камчатку или Таймыр? Всё это, конечно, здорово, но есть у этой процедуры один неприятный минус – в настоящий момент невозможно восстановить в MapSource карту из IMG с поддержкой адресного поиска. В исходном контейнере индексированную таблицу для адресного поиска содержит файл FID_mdr.img, и пока что неизвестен алгоритм его обратного преобразования к понятному для MapSource формату. Так что выполнять эти действия есть смысл только в том случае, если надо только просмотреть карту или если для неё не нужен адресный поиск (например, если это детализированная топографическая карта). Кстати сказать, на некоторых моделях навигаторов адресный поиск может заработать, если в контейнер добавить файл DIF_mdr.img, полученный после разборки исходного контейнера до его добавления в MapSource. Но это не про меня.

Вариантов, как всё это сделать, достаточно много. Я пользуюсь одним, который точно работает из-под Linux.

Итак, по порядку:

1. Надо раздобыть программки gmaptool.exe (для склеивания, разрезания и проверки данных карт), сgpsmapper.exe (для преобразования карт из Польского формата) и MapSetToolKit (для записи строк в реестр). Кладём все эти программки в ту же директорию, где лежит наш SMAPSUPP.IMG.

2. Запускаем распил контейнера на составляющие:

wine gmaptool.exe -S GMAPSUPP.IMG

Если всё хорошо, то в директории появляется куча файлов.

3. Преобразуем *.mp (обзорная карта) файл в *.img:

wine cgpsmapper.exe *.mp

4. Запускаем MapSetToolkit.exe, в нем жмём “Select IMG files”, выбираем текущую директорию, жмём “Select All”, “Add”, “Install a existing mapset”.  Теперь в каждой строке надо выбрать соответствующий файл. В строке Overview Map указать тот самый файл, который получился из преобразования *.mp. В строке Registry Name можно ввести любое имя ветви в реестре, но обычно их называют FID_<цифры>.

Осталось только нажать INSTALL и проверить, появились ли ключи в реестре.

Склейка нескольких карт в один контейнер

Навигаторы Garmin поддерживают загрузку карт из ограниченного количества файлов, а с флэш-карты так и вообще могут читать только один файл – gmapsupp.img. Поэтому для обеспечения возможности работы с большим количеством карт потребуется запихивать их в один контейнер. В этом нам поможет программа GMapTool.

Подготавливаем набор IMG-файлов, которые нам надо слить в один файл. Запускаем в wine gmaptool.exe и добавляем туда по очереди все карты. При этом сами эти карты могут быть контейнерами, содержащими внутри любое количество других карт. После добавления  карт тут же с помощью кнопки “Инфо” можно просмотреть информацию по каждому из файлов, в частности значения PID и FID, которые пригодятся, если карты не являются разлоченными.

Идём в закладку “Склейка”, указываем файл, в который записать получившийся контейнер и вперёд!

Если в этом наборе карт были неразлоченные карты, то для каждой из них с помощью кейгена надо сгенерировать 25-значный код разблокировки, и все эти коды в одну строчку записать в файл gmapsupp.unl (если файл будет называться gmapsupp.img).

Tags: , ,
Category: Linux | 1 Comment »

Comments

Один комментарий на “Garmin и Linux”

  1. Alex

    Автор, это просто мазохизм какой то.

    В Linux есть прорамма в репозиториях называется viking. Использует карты OSM подгружая в реальном времени в кеш.

    И все! Все эти танцы с бубнами – не понятно для чего. Мапсорс жуть какая то по сравнению с ней.

Leave a comment

 Comment Form