Реверсинг Digifant и создание инженерного блока

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Осенью был наконец-то установлен компрессор, и тут же встал вопрос настройки мозга, т.к. конфиг довольно сильно отличается от стока: другие форсунки, ст сж, объем, наддув. На более менее похожих чипах машина отказывалась работать, а единственные 2 человека, которые понимают в настройке ЭБУ Digifant - KDA и Vov@Syncro - уже давно не сидят на форуме. Установку других мозгов считаю неприемлемой и никогда на моей машине их не будет, поэтому стал разбираться, как работает дигифант. Также, не вижу никаких оснований доверять найденным в сети адресам таблиц и параметров, винолсу с его автопоиском карт тем более.

Единственный правильный путь - разреверсить весь мозг самому, что и было сделано в межсезонье. На это ушел не один месяц, поэтому считаю важным не потерять опыт и выложить свои наработки для всех. С другой стороны, это можно рассматривать как мануал по созданию инженерного блока с удобной онлайновой настройкой карт в 3D, поэтому описывать все буду максимально подробно.

Все сделанное можно повторить для любого другого мозга. Не нужно поддержки ни k-line, ни CAN, ни других протоколов.

 
Последнее редактирование:

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Итак, вскрываем Digifant.



Фото из интернета:


Ключевыми элементами мозга являются микропроцессор Motorola MC68HC11A1FN, микросхема MC68HC25FN (для расширения регистров) и чип памяти EPROM 27C256 в корпусе DIP28, содержащий прошивку. При включении зажигания, микропроцессор считывает программу из чипа во внутреннюю память и выполняет. Все эти элементы находятся на небольшой плате, соединенной с основной шлейфом. По сути, все остальные элементы мозга это т.н. обвязка - они нужны для преобразования уровня сигналов, устранения помех, защиты от перепадов напряжения и тд.



EPROM это постоянная память, мозг может только её прочитать, для записи необходим программатор. Я использовал MiniPro TL866.
Вынул чип из мозга, считал дамп программатором и открыл в дизассемблере IDA Pro, указав архитектуру микропроцессора - Motorola 6811A1, адреса загрузки, как на скриншоте:



Нашел даташит на микропроцессор и досконально изучил. 6811 - 8-разрядный микропроцессор, 16-разрядной адресацией, 8-разрядным АЦП, с несложным ассемблером и встроенным последовательным портом. Это означает, что у мозга есть все необходимое, чтобы делиться данными с компьютером, отсутствует только код (при желании можно допилить поддержку хоть CAN). Также, из даташита становится ясно, что микропроцессор подключен в режиме Extended Mode (MC68HC25FN).



Таблица векторов прерываний находится по адресу 0xFFC0-0xFFFF. RESET располагается по 0xFFFE. Переходим на прерывание RESET. Из первых инструкций видно, что RAM располагается по 0xB000. Там следует проименовать все регистры согласно даташиту, поскольку IDA этого сама не сделала.

Теперь потребуется схема мозга. К счастью, добрый человек её уже нарисовал в 2002 году для дигифанта, она есть на форуме.
Если для другого мозга схемы нет - её нужно будет делать самостоятельно. Долго и кропотливо, но ничего сложного. Есть куча софта, который в этом поможет, типа P-CAD.

Собственно, далее прошивка несколько месяцев реверсилась, постоянно заглядывая в схему, Instruction Set и даташит. Поначалу было непонятно вообще нифига, как на этом скришоте:



но довольно быстро вкуриваешь, как работают микропроцессоры, и что имели ввиду инженеры bosch (кликабельно):

 
Последнее редактирование:

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Несколько вспомогательных моментов при разборе кода:

1) Функции чтения из таблиц.

С этого можно начать анализ. Ищутся легко, т.к. небольшие, состоят из сплошной арифметики, работают с регистрами, а не с RAM. Адрес таблицы передается через индексный регистр X. Смотрим, откуда они вызываются и находим таким образом около 90% всех таблиц в прошивке.
Код чтения данных из оставшихся таблиц не вынесен в отдельные функции.






2) Почему на скриншоте значение 0x54 это 491Ом?

Невозможно разобраться в прошивке без привязки значений к физическим величинам. Необходимо определить, какие переменные хранят значения датчиков, а также как они преобразуются в байты.
Входные данные для мозга:
- Напряжение бортовой сети
- Абсолютное давление с MAP
- Сигнал с лямбды
- Сигнал с ДД
- Сигнал с ДТОЖ
- Сигнал с ДТВ
- Сопротивление потенциометра
- Микрик ХХ
- Микрик FT (FullThrottle)
- Сигналы с датчика Холла

Сигналы, которые не надо оцифровывать (микрики), приходят напрямую на порты микропроцессора. Остальные, как ни странно, приходят на АЦП :)
Напряжение, подающееся на АЦП, должно быть в пределах опорного напряжения (пины процессора Vrh и Vrl - 5В и 0В). Далее АЦП выдает байт пропорционально.
Т.е. если на на пин приходит 0В, АЦП выдаст значение 0x00. 5В - 0xFF. 1,647B - 0x54.

