Pull to refresh

Сохранение и восстановление прошивки медиаплеера из журнала Vogue

Reading time 7 min
Views 12K
Эксперименты с плеером из журнала Vogue это очень хорошо, но старая добрая админская привычка делать бекапы всего и вся не даёт мне покоя. Ибо испортить игрушку при экспериментах с чужими прошивками очень легко, а как вернуть её в первозданное состояние не ясно. Обидно будет испортить такую халяву.

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

Всё необходимое для перепрошивки и восстановления плеера в оригинальное состояние находится здесь.
Собственно в архиве рабочая и настроенная версия usb-boot для журнала + файлы прошивки.

Для самых нетерпеливых сразу опишу процесс восстановления:
-отключаем батарею от плеера, либо вставляем бумажку под контакт открытия страницы;
-зажимаем кнопку на плеере и с зажатой кнопкой вставляем usb-кабель и отпускаем кнопку;
-компьютер определяет новое устройство, устанавливаем для него драйверы из архива, значок устройства остаётся в виде вопроса, но не пугайтесь, так надо;
-запускаем usb_boot.exe;
-вводим там команду «run restore.sh» и пошёл процесс восстановления.

Если в процессе восстановления посыпятся ошибки — либо используем usb-кабель меньшей длины, либо его нужно включить в разъём на задней стенке компьютера. Устраняем проблему с кабелем и пробуем всё по новой.

Собственно после этого получаем снова рабочее устройство. (Нетерпеливые и нелюбознательные могут заканчивать чтение =) )

Теперь расскажу подробнее о процессе сохранения\восстановления прошивки плеера и о её составляющих

Прежде чем вдаваться во все тяжкие необходимо понять с чем мы имеем дело.
Прошивка и пользовательский контент в плеере хранится в микросхеме NAND-flash памяти K9G8G08U0A фирмы Samsung.
Микросхемы NAND-flash памяти вообще очень своеобразная вещь и имеет свою, по началу не привычную для обычных компьютерщиков, организацию пространства памяти и размеры секторов/блоков. Попробуем в ней разобраться.

Минимальной адресуемой единицей в данного типа памяти является страница (некий аналог сектора\блока у жёсткого диска). Сама страница имеет, на первый взгляд, странный размер 528/1056/2112/4224/8448… байт в зависимости от модели. Но сделано это из благих побуждений. NAND-flash память имеет очень ограниченное число циклов записи и со временем отдельные её биты начинают сбоить. Для определения этих сбоев и восстановления информации в странице со сбойными битами и был выбран такой «экзотический» размер. Страница по сути поделена на две части. Первая часть 512/1024/2048/4096/8192… байт кратна 512 байтам и хранит в себе пользовательскую информацию, а в оставшейся части 16/32/64/128/256… байт хранится ECC (контрольная сумма) первой части страницы и некоторая другая служебная информация. При чтении каждой страницы происходит последующее высчитывание её ECC и сверка с ранее записанной, в случае не совпадения страница признаётся сбойной и её значение восстанавливается по читанному ECC.
Далее страницы объединяются в блоки. Делается это на аппаратном уровне для ускорения процесса стирания информации во всех страницах блока одной единственной командой. Далее блоки объединяются физически в один кремниевый кристалл. Таких кристаллов в одном корпусе может быть 1, 2 или 4 и выбираются они при помощи выводов CS (chip select).

Теперь вернёмся к нашему подопытному K9G8G08U0A. Его организация памяти следующая: 2048+64 байт на страницу, 128 страниц в блоке и 4096 блоков в кристалле.

Для упрощения понимания вышеописанного приведу картинку из официального даташита на данную микросхему:

image

Разобравшись в организации памяти микросхемы рассмотрим составляющие части прошивки и процесс запуска ОС железки

