Скрипт для просмотра, генерации и патчинга полей мощности передачи (TX power) в EEPROM/Factory‑разделе устройств на базе SoC MT7981 с радиомодулями MT7915/MT7976. Поддерживает V2‑разметку полей, использующуюся в mt76 (OpenWrt).
Основан на исходниках mt76:
- https://github.com/openwrt/mt76/blob/master/mt7915/eeprom.h
- https://github.com/openwrt/mt76/blob/master/mt7915/eeprom.c
Внимание! Изменение калибровочных/производственных данных может привести к нестабильной работе, перегреву, выходу из строя устройства и/или нарушению требований регуляторов. Все действия на свой страх и риск.
Не прошивайте полный дамп раздела Factory от другой модели! В Factory хранятся не только уровни мощности, но и масса калибровочных и модель‑специфичных данных (MAC‑адреса, температурные/радиочастотные калибровки, конфигурация Wi‑Fi и пр.). Прошивка «чужого» Factory часто ломает показания температуры, калибровки радиотракта и другие вещи, которые можно сразу не заметить.
Этот скрипт намеренно изменяет только поля мощности TX в V2‑разметке и больше ничего:
- 2.4 ГГц: MT_EE_TX0_POWER_2G_V2 @ 0x441 (4 байта)
- 5 ГГц: MT_EE_TX0_POWER_5G_V2 @ 0x445 (20 байт)
- 6 ГГц: MT_EE_TX0_POWER_6G_V2 @ 0x465 (32 байта)
Остальные поля из eeprom (см. mt76 mt7915/eeprom.h), такие как MAC‑адреса, версии FT, rate‑delta, PRECAL/групповые калибровки и т.д., скрипт не трогает. Пример (фрагмент enum из драйвера):
MT_EE_MAC_ADDR = 0x004,
MT_EE_WIFI_CONF = 0x190,
MT_EE_RATE_DELTA_* = 0x252 / 0x29d / 0x7d3 / 0x81e / 0x884,
MT_EE_TX0_POWER_* = 0x2fc / 0x34b (V1), 0x441 / 0x445 / 0x465 (V2),
MT_EE_PRECAL = 0xe10 (V1), 0x1010 (V2),
Рекомендуемая практика:
- Работайте только со своим дампом Factory: скрипт делает копию в /tmp/factory_dump.bin и патчит её.
- Не заливайте «чужие» полные дампы. Если нужно — перенесите только значения мощности через пресеты этого скрипта.
- Автопоиск раздела “Factory” в /proc/mtd и создание дампа в /tmp/factory_dump.bin
- Просмотр зон (2.4/5/6 ГГц) в дампе/файле с указанием смещений
- Генерация «пресетов» из существующего Factory‑дампа для последующего копипаста
- Применение пресетов к выбранным диапазонам (2g/5g/6g/all)
- Двуязычный интерфейс: en/ru
Под «пресетом» понимается набор байтов для каждой из зон (2g/5g/6g), заданный переменными вида:
- preset_<имя>_2g = 4 байта
- preset_<имя>_5g = 20 байт
- preset_<имя>_6g = 32 байта
Смещения в Factory/EEPROM согласно mt76 (V2 layout):
- MT_EE_TX0_POWER_2G_V2 = 0x441 (4 байта)
- MT_EE_TX0_POWER_5G_V2 = 0x445 (20 байт)
- MT_EE_TX0_POWER_6G_V2 = 0x465 (32 байта)
Структура зон:
- 2.4 ГГц: 4 байта = 4 цепи по 1 байту
- 5 ГГц: 20 байт = 4 цепи × 5 групп
- 6 ГГц: 32 байта = 4 цепи × 8 групп
Байты — это калибровочные значения, считываемые драйвером mt76 из EEPROM. Это не прямые dBm, а индексы/уровни, интерпретируемые кодом драйвера. Контрольных сумм для этих полей драйвер не требует.
- OpenWrt или совместимая среда с BusyBox/posix sh
- hexdump, dd, grep, awk, sed
- Доступ к /proc/mtd и /dev/mtdX (для автодампа)
- Права на запись, если планируется прошивка изменённого Factory обратно
- Посмотреть зоны из текущего Factory (скрипт сам сделает дамп):
./txpwr.sh
- Сгенерировать пресеты из файла factory.bin:
./txpwr.sh -g -f factory.bin -p myrouter -b all
Скрипт выведет блок переменных preset_myrouter_2g/5g/6g, которые можно скопировать в скрипт.
- Применить готовый пресет ко всем доступным зонам в дампе:
./txpwr.sh -p wr3000p
Скрипт:
- найдёт Factory
- создаст /tmp/factory_dump.bin
- пропатчит выбранные зоны в дампе
- покажет до/после
- не пишет обратно в MTD автоматически
ОЧЕНЬ ОСТОРОЖНО! Перед записью обязательно сделайте резервную копию исходного раздела. Важно: см. раздел «Важное предупреждение про Factory».
- Разрешить запись в MTD (в некоторых сборках OpenWrt запись может быть защищена):
opkg update && opkg install kmod-mtd-rw
insmod mtd-rw i_want_a_brick=1
Примечания:
- Этот модуль обходит защиту записи и может повредить устройство.
- Требует совместимую версию с вашим ядром.
- Настройка не сохраняется после перезагрузки — загружайте модуль заново при необходимости.
- Сделать резервную копию Factory:
dd if=/dev/mtdX of=/tmp/factory_backup.bin
# либо:
cat /dev/mtdX > /tmp/factory_backup.bin
Где /dev/mtdX соответствует разделу «Factory» (проверьте /proc/mtd).
- Записать пропатченный дамп:
mtd write /tmp/factory_dump.bin Factory
Либо прямой записью (рискованнее, используйте только если точно понимаете последствия):
dd if=/tmp/factory_dump.bin of=/dev/mtdX
- При проблемах откатитесь бэкапом:
mtd write /tmp/factory_backup.bin Factory
Скрипт спрашивает подтверждение перед патчем. Чтобы применить без ручного ввода:
printf 'y\n' | ./txpwr.sh -p ax3000t -b all
Или на свой страх и риск модифицируйте скрипт, убрав запрос подтверждения.
Язык интерфейса по умолчанию: en. Можно указать:
- флагом:
./txpwr.sh -L ru
- или переменной среды:
TXPWR_LANG=ru ./txpwr.sh
- Показать зоны из конкретного файла:
./txpwr.sh -f /path/to/factory.bin
- Сгенерировать пресет только для 5 ГГц:
./txpwr.sh -g -f factory.bin -p office -b 5g
- Применить пресет только к 6 ГГц:
./txpwr.sh -p rax3000me -b 6g
- Применить пресет ко всем доступным зонам:
./txpwr.sh -p wbr3000uax -b all
В скрипт включены примеры:
- ax3000t: preset_ax3000t_2g / _5g / _6g
- wbr3000uax: preset_wbr3000uax_2g / _5g / _6g
- wr3000p: preset_wr3000p_2g / _5g / _6g
- rax3000me: preset_rax3000me_2g / _5g / _6g
Посмотреть доступные пресеты:
./txpwr.sh -h
В конце help‑вывода будет список найденных preset__*.
- Сгенерируйте из исходного дампа:
./txpwr.sh -g -f factory.bin -p mydevice -b all
- Вставьте сгенерированные строки в скрипт рядом с другими preset_*.
- При необходимости отредактируйте значения (HEX‑байты).
- Примените:
./txpwr.sh -p mydevice -b all
- 2g: 0x441, 4 байта (цепи 0..3)
- 5g: 0x445, 20 байт (4 цепи × 5 групп)
- 6g: 0x465, 32 байта (4 цепи × 8 групп)
Скрипт печатает текущие байты по смещениям и то, что будет записано. Запись делается в указанный файл (обычно /tmp/factory_dump.bin), без изменения MTD‑устройства напрямую.
-
Нужно ли править контрольные суммы?
- Для этих полей в V2‑разметке mt76 дополнительных контрольных сумм не требуется.
-
Чем являются эти байты?
- Это калибровочные/индексные значения мощности по цепям и группам каналов, интерпретируемые драйвером mt76 (см. eeprom.h/eeprom.c).
-
Можно ли применять только к 2.4 ГГц?
- Да: укажите -b 2g. Аналогично для 5g/6g/all.
-
Скрипт пишет прямо в /dev/mtd?
- Нет, по умолчанию он делает дамп в /tmp/factory_dump.bin и патчит его. Обратную запись вы делаете вручную отдельной командой.
Смещения и размеры зон взяты из:
- mt7915/eeprom.h: константы MT_EE_TX0_POWER_*_V2
- mt7915/eeprom.c: логика чтения калибровочных полей
Это гарантирует, что читаемые/записываемые байты соответствуют ожидаемой драйвером структуре для V2.
См. файл LICENSE.
- Команде OpenWrt и разработчикам mt76 за открытый код драйвера и документацию по EEPROM.
- Людям, предоставившим дампы раздела Factory, что помогло сравнить мощности передачи разных моделей.