Итак, я изнасиловал новый
Alcatel 4033D.
eMMC
KMN5X000ZM-B209, OTP прописана и залочена.
Форматирую тело через FT, снимаю флеш, ставлю на колодку, читаю образ ROM1 EasyJTAG'ом.
Никаких GP-разделов, как видим, на ней нет. Таблицы софтовых разделов MBR тоже нет, она стерта. А вот OTP-область действительно есть и находится внутри ROM1 по адресам
0x0E5000000 - 0x0E57FFFFF, (8 мегабайт),
см. скриншоты 1-3. Там имеются IMEI платы и туда невозможно ничего стереть/записать -
Block verify fail! За пределами этого участка все пишется-читается,
см. скриншот 4.
Начинаю мучения:
1. Выполняю MoviNAND Format + Reset и читаю этот блок еще раз.
Данные из OTP пропали! Кроме того, теперь этот блок стал прописываться тестовым файлом без ошибок: вся OTP-область исчезла как не бывало. Стало быть,
с завода ее там не было, появилась позже.
2. Ставлю eMMC обратно на плату, вливаю фулл, считанный с нее до формата, читаю OTP через флештул - и вижу что IMEI на месте. Содержимое OTP влилось из фулла, а ее адреса флештул получил из scatter:
...однако, этот
0xFFFF0200 мало того что не соответствует
0xE5000000 даже близко, так еще и находится за пределами 3728Мб, имеющихся в ROM1. Равно как и размер 0x2B00000 (43Mb) не совпадает с экспериментально найденным 8Mb. Эти адреса в скаттере явно не прямые. Кстати,
OTP-область теперь не залочена и принимает файлы на запись.
3. Меняю этот адрес на 0xFFFF0100, выбираю в FT новый скаттер, пишу туда некий блок данных, читаю - совпадает. Кажись, я только что создал новую OTP-зону. "Старая" OTP при этом на месте и читается при выборе старого scatter.
4. Делаю Format Whole Flash - данные из обеих (незакрытых) OTP исчезли.
5. Повторяю пункты 3-4, но закрыв обе OTP после записи (закрывались они независимо друг от друга, то есть, после закрытия первой, вторая еще давала себя переписывать - похоже, создались две совершенно разные зоны). Теперь данные из обеих OTP остались.
6. Залил фулл, включил тело. IMEI на месте, то есть мусорные данные из "второй OTP" модемом игнорируются.
7. Проверяю эту ерунду с адресами. Снова снимаю eMMC и на колодку, посмотрим, где теперь окажутся обе OTP.
Первая - на прежнем месте и прежней длины. Вторая нашлась по адресам
0x0E7000000 - 0xE7800000 (снова 8 мегабайт). То есть, несмотря на то что я
уменьшил адрес второй OTP в скаттере на 0x100, по факту она оказалась на
32 мегабайта дальше первой. Похоже, тамошний адрес еще и инвертированный, отсчитывается от
конца ROM1.
8. Теперь посмотрим, не попадают ли эти зоны в какой-нибудь из логических разделов телефона. Адрес 0xE5000000 это 3664-й мегабайт, то есть самый конец ROM1, за 64 мегабайта до границы раздела. Последний раздел USERDATA по scatter имеет адрес 0x5D680000 и длину 0x88200000, то есть оканчивается на 0xE5880000. Однако, из этого числа нужно вычесть 8,5 мегабайт (0x880000) т.к. вначале идут ROM2(4Мб) + ROM3(4Мб) + RPMB(512к). 0xE5880000 - 0x880000 =
0xE500000. Получается,
OTP-зоны начинаются байт-в-байт сразу за Userdata и расположены дальше, в небольшом "зазоре" между ней и границей ROM1.
Итого выяснено:
1. OTP-зона является частью стандарта JEDEC и создается/читается флештулом по спецадресам в scatter-файле прошивки. Новые eMMC такой зоны не имеют.
2 У OTP-зоны отсутствуют какие-либо сигнатуры: она начинается сразу с записанных в нее данных. До и после этих данных сплошные нули.
3. Под нее отводится самый хвост раздела ROM1; логические разделы прошивок намеренно обходят это место.
4. OTP-зона может быть определена только в scatter и не создаваться в виде отдельного логического раздела, то есть отсутствовать в MBR/EBR/GPT/PMT аппарата.
5. На одной eMMC можно создать несколько OTP-зон с независимыми состояниями. Модем аппарата ищeт нужную по вшитым в него адресам, совпадающим с адресами в scatter.
6. Закрытая OTP-зона может быть стерта форматом либо обновлением прошивки контроллера на eMMC Samsung. Недавно введенный Universal Format для флешек других производителей еще предстоит проверить.
Осталось выяснить:
1. Как адрес 0xFFFF0200 из scatter переводится в "отступить 64 мегабайта от границы ROM1"?
2. Каким образом определяется размер создаваемой OTP-зоны? Длина в scatter не соответствует фактически создаваемой, равно как и формулe HC_WP_GRP_SIZE * 512k. Пока что встречались значения 4Мб и 8Мб.
3. Как и какими средствами внутри eMMC прописываются границы OTP-зоны? Какими регистрами и где? Можно ли их сбросить?
P.S. NoName, eMMC Tool Suite льет прошивку на основе scatter НЕПРАВИЛЬНО! Она пихает прелоадер в ROM1. Бокс на букву М отрабатывает такой же скаттер корректно, надо и иксам исправить.