Прошиваємо роутер upvel ur ur-313n4g на openwrt

Якось раз, ще до стрибків курсу долара, мені знадобився дуже дешевий SOHO-роутер. Вимоги - 5 портів, NAT і Wi-Fi, не завадив би і USB. Вибір припав на Upvel UR-313N4G. який в ті часи коштував в Citilink'е смішні 860 рублів. Роутер був куплений і виконував свої обов'язки цілком стерпно, стабільно зависаючи раз в тиждень. Крім того, не працював кидок портів, ну і що, він не надто сильно був потрібен. До того ж в Web-інтерфейсі був доступ до командного рядка, так що в критичних випадках можна було просто написати iptables -A PREROUTING -j DNAT і насолоджуватися працюють портами до наступного зависання. Втім, більшого я від коробочки за таку смішну ціну я не чекав. Потім дещо в моєму житті змінилося і роутер ліг на дальню полицю, а його замінив TP-Link TR-ML3420. Треба сказати, TR-ML3420 відмінно працює під OpenWRT і ніяких проблем з ним не виникає, а от роутери Upvel офіційно не підтримуються OpenWRT трохи менше, ніж повністю (з усього модельного ряду - тільки два роутера).
Коли стало ясно, що Upvel UR-313N4G мені вже не шкода, я вирішив спробувати поставити на нього OpenWRT. Основне завдання - змусити працювати 3G-модем Megafon M21-4, він же Huawei E3531. Треба сказати, що досвід прошивки роутерів на OpenWRT у мене був, як через Web-інтерфейс, так і через UART, але він зводився до "виберіть файл для прошивки і моліться" або "наберіть ці три команди в консолі і моліться". На цей раз мені хотілося розібратися, чому вводяться саме такі команди, ну і взагалі отримати загальне уявлення про архітектуру MIPS, з якої я до цього не працював.

Тепер настав час експериментів. Для початку розкриємо роутер і подивимося маркування основного чіпа - Ralink 5350F. Легке гугленіе показує, що цей чіп підтримується OpenWRT, і досить непогано, - є цілий каталог ramips з прошивками під серію 5350. Ще на платі видно мікросхема RAM на 32Мб і чіп EEPROM на 8 Мб. Пошук по сайту 4pda показує, що на чіпсеті Ralink 5350F побудований Upvel UR-322N4G, Hame MPR-A1 і Zyxel Keenetic 4G II. Ну що ж, качаємо OpenWRT для Hame MPR-A1 і спробуємо прошу через Web-інтерфейс роутера.
Прошивки не шиється, мабуть, не проходить перевірка якихось сигнатур. З'ясовувати з отладчиком напереваги, яких саме, немає бажання. Ну й добре, не боляче треба було.

Є кілька способів прошити роутер без використання Web-інтерфейсу. Можна, наприклад, скористатися режимом відновлення, в який завантажувач переходить при запуску роутера. якщо натиснута кнопка Reset. Забігаючи вперед, скажу, що в Upvel UR-313N4G цього режиму немає, не пощастило, що ж поробиш.
Можна також підключитися до роутера через telnet, який доступний в оригінальній прошивці, "розчистити" пам'ять роутера, убивши непотрібні процеси, завантажити в пам'ять нову прошивку через tftp і прошити її командою mtd_write. Спосіб цей поганий тим, що у нас, по суті, є тільки одна спроба - якщо прошивка виявиться несумісною з роутером і не зможе завантажитися, то на виході ми отримаємо "полукірпіч", який можна відновити, але тільки через UART. До того ж в цьому випадку доведеться поламати голову над тим, в який розділ MTD слід записувати прошивку. Відразу скажу - в розмітці MTD, яка застосовується в оригінальній прошивці, розділу Firmware немає.

Прошивка через UART


З усього цього випливає, що для експериментів нам потрібно підключитися до роутера через UART, тоді у нас буде доступ до консолі з моменту старту роутера. Про всяк випадок замовимо з Китаю за 160 рублів програматор. Якщо ми не вб'ємо завантажувач, програматор нам не знадобиться, але, так би мовити, "випадки бувають різні". На платі, якщо тримати її світлодіодами до себе, у верхній правій частині помітні 4 нераспаянних отвори в ряд, підозріло схожі на UART. Уважно дивимося на плату - перша зліва отвір зроблено в широкому шарі фольги, здається, це схемна земля, доріжки від наступних двох отворів через резистори йдуть кудись углиб плати - це Rx і Tx, правда, поки не зрозуміло. В якому порядку. Вкрай праве отвір так само розташовується на шарі фольги, але трохи менше, це, швидше за все, +3,3 В. Беремо в руки тестер і вимірюємо напруга. На Tx повинно бути +3,3 В, на Rx - 0 В. Отримуємо (зліва направо) - 0В; 3,3, 0В, 3,3. Значить, другий ліворуч - Tx, а третій - Rx. Крайній праворуч контакт - 3,3, ми розпаювати не будемо - спаліть перехідник.
Беремо китайський клон шнура Nokia CA-42, розрізаємо його, знаходимо в Гуглі терморегулятори і припаюємо (зліва направо) - помаранчевий, червоний, синій.

Ставимо Putty (у мене Linux на робочої станції, з Windows проблем теж виникнути не повинно) і підбираємо швидкість порту: виставляємо стандартні для COM-порту значення, включаємо роутер і дивимося, щоб на екрані були кракозяби, а осмислений текст. У мене з'єдналося на швидкості 57600 бод. Тепер у нас є доступ до завантажувача, а значить, шанс окірпічіть роутер зменшується.

Добре, спробуємо прошу через завантажувач. У момент старту системи ми бачимо вітання

Прошивка запустилася, ура! Навіть є доступ до Web-інтерфейсу, а значить, велика частина прошивки працездатна. І це ми ще нічого не шили! Тільки зі світлодіодами коїтися щось дивне - горить тільки Wi-Fi (а він відключений і горіти не повинен), а ось світлодіоди портів Ethernet не горять. Розбираємося далі. Для настройки комутаторів в OpenWRT використовується утиліта swconfig. З'ясовуємо, що може наш комутатор


На перший погляд - обнадійливо, ми можемо управляти не тільки VLAN'амі, що життєво необхідно для розмежування трафіку LAN і WAN-підмереж, але і програмувати світлодіоди.
робимо


і ... нічого не відбувається. Мабуть проблема десь глибше, в драйверах. Добре, що у OpenWRT відкритий код. Йдемо в git-репозітоій. знаходимо там вихідні драйвера і бачимо


тут, здається, використовується магія вуду. І ще - за кодом драйвера відразу зрозуміло, що без детальної документації на регістри комутатора нам в ньому не розібратися. Але видно, що параметри драйвера задаються не через аргументи команди modprobe, а, судячи з усього, через вкомпільовані в ядро ​​рядки:


Гаразд, відкладемо вихідні коди і спробуємо зайти з іншого боку. Всі три роутера - Upvel UR-322N4G, Hame MPR-A1 і Zyxel Keenetic 4G II - двопортові. Напевно серед хмари підтримуваних моделей на Ralink 5350 є і пятіпортовие моделі. Йдемо на WikiDev і знаходимо, наприклад, D-Link 320 NRU B1. Пятіпортовий роутер, один USB порт - те, що треба. Качаємо прошивку, завантажуємо в пам'ять роутера, запускаємо. Світлодіоди працюють як належить. Дуже цікаво. Будемо прошиваться на неї, а поки спробуємо знайти різницю між OpenWRT для Hame MPR-A1 і D-Link 320 NRU B1. Різницю потрібно шукати в профілях збірки - DTS. Ось, наприклад, параметр led_polarity для Hame не вказано, а для D-Link дорівнює 0x17. А я то думав, що полярність буває тільки пряма і зворотна! Знову ліземо в вихідні драйвера, знаходимо там константу


знаходимо спосіб завдання полярності

і знову переконуємося, що без опису регістрів комутатора нам ловити нічого.

