Русский язык и GPS Garmin

Неофициальное руководство к действию

"Если гора не идет к Магомету,
значит Магомет идет к горе..."
(древневосточная мудрость)

"...Я хочу у вас узнать где
взять конвертеры pre2bin
и patch..."
(из переписки с пользователями)

Предисловие. Мой ответ пользователю был бы - написать самому. Но почему-то я так не ответил, а решил написать документацию на то, что уже сделано кем-то, в том числе и мною.

Disclaimer. Ввиду того, что написано в лицензионном соглашении с компанией Garmin, все нижеописанные действия являются незаконными с точки зрения этой лицензии. Я со своей стороны не уговариваю вас следовать всем этим действиям, и не несу никакой ответственности за все возможные последствия от ваших действий. Помните, вы действуете только на свой страх и риск.

----------------------------
День 1. Начинаем распаковку.
----------------------------

Немного истории. Как все начиналось. История достаточно скромная, потому как информацией я не владел, пока не набрел на кладезь народной мудрости - форум http://gps.boston.ru. Если бы владел, наверняка было бы по-другому. :)
Давно появился сайт corsar, где можно скачать карты, пообщаться на форуме, а также загрузить некоторые полезные файлы. Однажды человек, не назвавший себя кроме как Garmin replacer/russificator by KonNor прислал исходные тексты программы gunp, и другой инструментарий, а также и прошивку с русским языком eTrex Legend 3.20, созданную им из ... 2.41.

Цитата из файла, лежащего рядом с инструментарием разработчика гласит
" Не отвечу только на один вопрос - как вытащил оригинальную прошивку из Garmin'a. Могу дать единственный намек - IDA+arm.d32+поверхностное знание ARM ассембрера = результат". Мысленно вздохнув, с сожалением, "умеют же люди" продолжаем двигаться дальше.

Чуть позднее выяснилось, что данный пакет умеет чуть больше, стоит только приложить немного усилий. Таким образом была собрана прошивка eTrex legend 3.60 , а позднее и eTrex Vista 3.60.
В это время дописыванием утилиты gunp занимался dyp. Ставилась цель - отображение русских карт на gps garmin. Появилась возможность распаковывать тексты для моделей c60/cs60/76c/76cs (это одна и та же прошивка) и рисовать шрифты. (я упоминаю весну-лето 2004).

Для начала я бы посоветовал ознакомиться с приложением 1 - глоссарием - вдруг пригодится.

Как это работает? Упрощенно процесс русификации (перевода русского интерфейса пользователя) можно описать следующими шагами:
1. Получение текстового ресурса (текстовых строк)
2. Получение шрифтов
3. Перевод текстового ресурса
4. Рисование русских шрифтов (если это небходимо, вдруг в коллекции окажется нужный..)
5. Упаковка текстового ресурса
6. Наложение патча на исходный файл упакованным текстовым ресурсом и отредактированными шрифтами.
7. Другие действия

Насчет последнего пункта есть небольшая оговорка. Если планируется сделать полную русификацию (в том числе ввод поиска по русски), то добавляется еще и пункт 4.5 Дизассемблирование прошивки и 4.6 Написание патча для поиска. Еще возможны варианты с отображением шрифтов (сохранение родных шрифтов, а русские добавление в прошивку). Пока остановимся на базовом варианте, только русский интерфейс.

Почему это срабатывает? Потому что. :) Потому что именно так работает программа в приборе. Для более любопытных - смотрим в приложение 2 - ссылки.

Получением текстового ресурса (1) занимается приложение gunp (gunp2) и grabres (поскольку я многого не знал, я написал свои утилиты для распаковки прошивки). gunp пытается применить интеллектуальный поиск, а grabres действует напрямую по указке свыше.
На выходе работы программ (неважно какой вы воспользуетесь, главное результат) - набор текстовых файлов с именами lang001.txt и т.д., разделенный на строки. В каждой строке находится одно высказывание (выражение). Специальными символами являются \n (символ перевода строки) и \0 (символ конца выражения и перехода к следующему).
Какой-то из файлов (например первый) надо взять за основу для перевода. Количество файлов обычно равняется количеству языков, доступных в меню прибора Выбор языка. Не на всех прошивках срабатывает автоматический поиск gunp.

Получением шрифтов (2) занимается gunp (gunp2 - добавлены определения очень старых шрифтов) или winHex (устаревший метод).

