● Продвинутая практика ExpressLRS
HEX‑правка firmware.bin ExpressLRS 4.x
Практический маршрут для ESP‑устройств: найти начало дописанного конфигурационного блока, проверить смещения, заменить байты без сдвига файла, сравнить результат и подготовить возврат к исходной прошивке.
Граница урока: правим только дописанный unified‑блок уже совместимой прошивки. Машинный код, bootloader, partitions, RF‑калибровки и бинарники чужой модели здесь не патчим.
Что вы получите
Найдёте BASE
Локальный анализатор повторяет алгоритм ExpressLRS и показывает точный адрес блока.
Поймёте границы
Увидите четыре фиксированных слота и не затронете соседние данные.
Соберёте копию
Тренажёр меняет только два текстовых поля и сохраняет новый файл, не трогая исходник.
Карта unified‑блока
В ExpressLRS 4.1.0 функция appendToFirmware() находит конец ESP‑образа, выравнивает адрес и записывает поля последовательно. Смещения ниже считаются от найденного BASE.
| Смещение | Размер | Поле | Как править |
|---|---|---|---|
BASE + 0x000 | 128 байт | product_name | ASCII/UTF‑8, остаток заполнить 00 |
BASE + 0x080 | 16 байт | lua_name / имя устройства | Лучше ASCII; не превышать 16 байт |
BASE + 0x090 | 512 байт | Firmware Options JSON | Экспертно: до 511 байт + завершающий 00 |
BASE + 0x290 | 2048 байт | Hardware Layout JSON | Экспертно: до 2047 байт + завершающий 00 |
BASE + 0xA90 | переменно | логотип / legacy‑маркер target | Не трогать |
Почему нельзя просто искать строку: одно имя может встретиться в коде, веб‑интерфейсе и конфигурации. Править нужно только копию в пределах вычисленного слота после BASE.
HEX‑лаборатория firmware.bin
Загрузите рабочую копию: инструмент найдёт BASE, покажет поля и сможет создать копию с новым product/Lua‑именем.
Файл не загружается на fpv-club.ru и не отправляется во внешние сервисы. Options показываются только списком ключей, без Wi‑Fi‑пароля и UID.
E9.| Поле | Абсолютный адрес | Использовано | Прочитано |
|---|---|---|---|
product_name | — | — | — |
lua_name | — | — | — |
options JSON | — | — | — |
hardware JSON | — | — | — |
Безопасная учебная правка двух строк
Инструмент очищает весь фиксированный слот нулями и записывает новое значение с его начала. Размер файла не меняется.
Что лаборатория намеренно не правит
- Firmware Options: поле может содержать UID и данные Wi‑Fi; используйте Configurator/Web UI.
- Hardware Layout: ошибка GPIO, PA/LNA или RF‑switch способна повредить устройство.
- Данные после
BASE + 0xA90, машинный код до BASE, bootloader и partition table.
Пошаговая HEX‑правка вручную
Подойдёт HxD, ImHex или другой редактор, который умеет переходить к абсолютному адресу и работать в режиме Overwrite/OVR.
- Подготовьте комплект возврата. Сохраните исходный
firmware.bin, точный target, версию ELRS, модель и ревизию устройства. Посчитайте SHA‑256 исходника. - Работайте только с копией uncompressed .bin. Не открывайте для этой процедуры
.bin.gz,.elrs, полный дамп flash или файл из чужого архива. - Найдите BASE лабораторией. Запишите абсолютные адреса нужных полей. Поиск строки используйте только как дополнительную проверку, не как источник адреса.
- Перейдите к адресу через Go to / Ctrl+G. Убедитесь, что редактор показывает абсолютное смещение и включён режим Overwrite. Режим Insert запрещён: один вставленный байт сдвинет хвост файла.
- Очистите весь слот значением 00. Для product name выделите ровно 128 байт, для Lua name — ровно 16. Затем, не меняя длину файла, впишите новое ASCII‑имя с начала слота.
- Сохраните под новым именем. Размер копии обязан совпасть с исходником байт в байт. Повторно загрузите копию в лабораторию и проверьте прочитанные значения.
- Сравните два файла. Все изменённые байты должны находиться только внутри выбранного слота. Изменение до BASE или после конца слота — причина не прошивать файл.
Кириллица: размер поля считается в байтах UTF‑8, а не в символах. Для совместимости дисплеев и Lua‑меню используйте ASCII; особенно в 16‑байтовом lua_name.
Экспертные поля: JSON
Как технически заменить Firmware Options JSON
Слот начинается по адресу BASE + 0x090 и занимает 512 байт. Подготовьте минифицированный JSON в UTF‑8 без BOM и комментариев; безопасный предел — 511 байт, чтобы остался завершающий 00. Очистите все 512 байт нулями и запишите JSON с начала слота в режиме Overwrite.
Практически лучше использовать ExpressLRS Configurator или Web UI: поле способно содержать UID, SSID и пароль Wi‑Fi. Не публикуйте его содержимое и Build Log с секретами.
Как технически заменить Hardware Layout JSON
Слот начинается по адресу BASE + 0x290 и занимает 2048 байт. Безопасный предел — 2047 байт плюс завершающий 00. Сначала очистите весь слот, затем запишите минифицированный JSON. Любой ключ GPIO, radio_*, power_*, PA/LNA или RF‑switch должен быть подтверждён схемой именно этой ревизии.
Для реального устройства предпочтительнее Web UI → Hardware Layout: там файл можно загрузить, перезагрузить устройство и скачать обратно для сравнения. Подробный маршрут есть в связанном материале ниже.
Нужно ли пересчитывать checksum?
Для описанных четырёх полей — нет: ExpressLRS сам дописывает их после конца ESP application image. Правка внутри уже выделенного слота не меняет ESP‑сегменты и их checksum. Это утверждение не относится к машинному коду до BASE, bootloader, partition table, сжатому .gz, подписанному образу или контейнеру производителя.
Проверка перед прошивкой
Проверка файла
- размер совпадает с исходником;
- лаборатория снова читает все поля;
- diff ограничен нужным слотом;
- target и major‑версия не менялись.
Проверка стенда
- пропеллеры сняты;
- антенна подключена;
- мощность минимальная;
- контролируются температура, UART/CRSF и телеметрия.
Загружайте копию только штатным способом, который подходит выбранному target. Для Wi‑Fi‑обновления используйте страницу Update устройства и дождитесь штатной перезагрузки. Если Web UI предупреждает о несовпадении target, не выбирайте «Flash Anyway» без отдельного подтверждения аппаратной совместимости.
Лестница восстановления
- Web UI доступен: загрузите сохранённый исходный firmware.bin того же target и дождитесь перезагрузки.
- Wi‑Fi не запускается: переходите к официальной процедуре ExpressLRS Unbricking через UART/boot‑pad для конкретного устройства.
- Неизвестен target: остановитесь. Сначала определите MCU, RF‑чип, диапазон, модель и ревизию платы.
- Есть нагрев или нестабильный RF: немедленно отключите питание; не повышайте мощность и не выполняйте дальностный тест.
Самопроверка: четыре вопроса перед записью
- Можно ли вставить один байт в середину файла? Нет, только Overwrite.
- Достаточно ли того, что размер не изменился? Нет, diff должен находиться только в разрешённом слоте.
- Можно ли править firmware.bin.gz напрямую? Нет, это сжатый поток.
- Можно ли взять .bin похожей модели? Нет, совпадение диапазона или корпуса не подтверждает target.
Связанный маршрут
Официальные источники
- ExpressLRS 4.1.0 — UnifiedConfiguration.py: алгоритм поиска конца firmware и размеры четырёх полей.
- ExpressLRS 4.1.0 — release: версия, по которой проверена карта.
- ExpressLRS Web UI: Hardware Layout и предупреждения для продвинутых пользователей.
- Wi‑Fi Updating: штатная загрузка firmware.bin.
- ExpressLRS Unbricking: восстановление ESP‑устройств через boot‑режим.
Проверено 10.08.2026 для ExpressLRS 4.1.0. Для другой версии сначала откройте UnifiedConfiguration.py соответствующего release tag и сверьте алгоритм и размеры слотов.