Для привязки физических величин с большинства датчиков к напряжению на АЦП, гуглим, что такое делитель напряжения. Для датчиков ДТОЖ и ДТВ - гуглим модифицированное уравнение Стейнхарта-Харта. Для сигнала с датчика Холла - гуглим про фронт и спад сигнала, и читаем в даташите про счетчики и прерывания входных/выходных сравнений микропроцессора.

Чтобы постоянно не лазить в калькулятор, был написан скрипт на python, содержащий все необходимые преобразования:



3) Гуглинг 80го левела

Иногда совершенно непонятно, что имели ввиду программисты Bosch. Какой-то мутный говнокод. Разобраться могут помочь более ранние прошивки. Их можно найти на давно несуществующих страницах, с помощью директив Google (поисковые операторы) и сайтов, кэшируюших интернет. Кэш интернета - твой бро. Много интересных данных было найдено на закрытых форумах, где даже зарегаться нельзя.
По крупицам была собрана огромная куча информации - о том, какие прошивки куда ставились, внутреннее руководство VW с описанием работы PG G60, половина стоковых прошивок, огромное количество тюненх-чипов, много документации.
Все это помогает в анализе кода, т.к. когда из функции отката УОЗ по детонации, видишь, что максимальный откат в цилиндре составляет 12.5гр, и это подтверждается VAG Service Manual #103 - это успех.



4) Скрипты IDA

Найденные более ранние прошивки приходилось бы анализировать с нуля, что заняло бы слишком много времени. Переименование регистров, поиск функций чтения из таблиц, поиск самих таблиц по этим функциям, создание структур для описания форматов, поиск базонезависимых функций (hardcode) - все это было автоматизировано с помощью python-скриптов для IDA. Теперь я загружаю неизвестную прошивку, натравливаю скрипт и вуаля, огромный кусок прошивки разобран, основные таблицы найдены, проставлено множество комментариев.
 
Последнее редактирование:

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Так анализируется прошивки. Результат - понимание алгоритмов работы ЭБУ, адреса карт, константы, использующиеся в вычислениях, пороговые значения и тд. После анализа становится ясно, что править при смене МАП-сенсора, как сдвинуть отсечку, как сделать лаунч-контроль, позволяя тачке развить избыток на ХХ и стартануть с бара, и прочее (все перечисленное связано с правкой кода, редактируя таблицы это сделать невозможно). А также почему машина так зависима от ДТОЖ.

Итак, все карты найдены, в vw6636 их 79. Нужен удобный софт для редактирования и железки для создания онлайника.
Для понимания: софт для настройки, с красивым отображением 3х-мерных карт - это всего лишь редакторы. Сами по себе, они ничего не проанализируют и не найдут. Однако, создав в программе "схему" прошивки, забив все найденные адреса таблиц, функции преобразования и пороговые значения, получается мощный и удобный инструмент. Таких программ куча - ecuEdit, WinOLS, ChipTuningPRO, TunerPro и тд.

По многим причинам была выбрана TunerPro RT. bin-файл - прошивка, xdf-файл - та самая "схема" прошивки.
Создал новый xdf-файл, потыкал мышкой, ввел адреса двух главных таблиц



указал размерность, формулы преобразования, откуда брать значения оборотов, MAP вбил руками



и вот что вышло:



скриншот из VAG Service Manual #103:



скриншот из iron man:



В xdf описываются все оставшиеся таблицы и около сотни констант (процент доп. открытия КСХХ при включении кондея, значение УОЗ при прокрутке стартером и тд)
Получившаяся xdf-схема даст возможность удобной и быстрой правки таблицы, даже мышкой в 3D.
 
Последнее редактирование:

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Далее был куплен эмулятор ПЗУ. При использовании обычного эмулятора пришлось бы пользоваться еще и его софтом для заливки прошивок, что доставляет неудобства. Поэтому был выбран Moates Ostrich 2.0. Тут и кроется основная причина выбора софта: TunerPRO RT и эмулятор Ostrich могут работать в связке.





Меняем чего-нибудь, Upload и изменения внесены.



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

Собрал онлайник, все работает. Карты правятся на заведенном моторе. Для теста менял таблицу обогащения по потенциометру, добавлял топлива, мотор заработал мягче.


Прошивка разобрана, удобный софт предоставлен, как собрать онлайник - рассказал. Но это не все.

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

ПЗУ работает следующим образом: когда нужно прочитать значение по адресу, например, 0xB1F2, биты адреса подаются на 16 пинов чипа (A0..A15), и ПЗУ-шка выдает хранящийся там байт по выходным пинам Q0..Q7



