В те времена, когда копеечный и офигенный Xiaomi AX3000T еще не ворвался на рынок, бюджетным топом для OpenWRT за свои деньги были билайновые (по факту Sercomm) роутеры на Mediatek MT7621 — Smartbox Turbo+ и Smartbox GIGA (были еще Turbo и Flash, но попадались они редко). И выбирая между ними я вспомнил дилемму с двумя стульями: у Turbo+ есть аж 4 гигабитных lan порта, но только 128MB ОЗУ (что маловато для прозрачного rutube с adguardhome); а GIGA при наличии желанных 256MB ОЗУ имеет только один гигабитный lan порт (второй маркетологи сделали стомегабитным). Один гигабитный порт меня никак не устраивал, ибо имею еще и сервер + провайдер дает полгигабита, поэтому я купил Turbo+. Спустя некоторое время я понял, что все-таки 128MB ОЗУ маловато, поэтому купил GIGA, а сервер повесил на 100MBit. Теперь перестало хватать скорости для сервера😀. Проблему я решил покупкой Xiaomi 3Gv1 (на нем два гигабитных lan), но аппетиты для фильтров adguard росли, и я пришел к тому, что мне и 256MB RAM оказалось мало. Для меня нет проблем оставить свободного ОЗУ мегабайт 30-40, то вот при обновлении фильтров потребление ОЗУ на несколько секунд увеличивается примерно в полтора-два раза, и тут меня не спасал даже zram. Вывод один — мне нужен роутер с 512MB RAM.
Я полез на авито искать роутеры для OpenWRT с 512BM RAM и гуманным ценником, но из относительно дешевых (<3000р) нашел только Xiaomi Router 3 Pro (R3P) на все том же Mediatek MT7621. Но проблема — эти роутеры делались с флешками от ESMT и Micron, и со второй OpenWRT работает очень плохо (если вообще работает), о чем написано на странице девайса в OpenWRT wiki. Внешне (по наклейке/ревизии) нельзя понять какая флешка в роутере, так что вариант с этой лотереей я тоже отсеял.
Тогда я задумался, а можно ли увеличить ОЗУ на Turbo+ (инфа ниже актуальна и для апгрейда GIGA).


