Вступление
Объектом рассмотрения в данной статье стал SRS блок с маркировкой 8635A 568, снятый с автомобиля Mitsubishi ASX. Интерес к случаю обусловлен как нестандартной предысторией, так и состоянием, в котором оно поступило. По словам заказчика, автомобиль попал под воду, откуда, как известно, электронные блоки возвращаются редко и, как правило, уже неработоспособными. При первичном осмотре сразу стало ясно, что мы не первые, кто пытался вернуть блок к жизни.

Выяснилось, что клиент уже обращался с ремонтом этого блока к другому специалисту. В качестве донора он приобрёл схожий по номеру бу блок SRS 8635A569. Однако, при более детальном изучении оказалось, что данный блок имеет более богатую комплектацию. Специалист попытался исправить эту ситуацию. Он решил переставить все компоненты с блока 8635A569 на 8635A568. Очевидно, что задача не из тривиальных. Для того чтобы уровнять комплектацию была проделана большая работа. Так этот блок попал к нам в руки.
Анализ ошибки
При запуске на столе, блок выдает следующую ошибку:
B1557 SRS-ECU application specific integrated circuit [00]
Информация от Mitsubishi по ошибке B1557:
The self-diagnostic function used by the internal acceleration sensor in the SRS-ECU may misinterpret vibration caused by severe road conditions and/or driving on a flat tire to be a malfunction in the SRS-ECU. If this occurs, the SRS warning lamp will illuminate and none of the seven airbags available in the vehicle will deploy in the event of a crash.
То есть, говорится, что это вызвано внутренним датчиком ускорения, коих тут два. На самом деле информация эта не совсем верна...
При более глубоком исследовании и проведении диагностики на столе стало понятно, что проблема не только в ошибке B1557. В диагностическом отчёте не отображается ни одной ошибки по запалам подушек безопасности, которых на столе, естественно, нет.
Список DTC(Diagnostic Trouble Code) приведен ниже в разделе «Диагностика на столе».
При ремонте блоков мы часто опираемся на свой прошлый опыт. Ошибка B1557 уже встречалась ранее при работе с похожим блоком SRS Mitsubishi. Попробовали провести действия, которые в прошлый раз помогли. В данном случае так просто решить проблему не получилось.
Диагностика на столе при 48032
VIN:
Чтение данных ЭБУ...
JE4LPT1U8RU702686
ECU:
Чтение данных ЭБУ...
8635A568
Чтение DTC...
4 errors found:
U1190 No receive fault detect signal [00]
B1409 Front impact sensor (RH) communication impossible [00]
B1419 Front impact sensor (LH) communication impossible [00]
B1557 SRS-ECU application specific integrated circuit [00]
Первые шаги к устранению ошибки
На начальном этапе восстановления были предприняты попытки поработать с дампом памяти EEPROM, записать донорские дампы, однако данные действия не дали положительного результата — состояние блока не изменилось. В качестве следующего шага была проведена замена драйвера.
Анализ платы показал, что драйвер BOSCH 40090, который стоит в блоке 8635A569 был заменен на 48032. При попытке обратной замены и проведении диагностики, добавились ошибки по боковым датчикам, которых раньше не было. DTC также приведен в разделе «Диагностика на столе».
Диагностика на столе после замены драйвера подушек безопасности
VIN:
Чтение данных ЭБУ...
JE4LPT1U8RU702686
ECU:
Чтение данных ЭБУ...
8635A568
Чтение DTC...
8 errors found:
B1498 SRS-ECU abnormal condition in ROM or RAM [00]
B1427 Side impact sensor (RH) voltage error [00]
B1437 Side impact sensor (LH) voltage error [00]
U1190 No receive fault detect signal [00]
B1409 Front impact sensor (RH) communication impossible [00]
B1419 Front impact sensor (LH) communication impossible [00]
B1476 IG1 power supply open circuit (Fuse No. 16 circuit) [00]
B1557 SRS-ECU application specific integrated circuit [00]
Возникшие ошибки позволили предположить два возможных сценария. Либо при замене не были корректно перенесены все резисторы, определяющие конфигурацию драйвера. Либо ошибка прописалась в EEPROM и является нестираемой. Сначала пробуем восстановить прошивку EEPROM 95128. На просторах интернета находим донора от 8635A 568. Попробуем почистить ошибки в области 0x1E14
. После перезагрузки блока появилась новая ошибка.
B1498 SRS-ECU abnormal condition in ROM or RAM [00].
Ошибка это более серьезная, чем B1557, которая может говорить о неправильной конфигурации заданной в EEPROM, также может говорить о нехватки драйверов и о более серьезных проблемах. Значит драйвер 40090 с этой конфигурацией использовать нельзя. Возвращаем оригинальный драйвер 48032. Так как драйвер может быть неисправен, исключаем эту возможность, приобретая донорский блок от Mercedes, в котором также установлен BOSCH 48032
. Для того чтобы это узнать, пользуемся нашей фото базой SRS.
После этого был заменён процессор. Мы вернули в блок оригинальный процессор от 8635A569. Это не привело к улучшению, так как прошивка данного процессора опять же требовала два драйвера и другую комплектацию.
Попытка чтения CPU
На данном этапе стало понятно, что прошивка процессора нам не подходит. Необходимо научиться читать и писать, что потенциально позволило бы перенести рабочее содержимое памяти в идентичный или совместимый процессор. Главной проблемой было то, что официальной документации по проприетарному процессору TMS470PV241BBP на просторах интернета просто не найти. В линейке Texas Instruments, однако, существуют процессоры с похожей распиновкой и маркировкой.
Самый ближайший процессор, по которому удалось найти DataSheet, оказался процессор с маркировкой TMS470MF04207. Основная часть расположения пинов именно по этому процессору и была определена. С наличием DataSheet легко определить площадки для подключения JTAG, они представлены на рисунке .

