Эта статья носит скорее познавательный характер, нежели практическую полезность. И направлена, в первую очередь, на повышение вашего скилла, как специалиста по чип-тюнингу, умеющего выкарабкиваться из различных ситуаций. Ведь ситуация необходимости подготовить файл перед записью, выполнив перенос области калибровок, случается не так уж часто. Тем более, что для этого существуют утилиты и программы, а также калибровщики, готовые это сделать за бесплатно, при условии покупки тюна у них. Тем более, что речь в статье пойдёт только про семейство блоков Bosch MEDC17.
И всё же, если указанная тема вам интересна, то предлагаем не останавливаться и читать дальше. Единственное требование к читателю - умение работать в hex-редакторе и знание базовых понятий, связанных с работой в нём.
Для начала представьте, что у вас есть абстрактный блок управления, а также есть 2 прошивки к нему (сток и тюнинг). Спортивного интереса ради, сразу же усложним задачу, заменив абстрактный блок управления на блок Bosch EDC17CP44 от VW Touareg. Усложнение заключается в том, что данный блок является «нечитаемым» по OBD2 и подразумевает «виртуальное чтение» стока. При этом некоторые загрузчики (среди них PCMFlash и CMD) имеют свой собственный «формат» виртуально полученных стоков для VAG Bosch MEDC17, работающих по протоколу UDS. Слово «формат» применимо с большой натяжкой, так как формат там обычный бинарный, а структура прошивки ничем не отличается от считанной в BSL, просто часть областей (исключая область калибровок) в теле стока зашифровано (и должно остаться в том же состоянии при записи тюнинга через указанные загрузчики).
Ещё сильнее усложним задачу, предположив, что файл с тюнинговой прошивкой имеет смещения и является неполным (часть данных не связанных с калибровками заполнено байтами «00» или «FF»), а также, в отличие от стока, не имеет зашифрованных областей.
В итоге, сравнив два таких файла в HEX-редакторе («криптованный сток» и «неполный тюн со смещениями»), есть риск увидеть полную кашу (как на скриншоте ниже). Задача - найти в этой каше области калибровок и корректно перенести модифицированные калибровки из тюна в сток. Без использования сторонних утилит. За исключением HEX-редактора, конечно же.
По факту, всё оказывается гораздо проще чем кажется заранее. Дело в том, что прошивки для ЭБУ серии Bosch MEDC17 имеют характерную блочную структуру, разобраться в которой не составляет труда. Для этого не потребуется заниматься реверс-инжинирингом или изучать какую-либо официальную техническую документацию, ковыряться в A2L-описаниях и т.п.
Если взять и визуально посмотреть в HEX-редакторе на любой файл прошивки от Bosch MEDC17, считанный в BSL (не имеющий зашифрованных или пустых областей, а также смещений), можно разглядеть, что данные всегда хранятся блоками. Причём, каждый блок данных всегда имеет заголовок (в самом начале), в котором всегда указаны идентификатор блока, объём памяти выделенной под этот блок, адрес следующего блока, а также различные указатели и прочая служебная информация.
Разумеется, подобная информация где-то должна быть подробно задокументирована. К сожалению, у нас нет ссылки на такие документы. Впрочем, в рамках поставленного вопроса (как найти и перенести калибровки на Bosch MEDC17), это не столь важно. Важно научиться правильно находить границы блоков с данными, для чего нужно научиться читать информацию из заголовков блоков. Ну а затем, поняв как выглядит «каноничная» скомпилированная прошивка в бинарном виде для Bosch MEDC17, можно без проблем ориентироваться и выполнять манипуляции по переносу данных для менее каноничных файлов прошивок (со смещениями, пустыми областями и криптом).
Учиться будем сразу на примере. А в качестве примера, возьмем и рассмотрим прошивку с идентификаторами 1037517572_7P0907311B_0005 для вышеупомянутого Bosch EDC17CP44, где 1037517572 - это номер проекта Bosch (номер программы в рамках производителя ЭБУ), а 7P0907311B и 0005 - номер ЭБУ и версия ПО, соответственно. Для написания данной статьи был найден полный образ такой прошивки, полученный путём чтения через BSL. По факту, можно взять любую другую прошивку для Bosch MEDC17 (желательно чтобы её образ был полным).
Итак, открываем прошивку в HEX-редакторе и начинаем изучать сверху вниз. С первого же байта идут данные. Вспоминаем, что структура прошивки полностью блочная, а в начале блока всегда идёт заголовок. Следовательно, попытаемся его прочитать и понять. Благо, структура заголовков на Bosch MEDC17 всегда одинаковая (по крайней мере, иного мы не встречали).
Первые четыре байта заголовка - это идентификатор блока. Следующие четыре байта - это объём памяти, выделенной под блок. Далее идут четыре байта, служащие указателем на адрес следующего блока (учитывайте, что блоки идут не последовательно в теле прошивки, то есть их последовательность может быть перемешанной). Следующие четыре байта - указатель на окончание текущего блока. Далее идут указатели на две системные таблицы (к сожалению, мы не знаем их предназначения), а также номер проекта Bosch и прочие данные, которые в рамках поставленной задачи нас не интересуют.
Два важных момента: При задании адресов используется относительная адресация по базе (обычно база 0x80000000). А также, следует учитывать, что идентификатор заголовка, размер блока и все указатели на адреса в памяти записаны в порядке Little-Endian (т.е. в обратной последовательности байт). Например, последовательность байт 00 00 34 80 следует интерпретировать как 0x80340000 (или 0x340000, если исключить адресацию по базе).
Вернёмся к нашему примеру и нашему первому блоку данных (первому в порядке следования внутри дампа, а не в плане фактической последовательности). Итак, этот блок имеет идентификатор «C0»; Сегмент памяти, выделенной для хранения блока, занимает 4000h (что есть 16384 в десятеричной системе счисления - т.е. 16384 байт, или 16кб); Адрес следующего блока - 0x340000 (или 0x80340000, так как применяется относительная адресация); Текущий блок имеет окончание по адресу 0x3FFC. К слову, любой блок данных Bosch MEDC17 оканчивается четырьмя байтами «EF BE AD DE». По крайней мере, проверив это на более чем 7000 прошивках для самых разных ЭБУ из семейства Bosch MEDC17, мы ни разу не встретили опровержения сего факта.
Переходим по адресу 0x3FFC и действительно видим там байты «EF BE AD DE», после которых по адресу 0x4000 начинается новый блок. Всё верно, ведь под рассмотренный блок выделено 16384 (4000h) байт памяти, с адреса 0x0 по 0x3FFF включительно.
Единственный вопрос может возникнуть в том, почему следующий блок начинается с адреса 0x4000, а не с 0x340000, как было указано в заголовке. Повторимся, блоки идут не последовательно в теле прошивки. Блок по адресу 0x4000 следующий лишь по расположению в дампе (но не обязательно следующий в плане внутренней логики прошивки). А блок по адресу 0x340000 действительно следующий (в логическом порядке) после блока, что начинался по адресу 0x0, расположение которого, в свою очередь, неизвестно (если рассматривать именно логический порядок), ведь этот блок просто находится в начале тела прошивки.
Обычно входной точкой является блок с идентификатором «10», начинающийся по адресу 0x18000 (возможно на каких-то ЭБУ Bosch MEDC17 бывает иначе, но мы не смогли найти такой пример). Если начать двигаться с этой входной точки, перепрыгивая с блока на блок, записывая границы блоков, вскоре все участки памяти будут подписаны, за исключением небольших участков между блоками, заполненных байтами 00 или FF (разные загрузчики имеют своё мнение на счёт того, чем заполнять пустые области).
В итоге получаем последовательность подобно этой:
1. Block #10: 0x18000-0x1FEFFОтлично. Осталось ответить буквально на пару вопросов, самый главный из которых - а что из этого калибровки? Какой из блоков содержит в себе область калибровок?
Проверив порядка 7000 прошивок (в автоматическом режиме, разумеется) для самых разных ЭБУ из семейства Bosch MEDC17, мы пришли к выводу, что калибровки встречаются только в блоках с идентификаторами «60», «70» и «80». Остальные блоки хранят в себе управляющую программу, бутлоадер, OTP-области и т.д.
Конкретно на прошивке 1037517572_7P0907311B_0005, которую мы брали в качестве примера, область калибровок находится по адресам 0x340000-0x3FFFFF (блок «60»)и 0x200000-0x33FEFF (блок «80»).
Таким образом, рассмотрев блочную структуру прошивок Bosch MEDC17, можно подытожить, что задача переноса калибровок на Bosch MEDC17 – это задача поиска и переноса блока с идентификатором «60» (иногда также «70» и «80»). Какая бы пара файлов вам не попалась, нужно просто найти этот блок данных в обоих файлах, прочитать из его заголовка информацию, выполнить перенос.Вышеописанный алгоритм работает для любых версий ПО, для любых ЭБУ серии Bosch MEDC17. Корректнее будет сказать, что мы не нашли ни одной прошивки для Bosch MEDC17, где вышеописанный алгоритм не заработал бы. Хотя, кто знает, может мы просто плохо искали =)
P.S. В качестве заключения. А существует ли более простой способ найти и перетащить данные для Bosch MEDC17?
Отвечаем: конечно существует. В частности, модуль BSL Tricore для загрузчика Combiloader имеет в своём функционале кнопку «Импортировать данные Bosch MEDC17» и гарантированно работает с дампами, полученными через BSL или BSM. Также, на нашем сайте есть вспомогательные модули для идентификации и переноса области калибровок для некоторых блоков серии Bosch MEDC17 (не для всех, т.к. помимо простого переноса, мы встраиваем ряд специфических проверок на прошивки разных марок авто).