Переводом текста (3) занимается переводчик. Или, при наличии достаточно развитой базы перевода, замечательное приложение ехсе1.

Рисованием русских шрифтов (4) занимаетесь вы. В конце концов необходимо же что-то делать. :) Опять же, если коллекция шрифтов от приборов достаточно обширна, можно найти недостающие шрифты, а часть все-же нарисовать. Как? Есть редакторы шрифтов - fe (поддерживает новые шрифты, векторные шрифты, старый и очень старый тип пока в стадии тестирования), fe_win (fe_clx) - поддерживает новые шрифты, старые шрифты, очень старые шрифты и некоторые операции трансформирования шрифтов. Недавно была добавлена поддержка автоматической генерации шрифта на основе установленных системных шрифтов Windows (но все равно ручной работы хватает).

Упаковку текстового ресурса (5) делает (у меня по крайней мере) утилита pre2bin. Входные параметры - файл текста, на выходе - упакованный, готовый к патчу бинарный текст :)).

Наложение патчей (6) на исходную прошивку прибора делает утилита patch.

Примечание. Иногда ввиду некоторых соображений программистов garmin в прошивках используется упаковка текстовых ресурсов. Видимо это связано с экономией памяти flash, но никак не связано с экономией нашего времени. :( На сегодняшний день нет готового решения для упаковки текстовых ресурсов "как гармин", поэтому часть (малая) прошивок так и остается не русифицированными - яркий пример этому eMap 2.64. Положение можно изменить, если сама фирма garmin начнет внедрять переводы в приборы на этапе построения программного кода. Надеюсь, что когда-то это произойдет.

==================================

Часть 1.

Использование утилит.

==================================

Для начала скопируйте файл исходной прошивки .rgn в какую-то отдельную директорию.
Скопируйте туда же утилиту gunp (grabres)
1. Синтаксис вызова gunp Имя_файла [/old]
Имя файла является обязательным параметром. Имя файла указывает на файл прошивки.
Ключ /old - для улучшенной обработки "очень старых" шрифтов, используется, когда не найдены шрифты.
На выходе в той же директории получается примерно такой список файлов:
bootseg.bin - загрузочный сектор
font001.bin - файл шрифта номер 1
font002.bin - номер 2
...
fw_all.bin - основная прошивка (этот код передается updater.exe через интерфейс обмена)
header.bin - заголовок файла .rgn
loader.bin - код программы загрузчика (этот код передается updater.exe через интерфейс обмена на начальной стадии - для старта прошивки)(загрузчиков может быть несколько)
image001.lbm - картинки, содержащиеся в прошивке прибора
image002.lbm - случается, что их не бывает :)
...
extract.log - лог-файл работы gunp
lang_001.txt - текстовый ресурс номер 1.
lang_002.txt
...

Примечание. Утилита gunp может и не завершить работу, или создать большие файлы - это связано с прошивками :) Достаточно нажать Ctrl-C и программа завершится. Иногда файлов больше, чем указано здесь, иногда гораздо меньше.

Примечание 2. Лучшим вариантом использования может быть gunp orig_firmware.rgn [/old] >ew
Это перенаправление потока вывода сообщений программы в файл ew.

Использование утилиты grabres.
1.a. Синтаксис вызова grabres Имя_файла
Имя_файла должно быть (на теперешний момент) DOS 8.3
Утилита запросит, с какого смещение начинать: укажите смещение текстового ресурса в десятичной системе относительно начала файла.
Также необходимо указать, сколько завершающих \0 символов в ресурсе считается окончанием работы. Обычно 4 хватает, но бывают экзотические случаи.
Также необходимо указать максимальное число строк для одного текстового ресурса. Результирующий файл - res.txt. Его требуется отредактировать вручную, убрав лишние строки, не относящиеся к какому-то текстовому ресурсу.

! Подсказка. Обычно язык English заканчивается строкой Zoo/Aquarium, но бывают и исключения.


==================================

Часть 2.

Почти ничего делать не надо, когда все сделано.

==================================

В итоге по завершении части 1 были получены текстовые файлы с текстовыми ресурсами и бинарные файлы с растровыми и векторными шрифтами.
Скопируем все шрифты font???.bin и один из текстовых ресурсов (например английский, lang001.txt) в отдельную директорию.

==================================

Часть 3.

Перевод текста, и почему ехсе1 такой хороший инструмент.

==================================