Прошивка состоит из следующих частей (смотреть файлы *.bin в папке с прошивальщиком):
1) spl (secondary program loader) — первоначальный загрузчик, файл nand.bin в архиве
2) loader — собственно основной загрузчик, который загружает в память ядро ОС и передаёт на неё управление, файл loader.bin
3) loader config — настройки загрузчика, где прописано расположение ядра ОС и ресурсов в микросхеме NAND и адреса в оперативной памяти, по которым это всё загружается, файл def_boot.bin
4) boot image — картинка, которая отображается при загрузке ОС (дада та самая жёлтая), файл img_boot.bin
5) ядро операционной системы MINIOS, файл minios.bin
6) внутренняя файловая система ОС с различными ресурсами, файл res.bin.

Собственно в этой же очерёдности идёт и запуск ОС.
В первую очередь стартует IPL (загрузчик зашитый производителем в сам процессор). Он проверяет в каком состоянии находятся ножки процессора, которые устанавливают очерёдность загрузки и не нажата ли кнопка. Если кнопка нажата, то ожидается загрузка по USB, если нет — то идёт загрузка с памяти. IPL считывает во внутреннюю SRAM память с микросхемы NAND-flash памяти первые 8 килобайт (0-3 страницы) в которых находится код SPL загрузчика. Проверяет их корректность по ECC и ещё некоторым признакам и если всё отлично — передаёт на него управление. Если что-то пошло не так, то аналогичное действие производится со следующими 8 килобайтами NAND-flash памяти (4-7 страницы).
После старта SPL инициализирует регистры и периферию процессора, настраивает контроллер SDRAM и загружает в оперативную память код непосредственного загрузчика ОС (loader.bin) по адресу, который указан в начале 61 и 62 страниц.
Далее основной загрузчик грузит в оперативную память ядро операционной системы и передаёт управление на него.
Возникает вопрос, а зачем столько загрузчиков городить? С этим ничего не поделать, железное ограничение. IPL не может загрузить больше 8 килобайт кода, по этому и приходится делать 2-х этажный загрузчик.

От теоретических основ приступим к практике
Давайте же рассмотрим, как же он устроен, этот проклятый самогонный аппарат!… ээээ, в смысле как устроена утилита для загрузки плеера по USB и его прошивки.
-файлы fw.bin и usb_boot.bin есть, ни что иное как, специальным образом написанные SPL и Loader;
-программы USB_Boot.exe — оригинальная утилита управления спец. лоадером usb_boot.bin, Test_jz4740_usb.exe — правленая tronix286-ом версия с возможностью чтения содержимого NAND-flash памяти в файл;
-все остальные файлы *.bin — компоненты прошивки плеера;
-файлы Usb_Boot_Driver.inf и Usb_Boot_Driver.sys — драйверы для плеера в режиме usb-загрузки;
-файлы *.cfg — файлы конфигурации загрузчика под разные микросхемы памяти (как NAND, так и SDRAM)и режимы их работы.
-файл restore.sh — сценарий для заливки прошивки в плеер.

Утилита Test_jz4740_usb.exe отличается от USB_Boot.exe наличием двух команд (ndump и nreadtofile) предназначенных для чтения прошивок из памяти плеера.
Команды, которые нам понадобятся:
-boot — загрузка usb-загрузчика в плеер с использованием дефолтной конфигурации из файла USBBoot.cfg
-nerase — ПО БЛОЧНОЕ стирание информации с микросхемы NAND-flash памяти;
-nprog — запись информации из файла в страницы микросхемы NAND-flash памяти;
-ndump — чтение содержимого памяти из NAND-flash в файл;
-fconfig — переключение конфигураций.
Параметры каждой из команд можно узнать, запустив её без параметров.

Разберёмся каким образом сохранить оригинальную прошивку
Сразу расскажу об одном огромном нюансе, об который было переломано кучу копий и затуплена дюжина мечей в процессе мозгового штурма. SPL загружаем и читаем с конфигурацией USBBoot_nand.cfg, а всё остальное с конфигурацией USBBoot_norm.cfg. Использование 2-х конфигов обусловлено тем, что запись spl-загрузчика и всего остального происходит с разными форматами служебной зоны (в терминах usb-boot она называется OOB) и контрольной суммы страниц. Для SPL-загрузчика используется формат, железно зашитый внутри процессора, а для всего остального — тот, который выбрали программисты во время сборки и компилирования загрузчика и ОС.