Ми з'ясували, що для нашого роутера найкраще підходить прошивка від D-Link DIR-320 NRU B1. Тепер потрібно прошиваться. Бути може ви помітили, що для тестування роботи прошивок я вибирав файли зі словом uImage в імені. Такий файл містить тільки образ ядра і файлову систему, що завантажується в RAM і доступну тільки для читання. Такий образ можна запускати прямо з пам'яті, а ось для прошивки він не дуже підходить - настройки в такому образі зберігати просто ніде. Тому для прошивки ми виберемо образ з розширенням sysupgrade - в кінці такого способу причеплений розділ JFFS2, в якому будуть зберігатися зміни, внесені нами в файлову систему роутера. Тому образ sysupgrade стартувати з пам'яті без прошивки на флешку не може.
Дуже добре, що у Upvel UR-313N4G флешка на 8 Мб, після установки у нас залишиться ще трохи більше 4Мб для додаткових пакетів. А ось в TP-Link TR-ML3420 флешка на 4Мб і вільного місця там - кіт наплакав.
Перезавантажуємо роутер, натискаємо 2, вказуємо ім'я прошивки і шиємо. Отже, ніби все нормально: інтерфейси піднялися, світлодіоди моргають, в загальному - життя вирує. Ви ще не забули, що нашою основною метою було змусити працювати роутер з модем Megafon M21-4? Встромляємо модем в USB-порт, дивимося в dmesg і ... нічого. Тобто, зовсім нічого. Тут є два варіанти - або ядро ​​не побачив якусь пекельну шину, на якій всередині чіпа висить USB-порт (тут вже ми нічого не поробимо), або в прошивку забули додати драйвери для цього порту. У D-Link 320 NRU B1 USB-порт є, так що більш ймовірний другий варіант. Гугл "OpenWRT usb support", налаштовуємо на роутері WAN-порт, щоб прошивка отримала доступ в Інтернет і ставимо пакети.


Саме в такому порядку, тому що модуль kmod-usb2 повинен бути завантажений раніше, ніж kmod-usb-ohci

В консолі тут же з'являються рядки:


Ого, система побачила пристрій на шині USB, значить, продовжуємо.

Тепер ставимо пакет, який при підключенні модему пошле на нього "магічну послідовність", перемикає модем з режиму CD-ROM / TF Card в режим CD-ROM / TF Card + 3 COM-порту.


В консолі бачимо наступне:


Значить, usb-modeswitch спрацював - відправив команду модему, а модем після цього зник з шини USB і з'явився там вже як інший пристрій.

Поставимо два пакети з драйверами, які побачать COM-порти і зроблять їх доступними системі


Видно, що модем визначився правильно і в системі з'явилося 3 COM-порту

Ставимо пакет, необхідний для створення відправки команд 3G-модемів і розширення для Web-інтерфейсу:

Заходимо в Web-інтерфейс, налаштовуємо 3G, як порт вказуємо / dev / ttyUSB0, все працює.

Прошивка через Telnet


А ось тепер настав час з'ясувати, чи можна прошити роутер без доступу до UART. Для початку спробуємо режим відновлення - зазвичай він включається, якщо при затиснутій кнопці скидання подати харчування. Затискаємо, подаємо і дивимося в консолі: нічого. Режим не доступний. Відкотимося через завантажувач на оригінальну прошивку і подивимося в лог завантаження:


Розмір розділу Kernel - 7680 Кб, а образ OpenWRT займає приблизно 3,5 Мб, отже, можна прошиваться без побоювання, що нова прошивка не поміститься в старий розділ.

Подивимося, скільки у нас вільної пам'яті:


Нам потрібно приблизно 3,5 Мб і вони у нас є.


Спочатку зітремо розділ RW_FS. Може, цього й не треба робити, але про всяк випадок перестрахуемся:

Тепер запишемо прошивку:


Ключ -r значить, що після виконання команди роутер перезавантажиться. Коригувати таблицю розділів не потрібно, тому що вона існує тільки всередині ядра Linux.

Після перезавантаження заходимо в Web-інтерфейс, ставимо пакети kmod-usb2, kmod-usb-ohci, kmod-usb-serial, kmod-usb-serial-option, kmod-ledtrig-usbdev, usb-modeswitch, comgt, luci-proto- 3g, налаштовуємо інтерфейси і світлодіоди.

Роутер прошитий, можна відкривати печеньки і наливати чай.