Как я раскирпичил комп в своей Мазде
Jul. 31st, 2017 12:47 pm(Note: the English version is here.)
Что произошло
Решил я как-то в очередной раз (уже в третий) обновить прошивку в головном устройстве (CMU) своей Мазды 3 2014 — компе, который управляет музыкой, экраном и всем, что на нём показывается. Как известно тем, кто прошивал, она состоит из двух файлов: ..._failsafe.up и ..._reinstall.up, которые записываются на флэшку, с которой запускается обновление. Основная часть прошивки сидит в двухгиговом reinstall, а в маленьком failsafe — вспомогательный код, управляющий обновлением прошивки, показом процесса и пр. При обновлении я обычно ставлю оба файла, причем первым — failsafe. Обновлялся я с 56.00.513B на 59.00.443C. В этот раз решил ставить только основную часть, где-то вычитав, что failsafe ставить не обязательно. Запустил reinstall — он через какое-то время сказал "Failed to validate package certificate". Тут уже должен был зажечься красный огонёк, но я подумал, что если сначала надо поставить failsafe (мол, это базовый запускающий код), то, может, тогда пойдет основная часть.
Запустил обновление failsafe — он обновился успешно. Снова запустил reinstall — та же проблема. Ну ладно, думаю, потом посмотрим, в чем дело, а пока надо ехать. Завёлся я и поехал. Всё при этом прекрасно работало.
Когда я приехал на место, потом вернулся через полчаса, завёлся — был чёрный экран, ничего не работало, кроме одного радиоканала (того, который звучал последним), регулятора громкости и кнопки Mute. Комп был мёртвым, не было никакой возможности хоть что-то сделать. ⛔
Что было дальше
Повозившись, я вытащил блок CMU вместе с экраном (видео и картинки, как это делается, есть в сети, напр., здесь; есть у меня и service manual). Вначале попытался, как написано здесь, подключиться через известные контакты разъема к TTL консоли, потом даже вскрыл корпус и припаял проводки прямо к контактам на плате. Признаков жизни не было. Теперь понимаю, что и не могло быть.
Оставались два пути: либо купить новую CMU (на eBay нашел несколько вариантов с приемлемой ценой), либо вернуть старую прошивку. Из этих двух страничек я понял, что восстанавливать надо SPI NOR flash — 8-мегабайтную микросхемку. Вскрыв корпус девайса, увидел ее тип — Spansion S25FL064A. Хорошенько поискав, понял, что ее можно перепрошить минимальными средствами. Я решил действовать параллельно: заказал на Ибее и подержанный CMU, и программатор (даже два разных; один пришел с большим опозданием). CMU пришел раньше, но он не работал. Мне вернули деньги (сразу! они знали!), я отправил его назад. В общем, сэкономил $140, а у машинки остался родной девайс.
Как это делается
Для того, чтобы раскирпичить CMU, который не грузится, надо:
знать, что это вполне реально;
на каждом этапе знать, чтО вы делаете, и осознавать возможные риски (хотя, если у вас кирпич, вам терять нечего);
приобрести китайский программатор на чипе CH341A, который продается на eBay за три с половиной доллара;
найти способ выпаять, а потом впаять микросхему в корпусе SOIC-16; мне повезло, у меня оказался сотрудник-радиоэлектронщик с подходящими насадками на паяльник, для которого это было несложно (вообще осторожно с пайкой, от перегрева дорожки могут отскочить!);
разобраться со структурой прошивки и увидеть, чтО у вас не так и как это исправить.
Программатора я ждал больше месяца. Когда он пришел, пришлось ждать еще сотрудника, который уехал в отпуск :) Весь нужный софт легко находится в сети, есть и видео, на котором его ставят. Программатор подходит к нескольким типам чипов; в сборе с панелькой и с напаянной на неё моей микросхемой он выглядел вот так:

Там есть перемычка, изначально соединяющая контакты 1 и 2; трогать ее не надо, такому положению перемычки соответствует драйвер с инсталлятором CH341PAR.EXE. Кроме микросхемы, понадобилось впаять в панельку два ряда контактов, которые входят в комплект. Как они впаяны, видно на фото. Фактически эта панелька играет роль переходника между микросхемой с 16 выводами и половинкой гнезда, предназначенной для микросхем с 8 выводами. (Другая половинка гнезда — для другого типа микросхем.)
Содержимое
Я распаковал несколько пакетов ...failsafe.up (старый, новый, а также еще парочку более старых и более новых) — это zip-файлы с одним и тем же известным паролем. Внутри, кроме корневых файлов, есть три подкаталога: bootstrap, fail-safe и ibc2. В каждом подкаталоге лежит несколько файлов .gz, их я тоже распаковал.
Когда программатор с припаянным чипом заработал, первым делом я, конечно, прочитал 8-мегабайтное содержимое чипа. Благодаря этой страничке я знал, что мне с этим делать.
В каталоге bootstrap каждого пакета были три файла: e0000000001.dat, e0000000002.dat и execute.ini. Из содержимого .ini следовало, что e0000000001.dat — это update-bootstrap.sh (скрипт, запускающий прошивку), а e0000000002.dat — это ibc-cmu-bootstrap.bin, то есть собственно содержимое загрузчика. В каталоге ibc2 лежал файл binary.ini, а также две части раздела ibc2. В каталоге fail-safe — binary.ini и четыре части одного большого двоичного файла, нарезанного кусками по два мега.
Я сравнил соответствующие части прошивки с распакованными файлами. Содержимое секции bootstrap точно соотвествовало файлу e0000000002.dat из каталога bootstrap новой прошивки. Причем вплоть до версии 56.00.513B код загрузчика был одинаковым, в версии 59.00.443C он поменялся, и начиная с неё во всех последующих версиях он снова точно такой же. То есть засада подстерегала именно на этом обновлении. Далее, содержимое секции ibc1 было равно ibc2 от старой прошивки, а ibc2 — ibc2 от новой прошивки. Что логично: ibc1 грузит основную систему, которая не обновилась, а ibc2 обновилась вместе с failsafe. И, наконец, раздел прошивки fail-safe был точной копией двоичных файлов из распакованного каталога fail-safe, примерно 7.5 мег.
Стало понятно, что надо просто заменить в прошивке все новые куски старыми: загрузчик, ibc2 и fail-safe. Разделы конфигурации я не стал трогать, остальные разделы либо отсутствовали, либо что-то содержали, включая номер версии в текстовом виде, который я тоже поменял на старый, остальное не трогал.
Еще было сомнение, не поменять ли байт по адресу 0x10000 (boot-select) с FF (грузить основную систему) на 00 (грузить failsafe, чтобы запустить обновление с флэшки). Я рассудил, что возврат старого загрузчика — это всё, что нужно для того, чтобы система заработала, и никакой failsafe искусственно вызывать не надо. Заодно понял, что мой случай — практически то самое, что и описано на той самой страничке: новый загрузчик не хотел грузить старую основную часть прошивки. Только способ лечения другой.
Прошил микросхему с третьего раза (надо ж было сообразить, что сначала ее надо стереть, иначе никто мне нулевые биты не превратит в единички). Сотрудник перепаял чип на место, я всё подключил — система загрузилась как ни в чем не бывало.
update Октябрь 2017: Я смог-таки проапгрейдиться до версии EU 59.00.449A (сначала failsafe, потом reinstall, без перезагрузки между ними). Думаю, у меня была дефектная флэшка, с которой я пытался прошить 443-ю версию, но больше я ее прошивать не пытался, взял следующую. Всё прошло успешно.
Что произошло
Решил я как-то в очередной раз (уже в третий) обновить прошивку в головном устройстве (CMU) своей Мазды 3 2014 — компе, который управляет музыкой, экраном и всем, что на нём показывается. Как известно тем, кто прошивал, она состоит из двух файлов: ..._failsafe.up и ..._reinstall.up, которые записываются на флэшку, с которой запускается обновление. Основная часть прошивки сидит в двухгиговом reinstall, а в маленьком failsafe — вспомогательный код, управляющий обновлением прошивки, показом процесса и пр. При обновлении я обычно ставлю оба файла, причем первым — failsafe. Обновлялся я с 56.00.513B на 59.00.443C. В этот раз решил ставить только основную часть, где-то вычитав, что failsafe ставить не обязательно. Запустил reinstall — он через какое-то время сказал "Failed to validate package certificate". Тут уже должен был зажечься красный огонёк, но я подумал, что если сначала надо поставить failsafe (мол, это базовый запускающий код), то, может, тогда пойдет основная часть.
Запустил обновление failsafe — он обновился успешно. Снова запустил reinstall — та же проблема. Ну ладно, думаю, потом посмотрим, в чем дело, а пока надо ехать. Завёлся я и поехал. Всё при этом прекрасно работало.
Когда я приехал на место, потом вернулся через полчаса, завёлся — был чёрный экран, ничего не работало, кроме одного радиоканала (того, который звучал последним), регулятора громкости и кнопки Mute. Комп был мёртвым, не было никакой возможности хоть что-то сделать. ⛔
Что было дальше
Повозившись, я вытащил блок CMU вместе с экраном (видео и картинки, как это делается, есть в сети, напр., здесь; есть у меня и service manual). Вначале попытался, как написано здесь, подключиться через известные контакты разъема к TTL консоли, потом даже вскрыл корпус и припаял проводки прямо к контактам на плате. Признаков жизни не было. Теперь понимаю, что и не могло быть.
Оставались два пути: либо купить новую CMU (на eBay нашел несколько вариантов с приемлемой ценой), либо вернуть старую прошивку. Из этих двух страничек я понял, что восстанавливать надо SPI NOR flash — 8-мегабайтную микросхемку. Вскрыв корпус девайса, увидел ее тип — Spansion S25FL064A. Хорошенько поискав, понял, что ее можно перепрошить минимальными средствами. Я решил действовать параллельно: заказал на Ибее и подержанный CMU, и программатор (даже два разных; один пришел с большим опозданием). CMU пришел раньше, но он не работал. Мне вернули деньги (сразу! они знали!), я отправил его назад. В общем, сэкономил $140, а у машинки остался родной девайс.
Как это делается
Для того, чтобы раскирпичить CMU, который не грузится, надо:
Примечание: возможно, выпаивать микросхему необязательно. Существуют контактные зажимы под такие типы корпуса. Я такой заказал на Ибее, но он пришел с большим опозданием, я обошелся без него. Не знаю, заработал ли бы программатор со впаянной микросхемой или нет. Зажим выглядит вот так:
update: в комментариях к английской версии пара человек сообщили, что с помощью такого зажима им удалось прошить микросхему не выпаивая.
Программатора я ждал больше месяца. Когда он пришел, пришлось ждать еще сотрудника, который уехал в отпуск :) Весь нужный софт легко находится в сети, есть и видео, на котором его ставят. Программатор подходит к нескольким типам чипов; в сборе с панелькой и с напаянной на неё моей микросхемой он выглядел вот так:
Там есть перемычка, изначально соединяющая контакты 1 и 2; трогать ее не надо, такому положению перемычки соответствует драйвер с инсталлятором CH341PAR.EXE. Кроме микросхемы, понадобилось впаять в панельку два ряда контактов, которые входят в комплект. Как они впаяны, видно на фото. Фактически эта панелька играет роль переходника между микросхемой с 16 выводами и половинкой гнезда, предназначенной для микросхем с 8 выводами. (Другая половинка гнезда — для другого типа микросхем.)
Содержимое
Я распаковал несколько пакетов ...failsafe.up (старый, новый, а также еще парочку более старых и более новых) — это zip-файлы с одним и тем же известным паролем. Внутри, кроме корневых файлов, есть три подкаталога: bootstrap, fail-safe и ibc2. В каждом подкаталоге лежит несколько файлов .gz, их я тоже распаковал.
Когда программатор с припаянным чипом заработал, первым делом я, конечно, прочитал 8-мегабайтное содержимое чипа. Благодаря этой страничке я знал, что мне с этим делать.
В каталоге bootstrap каждого пакета были три файла: e0000000001.dat, e0000000002.dat и execute.ini. Из содержимого .ini следовало, что e0000000001.dat — это update-bootstrap.sh (скрипт, запускающий прошивку), а e0000000002.dat — это ibc-cmu-bootstrap.bin, то есть собственно содержимое загрузчика. В каталоге ibc2 лежал файл binary.ini, а также две части раздела ibc2. В каталоге fail-safe — binary.ini и четыре части одного большого двоичного файла, нарезанного кусками по два мега.
Я сравнил соответствующие части прошивки с распакованными файлами. Содержимое секции bootstrap точно соотвествовало файлу e0000000002.dat из каталога bootstrap новой прошивки. Причем вплоть до версии 56.00.513B код загрузчика был одинаковым, в версии 59.00.443C он поменялся, и начиная с неё во всех последующих версиях он снова точно такой же. То есть засада подстерегала именно на этом обновлении. Далее, содержимое секции ibc1 было равно ibc2 от старой прошивки, а ibc2 — ibc2 от новой прошивки. Что логично: ibc1 грузит основную систему, которая не обновилась, а ibc2 обновилась вместе с failsafe. И, наконец, раздел прошивки fail-safe был точной копией двоичных файлов из распакованного каталога fail-safe, примерно 7.5 мег.
Стало понятно, что надо просто заменить в прошивке все новые куски старыми: загрузчик, ibc2 и fail-safe. Разделы конфигурации я не стал трогать, остальные разделы либо отсутствовали, либо что-то содержали, включая номер версии в текстовом виде, который я тоже поменял на старый, остальное не трогал.
Еще было сомнение, не поменять ли байт по адресу 0x10000 (boot-select) с FF (грузить основную систему) на 00 (грузить failsafe, чтобы запустить обновление с флэшки). Я рассудил, что возврат старого загрузчика — это всё, что нужно для того, чтобы система заработала, и никакой failsafe искусственно вызывать не надо. Заодно понял, что мой случай — практически то самое, что и описано на той самой страничке: новый загрузчик не хотел грузить старую основную часть прошивки. Только способ лечения другой.
Прошил микросхему с третьего раза (надо ж было сообразить, что сначала ее надо стереть, иначе никто мне нулевые биты не превратит в единички). Сотрудник перепаял чип на место, я всё подключил — система загрузилась как ни в чем не бывало.
update Октябрь 2017: Я смог-таки проапгрейдиться до версии EU 59.00.449A (сначала failsafe, потом reinstall, без перезагрузки между ними). Думаю, у меня была дефектная флэшка, с которой я пытался прошить 443-ю версию, но больше я ее прошивать не пытался, взял следующую. Всё прошло успешно.