Перед началом сохранения родной прошивки не забываем удалить из папки файлы с моей прошивкой. Для сливания прошивки делаем следующее:
-отключаем батарею от плеера, либо вставляем бумажку под контакт открытия страницы;
-зажимаем кнопку на плеере и с зажатой кнопкой вставляем usb-кабель и отпускаем кнопку;
-компьютер определяет новое устройство, устанавливаем для него драйверы из архива;
-запускаем Test_jz4740_usb.exe;
-вводим команду "boot 0", и смотрим на результат её выполнения. Должно появится что-то вроди такого:

Checking state of No.0 device: Unboot
Now booting No.0 device: START_ADDR 2000000 81c00000

Download stage one program and execute at 0x80002000: Pass
Download stage two program and execute at 0x81c00000: Pass
Boot success!
Now configure No.0 device:
Now checking whether all configure args valid:
Current device information: CPU is Jz4750
Crystal work at 12MHz, the CCLK up to 336MHz and PMH_CLK up to 112MHz
Total SDRAM size is 32 MB, work in 4 bank and 16 bit mode
Nand page size 2048, ECC offset 3, bad block ID 0, use 1 plane mode
Configure success!


-переключаемся на «правильную» конфигурацию для чтения SPL командой "fconfig USBBoot_nand.cfg 0", опять же если всё в порядке должна быть надпись "Configure success!";
-считываем SPL и страницы её конфигурации в файл nand.bin командой "ndump 0 64 0 0 nand.bin";
-переключаемся на «правильную» конфигурацию для чтения остальной прошивки командой "fconfig USBBoot_norm.cfg 0", если всё в порядке должна быть надпись "Configure success!";
-считываем лоадер в файл loader.bin командой "ndump 128 66 0 0 loader.bin"
-считываем его настройки в файл def_boot.bin командой "ndump 256 1 0 0 def_boot.bin"
-считываем загрузочную картинку в файл img_boot.bin командой "ndump 512 3061 0 0 img_boot.bin"
-считываем ядро ОС в файл minios.bin командой "ndump 8192 8192 0 0 minios.bin"
-считываем внутреннюю ФС с ресурсами ядра в файл res.bin командой "ndump 32768 32768 0 0 res.bin".

При желании все эти команды по очереди можно записать в файл и стартовать командой run так же как процесс заливки. UPD. Что я и сделал и сохранил в файл save.sh.
Получившиеся файлы — и есть бекап родной прошивки. Теперь с прошивкой плеера можно делать что угодно и не боятся получить никуда не годную железяку.

Все адреса для записи были получены из информации, которую выводит на внутреннюю uart-овую консоль ОС плеера при загрузке и экспериментальным путём.

В итоге получаем:
1) SPL находится в 0-3 страницах;
2) 61, 62, 63 страницы нужны SPL для последующей загрузки;
3) основной загрузчик начинается с 128 страницы;
4) его конфигурация лежит в 256 странице;
5) загрузочная картинка начинается с 512 страницы;
6) ядро MINIOS начинается с 8192 страницы;
7) внутренняя ФС начинается 32768 страницы;
8) далее следует пользовательская файловая система с контентом.

Процесс заливки прошивки обратно в плеер думаю комментировать излишне, он аналогичен сохранению. Если открыть блокнотом (или любым другим текстовым редактором) файл restore.sh можно увидеть все команды процесса воочию. При желании можно прошивать плеер не полностью, а изменять только его отдельные части.

Теперь имея бекап прошивки и умея её заливать можно пробовать вливать в плеер любую другую прошивку. В данный момент я пытаюсь скомпилировать и записать в него загрузчик u-boot для запуска Linux-а.

UPD!!! В утилите Test_jz4740_usb.exe была найдена досадная ошибка! Обязательно скачайте заново архив со свежей версией утилиты по ссылке в начале поста либо отдельно саму утилиту тут!
Все старые архивы были удалены, во избежании распространения глюков.
Tags:
Hubs:
+125
Comments 80
Comments Comments 80

Articles