Jump to content

Программатор RT809H, сохранение или чтение раздела памяти eMMC


Recommended Posts

Posted

Привет Как вы знаете, программаторы UFPI (на которых я работаю) и ENTT позволяют сохранять выбранные разделы или разделы в памяти EMCC Программатор RT809H при программировании EMCC имеет вкладку «НАСТРОЙКА», где мы можем выбрать сохранение всей памяти EMCC или опцию «Частичный адрес», где вы должны указать данные для сохранения. Я заинтересован в предоставлении данных для записи раздела памяти на этой вкладке Я не могу записать данные в формате записи адреса, размера данных, как это делает UFPI Нужно ли RT809H пересчитывать данные чтения-записи по-другому?

  • 1 year later...
Posted

Насколько я помню RT809H можно считать разделы и записать разделы, но в какой то версии был косяк что о менял раздел ext_csd , тем самым изменял ее конфиг. Возможности в програмном обеспечении не такие большие как по сровнению в ufpi 

  • 2 years later...
Posted

RT809H и работа с разделами eMMC: детальный анализ

Понимание проблемы

Когда мы работаем с eMMC-памятью в телевизионной технике, принципиально важно понимать,

что разные программаторы используют разные модели адресации при работе с частичным чтением/записью.

Как считают адреса разные программаторы

UFPI / ENTT — логика адресации
Стартовый адрес (LBA или байтовый) + Размер данных
Пример:
Start Address : 0x00700000
Data Size     : 0x00100000  (1 MB)
Всё прозрачно — указал откуда, указал сколько, получил кусок.

 RT809H — логика «Partial Address»
RT809H работает иначе. В поле **Partial Address** нужно указывать:
Start Address : адрес начала (в байтах или секторах — зависит от версии ПО)
End Address   : адрес конца блока (не размер, а именно конечный адрес!)

⚠️ Это главная путаница.  UFPI принимает `Старт + Размер`, а RT809H ожидает `Старт + Конец`.

Формула пересчёта:
End Address = Start Address + Data Size - 1

Пример:
UFPI:   Start = 0x00700000 | Size = 0x00100000
RT809H: Start = 0x00700000 | End  = 0x007FFFFF

Единицы адресации в RT809H

Здесь важный нюанс, который путает многих:

| Версия ПО RT809H | Единица адресации |
| Старые версии (< 9.xx) | Байты |
| Новые версии (9.xx+) | Секторы (512 байт) |

Пересчёт байтов в секторы:
Sector Address = Byte Address / 512

Пример:
Байтовый старт : 0x00700000 = 7340032 байт
В секторах     : 7340032 / 512 = 14336 (0x3800 секторов)

Известный баг RT809H с ext_csd

@sus256 Ты правильно помнишь — это **реальная проблема**, известная в сервисных кругах.

Что происходит:
- ext_csd — это регистр конфигурации самой микросхемы eMMC (168 байт, адресуется отдельно через CMD8)
- В некоторых версиях RT809H при записи частичного дампа программатор **перезаписывал ext_csd**, меняя параметры:
  - Boot partition enable
  - Bus width configuration
  - Partition config
  - Sleep/Awake параметры

 Последствия:
- Чип перестаёт загружаться с boot partition
- Изменяется конфигурация шины (8-bit → 4-bit)
- В худшем случае — чип блокируется по boot config

 Как защититься:
1. **Перед записью** — считать и сохранить ext_csd отдельно
2. Использовать версии ПО RT809H **не ниже 10.xx** (частично исправлено)
3. После записи — **верифицировать ext_csd** и при необходимости восстановить
4. По возможности для частичной записи использовать UFPI — там эта проблема отсутствует

Практический алгоритм работы в RT809H

 Шаг 1 — Определить параметры раздела
Узнаём из partition table или из UFPI-дампа:
Пример раздела "logo":
  Start LBA : 0x3800
  Size      : 0x800 секторов (= 1 MB)

 Шаг 2 — Пересчитать под RT809H
Start Address = 0x3800
End Address   = 0x3800 + 0x800 - 1 = 0x3FFF

 Шаг 3 — Вкладка НАСТРОЙКА в RT809H
[x] Partial Address
    Start : 0x3800
    End   : 0x3FFF

 Шаг 4 — Проверить единицы (байты или секторы)
Смотрим на размер всего чипа в интерфейсе:
- Если показывает `0x1D2000000` (байты 8GB) → **байтовая адресация**
- Если показывает `0xE90000` (секторы 8GB) → **секторная адресация**