В былые времена я активно апгрейдил ОЗУ на всяких там асусах/длинках/тплинках на DDR1, а с DDR3 опыт апгрейда был только с тв приставками. Но да ладно, попробуем. Для начала надо ответить на некоторые вопросы:
- Сколько чипов RAM и какой разрядности стоят на плате
- Умеет ли SoC для данного типа памяти видеть желаемый нами объем
- Реально ли вообще найти чипы нужного типа/объема/разрядности (желательно не покупая на ali, а выпаяв с какой-нить плашки ОЗУ)
- Сможет ли стоковый загрузчик увидеть память, или может быть сможет после конфигурации (или может быть вообще не сможет, и потребуется искать более умный сторонний загрузчик)
- Есть ли линии данных RAM с отсутствующими резисторами по 22 Ом (которые надо допаять), или может быть эти линии вообще не разведены, и данная плата обречена на жизнь без апгрейда ОЗУ (встречал такое на mlwg2)
А про ОС беспокоиться не надо — OpenWRT в общем случае без всяких патчей увидит столько же ОЗУ, сколько видит загрузчик (хотя есть и исключения — см. статью про Depo Sky A60).
Разобрав Turbo+ я увидел один 16битный чип DDR3L-1866 (очевидно на 128MB). Загуглив datasheet на mt7621 я выяснил, что в случае с DDR3 максимальный объем памяти — 512MB с частотой 1200 (а 1866 вендор вкорячил за не именем другого). «Отлично» — подумал я, и нашел на авито плашку на SO-DIMM DDR3L-1600 1Rx16 2Gb с четыремя чипами. Получив аж целых 4 заветных чипа, я, не долго думая (вообще не думая) бросился запаивать чип — 0.45 свинцовые шары, слабоактивный флюс (не NC-559 и не ТТ), 3 минуты при 370 C выпаиваем стоковый чип и 3 минуты при 350 C запаиваем наш. Включаем — и не проходим калибровку RAM (что видно по uart). Идем в гугл. Оказывается многие вендоры под mt7621 собирают максимально деревянные u-bootы, калибровка RAM в которых жестко зашита под стоковые RAM чипы. Мда, надо было гуглить перед пайкой. Но да ладно, возвращаю стоковый чип и зову на помощь breed — загрузчик от китайского разработчика из Mediatek. Оригинального breed под Smartbox Turbo+ он конечно же не собирал, но он собрал загрузчик для Xiaomi 3Gv1 (тоже на mt7621+ddr3l+nand tsop48). Его мы шить конечно же не будем (ибо на китайском + не совпадают GPIO для reset и светодиодов), а зашьем mod который лишен вышеописанных косяков для Turbo+ от наших русских умельцев. Качаем отсюда (как видите, тут моды не только для Turbo+), но пока что не спешим шить, ибо в отличии от стокового uboot наш breed не знает адрес, с которого нужно грузить ядро. И мы не знаем. Поэтому давайте для начала узнаем его.
# dmesg | grep 0x0 | grep kernel
[ 2.466689] 0x000000400000-0x000000a00000 : "kernel"
В моем случае видим адрес начала раздела ядра 0x400000, так как бэдов до kernel у меня нет. Если вдруг у вас они есть, то адрес будет выше, ибо каждый новый бэд прибавляет к адресу число eraseblock (число 0x20000), то есть 0x400000, 0x420000, 0x440000, и т. д.
Далее к адресу начала раздела ядра надо прибавить 0x100 (размер заголовка у ядра в sysupgrade для данной платформы). В моем случае получаем: 0x400000 + 0x100 = 0x400100. Далее этот адрес будем называть адрес_старта_ядра_sysupgrade.
Теперь через scp -O (или как угодно) закидываем скачанный выше breed для вашей модели в /tmp роутера. Так как «во имя защиты» раздел u-boot в dts помечен как read-onlу, то придется еще поставить и модуль ядра для снятия этой защиты (kmod-mtd-rw).
Отнеситесь к прошивке загрузчика внимательно! При прошивке фигни вместо загрузчика вы получите кирпич, который сможет воскресить только nand tsop48 программатор (они стоят от 3000р), так как в mt7621 нет аппаратного загрузчика на случай непредвиденных ситуаций.
Ставим kmod-mtd-rw, и шьем breed:
# opkg update
# opkg install kmod-mtd-rw
# insmod kmod-mtd-rw i_want_a_brick=1
# mtd -r write /tmp/Breed(r1416)-Turbo+.bin u-boot
Роутер перезагрузится и выпадет в breed (из-за отсутствия адреса загрузки ядра). Переполучаем DHCP (благо Breed его выдает) и ломимся на http://192.168.1.1. Если breed не остановил загрузку и не дал войти в себя, то выключаем роутер, зажимаем reset, включаем роутер, ждем моргание светодиода, отпускаем reset. Breed выдаст DHCP и все также ломимся на http://192.168.1.1. Видим морду breed. Заходим в Environment и создаем переменную (если её нет) с именем autoboot.command в значение которой пишем boot flash адрес_старта_ядра_sysupgrade, то есть для моего случая значением будет boot flash 0x400100. Тыкаем save. Также ради перфекционизма можете задать маки, но драйвера OpenWRT их не должны читать — они читают маки из eeprom mtd2 (factory), а не из того eeprom, что думает breed. Тыкаем save, и reboot.


Если не хотите по вебу — идите по telnet на все тот же 192.168.1.1 и выполняйте:
breed> env set autoboot.command "boot flash 0x400100"
breed> env save
breed> reset
(кавычки портит форматирование — они такие же как на двойке с шифтом в русской раскладке)
Снова загружается OpenWRT, переполучаем DHCP аренду и проверяем, что все ок.
Паяем 512MB RAM
После установки Breed смело разбираем роутер и запаиваем новый чип вместо старого. Как я уже писал выше, нам нужен BGA-96 DDR3L 4GBit (512MByte) 16bit 1200+MHz чип, я взял K4B4G1646Q-HYK0. На время пайки снимаем все металлические экраны (чтобы под ними не потекли термопрокладки). После запайки нового чипа снова включаем роутер с зажатым reset чтобы войти в breed и проверить результат. Если вдруг ничего не работает — подпаивайте UART и смотрите в чем дело. Для breed скорость 115200 (для стокового uboot была 57600, и OpenWRT тоже работает на 57600). На Turbo+ для работы UART надо рядом с ним поставить две перемычки — R53 и R54. У GIGA UART работает сразу.


