Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
# Как прошить REFORMAT на Ford Sync3

Как прошить REFORMAT на Ford Sync 3

English version ➡️

Intro

Данный способ позволяет прошить Sync3 по USB, даже если он был полностью окирпичен 🧱. При этом не требуется припаивать ни картридер, ни какие-либо другие провода. Единственное что нужно, так это разобрать плату и замкнуть два контакта.

TL;DR ➡️

Hardware

Блок Ford Sync3 состоит из двух плат:

  • Основная плата - IPC с TI Omap5432 SoC в роли основного процессора, RAM, eMMC flash.
  • Вторая плата - VMCU. На ней расположены CPLD и микроконтоллер. Эта часть отвечает непосредственно за интерфейс CAN (так как Omap5432 его не имеет), а также эта плата выполняет роль внешнего watchdog'a для основного CPU.

IPC и VMCU обмениваются между собой по интерфейсу UART, скорость 500kbps, для передачи пакетов используется COBS кодировка. Но подробнее об этом как-нибудь в другой раз 🙃

OMAP5432 boot mode

В соответствии с публичным даташитом OMAP5432 Multimedia Deviced мы можем получить информацию о способах и порядке загрузки Omap5432.

Она приведена в разделе 2.6 SYSBOOT configuration.
Вот табличка из этого даташита. sysboot

Все внимание на sys_boot3. Именно он меняет приоритет загрузки с USB. То есть, если прижать sys_boot3 к земле, то SOC начнет грузиться с USB в первую очередь.

Но как найти sys_boot3?

В этом нам поможет другой даташит OMAP5432Multimedia Device Engineering Samples 2.0 который содержит описание пинов(шариков, если хотите😊) процессора, а также схему с их расположением(Figure 2-1. OMAP5432 AAN S-PBGA-N754 Package (Bottom View)).

Находим наш sys_boot3 и видим что он расположен на месте V31. sysboot

Но как до него добраться?

Так как шарик с V31 находится под процессором, к нему невозможно подобраться без специнструмента.

Но тут на помощь пришел Cusco. Он прозвонил разъемы от Soc до многочисленных контрольных точек(TP), расположенных на плате.

И таки нашел V31!
sysboot

Теперь мы готовы к загрузке в Sync3 по USB.

USB boot

Пришло время подключить Sync3 к PC по miniUSB кабелю. Затем начинаем будить плату пакетами по CAN(с этим отлично справится даже любой elm). Замыкаем два обведенных контакта и подаем питание 12V.

Смотрим лог(dmesg) и видим:

kernel: [431083.350475] usb 1-3: new high-speed USB device number 114 using xhci_hcd
kernel: [431083.499541] usb 1-3: New USB device found, idVendor=0451, idProduct=d011, bcdDevice= 0.00
kernel: [431083.499555] usb 1-3: New USB device strings: Mfr=33, Product=37, SerialNumber=0
kernel: [431083.499561] usb 1-3: Product: OMAP5430
kernel: [431083.499566] usb 1-3: Manufacturer: Texas Instruments

Отлично, SoC увиделся по USB и ожидает загрузки в него кода...

Но что в него загружать?

Тут следует сделать небольшую ремарку. USB boot в Omap5432 это не совсем то же самое, что и загрузка с eMMC или SD карты. Мы не можем просто отформатировать USB флешку определенным образом и загрузиться с нее, как это делается в PC. Вместо этого по USB мы должны передать в Soc наш исполняемый код(загрузчик), а вот уже в этом загрузчике реализовать доступ к eMMC.

После нескольких дней гугления удалось найти ссылки на статьи об отладочной плате TI OMAP5 5432 uEVM ES2.0 (Panda5) ведущие на http://omapedia.org. Пытаемся перейти и... нас редиректит на www.ti.com.
Сайт выпилен. fuck!

Однако web.archive.org помнит все, ну или по крайней мере многое 😌

Как ни странно ссылки на исходники были живые. Нас интересует в первую очередь утилита UsbBoot(Omapboot).
Тянем исходники git clone git://git.omapzoom.org/repo/omapboot.git usbboot && git checkout 33af7cb409b603cf7988306ab2ea70f052a9a02b и пробуем собрать.

Для сборки под Omap нужен тулчейн под Armv7. Можно взять тот, который в статье из wiki, но для этого придется выкачать весь android'овский репозиторий. Поэтому мы поступим проще и возьмем собранный тулчейн отсюда.

Отлично, теперь у нас есть что загружать в SoC. Загружаем...