Сравнительная таблица возможностей

| Функция | UFPI | RT809H |
| Частичное чтение по разделам | ✅ Удобно | ⚠️ Через Partial Address |
| Адресация | Старт + Размер | Старт + Конец |
| Защита ext_csd | ✅ Автоматически | ❌ Требует внимания |
| Работа с partition table | ✅ Встроено | ❌ Вручную |
| Верификация после записи | ✅ | ✅ |

 Вывод и рекомендация

Для частичной записи разделов eMMC в RT809H:

1. Переводи адреса из формата `Старт + Размер` → в `Старт + (Старт + Размер - 1)`
2. Проверяй единицы адресации своей версии ПО (байты или секторы)
3. **Всегда делай полный бэкап перед частичной записью**
4. Контролируй ext_csd до и после операции
5. Если есть выбор — для прецизионной работы с разделами используй UFPI, RT809H оставь для полного перепрошивания чипа

Онлайн поддержка в  🔗 МАХ - 24 часа!

 

  • 3 months later...
Posted

Дополнение и важные исправления по частичной записи eMMC в RT809H

Основной принцип пересчёта указан правильно, но только при условии,

что конкретная версия RT809H действительно принимает два значения:

 

This is the hidden content, please

 

и End Address является последним включённым адресом, а не размером блока.

Тогда формула такая:

This is the hidden content, please
Пример в байтах:
This is the hidden content, please
Для режима с адресацией по секторам 512 байт:
This is the hidden content, please
Нельзя жёстко привязывать адресацию к версии RT809H

Утверждение:

This is the hidden content, please
лучше не использовать. У RT809H существует много сборок, переводов и обновлённых алгоритмов.

Одинаковый номер основной версии ещё не гарантирует одинаковое поведение окна частичного чтения.

На уровне протокола современные high-capacity eMMC работают с блочными адресами.

Но оболочка программатора может показывать пользователю либо LBA, либо уже пересчитанный байтовый offset.

В U-Boot для high-capacity MMC старт передаётся как номер блока, а для старых byte-addressed устройств выполняется умножение на размер блока.

Поэтому единицы нужно проверять именно в установленной сборке RT809H.

Как проверить единицы без риска

Сделать пробное частичное чтение, а не запись.

Например:

This is the hidden content, please
Если программа сохраняет файл размером 0x200, то есть 512 байт, значит:
  • адреса указаны в секторах;
  • конечный адрес включительный.

Если программа не принимает такой диапазон либо получает другой размер, нужно проверить:

  • не является ли второе поле размером;
  • не используется ли байтовый offset;
  • не считается ли End как невключительная граница.

Размер, отображаемый в окне, можно использовать только как подсказку:

0x1D2000000 байт
и
0xE90000 секторов × 0x200
описывают один и тот же объём. Но это ещё не доказывает, что поля Partial Address работают в тех же единицах.
Исправление по EXT_CSD

EXT_CSD — это не раздел памяти размером 168 байт.

Это отдельный 512-байтный регистр конфигурации eMMC.

Число 168 — это номер байта:

EXT_CSD[168] = RPMB_SIZE_MULT
Он определяет размер RPMB в единицах по 128 Кбайт, но не является размером самого EXT_CSD. 
Linux также рассчитывает размер RPMB через соответствующий множитель.
EXT_CSD читается отдельной MMC-командой CMD8 SEND_EXT_CSD, 
а изменение разрешённых полей выполняется командой CMD6 SWITCH. 
Обычная блочная запись в User Area сама по себе в EXT_CSD попасть не может. 
Это разные операции протокола.
В штатном интерфейсе RT809H области также разделены:
User
Boot1
Boot2
RPMB
EXT_CSD
EXT_CSD выбирается отдельным флажком. 
Поэтому утверждение, что RT809H при любой частичной записи обязательно перезаписывает EXT_CSD, некорректно.
Такой случай возможен только если: 
  • выбран флажок EXT_CSD;
  • загружен полный комплект файлов RT809H;
  • программа отдельно выполняет запись конфигурации;
  • имеется баг конкретной сборки;
  • пользователь перепутал запись User Area с восстановлением полного комплекта.

Для подтверждения бага нужны:

точная версия RT809H;
выбранный алгоритм EMMC_AUTO/4BIT/ISP;
скрин настроек;
лог операции;
EXT_CSD до записи;
EXT_CSD после записи.
Без этого нельзя утверждать, что проблема исправлена именно в версии 10.xx.
Какие байты EXT_CSD критичны