Если все работает и в breed видны все 512MB RAM — отлично. Идем в ОС и тестируем RAM уже там (я тестил с помощью расширения tmpfs /tmp с помощью создания файлов из /dev/urandom с последующим cmp).


Также на скрине выше можете видеть, что флешки прибавилось — об этом ниже. А пока что обсудим один важный момент.
Как восстановить девайс, если остался жив только Breed
Коль уж вы теперь стали обладателем чужого Breed на своем девайсе, на всякий случай стоит прояснить и этот вопрос. Для начала надо понять, есть ли смысл к восстановлению прошивки привлекать breed — ведь даже убитую OpenWRT (независимо от типа загрузчика) можно загрузить в safe mode. Для этого врубаем роутер, и видим что через время светодиод быстро моргает две секунды, а потом медленней моргает еще N секунд. Те две секунды — ожидание OpenWRT нажатия любой клавиши (reset, wps). При нажатии — OpenWRT загрузится в safe mode используя только squashfs (и без dhcp сервера). Выставляйте статику на сетевую компа (из 192.168.1.0/24) и идите по ssh на роутер (192.168.1.1). И там в баннере вас встретит список команд — как смонтировать /overlay и/или сбросить ОС в дефолт, и т. д. Монтируйте оверлей, сбрасывайте в дефолт — и будет вам счастье.
Но если все совсем серьезно (допустим прошивка реально запорота), то придется для восстановления юзать имеющийся breed. Для начала уточним, какие образы можно шить через breed:
- initramfs-kernel — можно
- squashfs-factory — нельзя (breed не поймет формат)
- sysupgrade — НЕЛЬЗЯ. Его можно шить только из самой OpenWRT через web/sysupgrade (ибо для нашей платформы sysupgrade образ = tar архив c .bin расширением)
Теперь про само шитье из breed. Прошить можно только initramfs-kernel, и уже потом загрузившись в него прошить sysupgrade. Есть три способа прошивки initramfs-kernel из breed:
- Неправильный №1 — из web интерфеса breed в Firmware layout 1. Плохо, ибо шьет начиная с 0x200000, а это адрес начала mtd2 (Factory) раздела с калибровочными данными wifi, маками, и серийниками. Да и придется после такой прошивки менять в breed адрес загрузки ядра на 0x200000 (тут уже нет заголовка, не надо прибавлять 0x100), грузить initramfs-kernel, шить из него sysupgrade, снова менять в breed адрес загрузки ядра на адрес_старта_ядра_sysupgrade, после чего из OpenWRT восстанавливать бекап mtd2 с помощью kmod-mtd-rw (ибо Factory тоже в dts помечен как read-only).
- Неправильный №2 — из web интерфеса breed в Firmware layout 2. Тоже плохо, ибо тоже шьет начиная с 0x200000. По сути это тоже самое, что пункт 1.
- Правильный — через telnet с помощью wget со своего http сервера в адрес_старта_ядра_sysupgrade.
Для начала рассмотрим правильный способ прошивки:
- Поднимите на компе http сервер (самый простой вариант — nginx, легко даже на windows)
- Закиньте в его корень initramfs-kernel образ OpenWRT
- Войдите в breed. Если вы видите его web интерфейс, значит telnet тоже доступен. Войдите по telnet:
$ telnet 192.168.1.1
- Прошейте initramfs-kernel образ в адрес_старта_ядра_sysupgrade (чтоб ничего не менять в Environment лишние пару раз + не убивать mtd2) и ребутнитесь в initramfs-kernel (для разных образов размер файла очевидно будет разным):
#на всякий случай еще раз зададим адрес_старта_ядра_sysupgrade (замените на свой если отличается):
breed> env set autoboot.command "boot flash 0x400100"
breed> env save
#пишем файл openwrt-24.10.2-ramips-mt7621-beeline_smartbox-turbo-plus-initramfs-kernel.bin в ОЗУ по адресу 0x80001000:
breed> wget http://192.168.1.163/openwrt-24.10.2-ramips-mt7621-beeline_smartbox-turbo-plus-initramfs-kernel.bin
Connecting to 192.168.1.163:80… connected.
HTTP request sent, awaiting response… 200 OK
Length: 7778854/0x76b226 (7MB) [application/octet-stream]
Saving to address 0x80001000
[========================================================================] 100%
Transmission completed in 2.3s.
#стираем флешку с 0x400100 по 0x76b226 (размер файла)
breed> flash erase 0x400100 0x76b226
Erasing flash bank 0 from 0x400100, size 0x76b226
[========================================================================] 100%
#пишем из ОЗУ из 0x80001000 на флешку с 0x400100 количество байт файла (0x76b226)
breed> flash write 0x400100 0x80001000 0x76b226
Writing flash bank 0 to 0x400100 from memory 0x80001000, size 0x76b226
[========================================================================] 100%
breed> reset
- В загрузившемся initramfs-kernel прошейте соответствующий sysupgrade.
Если правильный способ прошивки для вас очень сложный (или вам больше нравится неправильный), то рассмотрим и его:
- Делаем бекап mtd2 (Factory) раздела на роутере:
# dd if=/dev/mtd2 of=/tmp/mtd2.dd
- Забираем /tmp/mtd2.dd с роутера на комп по scp (или как угодно)
- Идем в web интерфейс breed и шьем наш initramfs-kernel образ в Firmware layout 1
- Меняем в Environment autoboot.command = boot flash адрес_старта_sysupgrade на autoboot.command = boot flash 0x200000, save, reboot
- Загрузится initramfs-kernel, из него шьем соответствующий sysupgrade
- Опять меняем в Environment autoboot.command = boot flash 0x200000 на autoboot.command = boot flash адрес_старта_sysupgrade, save, reboot
- Грузимся в OpenWRT и восстанавливаем mtd2 (Factory) через kmod-mtd-rw (принцип такой же как при прошивке breed в начале статьи, только шьем уже другой файл в другой раздел)
Уже запороли mtd2 и бекапа нет? Не страшно, вот бекапы для Turbo+, а вот для GIGA. Советую перед прошивкой в mtd2 в файлах в hex редакторе все-таки прописать свои маки и серийники, иначе там будут мои😁. Или будут проблемы, если два роутера работают рядом с одинаковыми маками. Смещения (адреса для прописывания) указаны в текстовом файлике по тем же ссылкам.
Бесплатное увеличение места на флешке с 65 до 95 MB
Вы наверное задавались вопросом «а почему на моем Turbo+/GIGA доступно только 65MB при флешке в 128MB»? Ответ — место занимает слот второй прошивки. А если мне не нужен второй слот, но не помешало бы свободное место в первом? А фиг там плавал — ответит стоковый uboot, который при старте проверяет ядра обоих слотов и начинает творить «восстановление» при несовпадении. Но ведь теперь у нас нет стокового uboot, а значит можно отжать место из второго слота. Разметка флешки для нашего девайса в OpenWRT образах задается в dts, что превращаясь в dtb встраивается в ядро (вернее в конец ядра, не трогая его код). Проект OpenWRT сборок с такой разметкой не предоставляет, поэтому подправлю dts и соберу сам.
Собрал. Скачать можно тут для Turbo+ и тут для GIGA. Репы работают, kmod пакеты работают, все хорошо. Но не все так просто: нельзя просто так взять, и перейти на largeflash сборку с обычной (и наоборот). Сначала надо прошить соответствующий initramfs-kernel образ из breed, и уже из него соответствующий sysupgrade. То есть: для перехода на largeflash шейте из breed любым вышеописанным способом largeflash-initramfs-kernel образ, и из largeflash-initramfs-kernel шейте уже largeflash-sysupgrade. Круто, но теперь вы можете обновляться только на мои largeflash-sysupgrade сборки. А если захотите уйти с largeflash сборок? Окей, шейте из breed initramfs-kernel с официального сайта, и из initramfs-kernel с официального сайта уже шейте sysupgrade с официального сайта. Как шить — описано выше.
Ну и напоследок позволю себе наглую саморекламу 😄. В связи с тем, что я везде перешел на Xiaomi AX3000T, почти всю свою «коллекцию» роутеров на mt7621 я распродаю на авито. Они уже все с 512MB RAM и c прошитой OpenWRT largeflash (но могу прошить и официальную OpenWRT при необходимости).
Вот ссылка на моё объявление.