После того, как все распаковано и получено, необходимо оценить фронт работы по переводу. Открываем в обычном редакторе текстов (notepad, bred2, lister.) и смотрим, сколько строк занимает непереведенный текст. Много. Загружаем ехсе1 и указываем ему на файл (не используйте простое перетаскивание в его окно текстового ресурса). Выбираем формат файла кодировка Windows cp1251, текст с разделителями, формат поля - текстовый (последнее важно!)

После открытия сохраните файл как .xls. Можно далее убрать символы \0 (впоследствии необходимо добавить) для удобства перевода. В колонке рядом будет располагаться перевод. Следует обратить внимание, что служебный символ \n заменять и убирать нельзя (чтобы не нарушать форматирование текста при выводе на экран прибора). Можно его двигать вдоль строки в пределах разумного.

Итак, вариант первый: перевод с нуля. В среднем, количество строк, необходимых для перевода исчисляется ~1000. Проведя некоторое время со словарем, вы наконец получаете перевод нулевого приближения. Почему нулевого? Он еще не испытывался на вид в приборе - очевидно, что потребуется правка и коррекция. Следует избегать длинных переводов, увеличения строки, однако ничего страшного, если строка будет длиннее оригинальной (например английской) строки. В различных языках разные длины слов - это учитывается прибором.
Считаем, что столбик рядом с первоначальным является переводом. Не забудьте добавить символ \0 (если убирали на начальном этапе) через функцию СЦЕПИТЬ. А результирующий столбик требуется скопировать и сделать специальную вставку на новом файле - только значения. Сохранить как текстовый файл с разбиением на строки.

! После сохранения текстового файла (назовем его trans.txt - русский текстовый ресурс) требуется обязательно проверить на "услужливость" ехсе1 - замену кавычек " лишними кавычками (лучше избегать использования кавычек). Например, строка созданная ехсе1: "Перевод строки ""1111""\0" первоначально выглядела как Перевод строки "1111"\0
И отредактировать в любом текстовом редакторе. Также следует проверить на наличие в выходном файле trans.txt строки ###### - это означает, что ехсе1 (опять добрая душа, услужил) заменил слишком длинную строку больше 255 символов на эти символы. Естественно, это нам не надо, поэтому в ехсе1 указываем этой ячейке с длинной строкой формат "Числовой" (еще одна загадка - числовой отображается верно). Нельзя задавать всем ячейкам числовой формат или оставлять "Общий" при загрузке файла - ехсе1 (им наверное уже икается) уродует строки вида 0\0 и =\0 и кучу других, заменяя их на формулы. Зачем? Не знаю.
Придется вручную следить за этими длинными строками.

Вариант второй: есть наработки по переводу. Тут каждый может придумать несколько путей, однако я даю подсказку: ПОИСКПОЗ, ИНДЕКС, ЕСЛИ, ЕОШИБКА, некоторые другие и применение "Формат - Условное форматирование..." для раскраски ячеек.

Сохраняемый файл trans.txt копируем как in.txt (для утилиты pre2bin).

==================================

Часть 4.

Редактируем (или не делаем этого) шрифты.

==================================

Введение. Немного о шрифтах. Шрифты бывают трех видов: очень старые, старые, новые. Различаются форматом хранения и заголовками. Шрифты имеют размер таблицы до 255 символов. Обычно требуется рисовать русские буквы для верхней таблицы символов (cp1252 начертание заменять cp1251). Как определить, какие шрифты имеют кодовую таблицу? Из лог-файла работы программы gunp и файла сохранения вывода на экран (ew помните?). Бывает, что в шрифте присутствует не вся таблица из 255 символов, это определяется при загрузке шрифта в редактор fe (fe_win). Шрифт размером меньше 255 символов русификации не подлежит (не имеет смысла).

! Черезвычайно любознательные могут почитать о формате шрифта в исходных текстах редактора fe на http://sf.net/projects/flawia.

Таким образом, определились какие же все-таки шрифты необходимо редактировать.