Были проделаны попытки подключения средствами программатора J-Link. При подключении с помощью ПО JFlash видим следующую картину:
Подключение программатором J-Link
InitTarget() start
TotalIRLen = 4, IRPrint = 0x01
TMS470M (connect): Can not find ICE-Pick (IRLen mismatch). IRLen found: 0x00000004
TotalIRLen = 4, IRPrint = 0x01
JTAG chain detection found 1 devices:
#0 Id: 0x3100E02F, IRLen: 04, ARM7TDMI Core
TMS470M (connect): Can not find ICE-Pick (IDCODE mismatch). Expected 0x0B00002F, found: 0x00000000
InitTarget() end - Took 2.80ms
Connect failed. Resetting via Reset pin and trying again.
InitTarget() start
TotalIRLen = ?, IRPrint = 0x..000000000000000000000000
TMS470M (connect): Can not find ICE-Pick (IRLen mismatch). IRLen found: 0x00000280
TMS470M (connect): Can not find ICE-Pick (IDCODE mismatch). Expected 0x0B00002F, found: 0x00000000
InitTarget() end - Took 614us
Если подключится как TMS470R1A256 есть соединение, но программатор выдаёт ошибку, что не получается выполнить операцию halt:
Подключение программатором как TMS470R1A256
Device position in JTAG chain (IRPre,DRPre) <Default>: -1,-1 => Auto-detect
JTAGConf>
Specify target interface speed [kHz]. <Default>: 4000 kHz
Speed>
Device "TMS470R1A256 (ALLOW KEYS)" selected.
Connecting to target via JTAG
TotalIRLen = 4, IRPrint = 0x01
JTAG chain detection found 1 devices:
#0 Id: 0x3100E02F, IRLen: 04, ARM7TDMI Core
Memory zones:
Zone: "Default" Description: Default access mode
ARM7 identified.
J-Link>regs
CPU is not halted !
Удалось подключиться только с помощью утилиты J-Link Commander.
С помощью J-Link Commander командой savebin
была считана flash память процессора соответствии с описанной в datasheet Memory Map. Однако необходимо было понять, почему не сработал J-Link Flash.
Если установить RAM address = 0x8000000, JFlash начинает соединяться, но выполнить программу в памяти не может.
После изучения логов JLink были сделаны выводы о том, что, возможно, должен быть применен маппинг оперативной памяти, и некоторые регистры должны быть инициализированы до начала работы с оперативной памятью. Так как информации о регистрах этого процессора никакой практически не было, было принято решение по реверсу кода. Мы исходили из той предпосылки, что код также использует флеш память, и должен инициализировать всё в самом начале программы. Для загрузки дампа памяти, полученного с помощью JLink Commander в IDA Pro, пришлось специально указать формат записи Little endian, чтобы IDA смогла дизассемблировать корректно.
Реверс кода
После успешного дизассемблирования пришлось потратить некоторое время для нахождения функции инициализации. Она была найдена и с помощью нее можно определить начальные значения регистров.
void __fastcall sub_5E48(int a1, int a2, int a3, int a4)
{
int v4; // r8
int v5; // r0
int v6; // r0
_DWORD *v7; // [sp+4h] [bp-Ch]
MEMORY[0xFFFFFF70] = 0;
MEMORY[0xFFFFFF74] = 0x7FC07A00;
MEMORY[0xFFFFFF10] = 0x100;
MEMORY[0xFFFFE0A0] = 0x10000001;
MEMORY[0xFFFFE0A4] = 0x11;
MEMORY[0xFFFFE0A8] = 0x11;
MEMORY[0xFFFFE0F0] = 0x80008080;
MEMORY[0xFFFFE074] = 0x80008080;
MEMORY[0xFFF87104] = &loc_7F10;
v5 = MEMORY[0xFFF87100];
MEMORY[0xFFFFFFC0] = 0x11;
(_DWORD )(v4 + MEMORY[0xFFF87100]) = 24248;
v6 = v5 << 30;
while ( v6 >= 0 )
;
MEMORY[0xFFFFFF48] &= 0xFFFFFFFu;
MEMORY[0xFFFFFFD4] = MEMORY[0xFFFFFF48] + 1;
*v7 = MEMORY[0xFFFFFF00];
__asm { BX R3 }
}
В ПО JFlash существует возможность писать в регистры при инициализации, то есть необходимо произвести RESET и после написать инициализационные команды, по типу записи по определенному адресу определенного значения, что и было реализовано
Скрипт JLink
InitStep0_Action = "Reset"
InitStep0_Value0 = 0x00000000
InitStep0_Value1 = 0x00000064
InitStep0_Comment = ""
InitStep1_Action = "Write 32bit"
InitStep1_Value0 = 0xFFFFFF70
InitStep1_Value1 = 0x00000000
InitStep1_Comment = ""
InitStep2_Action = "Write 32bit"
InitStep2_Value0 = 0xFFFFFF74
InitStep2_Value1 = 0x7FC07A00
InitStep2_Comment = ""
InitStep3_Action = "Write 32bit"
InitStep3_Value0 = 0xFFFFFF10
InitStep3_Value1 = 0x00000100
InitStep3_Comment = ""
InitStep4_Action = "Write 32bit"
InitStep4_Value0 = 0xFFFFE0A0
InitStep4_Value1 = 0x10000001
InitStep4_Comment = ""
InitStep5_Action = "Write 32bit"
InitStep5_Value0 = 0xFFFFE0A4
InitStep5_Value1 = 0x00000011
InitStep5_Comment = "MFBALR1 "
InitStep6_Action = "Write 32bit"
InitStep6_Value0 = 0xFFFFE0A8
InitStep6_Value1 = 0x00000011
InitStep6_Comment = "MFBAHR2"
InitStep7_Action = "Write 32bit"
InitStep7_Value0 = 0xFFFFE0F0
InitStep7_Value1 = 0x80008080
InitStep7_Comment = "MFBALR2"
InitStep8_Action = "Write 32bit"
InitStep8_Value0 = 0xFFFFE074
InitStep8_Value1 = 0x80008080
InitStep8_Comment = "MFBAHR3"
InitStep9_Action = "Write 32bit"
InitStep9_Value0 = 0xFFFFFE1C
InitStep9_Value1 = 0x00002020
InitStep9_Comment = ""
InitStep10_Action = "Write 32bit"
InitStep10_Value0 = 0xFFFFFE20
InitStep10_Value1 = 0x00000000
InitStep10_Comment = ""
InitStep11_Action = "Write 32bit"
InitStep11_Value0 = 0xFFFFFE24
InitStep11_Value1 = 0x00000000
InitStep11_Comment = ""
InitStep12_Action = "Write 32bit"
InitStep12_Value0 = 0xFFFFFE04
InitStep12_Value1 = 0x00000190
InitStep12_Comment = ""
InitStep13_Action = "Write 32bit"
InitStep13_Value0 = 0xFFFFFF0C
InitStep13_Value1 = 0x000000E5
InitStep13_Comment = "Activate mapping"
InitStep14_Action = "Write 32bit"
InitStep14_Value0 = 0xFFFFFF0C
InitStep14_Value1 = 0x000000A3
InitStep14_Comment = ""
InitStep15_Action = "Write 32bit"
InitStep15_Value0 = 0xFFFFFFDC
InitStep15_Value1 = 0x00000003
InitStep15_Comment = "Freq"
JFlash начал соединятся, и удалось прочесть память уже с помощью него. Запись по-прежнему не работала, но это отдельный разговор, сначала надо вычитать программу оригинального процессора.
Финальная фаза ремонта
Были произведены попытки переноса прошивки микроконтроллера с оригинального блока 8635A568. Однако при считывании данных возникли трудности: ряд адресов оказался недоступен для чтения, что может свидетельствовать о повреждении flash-памяти процессора. На этом этапе стало очевидно, что восстановление текущего экземпляра блока невозможно, несмотря на все ранее предпринятые усилия.
На помощь пришла наша база SRS блоков от множества автомобилей, которую мы собирали много лет. В базе более 2000 блоков от различных автомобилей, поэтому несложно было найти в ней блок, наиболее подходящий по комплектации к ремонтируемому. Были небольшие отличия, но главное, что он также был с одним драйвером! Сама плата и компоненты на ней были крайне похожи по расположению. Поскольку данный блок находится в свободной продаже, его быстро удалось приобрести. После получения был выполнена диагностика.