Поскольку выдачей данных управляет отдельный девайс в виде эмулятора, он без проблем может запоминать адреса, по которым обращается мозг с последующей визуализацией в TunerPro. Таким образом, можно видеть, какие значения из каких таблиц в данный момент читает мозг. Фича называется Hit Tracing.

На видео я заливаю на эмулятор прошивку vw6636, verify - контроль целостности, после чего показан hit tracing на примере базовой таблицы впрыска (RPM vs MAP) и таблицы коррекции впрыска по напряжению (лаг форсунок). На сами значения не смотрим, т.к. в таблицах не прописаны функции преобразования из hex в миллисекунды



 
Последнее редактирование:

Roxter

Президент клуба
Команда форума
Технический советник
Сообщения
4.421
Реакции
440
Адрес
Москва
Факинг Энималс.
Plex, я есть гордиться тобой!

Моя вера в тебя была не напрасной.
Ура)))
 

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Спасибо)
Если б не мертвая лямбда LC-1, можно было бы снять видео, как меняется AFR после правки в онлайне. А то не наглядно, что это все за магия и зачем нужна :)
 

TORIKAS

Ветеран клуба
Сообщения
2.645
Реакции
118
Адрес
Санкт-Петербург
НУ и када будет опупенная прошивка под 16ве?
 

BaNaN

Почётный пилот
Сообщения
1.773
Реакции
45
Адрес
Москва
Саня красавчик!!!!:i_am_so_happy:
 

Xoce

Почётный пилот
Сообщения
803
Реакции
110
Адрес
Москва
Саня респектос за проделанное!)))
 

TORIKAS

Ветеран клуба
Сообщения
2.645
Реакции
118
Адрес
Санкт-Петербург

ScH

Moderator
Команда форума
Технический советник
Сообщения
486
Реакции
67
Адрес
Питер
Самое интересное в том, что у ТС - 2Е , значит и распределитель зажигания тоже от 2Е, а скважность импульсов у него отличается от ПГе. =)

А в целом - лови краба.
 

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
НА карбюратор. Подъеб не засчитан.
Никаких подъебов, видимо перепутал с механическим. Я не в курсе, как устроен впрыск на 9А. Но смысл от этого не меняется:

- 16вэ атмо на диги - калининградское отделение клуба уже вовсю вваливает на таком конфиге :) Летом надеюсь мы пересечемся и поковыряемся в этом с онлайником
- 16в-г60 - не вижу смысла мучаться, по рф ездит чистокровный 3G - лучше сгонять скопировать оригинальный чип
- 16вэ на любом другом мозге - надо сначала повторить все описанное для этого мозга

Самое интересное в том, что у ТС - 2Е , значит и распределитель зажигания тоже от 2Е, а скважность импульсов у него отличается от ПГе. =)
Неплохая попытка, но нет. У ТС от 2Е только блок, колено и шатуны.
 

ScH

Moderator
Команда форума
Технический советник
Сообщения
486
Реакции
67
Адрес
Питер
Неплохая попытка, но нет. У ТС от 2Е только блок, колено и шатуны.
Всё прально. трамблёры разные по размеру, ПГ-шный провалицца в очко 2Е.

и Самое обидное , что в результате получатся неправильные значения оборотов двигателя. ну и соотв. углы тоже немного.

И ваще, твоя машина ,тупо из-за этого , может и не ехать нормально.


- 16вэ атмо на диги - калининградское отделение клуба уже вовсю вваливает на таком конфиге
Я тоже Slexу помогаю логи разбирать. И судя по его просьбам, делаю это только я.
Каком конфиге?
 

TORIKAS

Ветеран клуба
Сообщения
2.645
Реакции
118
Адрес
Санкт-Петербург
Вово! Кроме Саши никто ниче толкового сейчас не делает!
 

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
TORIKAS, что ж опупенной прошивки для 16вэ тогда нет? :)
 

TORIKAS

Ветеран клуба
Сообщения
2.645
Реакции
118
Адрес
Санкт-Петербург
Меня интересовала именно в ТВОЕМ исполнении. ;)
 

plex

Айтишник
Команда форума
Сообщения
4.887
Реакции
1.008
Адрес
Москва
Посмотрел, трамблер 2Е. Все могло бы быть так, как ты описал, но так как машина моя едет нормально и явной ошибки в оборотах не замечено, то видимо отличия в шторках трамблера минимальны. Решается сменой шторки или беглым взглядом на прошивку 2Е. Да и с онлайником это бы определилось, если проблема вообще существует

Я тоже Slexу помогаю логи разбирать. И судя по его просьбам, делаю это только я.
А я и не помогаю. Но думаю, что пользы от онлайника будет куда больше, чем от двух (трех?) лет пересылки логов.
И вообще, тема не о настройке, а о создании инструмента для настройки.

P.S: если бы я смотрел логи, то начал бы с патча для логгера, вдруг для настройки важен именно УОЗ, а не погода на марсе?..
 
Последнее редактирование:
  • Мне нравится +0
Реакции: aleks 44
Сверху Снизу