Статья дополнена 19.04.2019.

Итак, дурная голова рукам покоя не дает опытным путем выяснено, что при обновлении прошивки видеорегистратора Mio MiVue 518 проверка соответствия модели регистратора и прошивки не производится. Достаточно положить в корень SD-карты файл SD_CarDV.bin от другой модели, например, MiVue 568, включить устройство, дождаться, пока полосочка прогресса обновления добежит до конца - и вуаля, имеем кирпич устройство, не подающее никаких признаков жизни, кроме включающего и выключающегося при нажатии кнопки питания светодиода.

Что делать? Конечно же, разбирать регистратор, извлекать флеш-память и прошивать правильным дампом. Но для начала этот дамп необходимо получить из прошивки, в чем нам помогут несколько консольных команд GNU/Linux.

После беглого взгляда на SD_CarDV.bin в любом просмотрщике файлов (например, Midnight Commander) становится ясно, что формат прошивки должен быть простым - видны строки с системными сообщениями, следовательно, данные не сжаты. Необходимо только выяснить, какая часть данных в прошивке относится к заголовку, за которым начинается собственно дамп. Для этого можно воспользоваться консольной утилитой cmp, выполняющей побайтное сравнение файлов. Сравним два файла с прошивками разных моделей:

$ cmp -l -n 1024 SD_CarDV.bin SD_CarDV.bin.568 
   9 115   0
  10 111   0
  11 117   0
  12 105   0
  13  67   0
  14  61   0
  15  65   0
  16  70   0
  17 345 336
  18 332 236
  19  40  74
  20  22 372
  21 355 323
  22 313 326
  23 317 312
  24 251 260
  25 142 317
  26 314 172
  27 132 102
  28 373 340
  29 142 303
  30 110 333
  31 173 326
  32 305  57

Итак, видно, что из первого килобайта прошивки отличаются только первые 32 байта (нумерация вывода cmp идет с 1). Логично предположить, что эти 32 байта и являются заголовком. Отрежем его с помощью команды dd:

dd bs=32 skip=1 if=SD_CarDV.bin of=SD_CarDV.rom

Посмотрим на первые 128 байтов дампа в шестнадцатеричный виде:

$ xxd -l 128 -c 16 -g 1 SD_CarDV.rom 
0000000: 06 00 00 ea fe ff ff ea fe ff ff ea fe ff ff ea  ................
0000010: fe ff ff ea fe ff ff ea 20 ff 1f e5 fe ff ff ea  ........ .......
0000020: d3 f0 21 e3 b0 10 9f e5 01 d0 a0 e1 d2 f0 21 e3  ..!...........!.
0000030: a8 10 9f e5 01 d0 a0 e1 d1 f0 21 e3 a0 10 9f e5  ..........!.....
0000040: 01 d0 a0 e1 d7 f0 21 e3 98 10 9f e5 01 d0 a0 e1  ......!.........
0000050: db f0 21 e3 90 10 9f e5 01 d0 a0 e1 df f0 21 e3  ..!...........!.
0000060: 88 10 9f e5 01 d0 a0 e1 d3 f0 21 e3 80 0a a0 e3  ..........!.....
0000070: 11 1f 19 ee 00 10 81 e1 01 10 81 e3 11 1f 09 ee  ................

Чтобы понять, правильно ли мы определили начало дампа, попробуем дизассемблировать несколько его первых команд. Видеорегистратор построен на чипе AIT8427 производства тайваньской фирмы Alpha Imaging Technology. Никакой информации о нем, кроме той, что есть на страничке производителя, увы, нет. О процессоре сказано только то, что это "Embedded 32-bit CPU / 500MHz". Логично было бы предположить, что за "32-bit CPU" скрывается хорошо знакомый всем нам ARM. Для быстрой проверки воспользуемся онлайн-дизассемблером ODA:

Disassembled dump start data

Так и есть, это ARM и первой командой является безусловный переход на процедуру инициализации. Отлично, теперь у нас есть дамп для прошивки, осталось только извлечь флеш-память и записать в нее дамп. Для этого разберем регистратор и найдем чип флеш-памяти:

W25Q64FV flash chip position on device board

Флеш-память выделена красным, ее тип - W25Q64FV, это флеш-память со SPI-интерфейсом, объемом 64 мегабита (то есть 8 мегабайтов). Для ее прошивки нужен SPI-программатор, в качестве которого я использовал одноплатный микрокомпьютер Raspberry Pi, у него имеется порт SPI, выведенный на 26-контактный штыревой краевой разъем. Поддержка программирования через данный порт есть у отличной утилиты FlashRom, единственное, что нужно сделать перед прошивкой - выравнять размер дампа и объем флеш-памяти:

$ truncate --size 8M SD_CarDV.rom

Подключив извлеченную из регистратора флеш-память к Raspberry Pi, запускаем прошивку следующей командой:

sudo ./flashrom -w SD_CarDV.rom -p linux_spi:dev=/dev/spidev0.0

Процесс стирания, записи и проверки займет около 10 минут, после сообщения об успехе отсоединяем флеш-память от "малинки" и впаиваем обратно в устройство. Затем включаем его и убеждаемся, что вместо "кирпича" у нас опять есть нормально функционирующий регистратор. Ура! :)

Дополнение от 19.04.2019

В некоторых новых регистраторах Mio (например, MiVue 733) файл прошивки немного отличается, стартовая последовательность 06 00 00 ea fe ff... находится по смещению 0x2020, а вместо нее по смещению 0x20 находится другая последовательность:

$ xxd -l 64 -c 16 -g 1 SD_CarDV.bin
00000000: 41 49 54 53 30 30 33 31 32 44 2e 31 31 34 33 20  AITS00312D.1143 
00000010: ac ae 2f d1 48 c8 d1 70 05 17 cd d2 24 da ef 3d  ../.H..p....$..=
00000020: 4d 43 52 32 01 00 00 40 0c 00 00 00 09 00 00 00  MCR2...@........
00000030: 02 00 00 00 64 6c 00 00 00 e0 11 00 01 00 00 00  ....dl..........

Несмотря на это, инструкция по созданию дампа из прошивки остается прежней - всё так же отрезаем первые 32 байта и прошиваем получившийся дамп, предварительно выравняв его до размера флеш-памяти. Отличие связано, видимо, с тем, что в новых регистраторах процессор стартует не с нулевого адреса, а с адреса 0x2000.