Диагностика на столе
VIN:
Чтение данных ЭБУ...
Z8TXTGF2WDM048625
ECU:
Чтение данных ЭБУ...
8635A282
Чтение DTC...
19 errors found:
B1648 Passenger's air bag ON indicator lamp (open circuit) [00]
B1489 Passenger's air bag OFF indicator lamp (open circuit) [00]
U1190 No receive fault detect signal [00]
B1632 Knee air bag module (squib) system (open circuit between squib circuit terminals) [00]
B1441 Curtain air bag module (RH) (squib) system (open circuit of squib circuit) [00]
B1451 Curtain air bag module (LH) (squib) system (open circuit of squib circuit) [00]
B1421 Side-airbag module (RH) (squib) system (open circuit of squib circuit) [00]
B1431 Side-airbag module (LH) (squib) system (open circuit of squib circuit) [00]
B1C49 [00]
B1604 Seat belt pre-tensioner (driver's side) (squib) system (open circuit of squib circuit) [00]
B1411 Passenger's (front) air bag module (squib) system (open circuit of squib circuit) [00]
B1401 Driver's air bag module (squib) system (open circuit of squib circuit) [00]
B1429 Side impact sensor (RH) communication impossible [00]
B1439 Side impact sensor (LH) communication impossible [00]
B1409 Front impact sensor (RH) communication impossible [00]
B1419 Front impact sensor (LH) communication impossible [00]
B1574 Passengers air bag cut off switch circuit open [00]
B1547 Passenger's air bag cut off activating circuit [00]
B1499 Air bag deployment determined by SRS-ECU [00]
Видим, что комплектация вновь не соответствует конфигурации оригинального устройства. В частности, присутствуют запалы боковых подушек, шторки, а также расширенная сенсорная группа. Напомним, что в нашем случае штатная система включает только передние подушки, ремни и два фронтальных датчика удара.
С подобными ситуациями мы уже встречались, необходимо перелить туда оригинальный EEPROM, тем самым постараться уменьшить комплектацию. Пробуем загрузить дамп памяти с 8635A568, он частично зачитался, были показаны идентификаторы VIN, а также номер блока, но появилась ошибка B1498, с которой мы уже сталкивались и описывали выше.
Стало ясно, что простой перенос полного дампа EEPROM не обеспечивает корректной инициализации устройства. Было принято решение производить загрузку памяти выборочно, по областям. В частности, была идентифицирована область, отвечающая за конфигурационные параметры блока, а также успешно перенесены VIN и серийный номер.
Со второй попытки удалось собрать рабочую версию прошивки, полностью соответствующую исходной комплектации: фронтальные подушки, ремни безопасности и пара передних датчиков. После финальной сборки и программирования блок был установлен в автомобиль для проверки в реальных условиях.
Как и ожидалось, диагностика прошла успешно, ошибок по компонентам системы не зафиксировано — устройство функционирует штатно, все заявленные элементы системы пассивной безопасности определяются корректно.