Вариант первый. Рисование с нуля. В среднем, в шрифте требуется заменить (нарисовать) 32*2 символа. Ввиду того, что символы АВЕКМНОРСТХ русского алфавита похожи на символы ... английского, то можно их линковать... Подробнее о процессе рисования символов можно ознакомиться в справочном файле для программы fe_win (программу можно скачать на http://e-trex.narod.ru в разделе Кухня). Интерфейс программы fe_win похож на fe и процесс редактирования тоже. Программу fe можно скачать на http://sf.net/projects/flawia.

Вариант второй. Символы есть, взятые из других прошивок. Однако, ввиду различных версий ПО у компании производителя, или разных программистов ПО, шрифты различаются. Незначительно. Перевернуты по горизонтали/вертикали, хранятся в очень старом формате (вместо старого). Для этого все равно придется воспользоваться редакторами шрифтов fe или fe_win. Подробнее о процессе переворота/отображения можно почитать в справочном файле для программы fe_win.

Все полученные шрифты аккуратно складываем в отдельную папку (допустим work) и даем им имена, схожие с начальными. Например font007.bin в русском виде будет именоваться font007r.bin .

==================================

Часть 5.

Упаковываем текст.

==================================

Удобный для редактирования, текстовый ресурс абсолютно неприемлим для записи в прибор напрямую. Его необходимо упаковать. Это делает утилита pre2bin.
Синтаксис вызова pre2bin
При этом, входной текстовый ресурс для упаковки должен содержаться в файле in.txt
Выходной текстовый упакованный ресурс будет содержаться в файле out.txt
Переименуйте out.txt в langRu.bin (для удобства).

==================================

Часть 6.

Наложение патчей.

==================================

Для этого надо знать, куда накладывать. Внимательно изучаем файл extract.log (результат работы gunp от Части 1) и видим смещения в файле, по которым были найдены конкретные ресурсы: шрифты, текст.
Допустим, решили заменять язык 005:
lang_005.txt 000125BF
И оказалось, что необходимые шрифты находятся в файлах
font006.bin 00258AFB
font007.bin 0025BBB3
font008.bin 0025C543
font009.bin 0025D03B

Вспоминаем, что упакованный текстовый ресурс называется langRu.bin
а прошивку мы скопируем в директорию под именем in.bin
Тогда набираем команду
patch in.bin langRu.bin /H000125BF
и получаем файл res.bin с замененным ресурсом по адресу 000125BF.
Переименовываем res.bin в in.bin
Аналогично для каждого из оставшихся шрифтов.
patch in.bin font006r.bin /H00258AFB
del in.bin
ren res.bin in.bin
....
! Совет. Напишите .bat файл - жизнь будет проще.

==================================

Заключение.

==================================

После проведенных всех действий получилась прошивка, которую можно прошивать. Но не следует спешить. Создайте отдельную директорию (например test) и скопируйте туда полученную прошивку. Распакуйте ее снова при помощи gunp имя_прошивки >ew

Если все прошло успешно, получатся те же файлы, что и на этапе Части 1. Только текстовый ресурс будет заменен на русский и шрифты будут немного другого размера (они же русские). Сравните смещения, генерируемые теперь в extract.log с прежними. Они должны совпадать.

Если неудачно, не хватает файлов, или происходит что-то странное, следует проверить цепочку определения адресов в Части 6 и правильность ввода всех этих параметров.

Косметические улучшения. Осталось посчитать верную контрольную сумму CRC для прошивки (ее прибор вычисляет в сервисном режиме). Но это не сейчас... Или оставляю вам в качестве домашнего задания.

На вопросы по прошивке - смотрим FAQ на http://e-trex.narod.ru.

Удачи!
9.11.2004 Adrenalin
==================================

Приложение 1.

Глоссарий.

==================================

Прошивка - а) процесс закачивания в flash ПЗУ прибора некоторой программы. б) бинарный файл .rgn который лежит рядом с утилитой updater.exe при распаковке .exe файла обновления, взятого с сайта garmin.

Патч - бинарный файл (наложение) на другой бинарный файл некоторого изменения. Результатом является еще один бинарный файл ("патченный") с некоторыми желаемыми свойствами (например, русским языком).

updater.exe - приложение от garmin для прошивки бинарного файла .rgn

Текстовый ресурс - все текстовые строки одного языка. Содержится в файле lang???.txt

Линковка (символа шрифта) - связывание отображения похожих символов русского алфавита с символами английского алфавита.


==================================

Приложение 2.

Ссылки.

==================================

http://e-trex.narod.ru
http://sf.net/projects/flawia - русские прошивки, инструменты разработки, редактор шрифтов.
http://sf.net/projects/cmap - конвертер карт ИНГИТ в польский формат.
http://gps.boston.ru- форум

Rambler's Top100

Используются технологии uCoz