В первую очередь сравниваются:

EXT_CSD[179] PARTITION_CONFIG
EXT_CSD[177] BOOT_BUS_WIDTH
EXT_CSD[162] RST_n_FUNCTION
EXT_CSD[173] BOOT_WP
EXT_CSD[171] USER_WP
EXT_CSD[155] PARTITION_SETTING_COMPLETED
  PARTITION_CONFIG определяет:
  • откуда eMMC должна грузиться;
  • Boot1 или Boot2;
  • выдавать ли Boot ACK;
  • какая аппаратная область сейчас выбрана для доступа.

BOOT_BUS_WIDTH определяет ширину и режим шины именно во время boot operation.

Обычный BUS_WIDTH — это отдельный рабочий параметр передачи данных.

Его не следует путать с конфигурацией загрузочной шины.

Управление boot partition и boot bus в U-Boot также выполнено отдельными командами partconf и bootbus.

Неправильные значения PARTITION_CONFIG или BOOT_BUS_WIDTH могут привести к отсутствию загрузки, но обычно не блокируют сам чип.

Конфигурацию можно восстановить при офлайн-подключении или по ISP.

Реально опасны поля:

  • однократно программируемые;
  • аппаратная защита Boot1/Boot2;
  • постоянная защита от записи;
  • завершение конфигурации разделов;
  • постоянное включение или отключение RST_n.

В составе mmc-utils операции с аппаратным Reset прямо обозначены как постоянные.

Правильный порядок частичной записи в RT809H

1. Снять полный комплект

Перед вмешательством сохранить:

User Area
Boot1
Boot2
EXT_CSD
CID
CSD
лог определения eMMC
RPMB обычным копированием полноценно не переносится, поскольку это защищённая область с ключом и счётчиком.
В инструкции RT809H она также выделена отдельно и не рекомендуется к обычному чтению.
2. Выбрать правильную аппаратную область

Для разделов Android, Linux, GPT, logo, boot, recovery, system, vendor и userdata обычно выбирается:

User
Флажки:

Boot1

Boot2

RPMB

EXT_CSD

при обычной частичной записи раздела должны быть сняты.

Адреса из GPT относятся к началу User Area, а не ко всему физическому набору User + Boot1 + Boot2.

3. Проверить единицы адресации

Не ориентироваться только на номер версии программы.

Нужно определить:

  • байты или LBA;
  • размер логического сектора;
  • включается ли End Address в диапазон;
  • является ли второе поле концом либо размером.

Для большинства телевизионных eMMC используется логический сектор 512 байт, но это нужно проверять, а не принимать безусловно.

4. Пересчитать диапазон

Для секторной адресации:

This is the hidden content, please
Для байтовой адресации:
This is the hidden content, please
5. Проверить размер файла

Размер файла должен точно соответствовать диапазону:

Size = End - Start + 1
для байтовой адресации либо:
File Size = (End LBA - Start LBA + 1) × 512
для секторной.

Не следует рассчитывать, что RT809H безопасно обрежет слишком большой файл или правильно дополнит маленький.

6. Выполнить запись и контрольное чтение

После записи:

  1. выполнить Verify;
  2. отдельно считать тот же диапазон;
  3. сравнить считанный файл с исходником;
  4. проверить CRC32, MD5 или SHA-256;
  5. только после этого ставить eMMC на плату или отключать ISP.

7. Сравнить EXT_CSD

После обычной записи User Area достаточно повторно считать EXT_CSD и сравнить критичные байты.

Не нужно без необходимости записывать обратно весь файл EXT_CSD размером 512 байт. В нём присутствуют:

  • read-only поля;
  • временные параметры;
  • зарезервированные байты;
  • однократно программируемые поля;
  • параметры защиты.

Правильнее восстанавливать только конкретный изменённый параметр и только после проверки документации на данную eMMC.

Итог

RT809H можно использовать не только для полной прошивки eMMC.

Частичное чтение, запись и стирание в официальных обновлениях программатора предусмотрены.

Но перед операцией нужно обязательно установить:

какая аппаратная область выбрана;
в каких единицах введён адрес;
что означает второе поле;
включительный ли конечный адрес;
совпадает ли размер файла с диапазоном. 

UFPI действительно удобнее при работе с таблицами разделов и отображением Start + Size,

но безопасность ремонта зависит не от названия прогера, а от правильного расчёта offset, выбора User/Boot и обязательной проверки результата.

Онлайн поддержка в  🔗 МАХ - 24 часа!

 

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...