user@pc:~/$ sudo ./out/omap5uevm/usbboot -f
reading ASIC ID
CHIP: 5430
rom minor version: 02
IDEN: 0000000000000000000000000000000000000000
MPKH: 0000000000000000000000000000000000000000000000000000000000000000
CRC0: 071a9a31
CRC1: 00000000
device is GP
using built-in GP iboot of size 23-KB
sending 2ndstage to target...
waiting for 2ndstage response...
received 2ndstage response...

После загрузки и получения ответа по USB от нашего свежесобранного загрузчика, мы можем подключиться к Omap'у утилитой fastboot (да, да, той самой что для android) и попробовать выполнить пару команд.

fastboot

Подведем промежуточный итог

  • Мы научились менять порядок загрузки с USB.
  • Мы научились запускать свой собственный загрузчик.
  • У нас есть рабочий канал USB для взаимодействия между PC и процессором Sync'a.

Пришло время научится прошивать eMMC Sync'a своими образами, передаваемыми по USB с PC.

Reformat

Пакет реформата предназначен для заводской(чистой) установки ОС Sync3. Он состоит из 2х частей:

  1. MLO - Загрузчик
  2. QNX-IFS-REFORMAT - Образ ОС, выполняющий заводскую установку Sync3.

Именно эти файлы нам и нужно записать на eMMC. Осталось понять где именно в eMMC они должны размещаться.

Для этого посмотрим оригинальный скрипт установки реформата. Видим там такую строчку update_boot -t -i /tmp/QNX-IFS-REFORMAT -m /tmp/MLO

Ага, значит есть некая утилита update_boot, которая в Sync выполняет всю установку. Что ж будем ковырять ее...

Первым делом strings update_boot:

Usage: %s [-i] [-m] raw partition

	-i   Path of IFS image file
	-m   Path of MLO image file
	-t   Toggle active IFS partition
	-r   replace current IFS with new one
	raw partition   Path of raw partition to write IFS and MLO image files, default value is /dev/hd0.

С параметрами стало более менее понятно, дело за малым - понять что именно эта софтина делает. Берем гидру и засовываем наш update_boot туда. Процесс декомпиляции выходит за рамки этой статьи. Кому интересно, вот ссылка репозиторий с говнопсевдокодом, полученным в результате декомпиляции.

В итоге получаем вот такую вот картину разметки eMMC для Sync3.

Sync3 eMMC layout

block offset name
0x0000 MBR
0x0002 0x0000400 (1024) boot bank info
0x0100 0x0020000 (131072) MLO
0x0184 0x0030800 (198656) IFS first bank
0x7cd2 0x0F9A400 (16360448) IFS second bank

Sync3flash

Загрузчик, который мы собирали ранее, уже имеет функции для чтения\записи флешки. Адреса, по которым нужно писать образ реформата, мы получили в предыдущем пункте.

Немного перепишем оригинальный usbboot выкинув оттуда все лишнее и добавив прошивку MLO и QNX-IFS-REFORMAT по нужным нам смещениям. Получившаяся софтина sync3flash.

Прошивка eMMC Sync3

Для прошивки нужен PC с Linux (виртуалка не подойдет, но можно использоваться livecd флешкой, например puppy linux)

sync3flash

Также требуются файлы реформата (MLO и QNX-IFS-REFORMAT)

Итак, теперь у нас есть все необходимое для прошивки. Приступаем:

  1. Подключаем Sync3 к напрямую PC по microUSB кабелю. (подключение через хаб работать не будет)

  2. Начинаем отправку CAN сообщений, которые будят Sync.

  3. Запускаем sudo ./sync3flash -i QNX-IFS-REFORMAT -m MLO

  4. Замыкаем контакты, обведённые красным short

  5. Подаем питание на Sync.

Если все успешно, то должны увидеть вывод вида:

user@user-PC:/tmp$ sudo ./sync3flash -m MLO -i QNX-IFS-REFORMAT 
waiting for device...
reading ASIC ID
CHIP: 5430
rom minor version: 02
IDEN: 0000000000000000000000000000000000000000
MPKH: 0000000000000000000000000000000000000000000000000000000000000000
CRC0: 071a9a31
CRC1: 00000000
device is GP
sending 2ndstage to target...
waiting for 2ndstage response...
sending image to target...size (22696-B/22-KB/0-MB)
sending image to target...size (9279956-B/9062-KB/8-MB)

Через 30 секунд Sync 3 перезагрузится и загрузится реформат. Вот и все...

PS:

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

PPS:

Большое спасибо Cusco за помощь по аппаратной части, идейным вдохновителям Sanek2033 и Au{R}oN, а также Lynx за идею.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment