Как стать автором
Обновить

Восстановление блока SRS Mitsubishi

Уровень сложностиСредний
Время на прочтение10 мин
Количество просмотров2K

Вступление

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

Поступивший блок SRS
Поступивший блок SRS

Выяснилось, что клиент уже обращался с ремонтом этого блока к другому специалисту. В качестве донора он приобрёл схожий по номеру бу блок 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 = 0x8000000JFlash начинает соединяться, но выполнить программу в памяти не может.

После изучения логов 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  	Passenger’s 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 и серийный номер.

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

Как и ожидалось, диагностика прошла успешно, ошибок по компонентам системы не зафиксировано — устройство функционирует штатно, все заявленные элементы системы пассивной безопасности определяются корректно.

Успешная проверка рабочего блока
Успешная проверка рабочего блока
Теги:
Хабы:
+21
Комментарии12

Публикации

Истории

Ближайшие события

19 марта – 28 апреля
Экспедиция «Рэйдикс»
Нижний НовгородЕкатеринбургНовосибирскВладивостокИжевскКазаньТюменьУфаИркутскЧелябинскСамараХабаровскКрасноярскОмск
24 апреля
VK Go Meetup 2025
Санкт-ПетербургОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань
14 мая
LinkMeetup
Москва
5 июня
Конференция TechRec AI&HR 2025
МоскваОнлайн
20 – 22 июня
Летняя айти-тусовка Summer Merge
Ульяновская область