Данный способ позволяет прошить Sync3 по USB, даже если он был полностью окирпичен 🧱. При этом не требуется припаивать ни картридер, ни какие-либо другие провода. Единственное что нужно, так это разобрать плату и замкнуть два контакта.
TL;DR ➡️
Блок Ford Sync3 состоит из двух плат:
- Основная плата - IPC с TI Omap5432 SoC в роли основного процессора, RAM, eMMC flash.
- Вторая плата - VMCU. На ней расположены CPLD и микроконтоллер. Эта часть отвечает непосредственно за интерфейс CAN (так как Omap5432 его не имеет), а также эта плата выполняет роль внешнего watchdog'a для основного CPU.
IPC и VMCU обмениваются между собой по интерфейсу UART, скорость 500kbps, для передачи пакетов используется COBS кодировка. Но подробнее об этом как-нибудь в другой раз 🙃
В соответствии с публичным даташитом OMAP5432 Multimedia Deviced мы можем получить информацию о способах и порядке загрузки Omap5432.
Она приведена в разделе 2.6 SYSBOOT configuration
.
Вот табличка из этого даташита.
Все внимание на 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.
Но как до него добраться?
Так как шарик с V31 находится под процессором, к нему невозможно подобраться без специнструмента.
Но тут на помощь пришел Cusco. Он прозвонил разъемы от Soc до многочисленных контрольных точек(TP), расположенных на плате.
Теперь мы готовы к загрузке в Sync3 по USB.
Пришло время подключить 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) и попробовать выполнить пару команд.
- Мы научились менять порядок загрузки с USB.
- Мы научились запускать свой собственный загрузчик.
- У нас есть рабочий канал USB для взаимодействия между PC и процессором Sync'a.
Пришло время научится прошивать eMMC Sync'a своими образами, передаваемыми по USB с PC.
Пакет реформата предназначен для заводской(чистой) установки ОС Sync3. Он состоит из 2х частей:
- MLO - Загрузчик
- 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.
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 |
Загрузчик, который мы собирали ранее, уже имеет функции для чтения\записи флешки. Адреса, по которым нужно писать образ реформата, мы получили в предыдущем пункте.
Немного перепишем оригинальный usbboot выкинув оттуда все лишнее и добавив прошивку MLO и QNX-IFS-REFORMAT по нужным нам смещениям. Получившаяся софтина sync3flash.
Для прошивки нужен PC с Linux (виртуалка не подойдет, но можно использоваться livecd флешкой, например puppy linux)
Также требуются файлы реформата (MLO и QNX-IFS-REFORMAT)
Итак, теперь у нас есть все необходимое для прошивки. Приступаем:
-
Подключаем Sync3 к напрямую PC по microUSB кабелю. (подключение через хаб работать не будет)
-
Начинаем отправку CAN сообщений, которые будят Sync.
-
Запускаем
sudo ./sync3flash -i QNX-IFS-REFORMAT -m MLO
-
Замыкаем контакты, обведённые красным
-
Подаем питание на 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 перезагрузится и загрузится реформат. Вот и все...
Данный рассказ носит исключительно развлекательно-образовательный характер и не призывает никого к каким-либо действиям. Все персонажи вымышлены, а совпадения случайны.
Большое спасибо Cusco за помощь по аппаратной части, идейным вдохновителям Sanek2033 и Au{R}oN, а также Lynx за идею.
hi! thank you for work. I tried but get message sync3flash: command not found
Can you help me?
Thank you