Как запустить Doom на УАЗ Буханке 2022
Intro
Прошедший 2022 год сильно повлиял на отечественных автопроизводителей. Появились антикризисные комплектации (а остальные исчезли). Произошли откаты на старые экологические нормы, вплоть до евро-2. Кто-то прогнозировал возврат к карбюраторным двигателям, чего, к счастью, не случилось. Люди в шапочках из фольги особенно рады, что из отечественных машин исчезла система ЭРА-Глонасс. Глупцы, она стала ненужной, потому что всех уже чипировали через вакцину.
Мы же c @andrey239 и всей командой RusEFI продолжали пилить свой ЭБУ* с преферансом, барышнями, открытым программным кодом и открытыми аппаратными реализациями.
ЭБУ
Электронный Блок Управления. В этом тексте подразумевается ЭБУ Двигателя Внутреннего Сгорания (ДВС). Хотя современные ЭБУ ДВС помимо самого ДВС управляют еще и кучей оборудования, так или иначе связанного с ДВС, нчиная от генератора и заканчивая топливным насосом. Поэтому современный ЭБУ эго устроство немного сложнее замены трамблера и карбюратора.
А оно поедет?
Кстати, да, на нем можно запустить ДВС. Даже V12. Нет, не взорвется. Да, есть те, кто ездят на нем. На повседнев. Конечно же только по частным дорогам.
А так как мы делаем «инженерный онлайн ЭБУ»…
инженерный и онлайн, о чем это?
Тут надо немного отвлечься и пояснить что есть «инженерный» и что есть «онлайн». Когда-то давно ЭБУ было нельзя перешивать. Т.е. совсем. В них стоял проц с однократно-программируемой ПЗУ. «А как же патчи и хотфиксы?» спросите вы. Для этих целей рядом с процом иногда было место под внешнюю ПЗУ, запаяв которую, можно было обновить прошивку.
Вот, кстати, ЭБУ от моей любимой тестовой лошадки — Subaru SVX. Частично разобранный, чтобы найти, где у ней там неонка и немного пореверсить. В правом верхнем углу видно место для ПЗУ с патченной прошивкой.
ЭБУ Subaru SVX начала 1990хПонятно, что место под ПЗУ сделано не для тюнеров, а для исправления потенциальных косяков. Но этим механизмом очень быстро начали пользоваться энтузиасты.
Поставив на это место кроватку и подкидывая в нее ПЗУ (с УФ стиранием, ламповые) в прошлом веке можно было модернизировать прошивку. Обычно это ограничивалось редактированием таблиц по которым работает ЭБУ: «навалить угла», «насыпать буста», «забеднить» или наоборот «залить». Это был уже «инженерный» блок, но еще не онлайн.
Hidden textнавалить угла — увеличить Угол Опрежения Зажигания. Да, смесь в цилиндре обычно поджигается до достижения поршнем Верхней Мертвой Точки, т.е. сжимается уже горящая смесь. Настройка УОЗ и состава смеси — главные методы получения дополнительных лошадиных сил на атмосферных моторах
насыпать буста — добавить давления наддува, актуально только для турбированных/компрессорных машин. Это основной метод поиска скрытых резервов на наддувных ДВС.
забеднить и залить — соответственно обеднить или обогатить смесь на определенных режимах. Бензин с воздухом в разных соотношениях горит (а иногда и не горит) с разной скорость и КДП.
Потом к этому начали прикручивать «онлайн» — вместо ПЗУ ставили RAM, содержимое которой можно было менять на лету. Так же из этой памяти можно было читать интересующие тюнера параметры.
Сейчас паять ничего не надо. Прошить современный ЭБУ можно через диагностический разъем, благо там уже флеш память. На многие штатные ЭБУ есть патчи, позволяющие на время настройки переместить часть калибровочных данных в RAM с менять их на лету без необходимости при каждой правке перешивать флеш.
Так вот, мы тоже делаем и «инженерный» и «онлайн». И с удобством для пользователя. Поэтому у нас для микроконтроллера, который этим всем рулит, специфичные требования, часто идущие вразрез с automotive требованиями. Тот же USB для связи с компом, интерфейс SD карты для записи логов.
Так же мы (команда RusEFI) любим GCC и не любим архитектуры с коммерческими/закрытыми компиляторами. Равно как не любим и микроконтроллеры с закрытой/NDA документацией.
Ну и больше половины нашей прошивки — это всякие плюшки связанные с настройкой ЭБУ, а не его прямыми обязанностями по управлению ДВС. Та же поддержка файловой системы для SD, драйвера интерфейса USB, протокола для связи с TunerStudio, куча осмысленных текстовых (!) сообщений об ошибках и параноидальные проверки.
Это уже не говоря про модный Lua для написания всяческих расширений. Например для отправки специальных CAN сообщений, чтобы осчастливить блок АБС, ЭБУ АКПП или контроллер климата.
Т.е. нам и памяти надо больше, чем есть в классических ЭБУ.
Поэтому все мечты о портировании RusEFI на какой-либо штатный ЭБУ разбивались если не об отсутствие документации или адекватного компилятора, то об отсутствие достаточных ресурсов микроконтроллера.
Так было до конца 2022 года. Пока мы не решили портануть DOOM RusEFI на УАЗ Буханку (в девичестве УАЗ 2206). Согласен, очень неожиданно…
Российские производители автоэлектроники внедряют чипы общего назначения
До 2022 года на конвейеры отечественных автопроизводителей шли блоки управления на базе специализированных микроконтроллеров. Например от Infenion или STMicroelectronics — в таких чипах больше специализированной автомобильной периферии, полная документация на такие чипы не всегда доступна и банально бесплатного компилятора часто нет.
Во второй половине 2022 года два (оба?) российских производителя электронных блоков управления двигателем внутреннего сгорания начали поставлять на конвейеры решения на базе микроконтроллеров общего назначения с ядром ARM Cortex-M4. Это очень заинтересовало нас и мы начали охоту на эти блоки.
Первым (и пока единственным) у нас на столе оказался блок от компании СОАТЭ. СОАТЭ поставляет на конвейер УАЗа блок управления S105. На ранних серийных номерах в них использовался stm32f407, на более поздних мы видим Geehy apm32f407. Насколько нам известно, apm32f407 это функциональный аналог stm32f407. А stm32f407 это тот микроконтроллер, с которого начинался RusEFI!
ЭБУ УАЗ 2022 года
Картинка честно утащена с форума, где дядьки-УАЗоводы столкнулись с новым шайтаном, который по непонятным причинам окирпичился. Спасибо этим дядькам, без них мы бы не узнали об этих блоках.
Блок явно разработан с акцентом на доступные компоненты: дискретные MOSFET с внешней схемой ограничения тока, VR вход на компараторе, вместо специализированной микросхемы и так далее.
Geehy кстати первым в окрестностях анонсировал версию APM32A407 с автомобильной сертификацией AEC-Q100, хотя вероятно это всего лишь полная отбраковка по температуре. Мы очень надеемся, что внутри и он выглядит как stm32f407.
Второй интересный блок это М74.9 от ИТЭЛМА.В 2022 его начали ставить на две модели Нивы и он сделал на базе at32f435. at32f435 от Artery это вроде как тоже аналог другого микроконтроллера от STM — stm32f435 (не сильно отличается от stm32f407) и на нем мы тоже умеем RusEFI.
Новый ЭБУ Нивы
Удивительным образом рядом с микроконтроллером-клоном-аналогом от китайцев мы видим высоко-интегрированный специализированный автомобильный чип L9779 от одного из крупнейших производителей микроэлектроники STMicroelectronics. В этом плане ИТЭЛМА явно пошла другим путём и рискнула использовать чип, заменить который, случись чего, просто так не получится. Кстати, на краю ПП запаян разъём очень похожий на JTAG/SWD.
Про этот блок мы узнали от специалиста по турбированию Нив. Кто ездил на Нивах, тот понимает, почему машина прямо с завода поехала на установку турбины.
В какнун нового года мы маписали письмо Дедушке Морозу, запостили пару статей на Drive2 и накидали сообщений на тематических форумах, что мол, мы хорошо себя вели, документировали код, всегда тестировали изменения перед мержем и теперь очень хотим один из этих блоков. А лучше оба два.
Реверс
Блок S105 Дедушка Мороз доставил мне 28 декабря. Видимо Дедушка гоняет на УАЗ буханке. А уже 5 января мы запустили на этом блоке RusEFI и радостно помигали светодиодами, подключенными на выходы форсунок
Hidden text
Особо внимательные могут спросить «а фигли светодиоды всегда горят и только яркость меняется?». А это артефакт от схемы диагностики выхода — в ЭБУ по этим выходам помимо силовых полевиков стоят еще высокоомные делители и сигнал с них идет на процессор. Проц следит, чтобы при выключенном выходе на нем было напряжение аккумулятора (через достаточно низкое сопротивление форсунки). А при включенном выходе на нем должно быть около нуля вольт. Так он определяет обрыв цепи, неисправность выходного транзистора и с некоторыми извращениями, возможно, так же замыкание на +12В или землю.
Так вот сопротивления этого делителя оказалось достаточно для создания тока от которого светодиоды начинали тускло светить.
Пока это очень раннее демо, оно не дружит со штатным бутлоадером (я его пока тупо снес), общается только по CAN, не умеет K-line и так далее, но оно работает!
Это, конечно, не так впечатляет как Linux на калькуляторе или doom на тесте на беременность, но для нас это большой шаг в сторону пользователей. Поэтому хочется поделиться краткой историей этого реверса. Тем более, что реверс, зачастую, прекрасная возможность повысить свой скил. А реверс инженеринг железа — прекрасная возможность попробовать себя в embedded программировании без смс и регистрации, т.е. не тратясь на разработку своего железа. В ходе этого реверса паяльник пришлось брать в руки один раз. Но обо всем по порядку.
Минимальный (и достаточный) набор аппаратного хакера в 2022
именно так, тестер, цветные ручки и листы А4 (пока выступают фоном)
1. Визуальный осмотр
Разглядываем, списываем все маркировки, качаем даташиты.
На этом этапе по маркировке не удалось определить только два одинаковых чипа в soic-8. Но по их расположению, наличию больших конденсаторов в обвязке, да и просто методом исключения, стало понятно что это LDO.
Понятно, что разглядывать каждый резистор сейчас не стоит. Равно как и всякие мелкие sot-23 и тому подобные компоненты. Их назначение, в большинстве случаев, станет очевидно, когда разберетесь с «большими» компонентами.
На этом этапе желательно распечатать распиновки всех «больших» микросхем. Прямо на этих распечатках будем отмечать, что и куда идет.
2. Поиск документации
В случае ЭБУ — это схемы электропроводки соответствующих машин. По схемам удалось выяснить куда ему подавать питание. Это знание лучше подтвердить тестером. Ну и подавать питание в первый раз стоит от лабораторного блока питания с разумным ограничением по току (в моем случае 50…100 мА).
3. Берем в руки тестер
Мне не терпелось проверить свое предположение о том, что добрые разработчики вывели на незапаянную гребенку отладочный интерфейс SWD. Распиновка проца известна, где у него SWD тоже. Делов на 5 минут.
Удача! В рядок идут SWDIO, GND, SWCLK, VDD (3.3). И еще пара сигналов, которые меня пока не интересуют.
4. Цепляем отладчик
Следующим этапом надо было проверить, а есть ли возможность подцепиться к процессору отладчиком. Если отладка заблокирована фьюзами, это усложнит работу. Вероятно, пришлось бы пересаживать на плату другой, не заблокированный, процессор. Или танцевать с режимами загрузки и пытаться стереть проц и фьюзы через rom загрузчик. Честно говоря, даже не знаю, есть ли такая возможность на STM32, или они безвозратно блокируются.
Вот тут единственнный раз пригодился паяльник. На отсутствующее место была запаяна гребёнка контактов. В качестве SWD отладчика я используют STlink, встроенный в stm32f4discovery. Неубиваемая штука. Цепляем 4 проводка, подаем питание на ЭБУ. запускаем openOCD, снова удача:
$ openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
....
Info : Target voltage: 2.905487
Info : stm32f4x.cpu: Cortex-M4 r0p1 processor detected
Info : stm32f4x.cpu: target has 6 breakpoints, 4 watchpoints
....
Трясущимися руками цепляемя телнетом и пробуем слить прошивку. Третья удача подряд — прошивка оказалась не залоченной. Прошивка пригодится нам на следующих этапах, когда мы захотим разобраться с бутлоадером — негоже пользователей заставлять вскрывать ЭБУ и паять SWD.
Кстати, беглый просмотр полученного бинаря hexdump’ом показал, что бутлоадер занимает аж 64К в начале флеша. В RusEFI мы используем OpenBLT и для него зарезервировано 16Кб.
5. Уроки рисования
Теперь, когда понятно, что прошить железку можно, начинается нудная часть — срисовывание схемы. Тут есть пара советов:
Если на плате нет шелкографии (а зачем она на серийном устройстве?) — пронумеруйте все большие компоненты. Кто-то делает фото и расставляет обозначения на фото. Я беру лист А4, на нем схематично разрисовываю большие компоненты и нумерую их. Точность не нужна, главное примерно соблюсти взаимное расположение. Чтобы через неделю можно было соотнести рисунок и плату.
Поиск одинаковых паттернов. В ЭБУ куча силовых выходов и куча аналоговых входов. Эти блоки выполнены однотипно. Все различия в номиналах всяких там делителей напряжения, подтяжках и так далее. Достаточно срисовать по одному такому блоку, выяснить каким концом он идет на разъем, а каким к процессору и можно начинать прозванивать.
Вот схема управления и диагностики катушки зажигания. Таких блоков на плате 2 (еще 2 опционально).
6. Прозваниваем
Я использую древний тестер в режиме прозвонки диодов и пищалки. При этом на диоды (и другие pn переходы) он не пищит. Тут не стоит опасаться что-то сжечь. Во всяком случае в устройствах типа этого.
С процом сейчас повезло, он не BGA, поэтому ставим один щуп на интересующую нас цепь, а второй скользим по ножкам проца, без особого усилия. Моему тестеру хватает контакта на долю секунды чтобы пискнуть (есть задумчивые тестеры — ими прозванивать неудобно). После того как услышали писк — возвращаемся и начинаем считать ноги от ближайшего угла.
На этом этапе надо иметь распечатку с пинаутом проца. На ней уже должны быть вычеркнуты все ножки питания, кварцы и тому подобные пины с однозначной функцией. Каждый найденный сигнал отмечаем на этом пинауте и параллельно вписываем в таблицу. На пинауте я использую разные цвета для разных типов цепей: выходы, входы, интерфейсы. Параллельно вычеркиваем или другим образом помечаем все вызвоненные компоненты на общем плане. Задача — вычеркнуть/пометить как можно больше компонентов на общем плане. На пинауте процессора этого не факт что можно достичь — могут быть неиспользуемые ноги. Но их тоже желательно найти — вдруг потом захочется добавить светодиод или консоль или еще что.
Если у вас BGA процессор — этап усложняется. Если устройств много и не жалко уничтожить одно — сдувайте проц и прозванивайте. Если жалко — придется писать тестовую прошивку, которая будет ставить интересующие нас ноги в нужное положение или постоянно дергать их туда сюда, а по плате уже тыкаться щупом осциллографа.
На выходе получаем Такой «набор документации».
Тут не до аккуратности т.к. в одной руке один щуп, в другой второй, третьей рукой вы придерживаете плату и ногой записываете результаты.
7. Анализируем штатную прошивку
Этап не всегда доступен. Прошивку может быть невозможно слить, она может быть уничтожена в процессе «разлочки» проца и так далее. Но если уж повезло, то тут кто на что гаразд. Можно расковырять ее дизассемблером (аж передернуло, как вспомнил ночи за IDA и состояние измененного сознания под утро).
В моем случае устройство достаточно простое, поэтому я с помощью дебагера с рабочей железки дампнул регионы памяти с настройками GPIO и сравнил с таблицей что получил на этапе прозвонки. Сильных расхождений не выявил и успокоился. Паралельно разобрался, что для полного открытия полевиков (а им для этого не хватает 3.3В) проц ставит соответствующие ноги с режим Open-Drain, а на плате присутствуют подтяжки к +5В.
К ковырянию в штатной прошивке еще придется возвращаться, когда буду изучать бутлоадер и тогда я так легко уже не отделаюсь.
8. Льем свой код
К этому этапу я накопил достаточно данных, чтобы поправить нашу прошивку под железо и попытаться запустить.
С чем столкнулся (мнение выжившего, бла-бла-бла, в следующий раз будут совершенно новые грабли):
В этом ЭБУ процу не доложили кварцев, хотя места под оба кварца (HSE, LSE) есть, надо переключить настройки PLL на использование внутреннего генератора.
Проц управляет вторым LDO, который делает 5В для нескольких потребителей, в числе которых CAN трансивер. Это я не вызвонил. Штатная прошивка, похоже, не включает этот источник пока не будет какой-то внешней активности — например, сигнала зажигания. Так что те настройки GPIO, что я дампнул с рабочей прошивки мне тут не помогли. Потратил некоторое время тупо не понимая почему сигнал не проходит через CAN трансивер, пока не догадался встать щупом ему на ножку питания.
Ну и кучка мелких нюансов, связанных с нашим кодом, который еще ни разу не запускали на проце настолько стесненном в объемах flash памяти.
Вместо заключения
А дальше надо это попробовать на реальной машине. Как показывает опыт — сразу всплывает куча неожиданных нюансов.
Надо разбираться с загрузчиком. Ведь пользователь не будет вскрывать блок ради подключения SWD и прошивки. И, вероятно, часть пользователей захочет вернуться на родную прошивку.
Надо из родной прошивки выковырить все таблицы по которым управляется двигатель, конвертировать их в наш формат и сделать «консерву», чтобы машина могла передвигаться на нашей прошивке «из коробки» не хуже, чем на оригинальной.
И куча других веселых активностей. Об этом расскажу в следующей статье.
А еще
Теперь очень хочется сделать то же самое на М74.9 от ИТЭЛМА. Там прикольная микросхема L9779. Мы ее рассматривали как альтернативу нашей любимой TLE8888, которую мы ставим на MicroRusEFI
Но пока вариантов купить такой ЭБУ не представилось. Видимо кто-то из нас все же сломал прод в том году.
Hidden text
Может нас здесь прочитает кто-то из ИТЭЛМА или может быть кто-то уже списал свою новую Ниву?
Надеюсь, кому-то эта статья покажется интересной. Возможно, кто-то даже встанет из-за компа и пойдет разбирать какую-то железку, устройство которой его всегда интересовало.
Может кто-то захочет влиться в нашу дружную команду и помочь нам с разработкой. Или у кого-то есть идеи как это все монетизировать. Ведь как говорится «Выбери себе работу по душе, и тебе не придётся работать ни одного дня в своей жизни. Кушать ты тоже будешь редко».
Понимаю, что статья получилась сумбурная и без подробностей, поэтому с удовольствием отвечу (в меру своей компетенции) на вопросы в комментариях.