Собираем u-boot для WiFi роутера
Данная статья это продолжение предыдущие статьи Оживление WIFI роутера WNR1000v2h2. Соответственно собирать мы будем u-boot для роутера WNR1000v2h2.
Ранее не приходилось собирать подобные вещи, под подобные платформы так, что это мой первый опыт.
Путь до выхода готового результата был долгим и тернистым.
Вначале нам надо было определиться, что за архитектура используется в нашем процессоре AR7240 — это архитектура misp и прямой порядок байт (big endian), от нее мы и будем отталкиваться. Обычно при сборке из исходников используют так называемый Toolchains т.е. набор инструментов уже кем-то подготовленный.
Я начал искать. Было найдено много всего, но испробовано:
- LEDE SDK for AR71xx MIPS (17.01.0 release)
- Buildroot
- OpenWrt Toolchain for AR71xx MIPS
Первые два набора муторные и запутанные, требует дополнительного пристального изучения, но на это у меня не было времени.
Третий набор был уже более человеческий, но с ним тоже особо не заладилось. Собрать u-boot из исходников им не вышло.
Было принято решение собрать набор для компиляции своими руками, то и было сделано. Сама сборка набора включает в себя не так много это GNU Binary Utilities и собственно сам компилятор GCC под архитектуру mips. На данном этапе все прошло довольно гладко, потом началась непосредственно сборка u-boot из исходников и тут все прошло без особых проблем. Я получил долгожданный бинарник и писался от счастья, но счастье не было долгим. Залив на роутер я получил полу рабочий загрузчик, он стартовал, но на половине пути зависал. Тут завис и я так, как что делать дальше было не понятно.
Я начал просматривать исходники в поисках точки зависания, но конечно ничего криминально я не нашел. Далее начались поиски первоисточника т.к. я работал с форком официального проекта и возможно ошибки были внесены автором форка, ну как вы понимаете, я не ничего не нашел. Изыскания в поисках похожих проектов подходящих под мою модель тоже не дали результатов.
Начались творческие изыскания. На просторах интернет прочитал что-то вроде, что не версии компилятора одинаково полезны из чего следует, что нам надо поиграться с версиями компилятора. Отрываем репозиторий и видим, что там с десяток версий компилятора и если их тупо перебирать мы так и до пенсии не успеем, нужен путь короче.
Идем на сайт netgear где у них выложены исходные коды от их железок к некоторым из которых приложены Toolchains и эмпирическим путем вычисляем примерную версию компилятора, что они используют.
Далее скачиваем, собираем, потом опять собираем, заливаем и наслаждаемся проделанной работой.
Процесс сборки u-boot из исходников
Нам понадобится:
- Развернутая Linux система на виртуальной машине. Я использовал Ubuntu 20.04.1 LTS , развернул на встроенном Hyper-V в Windows10. Linux необходимо настроить на работу с сетью Internet для скачивания необходимых пакетов, а так же не забудьте про SSH для удобства работы . Как установить и настроить ОС Linux мы рассматривать не будем, данного материала полно в интернете.
- Компилятор gcc-3.4.6 — как было описано выше, версия компилятора очень важна.
- binutils — набор инструментов для создания и управления бинарниками, объектными файлами, библиотеками, данными профилей и ассембленым исходным кодом.
- Исходные коды u-boot для WNR1000v2h2
Устанавливаем необходимы пакеты
y1@y1:~$ sudo apt-get update y1@y1:~$ sudo apt-get install gcc y1@y1:~$ sudo apt install make
Установка переменных для облегчения дальнейшей работы
root@y1:/home/y1# cd / root@y1:/# mkdir project && cd project !папка где мы будем все собирить root@y1:/project# export WDIR=/project !наименования исполняемых файлов для собираемого пакета root@y1:/project# export TARGET=mips-linux !место куда будет установлены собранные пакеты root@y1:/project# export PREFIX=/opt/mips_be root@y1:/project# export PATH="$":$/bin !для исправлении ошибки при сборке GCC, актуально только для нашей версии root@y1:/project# export CFLAGS="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
Скачиваем необходимые исходные коды
root@y1:/project# wget http://ftp.gnu.org/gnu/binutils/binutils-2.35.tar.bz2 root@y1:/project# wget http://ftp.gnu.org/gnu/gcc/gcc-3.4.6/gcc-3.4.6.tar.bz2 root@y1:/project# git clone https://github.com/realmicu/uboot-wnrmod2k
Сборка и установка binutils
!распаковываем скаченный архив root@y1:/project# tar xjf binutils-2.35.tar.bz2 !создаём каталог и входим в него root@y1:/project# mkdir build-binutils && cd build-binutils !производим конфигурирование для последующей сборки root@y1:/project/build-binutils# ../binutils-2.35/configure --target=$TARGET --prefix=$PREFIX !собираем пакет root@y1:/project/build-binutils# make !устанавливаем !возможно надо перегрузиться после установки root@y1:/project/build-binutils# make install !выходим из каталога root@y1:/project/build-binutils# cd ..
Сборка и установка компилятора GCC
root@y1:/project# tar xjf gcc-3.4.6.tar.bz2 root@y1:/project# mkdir build-gcc-bootstrap && cd build-gcc-bootstrap root@y1:/project/build-gcc-bootstrap# ../gcc-3.4.6/configure --target=$TARGET --prefix=$PREFIX \ --enable-languages=c --without-headers \ --with-gnu-ld --with-gnu-as \ --disable-shared --disable-threads \ --disable-libmudflap --disable-libgomp \ --disable-libssp --disable-libquadmath \ --disable-libatomic root@y1:/project/build-gcc-bootstrap# make -j2 root@y1:/project/build-gcc-bootstrap# make install
Заключительный этап, сборка u-boot
root@y1:/project/build-gcc-bootstrap# cd ../uboot-wnrmod2k !конфигурируем параметры сборки root@y1:/project/uboot-wnrmod2k# make wnr1000v2_config FLASH_SIZE=4 !собираем root@y1:/project/uboot-wnrmod2k# make
Если все прошло удачно, то в каталоге project/uboot-wnrmod2k появится u-boot.bin это и есть наш загрузчик, теперь его надо залить на роутер. Как это сделать читайте Оживление WIFI роутера WNR1000v2h2
Скачать файл с нашей ОС можно программой WinSCP
Русские Блоги
2.1 Инструменты: TFTPd32 — это сервер протокола TFTP (Simple File Transfer Protocol), используемый для передачи файлов в U-Boot.
2.2、Используйте команду tftpboot для получения файлов в U-Boot:
Команда tftpboot используется для запроса файла с сервера TFTP и сохранения его в памяти.
Команда tftpboot может быть сокращена до tftp, если нет двусмысленности.
2.3、tftp получить файл
2.4、Erase Flash in U-Boot (стереть + )
Обычный размер блока стирания SPI Flash составляет 64 КБ, а его шестнадцатеричное число байтов — 0x10000.
Если размер стирания равен 0x30000 (192 КБ), то размер является целым кратным 0x10000, который выравнивается;
Если размер стертых данных равен 0x12345 (72 КБ), этот размер не выровнен. Вам нужно использовать больший размер, но ближайший кратный 0x10000, то есть 0x20000 (128 КБ).
Пример прошивки U-Boot в маршрутизации TP-LINK
2.5、U-Boot записывает данные во Flash (cp.b )
Размер данных, записываемых во Flash, может быть любым положительным целым числом.
cp.b означает запись в байтах
Адрес источника — это адрес хранения файловых данных, полученных с помощью команды tftpboot.
Адрес назначения — это адрес Flash
Длина — это размер файла, полученного с помощью команды tftpboot, в шестнадцатеричной системе счисления с префиксом 0x.
Пример прошивки U-Boot в маршрутизации TP-LINK:cp.b 0x80000000 0x9f000000 0x20000
В-третьих, используйте HFS для загрузки файлов.
Если вы чувствуете, что загружать файлы с помощью WinSCP проблематично, вы можете рассмотреть возможность загрузки файлов в режиме HTTP, то есть установить ПК в качестве HTTP-сервера и загрузить файлы на маршрутизатор.
Если на ПК настроен HTTP-сервер, вы можете напрямую сохранить файл для загрузки в корневом каталоге HTTP, а затем загрузить его с помощью команды wget на маршрутизаторе.
3.1. Инструменты для подготовки:
HFS: http://www.rejetto.com/hfs/?f=dl
HFS — это легкий файловый сервер HTTP (файловый сервер HTTP)
3.2. Настроить HFS:
3.3. Скачать файлы в роутинге:
Обратитесь к методу на первом этаже, используйте SSH или telnet для входа в роутер
выполненный cd /tmp Войдите в каталог / tmp
выполненный wget http:// / Скачать файлы
Такие как:
wget http://192.168.1.2/u-boot-tp9343.bin